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.