logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Aduc842 - Programowanie serwomechanizmów w asemblerze, problem z kierunkiem

gunes1989 03 Lut 2013 17:57 2808 9
  • #1 11883524
    gunes1989
    Poziom 9  
    Posty: 5
    Witam. Usiłuję napisać programik do testowania serwomechanizmów tzn. dostałem ich kilkanaście od dr i moje zadanie polega na sprawdzeniu które z nich są sprawne. Mam to napisać w asemblerze. Wydaje mi się, że program który napisałem powinien pozwolić sterować serwem w lewo lub prawo za pomocą potencjometru. Zastosowałem tutaj pętle opóźniające, zmierzyłem opóźnienia scopometrem i po uruchomieniu serwo wychyla się tylko w jedną stronę zgodnie ze wskazówkami zegara. Program jest na Aduc842, pod port 3.4 podpinam sterowanie serwa, a pod 3.3 potencjometr którym zmieniam kierunek wychylenia serwa (czyli uruchamiam pętle z 1ms lub 2ms). Zamieszczam zdjęcia sprzętu. Proszę o podpowiedzi co zrobiłem źle lub jak to inaczej zrealizować. Zaznaczam że specem w dziedzinie techniki mikroprocesorowej nie jestem. Poniżej zamieszczam mój kod.

    Kod: text
    Zaloguj się, aby zobaczyć kod
    Załączniki:
    • Aduc842 - Programowanie serwomechanizmów w asemblerze, problem z kierunkiem 2.jpg (146.59 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #2 11886807
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    o ile mi wiadomo, serwo steruje się przebiegiem PWM o okresie 1 ms. Ty robisz coś zupełnie innego. Bez przerwania timera nie da się tego zrobić dobrze. Nie pamiętam, czy ADuc ma jakiś timer, który potrai generować PWM. Jeśli tak, sprawa jest prosta. Jeśli nie - zaprogramuj timer na okres np. 20 us (z krótszym procesor nie da sobie rady) i generuj programowo przebieg o wypełnieniu od 1/50 do 49/50.
  • #3 11888032
    Piotr Piechota
    Poziom 22  
    Posty: 519
    Pomógł: 55
    Ocena: 85
    BlueDraco napisał:
    o ile mi wiadomo, serwo steruje się przebiegiem PWM o okresie 1 ms. (...)


    Nie jest dokładnie tak. Serwo analogowe steruje się impulsami o szerokości 1-2 ms powtarzanych w okresie 20ms.


    Aduc842 - Programowanie serwomechanizmów w asemblerze, problem z kierunkiem
    autor rysunku: Shane Colton
  • #4 11888662
    gunes1989
    Poziom 9  
    Posty: 5
    Nie mam zielonego pojęcia o tym PWM, gdzie co ustawić i gdzie podłączyć ewentualnie dlatego tego nie ruszałem. Wiem że pętle opóżniające są mało praktyczne i profesjonalne bo procesor nie może w tym czasie nic innego wykonać ale w tym przypadku to akurat nie problem bo przecież mam tylko sterować serwem w lewo i prawo, ewentualnie punkt neutralny. Myślałem że jak wykonam program który będzie generował impuls stanu wysokiego przez 1ms (lub 2 ms kiedy potencjometr zmieni stan podawany na jeden z portów) i druga pętla do generowania stanu niskiego przez okres 20ms to wystarczy to do sterowania w lewo i prawo, a okazuje się że moje serwo Fatuba S3003 obraca się tylko w jedną stronę w obu przypadkach. Co zatem robię źle?
  • #5 11888854
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Piotr P. : dzięki za poprawkę.

    Tym bardziej widać, że trzeba użyć timer z przerwaniami co 0.5 ms - to się da bez problemu zrobić. Dalej odliczamy przerwania timera do 20 (w dół byłoby łatwiej) i wystawiamy 1 gdy zliczymy do 20, a 0 gdy zliczymy do 1 albo 3, w zależności od stanu wejścia

    DELAY2 opóźnia z grubsza o (((3 * 255) + 2 + 3) * 27 + 3) * 2 + 1, czyli 41586 cykli. Je]li to jest 20 ms, to częstotliwość ("dużych") cykli procesora wynosi nieco ponad 2 MHz. Czy to się zgadza?

    Znacznie prościej byłoby czytać ten kod, gdybyś zdefiniował małą procedurę z pętlą opóźniającą o 0.5 ms, wywoływaną z argumentem 2 a potem 38 w pierwszym przypadku, a 4 i 36 w drugim.

    Obecny sposób zapisu opóźnień jest koszmarnie pokrętny, a argument o stałej wartości 2 przekazywany w A jest bez sensu.
  • #6 11888876
    Piotr Piechota
    Poziom 22  
    Posty: 519
    Pomógł: 55
    Ocena: 85
    Powinno wystarczyć. Pokaż oscylogramy. Nie analizowałem programu ale nie pomyliłeś us z ms ?

    PS
    Serwo chyba Futaba S3003 a nie Fatuba S3003 ?
    Chyba, że to w stylu odidas'a.
  • #7 11889015
    gunes1989
    Poziom 9  
    Posty: 5
    Niestety nie posiadam oscylogramów. Korzystałem ze scopometru na uczelni i co do długości tych impulsów jestem w 100% pewny, że jest tak jak napisałem i na pewno w ms. Zresztą to że serwo obraca się w jednym kierunku chyba świadczy o tym że jakaś tam zgodność jest inaczej w ogóle by się nie poruszało. Zastanawia mnie fakt dlaczego tylko w jedną stronę. Co do rozwiązania z tym 0,5ms pewnie wyglądałoby lepiej ale czy rozwiązało by problem? Układ Aduc842 jest taktowany zegarem o częstotliwości 37768 Hz.

    Tak Futaba S3003 pisałem nazwę z pamięci, przepraszam za błąd.
  • Pomocny post
    #8 11889102
    Piotr Piechota
    Poziom 22  
    Posty: 519
    Pomógł: 55
    Ocena: 85
    Spróbuj czasów 1.8ms 1.2ms
    Powtarzanie co 20 ms nie jest krytyczne. Robiłem kiedyś eksperymenty z impulsami co 100 ms i serwo też się wychylało, choć mniej dynamicznie.
    Uszkodzenie potencjometru w serwie skutkuje wychylaniem się w jedną stronę - może trafiłeś na uszkodzone ...
  • Pomocny post
    #9 11889125
    BlueDraco
    Specjalista - Mikrokontrolery
    Posty: 6479
    Pomógł: 939
    Ocena: 421
    Ok, zacznij od takich zmian, jakie opisałem. Procedura opóźniająca o n * 0.5 ms, gdzie n jest argumentem, np. przekazywanym w rejestrze A.
  • #10 11889225
    gunes1989
    Poziom 9  
    Posty: 5
    Serwo jest sprawne przy zakupie prosiłem o sprawdzenie testerem i obracało się w obie strony. Jutro popracuje nad tym programem i opiszę rezultat. Tymczasem dziękuję bardzo za sugestie i pomoc. Mam jeszcze pytanie dotyczące sterowania czy jest szansa zwiększać i zmniejszać szerokość wysokiego impulsu potencjometrem z którego mam skorzystać i ewentualnie jakimi poleceniami miałbym to zrealizować, bo na razie używam go w dość prymitywny sposób do ustawienia bitu lub wyzerowania.

Podsumowanie tematu

✨ Użytkownik próbuje napisać program w asemblerze do testowania serwomechanizmów, jednak napotyka problem z kierunkiem ich ruchu. Serwo obraca się tylko w jedną stronę, mimo że program powinien umożliwiać ruch w lewo i prawo w zależności od sygnału z potencjometru. Uczestnicy dyskusji sugerują, że do prawidłowego sterowania serwem konieczne jest użycie sygnału PWM o odpowiedniej szerokości impulsu (1-2 ms) powtarzanego co 20 ms. Wskazują również na potrzebę zastosowania timerów z przerwaniami oraz poprawy kodu, aby uprościć generowanie impulsów. Użytkownik planuje wprowadzić zmiany w programie i pyta o możliwość regulacji szerokości impulsu za pomocą potencjometru.
Wygenerowane przez model językowy.
REKLAMA