PWM elve, mikroszervó motor vezérlése MiniRISC processzoron F1. A mikroprocesszorok, mint digitális eszközök, ritkán rendelkeznek közvetlen analóg kimeneti jelet biztosító perifériával, tehát valódi, minőségi digitális-analóg konverterrel (DAC). Kis pontossági igények, illetve lassú kimeneti jelváltozási sebesség esetén a DAC kimeneti jele jól helyettesíthető egy digitális pulzussorozat átlagolásával megkapható analóg kimeneti jellel. Az átlagolást a legegyszerűbb RC simító/átlagoló szűrővel elvégezve, elfogadható minőségű kimeneti jelet kapunk. A digitális pulzussorozat egy rögzített periódusidejű, (T PWM ), de változó pulzusszélességű (T w <T PWM ) jel, aminek a hosszúidejű átlaga (feltételezve a CMOS logikai jelszintek névleges V H =V cc és V L =GND értékét) a következő V ki analóg = V cc * (T w /T PWM ) Ideális átlagolást feltételezve a V ki analóg kimeneti DC szint a következő: Az ideális átlagolás csak megközelíthető. A gyakorlatban LC (induktivitás-kapacitás) vagy RC (ellenálláskapacitás) alkatrészekből felépített alacsony frekvenciás szűrőket alkalmaznak. Amennyiben az átlagoló szűrő határfrekvenciája jóval az f PWM =1/T PWM érték alatt van, akkor az U ki analóg jel már egy elfogadhatóan kisimított DC átlagértéket reprezentál. Az ábrán a t=0 időpillanatban indított, kék színnel jelölt digitális PWM jelet 3 szűrőfokozaton vezetjük keresztül, melyek kimenetei sorrendben: RC1 lila, RC2 piros, RC3 zöld, mely kimenet bár lassan éri el, de egészen kis ingadozással kiadja a 3,75V kimeneti analóg jelszintet, a PWM jel 75%-os kitöltési tényezőjének megfelelően.
A változó pulzusszélességű kimeneti jel sokszor nem csak átlagolás után, hanem közvetlenül is felhasználható. Ilyen alkalmazás pl. a LED diódák fényerő vezérlése digitális PWM jellel, ahol a szükséges simítást, átlagolást a szemünk tehetetlensége végzi el. További alkalmazási terület pl. a mikroszervó motor vezérlése, ahol a pulzusszélesség, mint a szögelfordulás időskálára konvertált lineáris kódja szerepel és vezérli a mikroszervó motort a megfelelő pozícióba. (Emlékezzünk a félév elején tanult ofszet számábrázolási kódra!) A vezérlő jelet folyamatosan fenn kell tartanunk, mert a mikroszervó belső szabályozó áramkörei csak akkor tudják az adott pozíciót stabilan tartani. F1.a. Tervezzünk egy olyan digitális hardver egységet, ami legalább 0,5% pontossággal képes PWM pulzusszélesség modulált jelet előállítani. A T w pulzusszélesség egy 8 bites bemeneti változóval adható meg (pl. a LOGSYS kártyán az SW kapcsolóval.) A T periódusidő legyen ms nagyságrendű. Adjuk meg az egység Verilog HDL kódját! Alkalmazzuk a kimenetet LED fényerő vezérlésére! A LED PWM hardveres digitális megoldása a fenti paraméterek szerint 3 funkcionális elemet igényel. A LOGSYS kártya 16MHz-es órajelét egy 10 bites bináris számlálóval leosztjuk 64us-ra. Ezzel működtetjük a 8 bites PWM periódusidő mérőt, ami így 64us*256 = 16,384 ms idejű periódust állít be, ami kb. 61Hz frekvenciának felel meg. A kimeneti PWM jel előállítása egyszerű: A 8 bites SW kapcsoló értéket komparáljuk a PWM számláló értékéhez. Amíg az SW nagyobb, addig a kimeneti jel 1, ha már kisebb, akkor a kimeneti jel 0 lesz. A komparálási operátortól függően ( > vagy >= ) a PWM határok 0 99,6% vagy 0,39 100% tartományban használható, de biztosan jobb, mint 0,5% beállítási pontosság/felbontás mellett. A PWM egység Verilog HDL kódja (csak a lényeges kódrészletek): 10 bites előosztó a 64us ütemező jelhez: A PWM generátor egység, 8 bites számláló és komparátor:
F1.b Készítsünk egy PWM kimeneti jelet előállító programot, a processzor TIMER perifériáját használva a kimeneti jel vezérléséhez! A programban a fenti időzítéseket használhatjuk. A TIMER-t beállítjuk 64us-os, periódikus időzítésre. Ennek ütemében működtetünk egy regiszter alapú 8 bites PWM számlálót (r1), amit komparálunk a kapcsoló perifériáról beolvasott értékkel (r2). Az induláskor bekapcsolt LED-eket addig hagyjuk bekapcsolva, amíg a PWM számláló értéke kisebb az SW kapcsolókon beállított értéknél. Amint a PWM számláló eléri az SW kapcsolókon beállított értéket, (tehát r1-r2 =0x00) a LED-eket kikapcsoljuk. A LEDek addig maradnak kikapcsolva, amíg a PWM számláló a 255 végértéket elérve át nem fordul és felveszi a 0x00 értéket.
F1.c A mikroszervó motorok vezérlése hasonló jelalakú pulzussorozattal történik, adott előírások betartása mellett. A motorok nem precíziós alkatrészek, elsősorban modellek, távirányításos játékok működtetésére szolgálnak, tehát a specifikáció csak közelítőleg, jellegére teljesül. A kívánt vezérlőjel jellemzően egy 1ms-2ms közötti pulzusszélességű jelsorozat, aminek frekvenciája 50-100 Hz közötti, azaz periódusideje 10-20ms. Válasszunk egyszerűen kezelhető időzítési paramétereket a MiniRISC processzor paraméterihez alkalmazkodva! A mikroszervó motor vezérléséhez az 1ms 2ms impulzus szélesség könnyű és megfelelő felbontású beállíthatósága a legfontosabb szempont. Ha a 8 bites értékkel szeretnénk átfogni a teljes változást jelentő 1ms időtartományt, ahhoz 1000/256 = 3,9us -> 4us alapütemezést érdemes választanunk. Ezzel az 1ms 1,024ms-ra adódik, ez a mikroszervó szempontjából nem okoz problémát. A teljes pulzusszélesség beállításához szükséges 1ms ofszet numerikus értéke 256. A teljes periódusidőt ~16ms-ra választva a 4us ütemezéssel egy 12 bites szoftver számlálót használhatunk a teljes periódus időzítéséhez.
F1.d Készítsünk el egy olyan programot, amelyben a mikroszervó vezérlése megszakításos működéssel, az ISR megszakítás kiszolgáló szubrutinon belül történik! A TIMER ISR egy regiszterpárban kapja meg a kimeneten beállítandó impulzusszélesség időtartamát, 4us-os időkvantumot feltételezve. Ennek megfelelően a kapott érték 256 511 között változhat, a középérték 383. A 12 bites vezérlőjel periódust az (r11:r10) regiszterpárban realizált számláló méri. Ennek aktuális értékéhez hasonlítjuk az (r13:r12) regiszterpárban beállított pulzusszélességet. Az összehasonlítás 16 bites aritmetikát használva történik. Az eredményt jelző C flag értékét léptetési műveletekkel másoljuk a GPIO_C[1] kimenetként konfigurált portlábra.