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.
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.
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 kΩ,C = 1 µF– amelyekf_c = 1 / (2π × 1.6 kΩ × 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 azR-t és a terhelést osztóvá alakítja, amely aV_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 msidőre van szüksége a beállásra, amikor a kitöltési tényező megváltozik; aV_outennyivel 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 (kisebbRvagyC), és fogadd el a nagyobb hullámzást.