Základy robotiky 2014 Projekt M12 Implementace regulátoru otáček do budičů BLDC motorů Vypracoval: Vladimír Stříteský (studijní skupina: M1KAM/05) Vedoucí práce: ing. Vlastimil Kříž
Obsah: Zadání projektu:... 3 Popis HW... 3 Návrh SW... 4 Komutace motoru... 4 Funkce pro komutaci... 5 Funkce pro běh motoru... 6 Komunikace IIC... 6 Funkce pro komunikaci... 6 Návrh převodníku RS232-IIC... 7 Realizace a testování... 8 Závěr... 9 Literatura... 9
Zadání projektu: Implementujte regulaci otáček do předloženého budiče BLDC motorů projektu MikroKopter BL-Ctrl 2.0. Regulátor bude také posílat do nadřazeného systému informace o aktuální rychlosti motorů, případně i odebíraném proudu. Obr. 1 MikroKopter 2.0 [1] Popis HW Hardware modulu MikroKopter 2.0 je založen na mikrokontroléru Atmel ATmega 168P. Dále jsou zde přítomny pomocné obvody sloužící k detekci polohy motoru, měření teploty, proudu a napájecího napětí. Nesmí samozřejmě chybět obvod pro stabilizaci napětí, v tomto případě na 5V, a dvojice červená a zelená LED k jednoduché signalizaci. Zajímavě je pak řešena část ovládající šestici výkonových MOS-FET. Spodní polovina transistorů, která připíná nulové napětí, je ovládaná přímo mikropočítačem. Spínání horní poloviny je zajištěno pomocnými tranzistory, a je řešeno tak, aby mohl být sepnut libovolný tranzistor jedním společným výstupem z mikropočítače. Pulsní šířkovou modulaci tak stačí přivést na jeden výstupní pin. Tímto se velmi zjednoduší celkové ovládání výkonové části, protože generování PWM na daném pinu je hardwarově zajištěno pomocí funkce 16 bitového čítače/časovače. Zároveň je to ale dosti nešťastné řešení jelikož zbývající dva čítače/časovače jsou již pouze 8 bitové. Obr. 2 Zapojení výkonové části [2]
Návrh SW Software byl napsán v prostředí AVR Studio 6.1, které je vyvíjeno přímo společností Atmel. Jsou zde tudíž k dispozici knihovny pro všechny mikrokontroléry typu AVR vyráběné touto firmou. Komutace motoru Základní funkcí navrženého software je zajistit správnou komutaci vstupů BLDC motoru. Každá elektrická otáčka se skládá ze šesti kroků, přičemž v každém z nich je sepnuta jiná dvojice tranzistorů, tak aby se vytvořilo rotující magnetické pole. Obr. 3 Komutace BLDC motoru [3] Toho lze dosáhnout pouze, pokud známe aktuální rychlost a polohu rotoru vůči statoru. Ta je detekována v každém kroku komutace tak, že se na právě nevyužité fázi detekuje průchod napětí nulou. V ideálním případě k tomu dojde přesně 30 elektrické otáčky po komutaci, tedy 30 před další komutací. Bohužel obvod použitý pro detekci otáček obsahuje RC články, které způsobují zpoždění detekce, což musíme kompenzovat, obzvláště ve vysokých otáčkách. Obr. 4 Průběh fázového napětí v nízkých otáčkách
Obr. 5 Fázové napětí ve vysokých otáčkách bez kompenzace Funkce pro komutaci setphase(unsigned char step) Tato funkce zajišťuje šesti-krokovou komutaci. Vstupním parametrem je číslo požadovaného kroku v rozmezí 1-6. Při zadání čísla 7 se aktivuje celá spodní polovina tranzistorů a dojde tak k brždění. Pro jakékoli jiné číslo dojde k deaktivaci všech tranzistorů, motor se pak voně dotočí. setpwm(unsigned int pwm) Touto funkcí se řídí střída spínání horních transistorů. Vstupní parametr může nabývat hodnot 0-511, přičemž 0 znamená zastavení motoru a 511 plný výkon. zerodetect(unsigned char step) Nastaví analogový komparátor na příslušnou nevyužitou fázi a aktivuje přerušení při průchodu nulou. Obr. 6 Průběh napětí na komparátoru
nextstep() Vykoná následující krok komutace. Využívá globální proměnou step a rotation. Posune hodnotu step v kladném směru při rotation = 1, opačně při rotation = 0. Následně se zavolají všechny předchozí funkce. cycletimer(unsigned char run) Při vstupním parametru run = 1 vynuluje a spustí časovač pro měření doby jednoho kroku. Pro 0 pak časovač zastaví. Funkce pro běh motoru startengine() Nejnáročnější operace je právě rozběh motoru. Při spouštění motoru nemáme informaci o jeho poloze, tudíž musíme motor rozeběhnout naslepo čili v otevřené smyčce bez zpětné vazby. Nejprve se na 300ms aktivuje první krok, poté se provedou další 4 kroky s periodou 30ms. Při pátém kroku se s předstihem spustí časovač a řízení se přepne na zpětnovazební (openloop = 0). Posledních 5 kroků se případně opakuje tak dlouho, dokud se rozběh nepodaří. Poté se přepne dělička časovače z 8 na 1, což zajistí přesnější měření i při vysokých otáčkách. stopengine(unsigned char brake) Dojde k vypnutí všech časovačů a fáze se nastaví tak aby došlo k zastavení motoru. Při brake = 1 dojde k rychlému brždění, při 0 se motor volně dotočí. regulationloop() Velice primitivní funkce pro dosažení požadovaných otáček. Porovnává požadovanou a skutečnou periodu jednoho kroku, podle toho pak zvyšuje či snižuje střídu PWM, čímž dochází k regulaci rychlosti. Tuto funkci by bylo vhodné zdokonalit ale bohužel na to již nezbyl čas. Komunikace IIC Komunikace mezi měničem a nadřazeným systémem probíhá dle protokolu IIC. Měnič je vždy nastaven ve slave módu a jeho adresa je dána následujícím způsobem. Nejvyšší 4 bity jsou pevně dané na 0111. Následující 3 bity jsou pak určeny podle vyznačených pájecích zkratovacích propojek, přičemž bez propojky je na daném bitu 1. Adresa tedy nabývá hodnot 0111000 0111111. Samotná komunikace je pak velice jednoduchá. Pokud měnič detekuje svoji adresu následovanou write bitem (nebo obecné volání pro zápis) očekává, že budou následovat další 2 byty s požadovanou hodnotou otáček za minutu (RPM), první byte je MSB. Tato hodnota je ve formátu int16, tedy v rozsahu -32 768 až 32 767. Pro záporné hodnoty se nastaví směr otáčení na opačný. Pokud adresu následuje read bit, měnič přejde do vysílacího módu a odešle data o posledních naměřených otáčkách, ve stejném formátu jako je přijímá. Funkce pro komunikaci initiicslave() Provede inicializaci komunikačního rozhraní. Volá funkci getiicaddress.
unsigned char getiicaddress() Provede kontrolu napájených propojek a vrátí zjištěnou adresu. setrpm(int RPM) Přepočte požadované otáčky na požadovanou periodu jednoho kroku a nastaví šířku PWM zhruba na požadovanou hodnotu. Pro přesné nastavení otáček pak slouží regulační smyčka. int getrpm() Vrátí poslední naměřenou periodu jednoho kroku přepočítanou na otáčky za minutu (RPM). LEDGR(unsigned int GR) Pro parametr GR = 1 rozsvítí zelenou LED, pro 0 červenou. Návrh převodníku RS232-IIC Pro testování navrženého software měniče bylo zapotřebí vyzkoušet i funkčnost komunikace. Za tímto účelem byl sestrojen na nepájivém poli jednoduchý převodník z RS232 na IIC. Je zde využit mikroprocesor (byl zrovna po ruce) ATtiny 13. Ten však nemá hardwarovou podporu ani UART ani IIC, proto je komunikace zajištěna čistě softwarově. Pro převod napěťových úrovní slouží obvod MAX232. Komunikace ze strany RS232 probíhá s rychlostí 9600bps. Pokud první přijatý byte končí nulou, write bitem, pak se vyčkává na další 2 byty (LSB první). V okamžiku kdy dorazí, odešlou se po sériové lince zpět jako potvrzení o příjmu. Následuje odeslání přijatých dat po IIC v pořadí adresa, MSB, LSB. Obr. 7 Průběh IIC zápisu (vypnutá detekce ACK) V případě že první byte končí 1, tedy read bitem, dojde ihned ke zpětnému přeposlání opět jako potvrzení příjmu. Následně se odešle přijatý byte po IIC. Pokud žádné zařízení nepotvrdí příjem
pomocí ACK, odešlou se po sériové lince zpět dva prázdné byty. Pokud příjem potvrdí, následuje čtení 2 datových bytů (MSB první), které se pak vrátí po sériové lince v opačném pořadí (LSB první). Realizace a testování Zkompilovaný program byl nahrán do mikropočítače pomocí vyvedeného SPI rozhraní. K tomuto účelu bylo využito zařízení AVRprog USB v2. Stejným způsobem byl program nahrán i do převodníku UART-IIC. Zařízení byla navzájem propojena, motor byl použit Turnigy Aerodrive 1130kv. Funkčnost komunikace byla ověřena pomocí převodníku USB-RS232 a programu RealTerm 2.0.0.70. K měření otáček posloužil podomácku sestrojený bezkontaktní měřicí přístroj. Obr. 8 Testovací zapojení Obr. 9 Přístroj pro bezkontaktní měření otáček
Závěr Podařilo se vytvořit jednoduchý funkční software pro měnič BLDC motoru komunikující pomocí IIC. V návrhu hardware jsem objevil několik poměrně významných nedokonalostí. Především použití výstupu jediného dostupného 16 bitového čítače pro generování PWM a návrh obvodu pro vytvoření virtuální nuly motoru, který obsahuje RC články, které zpožďují detekci průchodu nulou. Tyto záležitosti značně komplikovaly návrh softwaru. Z nedostatku času pak nebyl implementován plnohodnotný regulátor otáček ale pouze velmi zjednodušená funkce minimalizující odchylku od požadované hodnoty pomocí inkrementace či dekrementace šířky pulsu. Do budoucna by také bylo užitečné přidat do programu obsluhu dalších obvodů přítomných na desce, tedy měření odebíraného proudu, teploty a napětí akumulátorů. Literatura [1] MikroKopter. [online]. [cit. 2014-05-08]. Dostupné z: http://www.mikrokopter.de/ucwiki/en/bl-ctrl_2.0 [2] MikroKopter. Wiring diagram [online]. [cit. 2014-05-08]. Dostupné z: http://mikrocontroller.com/files/bl_ctrl_v2_0_doku.pdf [3] DUŠEK, Miroslav. Quadrotor - dálkové řízení. Praha, 2011. Diplomová práce. ČVUT FEL.