Aprender

PWM: um pino que só sabe ligar e desligar, imitando um meio-termo

Ou veja todas as aulas.

  • 465componentes na bancada
  • 43placas rodando agora
  • 1.00xtempo real, em todas as placas
Arduino Uno: fadelive0.000 s 0.00x
Clique para abrir no editor
PWM de hardware de verdade no timer 1, fazendo um LED no pino 9 respirar a 490 Hz.

Um pino de saída digital tem exatamente dois estados. Ele não consegue ficar em 2,5 V para deixar um LED com metade do brilho. A modulação por largura de pulso consegue o mesmo efeito de outro jeito: ligue e desligue o pino rápido o bastante, varie quanto de cada ciclo ele passa ligado, e tudo o que vem depois e não consegue reagir tão rápido quanto o chaveamento só enxerga a média, que se comporta como uma tensão intermediária de verdade.

O circuito acima é o programa fade que já vem pronto no Arduino Uno, rodando de verdade. O analogWrite() no pino 9 coloca o timer 1 em PWM phase-correct de 8 bits com prescaler de 64, o que dá 16 MHz divididos por 64 vezes 510, cerca de 490 Hz. Esse número não é um chute; é o que o hardware do timer realmente produz com esse prescaler e esse modo, e depois de configurado o timer mantém o ciclo de trabalho sozinho. O sketch só muda o registrador de comparação, trinta vezes por segundo, percorrendo uma tabela de 64 posições com o formato de um ciclo de (1 - cosseno) dividido por 2. É isso que faz a luz parecer que está respirando em vez de subir em linha reta: o olho percebe o brilho de forma mais ou menos logarítmica, então uma rampa linear parece passar correndo pela componentee de cima.

Isso é PWM de hardware: depois que o timer está configurado, a CPU fica livre para fazer outra coisa entre as atualizações, e a forma de onda no pino nunca falha, mesmo que o sketch fique ocupado por um instante. O PWM por software, a alternativa num pino sem timer por trás, faz a própria CPU virar o pino seguindo um horário, o que gasta tempo de CPU proporcional à frequência e pode tremer se outra coisa precisar do processador na hora errada.

O que você vê no LED também não é o liga e desliga instantâneo. A ponta de prova do LED no Mokxi é uma média curta do próprio brilho, com uma constante de tempo perto de 8 milissegundos, que está na mesma faixa do tempo que o olho leva para reagir a uma mudança. A 490 Hz, cada ciclo de PWM dura cerca de 2 milissegundos, bem mais rápido do que essa média consegue acompanhar, então o LED mostra o seu ciclo de trabalho com precisão de uns poucos por cento, em vez de piscar uma vez por ciclo. Isso não é um truque de desenho para imitar um borrão; é a mesma média que uma retina de verdade faz, calculada do mesmo jeito.

Abra o circuito e veja a respiração entrar no ritmo. A comparação que vale a pena fazer em seguida é no ESP32-C3, que traz a mesma respiração de dois jeitos: o fade faz tudo por software, e o pwmfade entrega o trabalho ao LEDC, o controlador de PWM do próprio chip, em qualquer pino em vez de só em seis pinos fixos. Os dois estão nas páginas de simulador das placas.

Monte isto de verdade

Abra o editor, mude um valor e veja o número mudar junto. Nada para instalar, e não precisa de conta.