Eletrônica Por Equipe DevBras

Capa do artigo: PWM no Arduino não abaixa a voltagem: o que analogWrite realmente faz no pino

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

  1. 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.
  2. Baixar um sinal de 5 V para 3,3 V: divisor de resistores ou conversor de nível lógico.
  3. 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.
  4. 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 analogWrite em 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.

Avalie este artigo

Referência: http://arduino.cc/en/Tutorial/PWM