SERWO „CYFROWE”
spowiedź niedowiarka
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:
głowny podejrzany – silnik komutatorowy DC z napędu głowicy drukarki HP DeskJet 660 (dokładnie taki o jakim wspominał autor wątku)
przemysłowy, obrotowy enkoder inkrementacyjny o rozdzielczości 2000imp/obr typu MOK 2000/5 BZ
„wał” niezwykle giętki ;-) w postaci kawałka wężyka igielitowego do mechanicznego połączenia osi silnika z osią enkodera
„sterownik” z mikrokontrolerem ATmega8L sterujący mostek H na MOSFET-ach
w rolach drugoplanowych (nie mających znaczenia w przebiegu doświadczenia):
układ konwersji różnicowego sygnału enkodera do standardu TTL (AM26LS32ACN)
układ konwersji napięć RS232<->TTL (na dwóch tranzystorach i kilku opornikach)
oraz materiały i narzędzia pomocnicze:
ściski stolarskie 2szt.
wysokogatunkowa masa plastyczna do użytku szkolnego czyli... plastelina ;-)
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żejAlgorytm 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 tutajPiszą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
iż 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