3.14. LED-fényerő-szabályozás PWM-mel¶
A Analóg jel előállítása PWM-mel és RC-szűrővel oldal egy RC aluláteresztő szűrőt használt ahhoz, hogy egyenfeszültséget nyerjen ki egy PWM-jelből. Egy LED esetében a szűrőre nincs szükség – maga az emberi szem végzi az átlagolást.
Ha egy LED-et körülbelül 60 Hz-nél gyorsabban kapcsolgatunk be és ki, a látórendszer már nem bontja fel az egyes impulzusokat, és az átlagos fénykibocsátással egyenlő, egyenletes fényerőt érzékel. Egy 50%-os kitöltési tényező nagyjából fél fényerőnek látszik; 25% negyednek; 10% halványnak.
A bekötés ugyanaz, mint egy statikus külső LED esetében a GPIO kimenet oldalon – egy áramkorlátozó ellenállás a LED-del sorba kötve, a Elektronikai alapok szabályai szerint méretezve. A változás csak a szoftverben van: a láb PWM kimenetként fut sima Pin.OUT helyett.
3.14.1. A frekvencia megválasztása¶
LED-fényerő-szabályozáshoz a PWM-frekvenciának csak a szem villogási küszöbét kell átlépnie:
Körülbelül 60 Hz alatt a szem közvetlenül látja az impulzusokat.
Körülbelül 200 Hz alatt a perifériás látás és a gyors szemmozgás még felfedheti a villogást.
Az 1 kHz kényelmesen mindezek fölött van, és tipikus alapérték.
Egy GPIO-n lévő kis LED esetében nincs olyan felső korlát, amely számítana; bármi 1 kHz-től 10 kHz-ig ugyanúgy viselkedik a szem számára.
3.14.2. Áttűnés¶
Egy beúsztató / kiúsztató ciklus a kitöltési tényezőt kikapcsolttól teljesen bekapcsoltig és vissza futtatja végig, minden lépésnél rövid ideig elidőzve:
import time
from machine import PWM, Pin
led = PWM(Pin("P7"), freq=1000, duty_u16=0)
while True:
for d in range(0, 65535, 256):
led.duty_u16(d)
time.sleep_ms(5)
for d in range(65535, 0, -256):
led.duty_u16(d)
time.sleep_ms(5)
1 kHz-es PWM és 5 ms-os lépések mellett a szem mindkét irányban sima áttűnést lát, és a látszólagos fényerő a kitöltési értéket követi.
A látszólagos fényerő nem szigorúan lineáris a kitöltési tényezőben – a szem válasza nagyjából négyzetes vagy köbös törvényt követ –, így a duty_u16 lineáris végigfuttatása nem tűnik a fényerő lineáris végigfuttatásának. Az érzékelhetően simább áttűnéshez a kitöltést görbe mentén léptessük.
Kényelmes, csak egész számokat használó trükk, hogy egy 8 bites számlálót léptetünk, és a négyzetét használjuk kitöltési tényezőként. A 255 × 255 = 65025 kerekítésen belül van a teljes skálához, így a végigfuttatás lefedi az egész tartományt:
import time
from machine import PWM, Pin
led = PWM(Pin("P7"), freq=1000, duty_u16=0)
while True:
for step in range(256):
led.duty_u16(step * step) # 0..65025, roughly quadratic
time.sleep_ms(5)
for step in range(255, -1, -1):
led.duty_u16(step * step)
time.sleep_ms(5)
Az áttűnés most már nagyjából egyenletesnek érződik a látszólagos fényerőben kikapcsolttól teljesig.