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.