Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Sterowanie sprzętowe serwem

Goodmoon 27 Jan 2016 11:35 1086 22
  • #1
    Goodmoon
    Level 9  
    Witam,

    W swoim programie chcę dodatkowo obsłużyć serwo modelarskie. Z powodu natłoku obliczeń chcę wykorzystać sprzętową obsługę Timera2 (na pin PD3). Niestety pozostałe Timery też mam zajęte.

    Jednak dla Atmegi328 z 16MHz wychodzi, że Timer2 może pracować najwyżej na 61Hz co może być za duże dla serw które lubią 50Hz.

    W tej chwili gdy mam 61Hz to serwo zachowuje się niestabilnie (po włączeniu, restarcie Atmegi ustawia się coraz dalej i po chwili zaczyna drżeć).

    Czy można zastosować jakiś podstęp który zacznie poprawnie sterować serwem ?

    Pozdrawiam.
  • #2
    dondu
    Moderator on vacation ...
    Goodmoon wrote:
    Niestety pozostałe Timery też mam zajęte.

    Do czego je wykorzystujesz, w szczególności Timer1?

    Goodmoon wrote:
    Czy można zastosować jakiś podstęp który zacznie poprawnie sterować serwem ?

    Obniżyć częstotliwość kwarcu do około 13-14MHz.
  • #3
    atom1477
    Level 43  
    Goodmoon wrote:
    Jednak dla Atmegi328 z 16MHz wychodzi, że Timer2 może pracować najwyżej na 61Hz co może być za duże dla serw które lubią 50Hz.

    Gdyby 61Hz było "najwyżej", to mógł by pracować niżej a więc na 50Hz.
    Poza tym serwa nie wymagają konkretnie 50Hz. Zdecydowana większość pracuje dobrze od 10Hz do kilkuset Hz.
    Objaw który opisujesz pasuje raczej do serwa które nie dostaje impulsów. Albo dostaje takie które nie mieszczą się w zakresie jego pracy (dużo krótsze niż 1ms, albo dużo dłuższe niż 2ms). Czyli może masz np. niepoprawną polaryzację impulsów (to nie stan wysoki a stan niski trwa 1...2ms, czyli stan wysoki trwa kilkadziesiąt ms).
    Druga opcja którą często widzę u siebie, to resetowanie się mikrokontrolera gdy serwo rusza. Serwo przy starcie pobiera duży prąd, zasilanie spada i procek się resetuje. To powoduje zatrzymanie wysyłania impulsów do serwa i sytuacja się wtedy jeszcze bardziej pogarsza (serwo jeszcze bardziej wariuje i pobiera jeszcze większy prąd).
    Kiedyś tak zrobiłem na ATMega88:

    Więc przede wszystkim sprawdź czy na pewno masz dobry przebieg i czy procek się nie resetuje.

    A co do samego programu, to możesz użyć Timera2 a dla zwiększenia rozdzielczości i uzyskania częstotliwościowi powtarzania impulsów równej 50Hz w przerwaniu tego Timera modyfikować wartość wypełnienia (żeby np. tylko jeden impuls z dziesięciu był takim o wypełnieniu większym od 0 (czyli żeby w ogóle "był")).
    Czyli ustawiasz częstotliwość na około 500Hz (16000000/255/128 = 490Hz).
    Ale w przerwaniu ustawiasz wypełnienie przebiegu w dziewięciu przypadkach na 0, a tylko w jednym na tyle ile ma wynosić impuls dla serwa.
    Tym sposobem po pierwsze uzyskasz większą rozdzielczość sterowania serwem (bo impuls ma większy czas trwania w stosunku do kresu PWMa, a więc wykorzystuje większy zakres dynamiki PWMa), a po drugie zejdziesz z częstotliwością powtarzania impulsów poniżej tych 61Hz (bo przepuścisz tylko co dziesiąty impuls).

    Kiedyś tak zrobiłem na ATMega88:
    Code: c
    Log in, to see the code

    Tylko przy takim rozwiązaniu trzeba się upewnić że nie występuje pasożytniczy impuls dla wypełnienia równego 0 (występuje dla 0 albo dla 255, zależnie od ustawień Timera).
  • #4
    User removed account
    User removed account  
  • #5
    atom1477
    Level 43  
    No w sumie zależy to od budowy sterownika serwa. Jeżeli serwo poza pomiarem czasu trwania impulsu każdy impuls traktuje jako wyzwalacz sterowania silnikiem to oczywiście będzie kiepsko przy impulsach kilkaset Hz. Może trafiłem na odpowiednie serwa.
    Natomiast 60Hz zamiast 50Hz to żadna różnica. Wiec to nie to jest problemem drgania serw.
  • #6
    User removed account
    User removed account  
  • #8
    User removed account
    User removed account  
  • #10
    Goodmoon
    Level 9  
    Dzisiaj kupiłem "droższe" serwo i działa OK. Jednak problem był w jakości serwa SG90.

    Potwierdzam, że przy 61Hz serwo działa stabilnie.
  • #12
    User removed account
    User removed account  
  • #13
    Marico
    Level 20  
    A po co takie kombinacje z generowaniem przebiegów? Większość serw można sterować wysyłając tylko 1 impuls odpowiedniej szerokości. Jeśli na serwo nie będzie działać duża siła przeciwstawna takie sterowanie pojedynczym impulsem jest wystarczające.
  • #14
    User removed account
    User removed account  
  • #16
    Marico
    Level 20  
    Piotrus_999 wrote:
    Marico wrote:
    ? Większość serw można sterować wysyłając tylko 1 impuls odpowiedniej szerokości. Jeśli na serwo nie będzie działać duża siła przeciwstawna takie sterowanie pojedynczym impulsem jest wystarczające.


    Nie - poczytaj o serwach, predkosciach itp sprawach - oczywiscie jak nie zalezy ci na niczym to nie ma to zadnego znaczenia
    http://www.sailservo.co.uk/anvdig.html


    Co - nie? Art. nie wniosi nic nowego.
    Mam kamerę z fpv na tak sterownaych serwach (pan-tilt) sterowanych z pina portu drukarki PC. Generowanie z ciągłego przebiegu to tylko proszenie się o dgrania serwa jeśli przebieg nie jest stabilny. Sterowanie jednym impulsem likwiduje ten problem.
  • #17
    atom1477
    Level 43  
    Artykuł ma jakieś informacje ale niekompletne i przez to mogą wprowadzać w błąd.
    Np. piszą że analogowe serwo ma sterowanie PWM. A to nieprawda.
    Sterowanie jest czasem impulsu. Owszem przy stałości częstotliwości (50Hz) można to potraktować jako PWM. Ale nawet najprostrze serwa (zbudowane za pomocą prostej zasady którą opiszę dalej*) nie będą reagowały na zmianę częstotliwości w jakimś małym zakresie (powiedzmy 40...60Hz), a przecież gdyby były sterowane PWMem to powinny (przy założeniu stałego czasu trwania impulsu).
    Druga sprawa to piszą o prędkościach. I nie wyjaśniają o co chodzi.
    Narysowali komparator a to przeczy temu co piszą o sterowaniu (że są tam jakieś czasy i prędkości które się zmieniają po impulsie).
    Więc dochodzimy do wyjaśnienia jako może działać sterownik serwa (może ale nie musi):
    * Takie proste sterowanie można zrobić np. na NE555. Był chyba jakiś taki sterownik opisany kiedyś w Praktycznym Elektroniku.
    Sterownik przyjmuje impulsy i mierzy ich długość, ale silnik aktywuje tylko na określony krótki czas (trochę większy niż spodziewany okres przychodzących impulsów, czyli trochę więcej niż 20ms). Oczywiście chodzi mi o wysterowywanie silnika gdy jest taka potrzeba, czyli gdy występuje błąd położenia ramienia.
    Przy impulsach 50Hz (co 20ms) nie będzie widać że silnik jest sterowany impulsami. Bo się po prostu zleją.
    Przy mniejszej będzie to widać. Może się to objawić jako drgania podczas ruchu.
    Występuje też taka sytuacja że silnik włączony na te 20ms nie zdąży skompensować błędu położenia ramienia. Więc impulsy muszą przychodzić dalej mimo że informację o docelowym położeniu przesłał już pierwszy impuls (przy założeniu że szerokość impulsów/docelowa pozycja się nie zmienia).
    Tak więc nawet dla pracy statycznej, trzeba wysłać wiele impulsów żeby mieć pewność że ramię ustawi się tam gdzie chcemy.
    Dodatkowo impulsy są potrzebne do kompensowania błędów podczas przesunięcia ramienia siłą zewnętrzną.
    I dlatego taki sterownik powinien być sterowany częstotliwością w miarę stałą i zbliżoną do założonej czyli najczęściej 50Hz (choć w zasadzie nawet taki sterownik zaakceptował by częstotliwości impulsów wyższe niż 50Hz). A do tego ciągłymi impulsami a nie tylko jednym gdy się chce zmienić pozycję ramienia.
    Ale tutaj uwaga: tak działa prosty niepełnosprytny sterownik. Jego wady prawdopodobnie wynikają z tego że był kiedyś budowany na NE555.
    A w zasadzie to to nawet nie są wady. Serwo z definicji ma być sterowane impulsami 50Hz. Więc jak nie przychodzą odpowiednie impulsy to serwo nie powinno pracować (bo nie ma pewności że impulsy niosą wtedy poprawną informację o pozycji). I taki układ na NE555 to realizuje.
    Ale dzisiaj mamy wiele układów dedykowanych do sterowania serw (ASIC) które działają inaczej.
    Np. może tam być układ czasowy z przerzutnikiem. Sterownik może przy narastającym zboczu impulsu rozładować szybko kondensator i ładować go stałym prądem aż do zbocza opadającego impulsu. Czyli napięcie wzrośnie do wartości zależnej od czasu trwania impulsu. I mógł by działać w szerokim zakresie częstotliwości. Od praktycznie 0 do 500Hz.
    Za przerzutnikiem układ pamiętający (wyzwalany zboczem opadającym impulsu). Czyli pamiętający napięcie uzyskane z impulsu (a więc pamiętający czas impulsu) przez długi czas.
    Potem wzmacniacz błędu i mostek H do silnika. Taki układ wzmacniacza błędu, mając zapamiętane napięcie z układu mierzącego czas trwania impulsu, może działać ciągle.
    Po pierwsze jego działanie nie zależało by od częstotliwości przychodzących impulsów.
    Po drugie w ogóle nie zależało by od przychodzących impulsów. Nawet bez impulsów wzmacniacz działa i mechaniczne przesunięcie ramienia spowoduje wysterowanie mostka H.
    I właśnie takie sterowniki są montowane w dzisiejszych serwach*2.
    Stąd możliwość ich sterowania pojedynczymi impulsami oraz nietypowymi częstotliwościami.
    Ale pewności co do działania tych dzisiejszych chińskich sterowników nie można mieć. Dlatego mimo wszystko lepiej sterować normalnie. Ciągłymi impulsami i o częstotliwości około 50Hz.

    *2 Wiem bo sprawdzałem oscyloskopem przebiegi w serwach MG995. Coś nie działało za dobrze (serwo drgało i miało mały zakres ruchu) i myślałem że uda mi się to naprawić. Z tego co zauważyłem to coś podobnego siedzi w nowych SG90.
    Ale są jakieś różnice w stosunku do serw które kupiłem kilka lat temu. Dlatego nie można mieć pewności i lepiej sterować serwami normalnie.
  • #18
    User removed account
    User removed account  
  • #20
    User removed account
    User removed account  
  • #21
    atom1477
    Level 43  
    No tak, określenie PWM jest tu jak najbardziej technicznie poprawne.
    To to w powszechnym użyciu jest niepoprawne albo może nieprecyzyjne.
    Piotrus_999 wrote:
    A tak przy okazji to jest poprawne w 100% tyle ze wypełnienie jest od 2 do 4%

    Poprawne będzie wtedy gdy będzie podane zgodnie z definicją PWMa: czyli długość impulsu.
    Czyli od 1 do 2ms.
    Podane w % to właśnie to nieprawne/nieprecyzyjne.
    W % się podaje modulację wypełnienia.
  • #22
    Goodmoon
    Level 9  
    Trochę naciągacie fakty ;)
    Standardowy zakres sygnałów dla serwa to 1ms .. 2ms, więc przy powtarzaniu 20ms daje 5% .. 10%.
    Nawet dla rozszerzonego zakresu sterowania będzie inny niż podaliście :)
  • #23
    User removed account
    User removed account