Czech English

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%
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
Schéma připojení potenciometru, led a tlačítka
Zapojení realizované na kontaktním poli
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%
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).

Zdroje