3.13. Analóg jel előállítása PWM-mel és RC-szűrővel

Az ADC feszültségeket olvas egy lábon. Ennek ellentéte – egy 0 V és Vcc közötti köztes feszültség előállítása egy lábon – nehezebb, mert egy GPIO-kimenet csak a két tápfeszültségét tudja meghajtani. A bevett helyettesítő megoldás az, hogy a lábat olyan gyorsan kapcsolgatjuk a tápfeszültségek között, hogy az átlagos feszültség lesz az, ami számít.

3.13.1. Impulzusszélesség-moduláció

Az impulzusszélesség-modulált (PWM) jel egy rögzített frekvenciájú négyszögjel, amelynek a magas ideje – az egyes ciklusok azon hányada, amely a föld helyett Vcc-n telik – szoftverben van beállítva. Ez a hányad a kitöltési tényező. A jelalak átlagos feszültsége a kitöltési tényező és a Vcc szorzata:

V_avg = duty × Vcc

A 25 %-os kitöltési tényező átlaga Vcc / 4; az 50 %-os kitöltési tényezőé Vcc / 2; a 75 %-os kitöltési tényezőé 3 × Vcc / 4.

Három négyszögjel-görbe egymás fölött függőlegesen elrendezve, mindegyik azonos frekvencián. A felső jel az egyes periódusok 25 %-ában magas és 75 %-ában alacsony. A középső jel a periódus felében magas, felében alacsony. Az alsó jel 75 %-ban magas és 25 %-ban alacsony.

PWM 25 %-os, 50 %-os és 75 %-os kitöltési tényezővel. Az átlagos feszültség követi a kitöltési tényezőt.

A frekvencia a PWM konfigurálásakor kerül beállításra; a kitöltési tényező az, amit a szoftver menet közben változtat. A machine.PWM osztály egy hardveres időzítő-csatornát fog be, amely a CPU segítsége nélkül állítja elő a jelalakot – a konfigurálás után a jel a választott frekvencián és kitöltési tényezővel folytatódik, amíg meg nem változtatják.

3.13.2. A machine.PWM osztály

Hozz létre egy PWM példányt a lábbal, valamint egy kezdeti frekvenciával és kitöltési tényezővel:

from machine import PWM, Pin

pwm = PWM(Pin("P7"), freq=20_000, duty_u16=32768)

Ez egy 20 kHz-es négyszögjelet indít 50 %-os kitöltéssel a P7 lábon. Két metódus változtatja meg menet közben a kimenetet:

pwm.duty_u16(16384)   # change to 25 % (16384 / 65535)
pwm.freq(5_000)       # change to 5 kHz

A duty_u16() egy előjel nélküli 16 bites egész számot vesz át, ahol a 0 a „mindig alacsony” és a 65535 a „mindig magas” értékre képeződik le. A freq() állítja be a vivőfrekvenciát hertzben.

Megjegyzés

Az ugyanazon hardveres időzítőn lévő minden PWM-csatorna közös frekvenciát használ. A freq() meghívása az egyik csatornán megváltoztatja az adott időzítőhöz kapcsolt összes többi csatornát is. Használj különböző időzítők csatornáit, ha a kimeneteknek eltérő frekvenciákon kell működniük.

Hívd meg a deinit() metódust az időzítő-csatorna felszabadításához, amikor a kimenetre már nincs szükség.

3.13.3. Átlagolás RC aluláteresztő szűrővel

A nyers PWM nem sima feszültség; egy négyszögjel, amelynek az átlaga az, amit szeretnénk. Ennek az átlagnak a kinyeréséhez vezesd át a PWM-et egy aluláteresztő szűrőn – ugyanazon az ellenállás-kondenzátor kombináción, amelyet a kapcsoló pergésmentesítéséhez használtunk a Pergésmentesítés oldalon.

Egy PWM-láb egy soros R ellenálláson keresztül kapcsolódik egy kimeneti csomóponthoz. Egy C kondenzátor ettől a csomóponttól a földig teljessé teszi az aluláteresztő szűrőt; a kisimított feszültség a V_out csomóponton jelenik meg.

PWM egy RC aluláteresztő szűrőn keresztül: a kondenzátor a négyszögjelet a kitöltési tényezővel arányos egyenfeszültséggé átlagolja.

A szűrő vágási frekvenciája – a határ az átengedett és a blokkolt frekvenciák között – ugyanazzal az RC szorzattal van beállítva, amely a pergésmentesítő áramkör időállandóját adta:

f_c = 1 / (2π × R × C)

Ahhoz, hogy a szűrő tiszta egyenfeszültséget nyerjen ki egy PWM-bemenetből, a vágási frekvenciának sokkal alacsonyabbnak kell lennie magánál a PWM-frekvenciánál. Az egyenáramú komponens (0 frekvencia) változatlanul áthalad; a PWM alapharmonikusa (a PWM-frekvencián) nagyjából f_c / f_PWM mértékben csillapodik. Egy 1 / 200 arány a kimeneten maradó hullámzást a bemeneti kitérés körülbelül 0.5 %-ára csökkenti.

Ésszerű kiindulópont egy lassan változó alapjel esetén:

  • PWM-frekvencia f_PWM = 20 kHz – jóval a hallható tartomány felett, és az időzítő számára könnyen, tisztán előállítható.

  • Szűrőértékek R = 1.6 , C = 1 µF – amelyek f_c = 1 / (2π × 1.6 × 1 µF) 100 Hz értéket adnak.

A vivőfrekvencián elért 200-szoros elnyomás a PWM teljes kitérését nagyjából Vcc / 200 maradó hullámzásra csökkenti a V_out csomóponton – ez 3,3 V-on körülbelül 16 mV.

Két gyakorlati megjegyzés:

  • A szűrő kimeneti impedanciája nagyjából R. Bármilyen, áramot felvevő, a kimenetre kötött terhelés az R-t és a terhelést osztóvá alakítja, amely a V_out értéket az ideális átlag alá húzza, pontosan úgy, mint az osztó az Analóg jel olvasása az ADC-vel oldalon. Egy ADC-lábat vagy egy nagy impedanciájú puffert táplálj vele, ne pedig egy milliampereket elnyelő terhelést.

  • A kondenzátornak körülbelül 5 × R × C 8 ms időre van szüksége a beállásra, amikor a kitöltési tényező megváltozik; a V_out ennyivel lemarad a kitöltés beállítása mögött. Egy gyorsabb frissítést igénylő alapjelhez emeld meg a vágási frekvenciát (kisebb R vagy C), és fogadd el a nagyobb hullámzást.