3.14. LED-Dimmen mit PWM¶
Auf der Seite Analoge Spannungen mit PWM und einem RC-Filter erzeugen wurde ein RC-Tiefpassfilter verwendet, um eine Gleichspannung aus einem PWM-Signal zu gewinnen. Bei einer LED wird der Filter nicht benötigt – das menschliche Auge selbst übernimmt die Mittelwertbildung.
Wird eine LED schneller als etwa 60 Hz ein- und ausgeschaltet, hört das Sehsystem auf, einzelne Pulse aufzulösen, und nimmt eine konstante Helligkeit wahr, die der mittleren Lichtabgabe entspricht. Ein Tastverhältnis von 50 % wird als etwa halbe Helligkeit wahrgenommen; 25 % als ein Viertel; 10 % als gedimmt.
Die Verdrahtung ist dieselbe wie bei einer statischen externen LED auf GPIO-Ausgang – ein strombegrenzender Widerstand in Reihe mit der LED, dimensioniert nach den Regeln aus Grundlagen der Elektronik. Die Änderung betrifft nur die Software: Der Pin läuft als PWM-Ausgang anstatt als einfacher Pin.OUT.
3.14.1. Wahl der Frequenz¶
Beim LED-Dimmen muss die PWM-Frequenz nur die Flimmer-Schwelle des Auges überwinden:
Unterhalb von ~60 Hz sieht das Auge die Pulse unmittelbar.
Unterhalb von ~200 Hz können das periphere Sehen und schnelle Augenbewegungen das Flimmern noch sichtbar machen.
1 kHz liegt bequem über all dem und ist ein typischer Standardwert.
Es gibt keine relevante Obergrenze für eine kleine LED an einem GPIO; alles von 1 kHz bis 10 kHz wirkt auf das Auge gleich.
3.14.2. Überblenden¶
Eine Einblend-/Ausblend-Schleife durchläuft das Tastverhältnis von Aus bis vollständig Ein und zurück und verweilt bei jedem Schritt kurz:
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)
Bei 1 kHz PWM und 5-ms-Schritten sieht das Auge ein sanftes Überblenden in beide Richtungen, wobei die wahrgenommene Helligkeit dem Tastverhältnis-Wert folgt.
Die wahrgenommene Helligkeit ist nicht streng linear zum Tastverhältnis – die Reaktion des Auges folgt etwa einem Quadrat- oder Kubikgesetz –, sodass ein linearer Durchlauf von duty_u16 nicht wie ein linearer Durchlauf der Helligkeit aussieht. Für ein wahrnehmungstechnisch gleichmäßigeres Überblenden sollte man das Tastverhältnis entlang einer Kurve durchlaufen.
Ein praktischer Trick mit reiner Ganzzahlarithmetik besteht darin, einen 8-Bit-Zähler durchzulaufen und sein Quadrat als Tastverhältnis zu verwenden. 255 × 255 = 65025 liegt innerhalb der Rundung am Vollausschlag, sodass der Durchlauf den gesamten Bereich abdeckt:
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)
Das Überblenden fühlt sich nun in der wahrgenommenen Helligkeit von Aus bis Voll annähernd gleichmäßig an.