Reklama

Pulzně šířková modulace – PWM

Úvod

Možná jste se už někdy setkali s pojmem “PWM” a nevěděli jste, o co jde. PWM (Pulse Width Modulation) je metoda, kterou lze pomocí dvoustavového signálu (log. 0 a log. 1) regulovat např. jas LED diody nebo otáčky elektromotoru, nebo také lze touto metodou získat spojitý analogový signál např. se může jednat o audio signál.

Popis

Jak již bylo řečeno, PWM signál nabývá pouze dvou hodnot log 0. (LED dioda je zhasnuta) a log 1. (LED dioda je rozsvícená). Další důležité parametry, které určují vlastnosti PWM regulace jsou frekvence a střída. Frekvence PWM je konstantní a určuje, jak rychle bude docházet ke změně stavu, a střída určuje poměr mezi stavem log. 1 a celou periodou, viz:

 

D = (ton / T) x 100 [%]

 

Kde D označuje střídu, ton je čas v aktivním stavu a T je perioda signálu. Pwm signál se střídou 25% lze vidět na Obr. 1.

Obr. 1: Ukázka PWM signálu se střídou 25%

Obr. 1: PWM signál se střídou 25%

Střední hodnotu PWM signálu v procentech pro několik hodnot střídy lze vidět na Obr. 2.

Obr. 2:Střední hodnota PWM signálu pro několik hodnot střídy

Obr. 2:Střední hodnota PWM signálu pro několik hodnot střídy

Asi nejjednodušší bude vysvětlení principu regulace pomocí PWM na nastavení jasu LED diody. Pokud ke generování PWM využíváte mikrokontrolér ATmega(16/32), tak si zkusíme jednoduchý kód, kterým vygenerujeme PWM signál pro připojenou LED diodu s vhodným předřadným odporem, která je umístěna na PORTA mikrokontroléru ATmega(16/32), viz níže.

Okomentovaný zdrojový kód

 

001: #include <avr/io.h>
002: #define F_CPU 16000000UL
003: #include <util/delay.h>
004:
005: uint8_t switchState;// změna stavu
006: uint8_t endPeriod; // konec periody
007:
008: int main(void)
009: {
010: DDRA = 0xFF// nastavení PORTA jako výstupní
011: PORTA = 0xFF;
012:
013: switchState = 5;// nastavení střídy 1:1
014: endPeriod = 10; // nastavení 10 úrovní rozlišení
015:
016:
017: while(1)
018: {
019: for (int i = 0; i < endPeriod; i++)
020: {
021: if (i == switchState)
022: {
023: PORTA = 0x00;// Změnit stav PORTA na log. 0
024: }
025:
026: _delay_ms(100);
027: }
028:
029: PORTA = 0xFF;// Změnit stav PORTA na log. 1
030: }
031: }

Ve zdrojovém kódu lze vidět, že pro generování PWM jsou použity dvě proměnné “switchState” a “endPeriod”. První proměnná “switchState” určuje stav, kdy má dojít ke změně z log. 1 a log. 0, zatímco druhá proměnná “endPeriod” určuje délku periody a tím i rozlišení PWM modulace. Ve vytvořeném kódu lze vidět, že ke změně stavu dojde po 500 ms a k ukončení celé periody PWM signálu dojde po 1 s, tzn. že jsme zvolili frekvenci 1 Hz. Pokud jste si tento kód zkusili, tak jste zjistili akorát, že LED dioda bliká a rozhodně nedochází k žádné regulaci jasu a máte taky pravdu. Ale co když teď zvýšíme frekvenci např. na 100 Hz? Změnu frekvence PWM provedeme změnou nastavení z _delay_ms(100) na _delay_ms(1). Teď vidíte, že LED dioda svítí, ale rozhodně ne na maximum, stejně tak, jako kdybychom nastavili na trvalo stav log. 1 na pinu mikrokontroléru. Celý trik spočívá v tom, že jsme využili nedokonalosti lidského zraku, který není schopný vnímat rychlé změny blikání LED diody, a proto se nám zdá, že LED dioda svítí trvale. A čím tedy lze řídit jas LED diody? Právě nastaveným poměrem mezi stavy log. 1 a log. 0. Čím déle bude LED dioda ve stavu log. 1, tím více bude svítit a obráceně. Ve vzorovém zdrojovém kódu můžeme určit nastavení jasu v 10 krocích (“switchState” 0 – 9), ale běžně se používá např. 255ti stavová regulace. Výsledný generovaný PWM signál na PORTA, ukazuje Obr. 3.

