- PWM piny v AVR mikrokontroléri Atmega16
- Čo je to signál PWM?
- Súčasti sú povinné
- Schéma zapojenia
- Programovanie Atmega16 pre PWM
Pulzná šírková modulácia (PWM) je výkonná technika, pri ktorej sa šírka impulzu mení udržiavaním konštantnej frekvencie. Táto technika sa dnes používa v mnohých riadiacich systémoch. Aplikácia PWM nie je obmedzená a používa sa v širokej škále aplikácií, ako je riadenie otáčok motora, meranie, riadenie výkonu a komunikácia atď. V technike PWM je možné ľahko generovať analógový výstupný signál pomocou digitálnych signálov. Tento tutoriál vám pomôže porozumieť PWM, jeho terminológiám a tomu, ako ho môžeme implementovať pomocou mikrokontroléra. V tomto tutoriáli ukážeme PWM s mikrokontrolérom AVR Atmega16 zmenou intenzity LED.
Ak chcete podrobne porozumieť základom PWM, navštívte naše predchádzajúce návody na PWM s rôznymi mikrokontrolérmi:
- Výukový program ARM7-LPC2148 PWM: Ovládanie jasu LED
- Pulzná šírková modulácia (PWM) pomocou MSP430G2: Riadenie jasu LED
- Generovanie PWM pomocou PIC mikrokontroléra s MPLAB a XC8
- Pulzná šírková modulácia (PWM) v STM32F103C8: Riadenie rýchlosti jednosmerného ventilátora
- Generovanie signálov PWM na pinoch GPIO mikrokontroléra PIC
- Výukový program pre Raspberry Pi PWM
PWM piny v AVR mikrokontroléri Atmega16
Atmega16 má štyri vyhradené PWM piny. Tieto kolíky sú PB3 (OC0), PD4 (OC1B), PD5 (OC1A), PD7 (OC2).
Tiež ATmega16 má dva 8-bitové časovača a jeden 16bitový časovač. Timer0 a Timer2 sú 8-bitové časovače, zatiaľ čo Timer1 je 16-bitový časovač. Na generovanie PWM musíme mať prehľad o časovačoch, pretože časovače sa používajú na generovanie PWM. Ako vieme, frekvencia je počet cyklov za sekundu, pri ktorých beží časovač. Vyššia frekvencia nám teda poskytne rýchlejší časovač. Pri generovaní PWM poskytne rýchlejšia frekvencia PWM jemnejšiu kontrolu nad výstupom, pretože môže rýchlejšie reagovať na nové pracovné cykly PWM.
V tomto výučbe Atmega16 PWM budeme používať Timer2. Môžete si zvoliť ľubovoľný pracovný cyklus. Ak neviete, čo je pracovný cyklus v PWM, poďme o tom stručne diskutovať.
Čo je to signál PWM?
Pulzná šírková modulácia (PWM) je digitálny signál, ktorý sa najčastejšie používa v riadiacich obvodoch. Čas, počas ktorého signál zostáva vysoký, sa nazýva „čas zapnutia“ a čas, počas ktorého signál zostáva nízky, sa nazýva „čas vypnutia“. Ďalej sú uvedené dva dôležité parametre pre PWM:
Pracovný cyklus PWM
Percento času, v ktorom signál PWM zostáva VYSOKÝ (v čase), sa nazýva pracovný cyklus.
Rovnako ako v prípade 100ms impulzného signálu, ak je signál HIGH na 50ms a LOW na 50ms, znamená to, že impulz bol polčas HIGH a polčas LOW. Môžeme teda povedať, že pracovný cyklus je 50%. Podobne, ak je impulz v stave 25ms HIGH a 75ms v stave LOW zo 100ms, potom by pracovný cyklus bol 25%. Všimnite si, že počítame iba trvanie stavu HIGH. Môžete si vziať odkaz na nasledujúci obrázok pre vizuálne pochopenie. Vzorec pre pracovný cyklus je potom,
Pracovný cyklus (%) = čas zapnutia / (čas zapnutia + čas vypnutia)
Takže zmenou pracovného cyklu môžeme zmeniť šírku PWM, čo vedie k zmene jasu LED. Budeme mať ukážku použitia iného pracovného cyklu pri ovládaní jasu LED. Skontrolujte demo video na konci tohto tutoriálu.
Po výbere pracovného cyklu bude ďalším krokom výber režimu PWM. Režim PWM určuje, ako chcete, aby PWM fungoval. Existujú hlavne 3 typy režimov PWM. Sú to tieto:
- Rýchle PWM
- Fázovo správne PWM
- Fázovo a frekvenčne správne PWM
Rýchle PWM sa používa tam, kde na fázovej zmene nezáleží. Použitím Fast PWM môžeme rýchlo vydávať hodnoty PWM. Rýchle PWM nemožno použiť tam, kde zmena fázy ovplyvňuje činnosť, ako je napríklad riadenie motora, takže v takejto aplikácii sa používajú iné režimy PWM. Pretože budeme ovládať Jas LED, kde fázová zmena nebude mať veľký vplyv, použijeme režim Fast PWM.
Teraz, aby sme vygenerovali PWM, budeme riadiť interný časovač tak, aby počítal, a potom nastavíme späť na nulu pri konkrétnom počte, takže časovač bude počítať hore a potom znova a znova nastavený na nulu. Týmto sa nastavuje obdobie. Teraz máme možnosť ovládať impulz, zapínať impulz pri konkrétnom počte v časovači, kým sa zvyšuje. Keď sa počítadlo vráti na 0, potom impulz vypnite. Existuje veľká flexibilita, pretože kedykoľvek máte prístup k počtu časovačov a môžete poskytnúť rôzne impulzy pomocou jedného časovača. To je skvelé, ak chcete ovládať viac LED súčasne. Teraz začnime prepojiť jednu LED s Atmega16 pre PWM.
Skontrolujte všetky projekty súvisiace s PWM tu.
Súčasti sú povinné
- IC mikrokontrolér Atmega16 AVR
- Krištáľový oscilátor 16 MHz
- Dva kondenzátory 100nF
- Dva kondenzátory 22pF
- Tlačidlo
- Prepojovacie drôty
- Nepál
- USBASP v2.0
- 2 led (ľubovoľná farba)
Schéma zapojenia
Používame OC2 pre PWM, tj Pin21 (PD7). Pripojte teda jednu LED na pin PD7 Atmega16.
Programovanie Atmega16 pre PWM
Kompletný program je uvedený nižšie. Spáľte program v Atmega16 pomocou JTAG a Atmel studio a pozrite si efekt PWM na LED. Jeho jas sa bude pomaly zvyšovať a znižovať z dôvodu meniaceho sa pracovného cyklu PWM. Skontrolujte video uvedené na konci.
Začnite programovať Atmega16 nastavením Timer2 Register. Bity registra Timer2 sú nasledujúce a podľa toho môžeme bity nastaviť alebo resetovať.
Teraz budeme diskutovať o všetkých bitoch Timer2, aby sme pomocou písaného programu mohli získať požadované PWM.
V registri Timer2 sú hlavne štyri časti:
FOC2 (Force Output Compare for Timer2): Bit FOC2 sa nastaví, keď bity WGM určujú režim, ktorý nie je PWM.
WGM2 (režim generovania vĺn pre časovač2): Tieto bity riadia postupnosť počítania počítadla, zdroj maximálnej hodnoty (TOP) počítadla a aký typ generovania krivky sa má použiť.
COM2 (Porovnanie výstupného režimu pre Timer2): Tieto bity riadia výstupné správanie. Celý popis bitu je vysvetlený nižšie.
TCCR2 - = (1 <
Ak chcete aktivovať rýchly režim PWM, nastavte bity WGM20 a WGM21 na VYSOKÉ. WGM predstavuje režim generovania kriviek. Výberové bity sú uvedené nižšie.
WGM00 |
WGM01 |
Prevádzka v režime Timer2 |
0 |
0 |
Normálny režim |
0 |
1 |
CTC (Vymazať časovač pri porovnaní zhody) |
1 |
0 |
PWM, správna fáza |
1 |
1 |
Rýchly režim PWM |
Ďalšie informácie o režime generovania kriviek nájdete v oficiálnom údajovom liste Atmega16.
TCCR2 - = (1 <
Taktiež sme nepoužili nijaké predbežné škálovanie, takže sme nastavili register zdroja hodín ako „001“.
Bity pre výber hodín sú nasledujúce:
CS22 |
CS21 |
CS20 |
Popis |
0 |
0 |
0 |
Žiadny zdroj hodín (časovač / počítadlo zastavené) |
0 |
0 |
1 |
clk T2S / (bez prednastavenia) |
0 |
1 |
0 |
Clk T2S / 8 (od spoločnosti Prescaler) |
0 |
1 |
1 |
Clk T2S / 32 (od spoločnosti Prescaler) |
1 |
0 |
0 |
Clk T2S / 64 (od spoločnosti Prescaler) |
1 |
0 |
1 |
Clk T2S / 128 (od spoločnosti Prescaler) |
1 |
1 |
0 |
Clk T2S / 256 (od spoločnosti Prescaler) |
1 |
1 |
1 |
Clk T2S / 1024 (od spoločnosti Prescaler) |
OC2 sa vymaže aj pri porovnávaní zhody nastavením bitu COM21 na „1“ a COM20 na „0“.
Možnosti výberu režimu porovnania výstupu (COM) pre režim Fast PWM sú uvedené nižšie:
COM21 |
COM21 |
Popis |
0 |
0 |
Normálna prevádzka portu, OC2 odpojený. |
0 |
1 |
Vyhradené |
1 |
0 |
Vymazať OC2 pri porovnaní zhody, nastaviť OC2 na TOP |
1 |
1 |
Nastaviť OC2 na porovnanie zhody, vymazať OC2 na TOP |
Zvýšte pracovný cyklus z 0% na 100%, aby sa jas časom zvyšoval. Vezmite hodnotu od 0 do 255 a odošlite ju na pin OCR2.
for (duty = 0; duty <255; duty ++) // 0 to max duty cycle { OCR2 = duty; // pomaly zvyšte jas LED _delay_ms (10); }
Podobne znížte pracovný cyklus zo 100% na 0%, aby ste postupne znižovali jas LED.
for (duty = 0; duty> 255; duty--) // max to 0 duty cycle { OCR2 = duty; // pomaly znižujte jas LED _delay_ms (10); }
Týmto sa končí náš Tutoriál o používaní PWM v Atmega16 / 32.