- Zatiči PWM v mikrokrmilniku AVR Atmega16
- Kaj je signal PWM?
- Potrebne komponente
- Shema vezja
- Programiranje Atmega16 za PWM
Modulacija širine impulza (PWM) je močna tehnika, pri kateri se širina impulza spreminja tako, da frekvenca ostane konstantna. Tehnika se danes uporablja v mnogih nadzornih sistemih. Uporaba PWM ni omejena in se uporablja v širokem spektru aplikacij, kot so nadzor hitrosti motorja, merjenje, nadzor moči in komunikacija itd. V PWM tehniki lahko z digitalnimi signali enostavno generiramo analogni izhodni signal. Ta vadnica vam bo pomagala pri razumevanju PWM, njegovih terminologij in kako ga lahko uporabimo z mikrokrmilnikom. V tej vadnici bomo prikazali PWM z mikrokrmilnikom AVR Atmega16 s spreminjanjem jakosti LED.
Če želite podrobno razumeti osnove PWM, pojdite na naše prejšnje vadnice o PWM z različnimi mikrokrmilniki:
- Vadnica za ARM7-LPC2148 PWM: Nadzor svetlosti LED
- Modulacija širine impulza (PWM) z uporabo MSP430G2: Nadzor svetlosti LED
- Ustvarjanje PWM z uporabo mikrokrmilnika PIC z MPLAB in XC8
- Modulacija širine impulza (PWM) v STM32F103C8: nadzor hitrosti enosmernega ventilatorja
- Ustvarjanje PWM signalov na GPIO nožicah mikrokrmilnika PIC
- Vadnica za PWM Raspberry Pi
Zatiči PWM v mikrokrmilniku AVR Atmega16
Atmega16 ima štiri namenske PWM nožice. Ti zatiči so PB3 (OC0), PD4 (OC1B), PD5 (OC1A), PD7 (OC2).
Tudi Atmega16 ima dva 8-bitnih časovnikov in en 16 bitni časovnik. Timer0 in Timer2 sta 8-bitna časovnika, medtem ko je Timer1 16-bitni časovnik. Za generiranje PWM moramo imeti pregled časovnikov, saj se časovniki uporabljajo za generiranje PWM. Kot vemo, da je frekvenca število ciklov na sekundo, pri katerem deluje časovnik. Torej višja frekvenca nam bo omogočila hitrejši časovnik. Pri generiranju PWM bo hitrejša frekvenca PWM dala boljši nadzor nad izhodom, ker se lahko hitreje odzove na nove delovne cikle PWM.
V tej vadnici Atmega16 PWM bomo uporabili Timer2. Izberete lahko kateri koli delovni cikel. Če ne veste, kaj je delovni cikel v PWM, potem pogovorimo na kratko.
Kaj je signal PWM?
Modulacija širine impulza (PWM) je digitalni signal, ki se najpogosteje uporablja v krmilnih vezjih. Čas, v katerem signal ostane visok, se imenuje "on time", čas, v katerem signal ostane nizek, pa "off time". Kot sta opisana spodaj, obstajata dva pomembna parametra za PWM:
Delovni cikel PWM
Odstotek časa, v katerem signal PWM ostane VISOK (pravočasno), se imenuje delovni cikel.
Tako kot pri impulznem signalu 100ms, če je signal VISOK za 50ms in NIZKI za 50ms, pomeni, da je bil impulz polčas VISOK in polčas NIZK. Tako lahko rečemo, da je delovni cikel 50%. Podobno je, če je impulz v VISOKEM stanju 25ms in 75ms V NIZKEM stanju od 100ms, potem bi bil delovni cikel 25%. Upoštevajte, da izračunamo samo trajanje VISOKEGA stanja. Za vizualno razumevanje si lahko ogledate spodnjo sliko. Formula delovnega cikla je potem,
Delovni cikel (%) = čas vklopa / (čas vklopa + čas izklopa)
Tako lahko s spremembo delovnega cikla spremenimo širino PWM, kar povzroči spremembo svetlosti LED. Imeli bomo predstavitev uporabe drugačnega delovnega cikla pri nadzoru svetlosti LED. Preverite predstavitveni video na koncu te vadnice.
Po izbiri delovnega cikla bi bil naslednji korak izbira načina PWM. Način PWM določa, kako želite, da PWM deluje. Obstajajo predvsem 3 vrste načinov PWM. Ti so naslednji:
- Hiter PWM
- Fazna korektna PWM
- Fazni in frekvenčni pravilni PWM
Hitri PWM se uporablja tam, kjer fazna sprememba ni pomembna. Z uporabo hitrega PWM lahko hitro izpišemo vrednosti PWM. Hitrega PWM ni mogoče uporabiti tam, kjer fazna sprememba vpliva na delovanje, kot je krmiljenje motorja, zato se v takšni aplikaciji uporabljajo drugi načini PWM. Ker bomo nadzorovali svetlost LED, kjer sprememba faze ne bo vplivala veliko, bomo uporabili način hitrega PWM.
Zdaj za generiranje PWM bomo nadzorovali odštevanje notranjega časovnika in nato pri določenem štetju postavili nazaj na nič, tako da bo časovnik odšteval in nato vedno znova nastavljal na nič. To določa obdobje. Zdaj imamo možnost krmiljenja impulza, vklop impulza pri določenem številu v časovniku, medtem ko gre gor. Ko se števec vrne na 0, izklopite impulz. Pri tem je veliko prilagodljivosti, saj lahko vedno dostopate do števca časovnika in z enim časovnikom zagotovite različne impulze. To je super, če želite hkrati nadzorovati več LED. Zdaj začnimo povezovati eno LED z Atmega16 za PWM.
Tukaj preverite vse projekte, povezane s PWM.
Potrebne komponente
- Atmega16 AVR mikrokrmilnik IC
- Kristalni oscilator 16 MHz
- Dva kondenzatorja 100nF
- Dva kondenzatorja 22pF
- Pritisni gumb
- Jumper žice
- Breadboard
- USBASP v2.0
- 2 LED (poljubne barve)
Shema vezja
Za PWM uporabljamo OC2, tj. Pin21 (PD7). Torej priključite eno LED na PD7 pin Atmega16.
Programiranje Atmega16 za PWM
Celoten program je naveden spodaj. Zapiši program v Atmega16 s pomočjo JTAG in Atmel studia in si oglej učinek PWM na LED. Njegova svetlost se bo počasi povečevala in zmanjševala zaradi različnih delovnih ciklov PWM. Preverite video na koncu.
Začnite s programiranjem Atmega16 z nastavitvijo registra Timer2. Biti registra Timer2 so naslednji in jih lahko nastavimo ali ponastavimo v skladu s tem.
Zdaj bomo razpravljali o vseh bitih Timer2, da bomo lahko s pisnim programom dobili želeni PWM.
V registru Timer2 so v glavnem štirje deli:
FOC2 (Force Output Compare for Timer2): Bit FOC2 je nastavljen, ko bit WGM določa način, ki ni PWM.
WGM2 (način generiranja valov za merilnik časa): ti biti nadzorujejo zaporedno štetje števca, vir največje vrednosti (TOP) števca in vrsto generacije valov, ki naj se uporabi.
COM2 (Primerjaj izhodni način za timer2): ti bit nadzoruje izhodno vedenje. Celoten opis bitov je razložen spodaj.
TCCR2 - = (1 <
Za aktiviranje hitrega načina PWM nastavite bit WGM20 in WGM21 kot VISOKO. WGM stoji za način generiranja valovnih oblik. Izbirni biti so kot spodaj.
WGM00 |
WGM01 |
Delovanje načina Timer2 |
0 |
0 |
Normalen način |
0 |
1. |
CTC (Clear Timer On Compare Match) |
1. |
0 |
PWM, faza pravilna |
1. |
1. |
Hiter način PWM |
Za več podrobnosti o načinu generiranja valovnih oblik lahko preberete uradni podatkovni list Atmega16.
TCCR2 - = (1 <
Prav tako nismo uporabili nobenega predhodnega skaliranja, zato smo register virov ure nastavili kot '001'.
Biti za izbiro ure so naslednji:
CS22 |
CS21 |
CS20 |
Opis |
0 |
0 |
0 |
Brez ure (časovnik / števec je ustavljen) |
0 |
0 |
1. |
clk T2S / (brez predkaliranja) |
0 |
1. |
0 |
Clk T2S / 8 (iz prednapenjalnika) |
0 |
1. |
1. |
Clk T2S / 32 (iz prednapenjalnika) |
1. |
0 |
0 |
Clk T2S / 64 (iz prednapenjalnika) |
1. |
0 |
1. |
Clk T2S / 128 (iz prednapenjalnika) |
1. |
1. |
0 |
Clk T2S / 256 (iz prednapenjalnika) |
1. |
1. |
1. |
Clk T2S / 1024 (iz prednapenjalnika) |
Prav tako se OC2 počisti pri primerjalnem ujemanju z nastavitvijo bita COM21 kot '1' in COM20 kot '0'.
Možnosti izbire Primerjaj izhodni način (COM) za način hitrega PWM so navedene spodaj:
COM21 |
COM21 |
Opis |
0 |
0 |
Običajno delovanje vrat, OC2 odklopljen. |
0 |
1. |
Rezervirano |
1. |
0 |
Počistite OC2 na Primerjalni tekmi, OC2 nastavite na VRH |
1. |
1. |
Nastavite OC2 na primerjalni tekmi, počistite OC2 na vrhu |
Povečajte obratovalni cikel z 0% na 100%, da se bo svetlost sčasoma povečala. Vzemite vrednost od 0-255 in jo pošljite na pin OCR2.
for (duty = 0; duty <255; duty ++) // 0 do največjega delovnega cikla { OCR2 = duty; // počasi povečujemo svetlost LED _delay_ms (10); }
Podobno zmanjšajte obratovalni cikel s 100% na 0%, da postopoma zmanjšate svetlost LED.
for (duty = 0; duty> 255; duty--) // največ do 0 delovnega cikla { OCR2 = duty; // počasi zmanjšujemo svetlost LED _delay_ms (10); }
S tem je končana naša vadnica o uporabi PWM v Atmega16 / 32.