3.14. 以 PWM 調節 LED 亮度¶
使用 PWM 與 RC 濾波器產生類比訊號 頁面使用 RC 低通濾波器從 PWM 訊號中萃取出直流電壓。對 LED 而言並不需要這個濾波器——人眼本身就會進行平均化。
當 LED 以快於約 60 Hz 的速度開關時,視覺系統便無法分辨個別脈衝,而是感知到等於平均光輸出的穩定亮度。50 % 的占空比看起來大約是半亮度;25 % 是四分之一;10 % 則是昏暗。
接線方式與 GPIO 輸出 上的靜態外接 LED 相同——一個與 LED 串聯的限流電阻,並依 電子學基礎 中的規則選定其阻值。改變的只在軟體:該接腳以 PWM 輸出運行,而非單純的 Pin.OUT。
3.14.1. 選擇頻率¶
對 LED 調光而言,PWM 頻率只需跨過人眼的閃爍門檻:
低於約 60 Hz 時,人眼會直接看到脈衝。
低於約 200 Hz 時,周邊視覺與快速的眼球運動仍可能顯現閃爍。
1 kHz 遠高於上述所有情況,是典型的預設值。
對於 GPIO 上的小型 LED 而言,並沒有什麼有意義的上限;從 1 kHz 到 10 kHz 對人眼而言表現都相同。
3.14.2. 淡入淡出¶
淡入/淡出迴圈會將占空比從關掃描到全開再回到關,並在每一步短暫停留:
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 與 5 ms 步進下,人眼會看到兩個方向皆平順的淡變,而表觀亮度會跟隨占空比的數值。
感知亮度與占空比並非嚴格的線性關係——人眼的響應大致遵循平方或立方律——因此 duty_u16 的線性掃描看起來並不像是亮度的線性掃描。若要在感知上更平順的淡變,請以曲線方式步進占空比。
一個便利且僅用整數的訣竅,是步進一個 8 位元計數器,並用其平方作為占空比。255 × 255 = 65025 在捨入誤差範圍內即達到滿刻度,因此掃描涵蓋了整個範圍:
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)
現在這個淡變從關到全開在表觀亮度上感覺大致均勻。