3.14. Regulação de luminosidade de LEDs com PWM¶
A página Geração de sinal analógico com PWM e um filtro RC usou um filtro passa-baixo RC para extrair uma tensão DC de um sinal PWM. Para um LED, o filtro não é necessário – o próprio olho humano faz a integração.
Quando um LED é ligado e desligado mais rapidamente do que cerca de 60 Hz, o sistema visual deixa de resolver os pulsos individuais e perceciona um brilho constante igual à saída luminosa média. Um ciclo de trabalho de 50 % é percebido como aproximadamente metade do brilho; 25 % como um quarto; 10 % como fraco.
A ligação elétrica é a mesma que para um LED externo estático em Saída GPIO – uma resistência limitadora de corrente em série com o LED, dimensionada usando as regras de Fundamentos de eletrónica. A mudança é apenas no software: o pino funciona como saída PWM em vez de um simples Pin.OUT.
3.14.1. Escolher a frequência¶
Para a regulação de luminosidade de LEDs, a frequência PWM só tem de ultrapassar o limiar de cintilação do olho:
Abaixo de ~60 Hz, o olho vê os pulsos diretamente.
Abaixo de ~200 Hz, a visão periférica e os movimentos rápidos dos olhos ainda podem revelar cintilação.
1 kHz está confortavelmente acima de tudo isso e é um valor padrão típico.
Não há limite superior relevante para um pequeno LED num GPIO; qualquer valor de 1 kHz a 10 kHz comporta-se da mesma forma para o olho.
3.14.2. Efeito de fade¶
Um ciclo de fade-in / fade-out varre o ciclo de trabalho de desligado para totalmente ligado e de volta, pausando brevemente em cada passo:
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)
A 1 kHz PWM e passos de 5 ms, o olho vê um fade suave em ambas as direções, com o brilho aparente a acompanhar o valor do ciclo de trabalho.
O brilho percebido não é estritamente linear em relação ao ciclo de trabalho – a resposta do olho segue aproximadamente uma lei quadrática ou cúbica – pelo que uma varredura linear de duty_u16 não parece uma varredura linear de brilho. Para um fade mais suave perceptualmente, avance o ciclo de trabalho numa curva.
Um truque conveniente usando apenas inteiros é avançar um contador de 8 bits e usar o seu quadrado como ciclo de trabalho. 255 × 255 = 65025 está dentro do arredondamento da escala completa, pelo que a varredura cobre toda a gama:
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)
O fade parece agora aproximadamente uniforme em brilho aparente desde desligado até ao máximo.