PWM no Arduino não abaixa a voltagem: o que analogWrite realmente faz no pino
Entenda por que analogWrite gera pulsos de 5 V e não uma tensão intermediária, o que o multímetro mostra, como corrigir o brilho do LED e quando você precisa de tensão de verdade.
Você precisa de 3,3 V para um sensor, faz a conta e escreve analogWrite(9, 168), porque 168 de 255 dá dois terços de 5 V. O multímetro até mostra algo perto de 3,3 V. Dias depois, o sensor morreu. O pino não estava em 3,3 V: ele alternava entre 0 e 5 V centenas de vezes por segundo, e o sensor recebeu 5 V em cada pulso.
A resposta curta: no Uno e na maioria das placas pequenas, analogWrite não gera tensão intermediária. Gera PWM, uma onda quadrada que fica uma fração do tempo em 5 V e o resto em 0 V. LED e motor reagem à média, por isso o brilho e a velocidade mudam. Qualquer componente que só aceita tensão menor continua recebendo o pico. Para tensão de verdade, use regulador, divisor ou um conversor digital-analógico.
O que acontece no pino durante o analogWrite
O valor de 0 a 255 define o ciclo de trabalho, a fração de cada período em que o pino fica em nível alto. Com 64, o pino passa cerca de 25% do tempo em 5 V; com 128, cerca de 50%; com 255, fica sempre em 5 V; com 0, sempre em 0 V. A frequência é fixa: no Uno, perto de 490 Hz na maioria dos pinos de PWM e perto de 980 Hz nos pinos 5 e 6.
analogWrite(9, 64) -> ciclo 25%
5 V ┌─┐ ┌─┐ ┌─┐
│ │ │ │ │ │
0 V ─┘ └─────┘ └─────┘ └─────
média = 5 V × 0,25 = 1,25 V
pico = 5 V, sempre
A média só existe para quem é lento o bastante para não acompanhar cada pulso. O olho humano não percebe 490 piscadas por segundo e vê um brilho intermediário. A inércia do motor também suaviza os pulsos. Um chip de 3,3 V, por outro lado, responde em nanossegundos e enxerga cada pico de 5 V.
Nem todo pino gera PWM. No Uno, são 3, 5, 6, 9, 10 e 11, marcados com um til na placa. Em outro pino, analogWrite com valor abaixo de 128 deixa o pino em 0 V, e com 128 ou mais deixa em 5 V. Nada de meio-termo: o LED só acende ou apaga, e parece defeito.
Experimento: o que o multímetro mostra
O exemplo que vai atravessar o texto: um LED vermelho com resistor de 220 Ω no pino 9 de um Uno alimentado pelo USB. O sketch abaixo passa por cinco valores, três segundos em cada, para dar tempo de medir, e depois faz um fade com correção de percepção.
const int PINO_LED = 9; // no Uno, PWM só em 3, 5, 6, 9, 10 e 11
const int VALORES[] = {0, 64, 128, 191, 255};
const int NUM_VALORES = sizeof(VALORES) / sizeof(VALORES[0]);
void mostrar(int valor) {
float ciclo = valor / 255.0;
Serial.print("analogWrite=");
Serial.print(valor);
Serial.print(" ciclo=");
Serial.print(ciclo * 100.0, 1);
Serial.print("% media_teorica=");
Serial.print(ciclo * 5.0, 2);
Serial.println(" V (o pico continua em 5 V)");
}
void setup() {
pinMode(PINO_LED, OUTPUT);
Serial.begin(9600);
for (int i = 0; i < NUM_VALORES; i++) {
analogWrite(PINO_LED, VALORES[i]);
mostrar(VALORES[i]);
delay(3000);
}
}
void loop() {
// O olho não percebe brilho de forma linear; elevar ao quadrado aproxima a percepção.
for (int i = 0; i <= 255; i++) {
analogWrite(PINO_LED, (long)i * i / 255);
delay(8);
}
for (int i = 255; i >= 0; i--) {
analogWrite(PINO_LED, (long)i * i / 255);
delay(8);
}
}
Com o multímetro em tensão contínua entre o pino 9 e o GND, durante a fase de valores fixos, você tende a ver números próximos da média teórica: perto de 1,25 V com 64, perto de 2,5 V com 128. Muitos multímetros mostram algo assim porque fazem média ao longo do tempo, mas o resultado varia com o aparelho e com a frequência, e alguns mostram valores estranhos. Lembre também que a referência é a alimentação real: se o USB entrega 4,8 V, a média de 50% é 2,4 V.
O que o multímetro não mostra é o pico. Só um osciloscópio desenha a onda quadrada. A leitura de 2,5 V no multímetro não significa que existe 2,5 V no pino. O procedimento de medição em si está em como usar o multímetro sem queimar o fusível.
O resistor do LED continua obrigatório
Durante cada pulso, o LED recebe 5 V. Com 220 Ω e uns 2 V de queda no LED, a corrente no pulso é (5 - 2) / 220, cerca de 13,6 mA, seja o ciclo de 10% ou de 100%. Sem o resistor, a corrente de pico é a mesma de um LED ligado direto, só que em rajadas. O PWM reduz a média, não o pico. A conta completa está em resistor do LED.
Por que o fade linear parece errado
Se você subir o valor de 0 a 255 em passos iguais, o LED parece ganhar quase todo o brilho na primeira metade e quase não mudar na segunda. A percepção de brilho não é linear. Elevar o valor ao quadrado e dividir por 255, como no loop() acima, espalha melhor a mudança visível. Não é uma curva exata, mas melhora muito com uma linha de código.
Quando você precisa de tensão de verdade
- Alimentar um componente de 3,3 V: use a saída de 3,3 V da placa, se a corrente couber, ou um regulador. Nunca PWM.
- Baixar um sinal de 5 V para 3,3 V: divisor de resistores ou conversor de nível lógico.
- Gerar uma tensão analógica de controle: filtre o PWM com um resistor e um capacitor. Com 10 kΩ e 10 µF, a frequência de corte fica em cerca de 1,6 Hz (1 dividido por 2π × R × C), bem abaixo dos 490 Hz do PWM, e a ondulação cai bastante. O preço é a lentidão, cerca de um décimo de segundo de constante de tempo, e uma saída fraca: se a carga puxar corrente, a tensão cai. Para alimentar alguma coisa a partir dela, coloque um amplificador operacional como buffer.
- Usar uma placa com conversor digital-analógico: algumas placas têm um de verdade (o Uno R4, por exemplo, tem um no pino A0). Confira na documentação da sua placa antes de contar com ele.
No motor, a discussão continua em PWM muda o esforço médio do motor, e o PWM entra no pino de habilitação da ponte H, como em motor DC com sentido e velocidade.
Erros comuns
- Alimentar componente de 3,3 V com PWM: cada pulso entrega 5 V, e o componente degrada ou queima.
- Tirar o resistor do LED porque o brilho está baixo: o pico de corrente volta a ser o de um LED sem limite.
- Usar
analogWriteem pino sem PWM: o pino só liga ou desliga, e o fade some. - Confiar no multímetro como prova de tensão: ele mostra uma média aproximada, não a forma de onda.
- Fade com passos lineares: o brilho parece saltar no começo e estacionar no fim.
- Filtro RC alimentando carga diretamente: a tensão desaba assim que a carga puxa corrente.
Checklist
- O pino usado aparece como PWM na documentação da placa.
- Você sabe que o pico no pino é a tensão de alimentação, em qualquer ciclo.
- Todo LED com PWM tem resistor calculado para o pico.
- Nenhum componente de tensão menor recebe PWM como alimentação.
- O fade usa uma curva de correção, não passos lineares.
- Quando precisa de tensão analógica, usa filtro com buffer, regulador ou conversor digital-analógico.
Olhe para cada analogWrite do seu projeto e pergunte: o que está do outro lado desse pino reage à média ou ao pico? Se a resposta for "ao pico" e o componente não aguenta 5 V, o PWM é o lugar errado.
Referência: http://arduino.cc/en/Tutorial/PWM