3.14. Регулювання яскравості світлодіода за допомогою ШІМ¶
На сторінці Генерація аналогового сигналу за допомогою PWM та RC-фільтра використовувався RC-фільтр низьких частот для виокремлення постійної напруги із сигналу ШІМ. Для світлодіода фільтр не потрібен – саме людське око виконує усереднення.
Коли світлодіод вмикається та вимикається швидше приблизно ніж 60 Гц, зорова система перестає розрізняти окремі імпульси і сприймає рівномірну яскравість, що дорівнює середньому світловому потоку. Робочий цикл 50 % сприймається як приблизно половина яскравості; 25 % — як чверть; 10 % — як тьмяне світло.
Схема підключення така сама, як для статичного зовнішнього світлодіода на сторінці Вихід GPIO – струмообмежувальний резистор послідовно зі світлодіодом, розрахований за правилами з Основи електроніки. Змінюється лише програмна частина: вивід працює як вихід PWM замість звичайного Pin.OUT.
3.14.1. Вибір частоти¶
Для регулювання яскравості світлодіода частота ШІМ повинна лише перевищувати поріг мерехтіння ока:
Нижче ~60 Гц око безпосередньо бачить імпульси.
Нижче ~200 Гц периферійний зір і швидкі рухи ока можуть все ще виявляти мерехтіння.
1 кГц значно перевищує всі ці пороги і є типовим значенням за замовчуванням.
Для невеликого світлодіода на GPIO верхньої межі не існує; будь-яке значення від 1 кГц до 10 кГц виглядає однаково для ока.
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 кГц і кроках 5 мс око бачить плавне змінення яскравості в обох напрямках, де видима яскравість слідує за значенням робочого циклу.
Сприйнята яскравість не є строго лінійною від робочого циклу – реакція ока приблизно відповідає квадратному або кубічному закону – тому лінійне змінення 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)
Тепер плавне змінення виглядає приблизно рівномірним за видимою яскравістю від вимкнення до повного.