SERWO „CYFROWE”

spowiedź niedowiarka


Jesteś osobą na tej stronie

W dniu 07.02.2007 na pl.rec.elektronika rozgorzała dyskusja zainicjowana przez Kolegę „wkwj” w temacie serwo cyfrowe. W dyskusji występowałem w roli totalnego niedowiarka, który twierdził, że w zwykłym komutatorowym silniku DC nie da się pozycjonować wirnika z dokładnością do jednego stopnia. Wielu Kolegów z grupy było całkowicie odmiennego zdania. W związku z tym postanowiłem wyważyć otwarte drzwi i spróbować:

Ponieważ problem gryzł mnie coraz bardziej (do tego stopnia, że zasnąć nie mogłem), zestawiłem „stanowisko badawcze” (cudzysłów jest tu jak najbardziej na miejscu :-) aby na własnej skórze odczuć (bądź nie) jak się sprawy mają.

W rolach głównych w doświadczeniu udział wzięły:

w rolach drugoplanowych (nie mających znaczenia w przebiegu doświadczenia):

oraz materiały i narzędzia pomocnicze:


Prymitywność „stanowiska badawczego” wynikała z braku środków, ale była też częściowo zamierzona. Wyszedłem z założenia, że jeżeli w tak prowizorycznych warunkach uda mi się osiągnąć cokolwiek sensownego, to przy precyzyjnym wykonaniu mechanicznym będzie to tym bardziej możliwe.

Jeśli chodzi o układ „sterownika” to już chciałem trawić płytkę, albo klecić coś na płytce prototypowej, gdy skojarzyłem sobie, że w zasadzie mam gotowca, którym jest... zaprojektowany jakiś czas temu modelarski regulator silnika BLDC. Pogoda nieciekawa, latadła i tak kurzą się na szafie, więc jeden regulator mogę poświęcić (tym bardziej, że w zasadzie nie zrobię mu żadnej krzywdy). Regulator ten posiada na wyjściu trójfazowy mostek na tranzystorach MOSFET. Wystarczyło wykorzystać dwie gałęzie i w ten sposób uzyskać klasyczny mostek H do sterowania silnikiem DC.

Schemat części elektronicznej po uproszczeniu do potrzeb silnika DC jest poniżej

Pozostało w zasadzie podpiąć enkoder i oprogramować to wszystko. Ponieważ posiadany enkoder ma wyjścia różnicowe musiałem po drodze zastosować układ dopasowujący (wspomniany AM26LS32). Sygnał fazy A enkodera doprowadzony jest na wejście przerwań INT0, faza B w zasadzie na dowolny pin wejściowy (w regulatorze akurat miałem na ATmedze wolną nogę PC4). Enkoder daje jeszcze trzeci sygnał dla punktu „0”, ale w tym układzie nie jest on wykorzystywany.

Widok całości jest poniżej

Algorytm obsługi enkodera jest klasyczny. Opadające zbocze fazy A wywołuje przerwanie, w którym testowany jest stan fazy B. Procedura obsługi przerwania jest zoptymalizowana pod kątem czasu wykonania (zmienne w rejestrach itp.) aby uniknąć utraty impulsów z enkodera. Przy taktowaniu procesora zegarem 8MHz czas obsługi przerwania nie przekracza 2,3us. Podczas próby zasiliłem silnik bezpośrednio ze źródła o napięciu 12V i na wyjściu enkodera otrzymałem falę prostokątną o okresie 18us. Czyli w tej sytuacji śmiało mogłem założyć, że nie nastąpi w tym układzie „zgubienie” sygnału enkodera.

Kod źródłowy WinAVR (samo„serce” algorytmu z pominięciem bootloadera, procedur komunikacyjnych z PC, i programowo sprzętowego PWM itp.) jest tutaj
Oraz film (4,7MB) z przebiegu doświadczenia. Na początku filmu układ miał małe tłumienie i widać silne oscylacje wokół punktu pozycjonowania. W dalszej części tłumienie jest zwiększone i układ po kilku wahnięciach stabilizuje się w zadanym punkcie. Diody LED sygnalizują kierunek obrotów silnika. Zgaśnięcie obu LED-ów oznacza osiągnięcie zadanego położenia wirnika. Przy tych próbach najczęściej zadawałem pozycję 0 i 2000 tak aby silnik wykonywał pełny obrót. Kolejne sceny to próby wykonywania pojedynczych kroków i tu zauważyłem to co budziło moje wątpliwości. Przy niektórych położeniach wirnik miał wyraźnie większe trudności w osiągnięciu zadanej pozycji. Podejrzewam, że miał na to wpływ niekorzystny układ szczotek na wycinkach komutatora, kiepski styk szczotka-komutator itp. Pod koniec widać reakcję ukłądu na próbę wytrącenia z równowagi siłą zewnętrzną i walnięciem pięścią w stół :-)

Pisząc oprogramowanie celowo nie sugerowałem się teorią sterowników PID i klepałem je dosłownie na wyczucie. Nie wiem czy uzyskałem w ten sposób kontroler PI, PID, PIT, CIT czy VAT ;-), ale największym dla mnie szokiem (w pozytywnym tego słowa znaczeniu) było to, że ten układ DZIAŁA !!! Wał silnika udało się pozycjonować z dokładnością do jednego impulsu enkodera czyli 360/2000 = 0,18° !!! W pierwszej wersji programu pojawiały się dość silne oscylacje wokół punktu pozycjonowania. W tej chwili udało mi się je dość mocno ograniczyć, ale ich wyeliminowanie będzie trudne (w sumie w silniku krokowym też one występują). Choć przy nadkrytycznym tłumieniu układu powinny zaniknąć... W modelowym układzie nie było żadnego koła zamachowego, ciężkiego suportu itp. więc bezwładność była mała. Jednak celem doświadczenia było stwierdzenie czy da się dokładnie ustawić wał silnika DC pod określonym kątem, a dynamika tego układu to już oddzielny problem.


Wobec przytłaczających dowodów doświadczalnych

OŚWIADCZAM

nie miałem racji twierdząc na grupie, że: nie da się ustawić wału silnika komutatorowego DC z dokładnością 1°.


i co gorsza sam sobie będę teraz musiał dać „konia z rzędem”...


Niniejszym chylę czoła Kolegom z grupy dyskusyjnej pl.rec.elektronika:

RoManowi Madziejewiczowi,

J.F.,

Łukaszowi Spychalskiemu,

wkwj za wywołanie III WŚ ;-),

a w szczególności Koledze Markowi Lewandowskiemu, z którym dyskusja była najbardziej zaciekła i którego chcę równocześnie przeprosić za swój skrajny sceptycyzm (ale taki juz jestem, że jak sam łapą nie dotknę, to nie uwierzę, że gorące).

Ponadto chciałbym przeprosić jakąś małą chińską fabryczkę produkującą silniczki do drukarek HP za to, że tak nisko oceniałem ich produkt...


P.S. Aktualnie mam na stole głównego podejrzaniego w całej okazałości.
Jest to kompletny mechanizm drukarki HP DeskJet 660. Zobaczymy co z tego wyjdzie...

Pozdrawiam Wszystkich

serwoniedowiarek

Grzegorz Kurczyk

grzegorz@control.slupsk.pl
GG: 1445218