9. Pulzně šířková modulace
aneb spínáme a vypínáme o stošest
V minulé lekci jsme si ukázali jak dostat do Arduina analogový signál (ne jen 0/1). Podobně někdy potřebujeme řídit akční členy nejen stylem zapnout/vypnout, ale chceme, aby led svítila méně, motor se točil pomaleji atd. Toho bychom dosáhli, pokud bychom měli analogový výstup z mikrokontroleru. Mikrokontroler v Arduinu však DA převodník nemá, proto použijeme jinou (pro většinu aplikací výhodnější) metodu tzv. pulzně-šířkovou modulaci signálu.
Co to pulzně šířková modulace je?
Průběh signálu PWM cyklicky v hodnotách 100%…0%…100% |
Pokud si představíme, že bychom na výstupu střídavě nastavovali 0 a 1, tak
bude připojená led blikat (to už dobře známe). Ale co se stane, když budeme
frekvenci přepínání zvyšovat. Nad určitou frekvencí už naše oko nestíhá
sledovat blikání a máme pocit, že led svítí stále, ale ne tak jasně.
Stejně tak by se chovala žárovka nebo elektromotor, s tím rozdílem, že
tady nepotřebujeme ani nedokonalost našeho oka, protože vlákno žárovky
nebo elektromotor mají setrvačnost a samy nestíhají sledovat průběh
signálu (motor se během krátké doby vypnutí nestihne zastavit a během zapnutí nedosáhne
maximálních otáček).
Pokud bude doba zapnutí a vypnutí stejná, tak se připojený akční člen bude
chovat jako by byl napájen zdrojem polovičního napětí. Pokud bude poměr
doby zapnutí a vypnutí jiný, bude "zdánlivé" napětí úměrné poměru doby zapnutí
a doby celé periody. Tím můžeme řídit výstup v celém rozsahu od 0 až do
plného napětí.
Střídavé nastavování 0 a 1 na výstupu bychom mohli provádět programově, ale
dost bychom zaměstnali procesor a hlavně bychom měli problém dosáhnout
dostatečně vysoké frekvence spínání. Proto mikrokontrolery často mají
modul čítačů, které umožňují generování PWM hardwarově. Stačí tedy vhodně
nastavit čítač do režimu PWM, určit periodu a plnění a na výstupu je
trvale generován signál s pulzně-šířkovou modulací automaticky.
Jediným omezením tedy je, že nemůžeme pro HW generování PWM použít libovolný pin,
ale jen piny, na které je přiveden výstup čítačů (u Arduina 3, 5, 6, 9, 10, 11).
Vývojové prostředí již samo zajistí nastavení čítačů (perioda generování
PWM je cca 2ms, tj. frekvence asi 500Hz) a my pouze v programu
nastavujeme tzv. plnění - poměr doby zapnutí a celé periody (hodnota 0-255 odpovídá
poměru 0-100%).
Zapojení
Pro dnešní cvičení využijeme už osvědčené zapojení led a tlačítka.
Led bude připojena na výstup 3, tlačítko na vstup 2 (s využitím vnitřního pull-up rezistoru)
a běžec potenciometru na analogový vstup 0.
Schéma připojení potenciometru, led a tlačítka |
Zapojení realizované na kontaktním poli |
Program
Pro nastavení hodnoty PWM výstupu slouží příkaz
analogWrite(pin, value)
pin ... určuje nožičku, na kterou je generován PWM signál
(pouze piny 3, 5, 6, 9, 10, 11)
value ... hodnota 0-255, která odpovídá plnění 0-100%
pin ... určuje nožičku, na kterou je generován PWM signál
(pouze piny 3, 5, 6, 9, 10, 11)
value ... hodnota 0-255, která odpovídá plnění 0-100%
Použití pulzně šířkové modulace si ukážeme na plynulém řízení jasu led.
Požadovanou hodnotu intenzity svitu budeme nastavovat potenciometrem
zapojeným na analogový vstup 0. Protože číslo získané AD převodem je
10. bitové (tj. rozsah 0 - 1023) je nutné jej upravit pro rozsah
0 - 255, který je možný zadávat jako plnění PWM.
Úkoly na samostatnou práci
1. Sestavte program pro plynulé rozsvědcení a zhasínámí led. Po stisknutí tlačítka
se led postupně během 1 s rozsvítí a zůstane svítit plným jasem. Po dalším stisknutí
plynule během 1s zhasne atd.
2. Sestavte program pro nastavování intenzity svitu led pomocí tlačítka. Krátkým
stisknutím tlačítka (méně než 0,5 s) led zhasne. Pokud držíme tlačítko stisknuté
delší dobu než 0,5 s začne se led postupně rozsvětcovat (tak, aby se plně rozsvítila
za 4 s). Po uvolnění tlačítka zůstane svítit led intenzitou, kterou právě měla
v okamžiku uvolnění tlačítka. Pokud držíme tlačítko stisknuté déle než 4 s, tak se
led začne opět postupně rozsvětcovat od 0 do plného jasu (opět rychlostí 0-100%/4s).