3.13. Analogiasignaalin tuottaminen PWM:llä ja RC-suodattimella

ADC lukee jännitteitä nastasta. Päinvastainen – välijännitteen tuottaminen nastaan 0 V:n ja Vcc:n väliltä – on vaikeampaa, koska GPIO-lähtö osaa ohjata vain kahta kiskoaan. Vakiokorvike on kytkeä nastaa kiskojen välillä riittävän nopeasti, jotta keskimääräinen jännite on se, mistä välität.

3.13.1. Pulssinleveysmodulaatio

Pulssinleveysmoduloitu (PWM) signaali on kanttiaalto kiinteällä taajuudella, jonka ylätila – se osuus jokaisesta jaksosta, joka vietetään Vcc:ssä maan sijaan – asetetaan ohjelmistossa. Tämä osuus on pulssisuhde. Aaltomuodon keskimääräinen jännite on pulssisuhde kertaa Vcc:

V_avg = duty × Vcc

25 %:n pulssisuhde keskiarvoistuu arvoon Vcc / 4; 50 %:n pulssisuhde arvoon Vcc / 2; 75 %:n pulssisuhde arvoon 3 × Vcc / 4.

Kolme kanttiaaltokäyrää pinottuna pystysuuntaan, kukin samalla taajuudella. Ylin aalto on ylhäällä 25 % jokaisesta jaksosta ja alhaalla 75 %. Keskimmäinen aalto on ylhäällä ja alhaalla kumpikin puolet jaksosta. Alin aalto on ylhäällä 75 % ja alhaalla 25 %.

PWM 25 %:n, 50 %:n ja 75 %:n pulssisuhteella. Keskimääräinen jännite seuraa pulssisuhdetta.

Taajuus asetetaan PWM:ää määritettäessä; pulssisuhde on se, mitä ohjelmisto muuttaa lennossa. machine.PWM-luokka kapseloi laitteistoajastimen kanavan, joka tuottaa aaltomuodon ilman suorittimen apua – kerran määritettynä signaali jatkuu valitulla taajuudella ja pulssisuhteella, kunnes sitä muutetaan.

3.13.2. machine.PWM-luokka

Luo PWM-instanssi nastalla sekä alkutaajuudella ja -pulssisuhteella:

from machine import PWM, Pin

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

Tämä käynnistää 20 kHz:n kanttiaallon 50 %:n pulssisuhteella nastassa P7. Kaksi metodia muuttaa lähtöä lennossa:

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

duty_u16() ottaa etumerkittömän 16-bittisen kokonaisluvun, jossa 0 kuvautuu tilaan ”aina alhaalla” ja 65535 tilaan ”aina ylhäällä”. freq() asettaa kantotaajuuden hertseinä.

Muista

Jokainen samaan laitteistoajastimeen kytketty PWM-kanava jakaa sen taajuuden. freq()-kutsu yhdessä kanavassa muuttaa jokaista muuta samaan ajastimeen liitettyä kanavaa. Käytä eri ajastinten kanavia, kun lähtöjen on toimittava eri taajuuksilla.

Kutsu deinit() vapauttaaksesi ajastimen kanavan, kun lähtöä ei enää tarvita.

3.13.3. Keskiarvoistus RC-alipäästösuodattimella

Raaka PWM ei ole tasainen jännite; se on kanttiaalto, jonka keskiarvo on se, mitä haluamme. Tämän keskiarvon erottamiseksi johda PWM alipäästösuodattimen läpi – sama vastus-kondensaattori-yhdistelmä, jota käytettiin kytkimen värähtelynvaimennukseen kohdassa Värähtelyn poisto.

PWM-nasta yhdistyy sarjavastuksen R kautta lähtösolmuun. Kondensaattori C tästä solmusta maahan täydentää alipäästösuodattimen; tasoitettu jännite ilmestyy kohtaan V_out.

PWM RC-alipäästösuodattimen läpi: kondensaattori keskiarvoistaa kanttiaallon tasajännitteeksi, joka on verrannollinen pulssisuhteeseen.

Suodattimen rajataajuus – raja niiden taajuuksien, jotka se päästää läpi, ja niiden, jotka se estää, välillä – määräytyy saman RC-tulon perusteella, joka antoi aikavakion värähtelynvaimennuspiirille:

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

Jotta suodatin erottaisi puhtaan tasajännitteen PWM-tulosta, rajataajuuden on oltava paljon matalampi kuin itse PWM-taajuus. Tasakomponentti (taajuus 0) kulkee läpi muuttumattomana; PWM:n perusyliaalto (PWM-taajuudella) vaimenee suunnilleen suhteessa f_c / f_PWM. Suhde 1 / 200 leikkaa lähdön jäännösaaltoilun noin 0.5 %:iin tulon vaihteluvälistä.

Kohtuullinen lähtökohta hitaasti muuttuvalle asetusarvolle:

  • PWM-taajuus f_PWM = 20 kHz – selvästi audion yläpuolella ja ajastimen helppo tuottaa puhtaasti.

  • Suodattimen arvot R = 1.6 , C = 1 µF – antaen f_c = 1 / (2π × 1.6 × 1 µF) 100 Hz.

200-kertainen vaimennus kantoaallolla pienentää PWM:n täyden vaihteluvälin noin arvoon Vcc / 200 jäännösaaltoilua kohdassa V_out – noin 16 mV jännitteellä 3,3 V.

Kaksi käytännön huomiota:

  • Suodattimen lähtöimpedanssi on suunnilleen R. Mikä tahansa alavirtaan oleva kuorma, joka ottaa virtaa, muuttaa R:n ja kuorman jakajaksi, joka vetää V_out-arvon ihanteellisen keskiarvon alapuolelle, aivan kuten Analogisignaalin lukeminen ADC:llä-sivun jakaja. Syötä ADC-nastaa tai korkeaimpedanssista puskuria, älä kuormaa, joka nielee milliampeereja.

  • Kondensaattorilta kestää noin 5 × R × C 8 ms asettua, kun pulssisuhde muuttuu; V_out jää sen verran jälkeen pulssisuhteen asetuksesta. Jos asetusarvon on päivityttävä nopeammin, nosta rajataajuutta (pienempi R tai C) ja hyväksy enemmän aaltoilua.