- PWM piny v AVR mikrokontroléru Atmega16
- Co je signál PWM?
- Požadované komponenty
- Kruhový diagram
- Programování Atmega16 pro PWM
Pulse Width Modulation (PWM) je výkonná technika, při které se šířka pulzu mění udržováním konstantní frekvence. Tato technika se dnes používá v mnoha řídicích systémech. Aplikace PWM není omezena a používá se v široké škále aplikací, jako je řízení otáček motoru, měření, řízení výkonu a komunikace atd. V technice PWM lze snadno generovat analogový výstupní signál pomocí digitálních signálů. Tento výukový program vám pomůže porozumět PWM, jeho terminologii a tomu, jak jej můžeme implementovat pomocí mikrokontroléru. V tomto tutoriálu budeme demonstrovat PWM s mikrokontrolérem AVR Atmega16 změnou intenzity LED.
Chcete-li podrobně porozumět základům PWM, přejděte na naše předchozí výukové programy o PWM s různými mikrokontroléry:
- Výukový program ARM7-LPC2148 PWM: Řízení jasu LED
- Pulzní šířková modulace (PWM) pomocí MSP430G2: Ovládání jasu LED
- Generování PWM pomocí mikrokontroléru PIC s MPLAB a XC8
- Pulzní šířková modulace (PWM) v STM32F103C8: Řízení rychlosti stejnosměrného ventilátoru
- Generování signálů PWM na pinech GPIO mikrokontroléru PIC
- Výukový program PWM pro Raspberry Pi
PWM piny v AVR mikrokontroléru Atmega16
Atmega16 má čtyři vyhrazené PWM piny. Tyto piny jsou PB3 (OC0), PD4 (OC1B), PD5 (OC1A), PD7 (OC2).
Také ATMEGA16 má dva 8-bitové časovače a jeden 16bitový časovač. Timer0 a Timer2 jsou 8bitové časovače, zatímco Timer1 je 16bitový časovač. Pro generování PWM musíme mít přehled časovačů, protože časovače se používají ke generování PWM. Jak víme, frekvence je počet cyklů za sekundu, při kterém běží časovač. Vyšší frekvence nám tedy poskytne rychlejší časovač. Při generování PWM poskytne rychlejší frekvence PWM jemnější kontrolu nad výstupem, protože může rychleji reagovat na nové pracovní cykly PWM.
V tomto výukovém programu Atmega16 PWM použijeme Timer2. Můžete si vybrat libovolný pracovní cyklus. Pokud nevíte, co je pracovní cyklus v PWM, pojďme to stručně probrat.
Co je signál PWM?
Pulse Width Modulation (PWM) je digitální signál, který se nejčastěji používá v řídicích obvodech. Čas, během kterého signál zůstane vysoký, se nazývá „čas zapnutí“ a čas, během kterého signál zůstane nízký, se nazývá „čas vypnutí“. Níže jsou popsány dva důležité parametry PWM:
Pracovní cyklus PWM
Procento času, ve kterém signál PWM zůstává VYSOKÝ (v čase), se nazývá pracovní cyklus.
Stejně jako v případě 100ms pulzního signálu, pokud je signál HIGH po dobu 50ms a LOW po dobu 50ms, znamená to, že puls byl poločas HIGH a poločas LOW. Můžeme tedy říci, že pracovní cyklus je 50%. Podobně, pokud je pulz ve stavu 25ms HIGH a 75ms ve stavu LOW ze 100ms, pak by pracovní cyklus byl 25%. Všimněte si, že počítáme pouze dobu trvání VYSOKÉHO stavu. Pro vizuální porozumění můžete použít odkaz na níže uvedený obrázek. Vzorec pro pracovní cyklus je pak,
Pracovní cyklus (%) = čas zapnutí / (čas zapnutí + čas vypnutí)
Takže změnou pracovního cyklu můžeme změnit šířku PWM, což vede ke změně jasu LED. Budeme mít ukázku použití jiného pracovního cyklu při řízení jasu LED. Podívejte se na ukázkové video na konci tohoto tutoriálu.
Po výběru pracovního cyklu bude dalším krokem výběr režimu PWM. Režim PWM určuje, jak chcete, aby PWM fungovalo. Existují hlavně 3 typy režimů PWM. Jedná se o následující:
- Rychlé PWM
- Fázově správné PWM
- Fázově a frekvenčně korektní PWM
Rychlé PWM se používá tam, kde na fázové změně nezáleží. Pomocí Fast PWM můžeme rychle vydávat hodnoty PWM. Rychlé PWM nelze použít tam, kde změna fáze ovlivňuje provoz, jako je řízení motoru, takže v takové aplikaci se používají jiné režimy PWM. Protože budeme ovládat Jas LED, kde fázová změna moc neovlivní, použijeme režim Fast PWM.
Nyní, abychom vygenerovali PWM, budeme řídit interní časovač, aby spočítal a poté nastavil zpět na nulu při určitém počtu, takže časovač bude počítat nahoru a pak znovu a znovu nastaven na nulu. Tím nastavíte období. Nyní máme možnost ovládat puls a zapínat puls při určitém počtu v časovači, zatímco se zvyšuje. Když se počítadlo vrátí na 0, vypněte puls. S tím je velká flexibilita, protože vždy můžete přistupovat k počtu časovačů a poskytovat různé impulsy jediným časovačem. To je skvělé, když chcete ovládat více LED najednou. Nyní začneme propojovat jednu LED s Atmega16 pro PWM.
Zkontrolujte všechny projekty související s PWM zde.
Požadované komponenty
- IC mikrokontroléru Atmega16 AVR
- 16MHz krystalový oscilátor
- Dva 100nF kondenzátory
- Dva kondenzátory 22pF
- Stiskněte tlačítko
- Propojovací dráty
- Nepájivá deska
- USBASP v2.0
- 2 LED (libovolná barva)
Kruhový diagram
Používáme OC2 pro PWM, tj. Pin21 (PD7). Připojte tedy jednu LED na pin PD7 Atmega16.
Programování Atmega16 pro PWM
Kompletní program je uveden níže. Vypalte program v Atmega16 pomocí JTAG a Atmel studio a podívejte se na PWM efekt na LED. Jeho jas se bude pomalu zvyšovat a snižovat z důvodu měnícího se pracovního cyklu PWM. Zkontrolujte video uvedené na konci.
Začněte programovat Atmega16 nastavením registrace Timer2. Bity registru Timer2 jsou následující a podle toho můžeme bity nastavit nebo resetovat.
Nyní budeme diskutovat o všech bitech Timer2, abychom mohli získat požadovaný PWM pomocí psaného programu.
V registru Timer2 jsou hlavně čtyři části:
FOC2 (Force Output Compare for Timer2): Bit FOC2 je nastaven, když bity WGM určují režim, který není PWM.
WGM2 (Wave Generation Mode for Timer2): Tyto bity řídí sekvenci počítání čítače, zdroj maximální hodnoty (TOP) čítače a jaký typ generování křivky má být použit.
COM2 (Porovnat výstupní režim pro Timer2): Tyto bity řídí chování výstupu. Celý popis bitů je vysvětlen níže.
TCCR2 - = (1 <
Chcete-li aktivovat rychlý režim PWM, nastavte bity WGM20 a WGM21 na VYSOKÉ. WGM znamená režim generování křivek. Bity pro výběr jsou uvedeny níže.
WGM00 |
WGM01 |
Provoz v režimu Timer2 |
0 |
0 |
Normální mód |
0 |
1 |
CTC (Vymazat časovač při porovnání shody) |
1 |
0 |
PWM, správná fáze |
1 |
1 |
Rychlý režim PWM |
Další informace o režimu generování vln naleznete v oficiálním datovém listu Atmega16.
TCCR2 - = (1 <
Také jsme nepoužili žádné předškálování, takže jsme nastavili registr zdroje hodin jako '001'.
Bity pro výběr hodin jsou následující:
CS22 |
CS21 |
CS20 |
Popis |
0 |
0 |
0 |
Žádný zdroj hodin (časovač / čítač zastaven) |
0 |
0 |
1 |
clk T2S / (bez přednastavení) |
0 |
1 |
0 |
Clk T2S / 8 (od Prescaler) |
0 |
1 |
1 |
Clk T2S / 32 (od Prescaler) |
1 |
0 |
0 |
Clk T2S / 64 (od Prescaler) |
1 |
0 |
1 |
Clk T2S / 128 (od Prescaler) |
1 |
1 |
0 |
Clk T2S / 256 (od Prescaler) |
1 |
1 |
1 |
Clk T2S / 1024 (od Prescaler) |
Také OC2 je vymazán při porovnání shody nastavením COM21 bit jako '1' a COM20 jako '0'.
Níže jsou uvedeny možnosti výběru Porovnat výstupní režim (COM) pro režim Rychlý PWM:
COM21 |
COM21 |
Popis |
0 |
0 |
Normální provoz portu, OC2 odpojen. |
0 |
1 |
Rezervováno |
1 |
0 |
Vymazat OC2 při porovnání shody, nastavit OC2 na TOP |
1 |
1 |
Nastavit OC2 na srovnávací zápas, vymazat OC2 nahoře |
Zvyšte pracovní cyklus z 0% na 100%, aby se jas v průběhu času zvyšoval. Vezměte hodnotu od 0 do 255 a odešlete ji na kolík OCR2.
pro (povinnost = 0; povinnost <255; povinnost ++) // 0 až maximální pracovní cyklus { OCR2 = povinnost; // pomalu zvyšujte jas LED _delay_ms (10); }
Podobně snižte pracovní cyklus ze 100% na 0%, abyste postupně snižovali jas LED.
for (duty = 0; duty> 255; duty--) // max to 0 duty cycle { OCR2 = duty; // pomalu snižujte jas LED _delay_ms (10); }
Tím končí náš Tutoriál o používání PWM v Atmega16 / 32.