Skocz do zawartości

[FPGA] Sterowanie serwem przez FPGA


Halon

Pomocna odpowiedź

Witam.

Zabrałem się za sterowanie serwami przez FPGA. Układ zaczyna reagować, ale nie tak jak bym się tego spodziewał.

Mam wypożyczoną płytkę UP2 firmy altera a na niej układ FLEX10K70 (5V). Płytka ma wbudowany oscylator 25,175 Mhz. Serwo do sterowania to Tower Pro SG 5010. Metodą prób i błędów doszedłem do raczej małych wartości czasowych (ok 200 cykli). Wtedy serwo zaczyna dawać oznaki życia i przy dalszym zwiększaniu przedziału czasowego (do ok 400 osiąga maks. szybkość) porusza się coraz szybciej aż do osiągnięcia brzegu. Potem silniczek dalej wyje i po ponownym skróceniu sygnału ucicha. Nie wiem jak spowodować jego ruch w drugą stronę?

Początkowe próby zaczynały się od 25 tys cykli i wtedy układ od razu przesuwał się na brzeg i tak schodziłem w dół, aż zaczynał reagować na sygnały od klawiatury i doszedłem do tych 200 cykli. nie wiem czy jest to spowodowane błędem w kodzie czy taka już jest natura tego układu (ale to drugie odrzucam).

Zamieszczam kod, jakby komuś się chciało sprawdzić co tam mogłem napsuć.

clk : sygnał zegarowy oscylatora UP2

data : wychylenie sterowane przez klawiaturę

sygnal : doprowadzenie do serwa

load : sygnał ustawiania aktualnej wartości wychylenia (zmienia swoją wartość na przeciwną co 10 ms)

Kod na pewno nie jest ładny, bo był zmieniany na bieżąco, tak by działał.

serwosterowanie.txt

Link do komentarza
Share on other sites

Hmmm, masz jakieś symulacje ? Nie znam się na serwo i nie wiem jakie sygnały powinno otrzymać. Polecam zrobić symulację tego układu, najlepiej timing-ową. Ona bezlitośnie obnaży wszelkie hazardy w układzie, może one coś psują. Jak mi wyjaśnisz jak działa serwo to chętnie pomogę dalej 😉 Na FPGA znam się nieźle 😉

Linijka

wartosc <= data*skok + dolny*drgan; 

jest "do bani". Nie da się mnożyć sygnałów asynchronicznie. To nie zadziała i tu szukałbym przyczyny. Działania arytmetyczne powinieneś wykonywać na zboczu zegara. Pamiętaj, że proces może być czuły tylko na jedno zbocze zegara.

Link do komentarza
Share on other sites

Ponadto o ile pamiętam to sygnały uaktualniane są dopiero na końcu procesu, a Ty po tym:

wartosc <= data*skok + dolny*drgan; 

sprawdzasz :

if (aktvalue < wartosc) then

więc masz tu wartość z poprzedniego wywołania procesu. Sygnały używa się raczej do przenoszenia danych między procesami oraz wejściem i wyjściem, Ty masz jeden proces więc możesz zrobić to na zmiennych (ich wartość jest od razu przypisywana oraz zachowują wartość między wywołaniami procesu).

Link do komentarza
Share on other sites

Jako wprowadzenie do programowania robiliśmy z kolegą wyświetlanie na wyświetlaczu kodów ASCII klawiszy. Początkowo robiliśmy symulacje, jednak po złożeniu całego układu nie wychodziły. Prowadzący stwierdził, że czasami symulacja ni jak się ma do rzeczywistości, więc zrezygnowaliśmy.

Co do uaktualniania wartości sygnałów to zanim sprawdzam:

if (aktvalue < wartosc )

mam elsif`a, który nie dopuszcza do wykonania się tej instrukcji.

A nad zmiennymi to nie myślałem.

Początkowo do ustawiania wartości sygnału był dodatkowy proces, uruchamiany na zboczu sygnału load (wtedy nie był on na wejściu do entity, tylko był tworzony poprzez wewnętrzny dzielnik z sygnału clk). Ale kompilator wywalał mi błędy, a po wywaleniu generacji load poza entity i dodanie nowego sygnału in skompilowało się. Spróbuje to jeszcze raz przepisać tak jak to wcześniej było, bo może gdzieś indziej był błąd.

Tak ogólnie to serwa powinny co ok 20ms dostawać aktywny sygnał długości od 1-2ms. Długość tego sygnału oznacza wychylenie silnika. Tyle doczytałem ogólnych informacji, ale u mnie niezbyt to działa, bo wartości 10us-100us dają tak jakby prędkość serwa. Nic więcej nie wiem.

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.