3.14. Zatamnjivanje LED diode pomoću PWM-a¶
Stranica Generiranje analognog signala pomoću PWM-a i RC filtra koristila je RC niskopropusni filtar za izvlačenje istosmjernog napona iz PWM signala. Za LED diodu filtar nije potreban – usrednjavanje obavlja samo ljudsko oko.
Kada se LED dioda uključuje i isključuje brže od oko 60 Hz, vidni sustav prestaje razlučivati pojedinačne impulse i percipira ujednačenu svjetlinu jednaku prosječnom izlazu svjetlosti. Radni ciklus od 50 % čita se kao otprilike pola svjetline; 25 % kao četvrtina; 10 % kao prigušeno.
Ožičenje je isto kao za statičnu vanjsku LED diodu na GPIO izlaz – otpornik za ograničavanje struje u seriji s LED diodom, dimenzioniran pomoću pravila iz Osnove elektronike. Promjena je samo u softveru: pin radi kao PWM izlaz umjesto običnog Pin.OUT.
3.14.1. Odabir frekvencije¶
Za zatamnjivanje LED diode PWM frekvencija mora samo prijeći prag treperenja oka:
Ispod ~60 Hz oko vidi impulse izravno.
Ispod ~200 Hz periferni vid i brzo kretanje oka još uvijek mogu otkriti treperenje.
1 kHz je udobno iznad svega toga i tipična je zadana vrijednost.
Ne postoji gornja granica koja je važna za malu LED diodu na GPIO-u; bilo što od 1 kHz do 10 kHz ponaša se isto za oko.
3.14.2. Postupno tamnjenje i posvjetljivanje¶
Petlja postupnog posvjetljivanja / tamnjenja pomiče radni ciklus od isključenog do potpuno uključenog i natrag, kratko zadržavajući na svakom koraku:
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)
Pri PWM-u od 1 kHz i koracima od 5 ms oko vidi gladak prijelaz u oba smjera, pri čemu prividna svjetlina prati vrijednost radnog ciklusa.
Percipirana svjetlina nije strogo linearna u odnosu na radni ciklus – odziv oka slijedi otprilike kvadratni ili kubni zakon – pa linearno pomicanje vrijednosti duty_u16 ne izgleda kao linearno pomicanje svjetline. Za percepcijski glađi prijelaz, mijenjajte radni ciklus po krivulji.
Praktičan trik samo s cijelim brojevima jest mijenjati 8-bitni brojač i koristiti njegov kvadrat kao radni ciklus. 255 × 255 = 65025 je unutar zaokruživanja pune skale, pa raspon pokriva cijelo područje:
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)
Prijelaz se sada osjeća približno ujednačen po prividnoj svjetlini od isključenog do punog.