3.14. LEDin himmennys PWM:llä¶
Sivulla Analogiasignaalin tuottaminen PWM:llä ja RC-suodattimella käytettiin RC-alipäästösuodatinta tasajännitteen erottamiseen PWM-signaalista. LEDin kohdalla suodatinta ei tarvita – ihmissilmä itse hoitaa keskiarvoistuksen.
Kun LEDiä kytketään päälle ja pois nopeammin kuin noin 60 Hz, näköjärjestelmä lakkaa erottelemasta yksittäisiä pulsseja ja havaitsee tasaisen kirkkauden, joka vastaa keskimääräistä valotehoa. 50 %:n pulssisuhde näyttää suunnilleen puolikirkkaudelta; 25 % neljännekseltä; 10 % himmeältä.
Kytkentä on sama kuin staattisella ulkoisella LEDillä sivulla GPIO-lähtö – virtaa rajoittava vastus sarjassa LEDin kanssa, mitoitettuna sivun Elektroniikan perusteet sääntöjen mukaan. Muutos on vain ohjelmistossa: nasta toimii PWM-lähtönä tavallisen Pin.OUT:n sijaan.
3.14.1. Taajuuden valinta¶
LEDin himmennyksessä PWM-taajuuden on vain ylitettävä silmän välkyntäkynnys:
Alle noin 60 Hz:n silmä näkee pulssit suoraan.
Alle noin 200 Hz:n ääreisnäkö ja nopeat silmänliikkeet voivat yhä paljastaa välkynnän.
1 kHz on mukavasti kaiken tämän yläpuolella ja on tyypillinen oletusarvo.
GPIO:ssa olevalle pienelle LEDille ei ole merkityksellistä ylärajaa; mikä tahansa 1 kHz:stä 10 kHz:iin käyttäytyy silmälle samalla tavalla.
3.14.2. Häivytys¶
Sisäänhäivytys- / uloshäivytyssilmukka pyyhkäisee pulssisuhteen pois päältä täysin päälle ja takaisin, viipyen hetken kullakin askeleella:
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:n PWM:llä ja 5 ms:n askelilla silmä näkee pehmeän häivytyksen molempiin suuntiin, ja näennäinen kirkkaus seuraa pulssisuhteen arvoa.
Havaittu kirkkaus ei ole tarkalleen lineaarinen pulssisuhteeseen nähden – silmän vaste noudattaa suunnilleen neliö- tai kuutiolakia – joten duty_u16:n lineaarinen pyyhkäisy ei näytä lineaariselta kirkkauden pyyhkäisyltä. Havaintoa pehmeämmän häivytyksen saa askeltamalla pulssisuhdetta käyrää pitkin.
Kätevä pelkästään kokonaisluvuilla toimiva niksi on askeltaa 8-bittistä laskuria ja käyttää sen neliötä pulssisuhteena. 255 × 255 = 65025 on pyöristyksen tarkkuudella täysi asteikko, joten pyyhkäisy kattaa koko alueen:
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)
Häivytys tuntuu nyt suunnilleen tasaiselta näennäisen kirkkauden suhteen pois päältä täyteen.