PWM é um conjunto de métodos de geração de sinais digitais que são bastante usados em projetos com microcontroladores. Neste artigo vamos conhecer um pouco mais sobre o PWM, vendo em detalhes o que ele é, aplicações comuns, como usar na IDE Arduino e ver um exemplo completo.
O que é PWM?
PWM (Pulse Width Modulation) é qualquer método de geração de um sinal digital onde o tempo que o sinal permanece em nível alto varia.
Como estamos trabalhando com um sinal digital, ele pode assumir somente dois níveis, o alto e o baixo. Podemos considerar o sinal como uma sequência de pulsos, onde cada pulso corresponde a um período durante o qual o sinal fica apenas no nível alto.
No PWM estamos variando o tempo que o sinal fica no nível alto, ou seja, a largura dos pulsos. A variação de uma característica de um sinal é chamada de modulação.
Chegamos assim à Modulação por variação da Largura de Pulsos, ou seja, PWM (Pulse Width Modulation, usando os termos em inglês).
O que significa PWM?
PWM, ou Modulação por Largura de Pulso, é uma técnica utilizada para gerar sinais digitais que variam a duração dos pulsos em um ciclo. Essencialmente, você ajusta quanto tempo o sinal fica em nível alto em cada ciclo para controlar a tensão média e a potência fornecida a dispositivos como LEDs, motores e servomotores. É uma maneira eficaz de simular variações analógicas com um sinal digital.
Como funciona o PWM?
No caso mais comum, temos um sinal periódico, onde o tempo entre as mudanças de nível baixo para alto é sempre igual. Este tempo é o período do sinal, cujo inverso é a frequência. A relação entre o tempo que o sinal fica no nível alto e o período é o duty-cycle.
O sinal digital periódico mais simples é a onda quadrada, onde o sinal permanece alto e baixo em tempos iguais (e portanto o duty-cycle é 50%):
A tensão média do sinal é V/2, onde V é a tensão do nível alto.
Vamos agora reduzir o tempo que o sinal fica alto pela metade, aumentando o tempo que o sinal fica baixo, para que o período continue o mesmo. O resultado é um sinal com duty-cycle de 25%:
A tensão média do sinal é reduzida para 0,25*V.
Vamos agora fazer o contrário, aumentar o tempo que o sinal fica alto, subindo o duty-cycle para 75%:
A tensão média do sinal é agora 0,75*V. De um modo geral, a tensão média para sinais PWM com frequência constante é V * duty_cycle.
Aplicações do PWM
Os usos comuns podem ser agrupados em duas situações:
- Codificação de informações: o duty-cycle é associado a uma informação digital ou analógica.
- Controle da tensão média: ao mudarmos o duty cycle mudamos o valor médio da tensão do sinal.
Estes são alguns exemplos:
- Controle de Posição de Servo motor: A maioria dos servo motores é controlada por um sinal de PWM com período de 20 ms (o que corresponde a uma frequência de 50 Hz). A variação do tempo de sinal alto entre 1 e 2 ms provoca a mudança da posição do servomotor entre 0 e 180 graus (estes valores variam ligeiramente de servo para servo).
- Controle de LEDs RGB endereçáveis WS2812: O sinal de controle destes LEDs é um sinal PWM onde a duração de cada pulso corresponde a um bit 0 ou 1. Cada oito pulsos determinam a intensidade de um dos componentes (vermelho, verde ou azul) de um LED.
- Controle da Luminosidade de LEDs: Ao aplicarmos em um LED um sinal PWM, com uma frequência suficientemente alta, a nossa vista não enxergará os pulsos individuais (como uma sequência de aceso/apagado). Ela fará a média, permitindo que o LED seja visto em diferentes níveis de intensidade.
- Controle de Motores CC: Efeito semelhante ocorre ao aplicar um sinal PWM em um motor de corrente contínua. Quando o nível estiver baixo, o motor continuará girando por inércia. Desta forma pode ser usado, grosseiramente, para controlar a velocidade e a força do motor. Um exemplo comum disso é o controle de ventiladores de refrigeração de processadores.
- Geração de Sinal Analógico: O valor (tensão) médio de um sinal PWM pode ser obtido, com restrições, aplicando o sinal sobre um capacitor. Mais precisamente, deve ser colocado um filtro passa-baixas, composto de um resistor e um capacitor, na saída do PWM. O filtro deve ser calculado para atenuar as frequências acima da frequência do sinal.
Além das aplicações comuns que mencionamos, também é amplamente utilizado em sistemas de controle mais avançados. Vamos explorar alguns exemplos adicionais:
- Controlador: O controlador PWM é um componente utilizado em muitos sistemas de controle, permitindo a modulação precisa da largura dos pulsos para gerenciar dispositivos eletrônicos. Este controlador ajusta o duty-cycle do sinal PWM para atender às necessidades específicas de um dispositivo, como um motor ou um LED.
- Controlador de Carga: Em aplicações onde a regulação de carga é essencial, como em fontes de alimentação e conversores de energia, o controlador de carga PWM é utilizado. Este dispositivo ajusta a largura dos pulsos para controlar a entrega de energia e melhorar a eficiência do sistema.
- Válvula: Em sistemas de automação e controle de fluidos. Através da modulação do sinal PWM, é possível controlar com precisão a abertura e o fechamento da válvula, regulando o fluxo de fluidos em processos industriais ou sistemas de climatização.
- PWM Fan: Os ventiladores PWM, como os encontrados em sistemas de resfriamento de computadores, utilizam sinais PWM para controlar a velocidade do motor do ventilador. Ao ajustar o duty-cycle do sinal, é possível variar a rotação do ventilador e, consequentemente, a sua velocidade.
- Cabo: Para conectar dispositivos que utilizam PWM, como ventiladores e servo motores, é essencial utilizar um cabo apropriado. Este cabo é projetado para transmitir sinais PWM de maneira eficiente e confiável entre o controlador e o dispositivo.
- Conector: O conector PWM é um tipo de conector específico utilizado para fazer a ligação entre o controlador e os dispositivos que recebem o sinal. Este conector garante uma conexão segura e estável, facilitando a integração de dispositivos em sistemas de controle.
Implementação em microcontroladores
Existem diversas formas de implementar PWM em microcontroladores. A mais comum é a presença de temporizadores (timers) de uso geral, que possuem um modo PWM. Neste modo, dois valores determinam a frequência e o tempo que o sinal permanece em nível alto. É o caso do microcontrolador ATmega usado no Arduino Uno R3 e similares.
Outros microcontroladores, como o RP2040 e RP2350 das Raspberry Pi Pico 2, possuem periféricos específicos para a geração de PWM.
A quantidade de periféricos para geração de PWM por hardware (e os pinos que eles podem usar) costumam ser limitados. É também possível gerar sinais PWM através de uma rotina disparada periodicamente (por exemplo por uma interrupção) que aciona diretamente a saída digital.
Funcionamento do PWM no Arduino
O ambiente Arduino abstrai a implementação específica do PWM, reduzindo a geração de PWM a uma única função:
analogWrite(pino, valor)
Onde pino é a identificação do pino digital onde será produzido o sinal e valor é um número de 0 a 255 que determina o duty-cycle (0 corresponde a 0% e 255 a 100%).
Os pinos aceitos, e a frequência do sinal, variam de placa para placa. Abaixo os valores para algumas das placas fabricadas pela Arduino:
Placa | Pinos permitidos | Frequência |
Uno R3 e anteriores, Nano | 3, 5, 6, 9, 10, 11 | 490 Hz (pinos 5 e 6: 980 Hz) |
Uno R4 | 3, 5, 6, 9, 10, 11 | 490 Hz |
Mega 2560 | 2 – 13, 44 – 46 | 490 Hz (pinos 4 e 13: 980 Hz) |
Due | 1-13 | 1000Hz |
Nano ESP32 | 0-13, A0 a A7 (somente 5 simultâneos) |
1000Hz |
Nota: em algumas placas mais recentes, analogWrite() pode ser usado com alguns pinos específicos para gerar um sinal analógico ao invés de um sinal PWM.
Controle de brilho de LED com PWM do Arduino
Neste exemplo vamos controlar a intensidade de um LED ligado a um Arduino Uno usando PWM.
O LED 5mm é ligado em série a um Resistor de 1kΩ (para limitar a corrente) entre o pino 11 e GND. O circuito para controlar o brilho do LED está representado abaixo:
No programa vamos usar o analogWrite() para mudar a intensidade conforme os valores de uma senoide:
// Projeto MakerHero - Brilho LED PWM int ledPin = 11; float sinVal; int ledVal; void setup() { pinMode(ledPin, OUTPUT); } void loop() { for (int x=0; x<180; x++) { // converte graus para radianos e então obtém o valor do seno sinVal = (sin(x*(3.1412/180))); ledVal = int(sinVal*255); analogWrite(ledPin, ledVal); delay(25); } }
A variável sinVal recebe o valor do seno para ângulos de 0° a 179°, o ângulo é convertido para radianos, pois esta é a unidade aceita pela função sin(). Em seguida este valor é convertido para um inteiro entre 0 e 255, que é a faixa aceita por analogWrite().
Uma descrição mais completa deste exemplo pode ser vista no artigo “Ajustando o Brilho de um LED por PWM”.
Conclusão
Neste artigo aprendemos como o ambiente Arduino permite gerar sinais PWM com uma única chamada à função analogWrite().
Se você tiver dúvidas, sugestões ou experiências para compartilhar, fique a vontade para deixar um comentário abaixo. E para não perder nenhum conteúdo como este, não deixe de nos seguir no Instagram.