Skip to main content

2.6 Modulácia výstupu cez šírku pulzu (PWM)

Ako vyplýva z podstaty digitálneho portu, nie je naň možné poslať inú hodnotu ako 0 alebo 1. Pokiaľ však chceme ovládať napríklad jas LED, či otáčky ventilátora a motora, môžeme využiť PWM (moduláciu šírkou pulzu), pri ktorej sa striedajú výstupné hodnoty 1 a 0, pričom nastavujeme frekvenciu a striedu.

2.6 využitie PWM.webp

Parametre PWM

Frekvencia udáva, ako často sa nastavuje výstupná hodnota 1 (teda počet kompletných periód za sekundu, v hertzoch). V prípade ovládania jasu LED nie je podstatné, akú frekvenciu použijeme, pokiaľ je dostatočne vysoká, aby nebolo vidno blikanie, či stroboskopický efekt (predvolenú hodnotu 5 kHz možno pokladať za dostatočnú). Niekedy príde vhod i veľmi nízka frekvencia, napríklad pre blikajúcu LED (bude však blikať vždy plným jasom). Cez PWM však môžeme ovládať aj piezoelektrický menič (bzučiak) alebo reproduktor - v takom prípade na frekvencii samozrejme veľmi záleží, pretože sa jedná priamo o frekvenciu vytváraného zvuku.

Strieda (duty cycle) udáva podiel času, kedy je na výstupe hodnota 1, z celého trvania periódy. V princípe je to teda číslo z intervalu <0, 1>, resp. <0 %, 100 %>:

  • Strieda 0 % znamená, že na výstupe je trvalo hodnota 0, teda nebude ani svietiť LED, ani sa točiť ventilátor, ani reproduktor nebude vydávať zvuk.
  • Pokiaľ je strieda 100 %, počas celej periódy je na výstupe hodnota 1, teda LED svieti plným jasom, ventilátor sa bude točiť naplno, no reproduktor nebude vydávať žiaden zvuk (membrána musí kmitať a nie byť nehybne v jednej polohe).
  • Strieda 50 % znamená, že na výstupe sa budú striedať hodnoty 1 a 0 rovnomerne, teda LED i ventilátor pôjdu polovičným výkonom, reproduktor bude počuť najviac.

Kým teda pre ovládanie výkonu (jasu / otáčok) je podstatná hodnota striedy, pre ovládanie bzučiaka / reproduktora je podstatná frekvencia.

PWM v MicroPython

V MicroPython máme pre PWM k dispozícii objekt PWM z modulu machine. Pokiaľ chceme niektorý pin použiť ako PWM výstup cez premennú p, musíme pri inicializácii objektu uviesť pin (pričom nedefinujeme jeho režim práce). Na ESP32 môžeme zároveň uviesť aj frekvenciu (freq) a striedu (duty_u16). Strieda sa udáva 16-bitovým číslom, teda číslom v intervale 0 až 65535:

from machine import PWM, Pin
# základná inicializácia objektu PWM
p = PWM(Pin({číslo pinu}))
# inicializácia s uvedením požadovaných parametrov PWM
p = PWM(Pin({číslo pinu}), freq={frekvencia}, duty_u16={strieda})

Pre zmenu nastavení máme k dispozícii objektové funkcie:

  • p.freq({frekvencia}) - zmení frekvenciu;
  • p.duty_u16({strieda}) - zmení striedu (rozsah 0 až 65535);
  • p.init(freq = {frekvencia}, duty_u16 ={strieda}) - zmení oba parametre naraz;
  • p.deinit() - uvoľní pin, vráti sa do stavu bežného GPIO.

2.6 PWM úrovne pre LED.webp

V prípade potreby je možné namiesto funkcie a parametra duty_u16 využiť duty_ns, ktorého hodnota nie je relatívna voči perióde, ale absolútna v nanosekundách - toto je vhodné napríklad pri ovládaní serva.

Ak meníme súčasne frekvenciu i striedu, je vhodné využiť objektovú funkciu init() - tá však nie je k dispozícii na MCU RP2040.

Zo skúsenosti možno konštatovať, že opakovaná inicializácia PWM niekedy vyvoláva neočakávané stavy. Vo všeobecnosti je spoľahlivejšie postupovať nasledovne - najskôr len vytvoriť inštanciu PWM na danom pine bez uvedenia hodnôt, potom deinicializovať PWM a na záver inicializovať PWM s požadovanými hodnotami:

from machine import PWM, Pin
p = PWM(Pin({číslo pinu}))
p.deinit()
p.init(freq={frekvencia}, duty_u16={strieda})