3.14. PWM ile LED karartma¶
PWM ve bir RC filtresiyle analog üretme sayfası, bir PWM sinyalinden DC gerilim çıkarmak için bir RC alçak geçiren filtre kullanmıştı. Bir LED için filtreye gerek yoktur; ortalamayı insan gözünün kendisi yapar.
Bir LED yaklaşık 60 Hz’den daha hızlı açılıp kapatıldığında, görsel sistem tek tek darbeleri ayırt etmeyi bırakır ve ortalama ışık çıkışına eşit sabit bir parlaklık algılar. %50’lik bir görev döngüsü kabaca yarı parlaklık olarak okunur; %25 çeyrek olarak; %10 ise sönük olarak.
Kablolama, GPIO çıkışı sayfasındaki statik harici bir LED ile aynıdır – LED ile seri bağlı, Elektronik temelleri sayfasındaki kurallar kullanılarak boyutlandırılmış bir akım sınırlayıcı direnç. Değişiklik yalnızca yazılımdadır: pin, düz bir Pin.OUT yerine bir PWM çıkışı olarak çalışır.
3.14.1. Frekansı seçmek¶
LED karartma için PWM frekansının yalnızca gözün titreme (flicker) eşiğini aşması gerekir:
~60 Hz’in altında göz darbeleri doğrudan görür.
~200 Hz’in altında çevresel görüş ve hızlı göz hareketi yine de titremeyi ortaya çıkarabilir.
1 kHz, bütün bunların rahatça üzerindedir ve tipik bir varsayılandır.
Bir GPIO üzerindeki küçük bir LED için önemli bir üst sınır yoktur; 1 kHz ile 10 kHz arasındaki her şey göze aynı görünür.
3.14.2. Solma (Fading)¶
Bir içeri-soldurma / dışarı-soldurma döngüsü, görev döngüsünü kapalıdan tamamen açığa ve geri tarar, her adımda kısaca bekler:
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 PWM ve 5 ms’lik adımlarda göz, görünür parlaklığın görev döngüsü değerini izlediği, her iki yönde de yumuşak bir solma görür.
Algılanan parlaklık, görev döngüsünde tam olarak doğrusal değildir – gözün tepkisi kabaca bir kare veya küp yasasını izler – bu yüzden duty_u16 değerinin doğrusal bir taraması, parlaklığın doğrusal bir taraması gibi görünmez. Algısal olarak daha yumuşak bir solma için görev döngüsünü bir eğri üzerinde adımlayın.
Kullanışlı, yalnızca tamsayı kullanan bir püf noktası, 8 bitlik bir sayacı adımlamak ve onun karesini görev döngüsü olarak kullanmaktır. 255 × 255 = 65025, tam ölçeğin yuvarlama farkı içindedir, böylece tarama tüm aralığı kapsar:
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)
Solma artık kapalıdan tama görünür parlaklıkta kabaca eşit hissettiriyor.