Obr. 3: Výstupní signál generovaný zdrojovým kódem

Obr. 3: Výstupní signál generovaný zdrojovým kódem

Samozřejmě většina mikrokontrolérů má již speciální jednotku, která generuje signál PWM, takže uvedený zdrojový kód slouží pouze pro demonstraci funkce. Jak pracovat s Čítačem/Časovačem, kterým lze generovat PWM na mikrokontroléru ATmega(16/32) lze nalézt ZDE. Samozřejmě lze generovat PWM signál i bez mikrokontroléru, ale tím se tady zabývat nebudeme.

Pokud byste chtěli PWM modulaci použít k vytvoření spojitého analogového signálu, např. pro generování audio signálu, nebo z jiného důvodu, potřebujete analogový signál, který je úměrný střídě PWM, tak je nutné ještě za výstup mikrokontroléru, který generuje PWM, zařadit integrační článek, tzn. dolní propust. Může se jednat např. o jednoduchou RC dolní propust, viz. Obr. 4.

Obr. 4: Jednoduchá RC dolní propust

Obr. 4: Jednoduchá RC dolní propust

Mezní kmitočet RC dolní propusti se vypočítá dle vztahu:

 

fmez = 1 / (2π x R x C) [Hz]

 

Tato dolní propust vytvoří z dvoustavového signálu signál analogový, který bude mít tvar odvozený od vstupního napětí, použité střídy a použité dolní propusti. Pro jednoduchou RC dolní propust R=10 kΩ a C = 100nF (fmez = 159,2 Hz) ukazuje Obr. 5, jak vypadá výstupní signál Vout při použití vstupního obdélníkového signálu 1 kHz. Z obrázku je patrné, že jsme nedosáhli konstantní úrovně napětí 2,5 V, jak by jsme očekávali, ale výstupní napětí je zvlněné díky volbě použité dolní propusti.

Obr. 5: Zobrazení průběhu vstupního signálu 1 kHz a výstupního signálu. Vytvořeno v LTspice.

Obr. 5: Zobrazení průběhu vstupního signálu 1 kHz a výstupního signálu. Vytvořeno v LTspice.

Pokud zvýšíme frekvenci vstupního signálu např. na 10 kHz, tak lze vidět, že výstupní napětí Vout je daleko více stabilní díky většímu odstupu mezního kmitočtu RC dolní propusti a frekvence vstupního signálu.

Obr. 6: Zobrazení průběhu vstupního signálu 10 kHz a výstupního signálu. Vytvořeno v LTspice.

Obr. 6: Zobrazení průběhu vstupního signálu 10 kHz a výstupního signálu. Vytvořeno v LTspice.
Následující a předchozí příspěvek v kategorii:

 
Následující: Vytvoření virtuálního spojení dvou sériových linek pomocí com0com
Předchozí: Základy řízení sedmisegmentových displejů – Řízení pomocí obvodu SAA1064
 
Tajned facebook
 
 

Za případné chyby v textu, ve zdrojovém kódě, nebo ve schématickém zapojení se omlouváme.
AUTOŘI NEBEROU ŽÁDNOU ODPOVĚDNOST ZA PŘÍPADNÉ ÚJMY NA ZDRAVÍ ČI MAJETKU.