Fórum témák
» Több friss téma |
Cikkek » Launchpad: ismerkedés az MSP430 mikrovezérlőkkel III. Launchpad: ismerkedés az MSP430 mikrovezérlőkkel III.
Szerző: icserny, idő: Jún 19, 2012, Olvasva: 20567, Oldal olvasási idő: kb. 4 perc
Impulzus-szélesség moduláció (PWM)Az időzítő/számláló egységek egyik felhasználási területe a digitális jelsorozattal történő vezérlés, impulzus-szélesség moduláció segítségével (PWM = Pulse Width Modulation), amelynél olyan állandó frekvenciájú jeleket keltünk, ahol a szabályozás a jel kitöltési tényezőjének változtatásával történik. Néhány különböző kitöltési tényezőjű PWM jelet mutat be a következő ábra: 9_1. ábra: Azonos periódusú, de különböző kitöltésű impulzus-sorozatok A PWM üzemmódok részletes ismertetése az MSP430x2xx Family Users Guide kézikönyv 12. fejezetében, valamint a cikksorozatom második részének 8. oldalán található. Itt most csak a korábbi példaprogramok új kiadású Launchpad kártyára történő adaptálására szorítkozunk. 2_pwm_softA PWM alapjainak megértéséhez először szoftveresen állítunk elő PWM jelet, az időzítésekhez LED villogtatásnál már megszokott késleltető függvényeket használva. A programban a PWM jel segítségével a LED1 fényerejét változtatjuk folyamatosan, mintha a LED "lélegezne". A szükséges változtatások: A program nem igényel módosítást (csak a mikrovezérlő típusát kell átállítani a projektben). 2_pwm_ledEbben a programban már felhasználjuk a Timer_A modul nyújtotta hardveres támogatást a PWM jel előállítására. Most LED2 fényerejét változtatjuk, mivel ehhez a LED-hez kapcsolódik hardveres Compare kimenet (a TA0.1 kimenet). A PWM frekvenciát 100 Hz-nek választottuk meg (kisebb frekvencia esetén a szemünk már észrevenné a "repkedést"), a kitöltést pedig ~2 s alatt 0-tól 200-ig (pontosabban csak 198-ig) változtatjuk. A kitöltést nem lineárisan, hanem négyzetesen növekedő számokkal állítjuk be, tehát a 0, 1, 4, 9, 16, 25, ... stb. sorozatot állítjuk elő.A szemünk így egyenletesebbnek érzékeli a fényerő változásokat. Üzemmód beállítások
A PWM mód beállításához TACCR0-ba írjuk a periódust megszabó számot, 10 000 - 1-et, mivel a periódus TACCR0 + 1 lesz. A TACCR1 regiszterbe pedig a kitöltést írjuk. A kitöltés értéke egy 0 és TACCR0 közötti szám lehet. Előbbi a 0, utóbbi a 100 %-os kitöltési tényezőnek felel meg. Arra azonban ügyelnünk kell, hogy TACCR1 ne haladja meg TACCR0 értékét, mert akkor nem kapunk megszakítást (TAR sohasem éri el TACCR1 értékét)! A beállítások után a főprogramnak nem lesz több dolga, ezért aludni küldhetjük (MCLK lekapcsolható). Vigyáznunk kell azonban arra, hogy SMCLK és DCO nem kapcsolható le, ezért itt most csak az LPM0 módot használhatjuk. Az energiatakarékos módot beállító __low_power_mode_0() függvényhívás egyúttal az interrupt engedélyezését is elvégzi (az SR státusz regiszter GIE bitjét is '1'-be állítja. A szükséges változtatások: A megszakítási vektor neve: TIMERA1_VECTOR helyett TIMER0_A1_VECTOR. 2_pwm_led2Ez az előző példa módosított változata, amelyben a TIMERA0_VECTOR (CCIFG0) megszakításakor frissítjük a PWM kitöltés értékét. Itt arra kell ügyelnünk, hogy a kis kitöltési értékeket beállításával ne késsük le azt, hogy a Timer számlálója túlcsordul, majd felfelé lépkedve meghaladja a kitöltés értéket. Ehhez az MCLK értékét minél magasabbra frekvenciájúnak, Timer_A bemenőjelét pedig minél alacsonyabb frekvenciájúnak célszerű megválasztani, Ebben a példában MCLK = 1 MHz (DCO), Timer_A bemenőjelét pedig az ACLK, a VLO 12 kHz-es órajele szolgáltatja. Az ACLK = 12 kHz-es órajel miatt a 100 Hz-es PWM frekvencia biztosításához 1200 impulzust kell leszámolni, tehát TACCR0 = 119 legyen. A LED kb. 2 s-os félperiódusa alatt 200 lépésben négyzetesen növekvő kitöltést adunk meg, a következő 200 periódusban pedig csökkenő kitöltéssel lépkedünk vissza. Most végrehajthatunk 200 lépést, nem kell a TACCR1 < TACCR0 feltétel teljesülésével foglalkoznunk, mert a 0. sorszámú Capture/Compare csatornából garantáltan kapunk megszakítást, 100 %-os kitöltésnél sem "akad el" a programunk! Üzemmód beállítások
A szükséges változtatások: A megszakítási vektor neve: TIMERA0_VECTOR helyett TIMER0_A0_VECTOR. 2_pwm_contA PWM üzemmódoknál a TACCR0 csatorna hivatalosan a PWM frekvencia beállítására szolgál (a Timer modul TAR számlálja a futó időt, TACCR0 pedig a periódust állítja be). Egy kis trükközéssel azonban megoldható, hogy TACCR0 felszabaduljon, és egy további PWM csatorna vezérlésre használhassuk: a számlálót szabadonfutó módban járatjuk, s a TACCR0 és TACCR1 regiszterekbe mindig a következő rész-ciklus (a bekapcsolt vagy kikapcsolt állapot időtartama) időzítését írjuk (a TAR regiszter pillanatnyi állapotához hozzáadva a kívánt várakozási időhöz tartozó óraütések számát). Erre mutatunk be most egy példát, amelyben LED1 1 s-os periódussal villog, állandó 1/60 kitöltéssel. Ez ugyan nem a szokványos módja a PWM használatának, de nem akartam bonyolítani a programot a kitöltési tényező változtatásával. LED2 pedig a korábbiakhoz hasonlóan a "lélegző LED" műsorát adja elő: fényereje fokozatosan erősödik, majd elhalványul. Periódusa ~3,4 s Üzemmód beállítások
A szükséges változtatások: A megszakítási vektorok neve TIMERA0_VECTOR helyett TIMER0_A0_VECTOR,TIMERA1_VECTOR helyett pedig TIMER0_A1_VECTOR. A cikk még nem ért véget, lapozz! Értékeléshez bejelentkezés szükséges! |
Bejelentkezés
Hirdetés |