Continuando a sequência de artigos básicos sobre a plataforma Arduino, vamos aprender como utilizar sinais PWM na placa Arduino UNO. No final desse artigo você saberá o que é PWM e como usar o PWM do Arduino para controlar a intensidade de um LED. O conteúdo apresentado servirá de base para suas aplicações usando o PWM do Arduino.
O que é PWM?
PWM, do inglês Pulse Width Modulation, é uma técnica utilizada por sistemas digitais para variação do valor médio de uma forma de onda periódica. A técnica consiste em manter a frequência de uma onda quadrada fixa e variar o tempo que o sinal fica em nível lógico alto. Esse tempo é chamado de duty cycle, ou seja, o ciclo ativo da forma de onda. No gráfico abaixo são exibidas algumas modulações PWM:
Fonte: https://arduino.cc/en/Tutorial/PWM
Analisando as formas de onda nota-se que a frequência da forma de onda tem o mesmo valor e varia-se o duty cycle da forma de onda. Quando o duty cicle está em 0% o valor médio da saída encontra-se em 0 V e consequentemente para um duty cycle de 100% a saída assume seu valor máximo, que no caso é 5V. Para um duty cycle de 50% a saída assumirá 50% do valor da tensão, 2,5 V e assim sucessivamente para cada variação no duty cycle. Portanto, para calcular o valor médio da tensão de saída de um sinal PWM pode-se utilizar a seguinte equação:
Vout = (duty cycle/100)* Vcc
Onde:
- Vout – tensão de saída em V;
- duty cycle – valor do ciclo ativo do PWM em %;
- Vcc – tensão de alimentação em V.
PWM pode ser usada para diversas aplicações, como por exemplo:
-
controle de velocidade de motores;
-
variação da luminosidade de leds;
-
geração de sinais analógicos;
-
geração de sinais de áudio.
PWM do Arduino
A placa Arduino Uno possui pinos específicos para saídas PWM e são indicados pelo carácter ‘~’ na frente de seu número, conforme exibido a seguir:
Observa-se na figura acima, que a Arduino Uno possui 6 pinos para saída PWM (3,5,6,9,10,11). Para auxiliar na manipulação desses pinos a plataforma possui uma função que auxilia na escrita de valores de duty cycle para esses pinos, assim você pode facilmente usar o PWM do Arduino UNO e outras placas.
Função analogWrite()
A função analogWrite() escreve um valor de PWM em um pino digital que possui a função PWM. Após a chamada dessa função, o pino passa a operar com uma onda quadrada de frequência fixa e com duty cycle conforme valor passado pela função. A frequência dessa onda, na maioria dos pinos é em tordo de 490 Hz, porém, os pinos 5 e 6 da Arduino UNO operam em 980 Hz.
Para utilizar a função analogWrite() , deve-se configurar o pino correspondente como saída digital. É interessante notar que essas saídas não são conversores digital-analógico como o nome sugere, e estes pinos não estão relacionados às entradas analógicas.
A função analogWrite deve ser utilizada da seguinte forma:
Sintaxe:
analogWrite(pino, valor);
Onde:
- pino corresponde ao pino que será gerado o sinal PWM;
- valor corresponde ao duty cycle, ou seja, o valor que permanecerá em nível alto o sinal.
O valor deve ser de 0 a 255 onde com 0 a saída permanece sempre em nível baixo e 255 a saída permanece sempre em nível alto.
Exemplo – Variando o brilho de um LED usando PWM do Arduino
Vamos utilizar a montagem a seguir para exemplificar o uso de um sinal PWM para variação do brilho de um LED, com a placa Arduino UNO:
O circuito possui um LED ligado ao pino 3 (~:PWM) com seu devido resistor e um potenciômetro ligado à entrada analógica 0. A proposta é controlar a intensidade do brilho do LED através da variação do valor do potenciômetro. Vejamos o sketch a seguir:
/*
PWM
controla a luminosidade de um led conforme o valor do potenciometro
*/
int ledPin = 3; // pino do led
int analogPin = 0; // pino para leitura do potenciômetro
int val = 0; //variável para armazenar o valor lido
void setup()
{
pinMode(ledPin, OUTPUT); // configura pino como saída
}
void loop()
{
val = analogRead(analogPin); // le o valor analógico
analogWrite(ledPin, val / 4); // aciona led com o valor analógico lido
//dividido por 4 para ajustar ao valor
//máximo que pode ser atribuído a função
}
Conclusões sobre o PWM do Arduino
A função analogWrite() fornece um modo simples para se trabalhar com sinais PWM, porém não fornece nenhum controle sobre a frequência do sinal aplicado ao pino. Em alguns casos a frequência do sinal é muito importante para o sistema, como por exemplo a frequência de acionamento de uma bobina de um motor. Em um artigo futuro vamos abordar como manipular os registradores do ATmega328 para alterar a frequência do sinal PWM.
O exemplo apresentado acima exibiu como usar o PWM do Arduino para variar a intensidade de um LED. Você pode usar o mesmo programa para variar a velocidade de motores DC, adaptar para criar cores usando LEDs RGBs, etc. Use a imaginação para novos projetos e os coloque em prática.
Se ficou alguma dúvida, deixe seu comentários abaixo.
Saiba mais
Placas Arduino – trajetória até o UNO
Referências







Meus parabéns, professor. Montei o circuito e funcionou perfeitamente. No lugar do led eu coloquei um fotoacoplador PC817. Entrei com 12v nele e tirei 0 a 10v ajustando o potenciometro. Gratidão
Ola professor, obrigado pelo conteúdo, tenho aprendido de mais. Tenho projetado uma luminária pro meu aquário, quero usar o Arduino pra controlar a intensidade dos leds mediante ao horário, a ideia é fazer um efeito amanhacer e anoitecer, acredito que com um módulo pwn e um rtc seja possível, a dúvida é como fazer isso com um circuito 12v, seria possível pela saída vin ? Fiquei feliz em saber que é entusiasta do DIY. =)
Gabriel, vc conseguiu ? estou com mesmo problema ….. usar PWM mais com uma saída maior igual a sua de 12 V
Pessoal, usem um transitor para a etapa de potência. Algo assim:
Olá , seria possível pulsar de 3 até 5 volts com tempo de 0,2 segundos?
Olá, um ótimo artigo sobre o assunto. Com tudo isso queria saber com linha e sintaxe eu poderia acrescentar para mudar a frequencia do PWM em torno de 50hz se possível. Grato.
Eu poderia usar o PWM do arduino para controlar a corrente que um transistor libera para uma carga? Eu estava pensando este sistema para um projeto, porém a corrente mínima para o transistor conduzir não afetaria o sistema? pois haverá um tempo que o PWM estará em OFF não liberando assim esta corrente mínima que o transistor necessita para conduzir.
Olá Fábio quero fazer um controle de fluxo de um protótipo de uma caixa d’água e gostaria de saber se consigo faze-lo com o PWM para não desligar a bomba e só mante-la numa rotação menor para evitar picos e como posso interfacear para usar motor CA?
olá sou novo na área e gostaria de saber o valor do resistor usado no projeto?
Diar, para o LED você pode usar um resistor de 330 a 1 K ohm. Para o circuito apresentado foi usado um resistor de 1K – Marrom, preto, vermelho.
Por que o valor deve ser de 0 a 255?
Allysson, a função recebe valores de 0 a 255 e ajusta o timer correspondente ao pino para gerar o sinal PWM. Ela usa 8 bits para configuração do timer.
Olá sou iniciante ! Gostaria de fazer funcionar 4 micro motores vibracall com o arduino nano, pelo que entendi tenho que usar saida do arduino PWM, minha dúvida sobre a Voltagem dos pinos… como cada micro vibracall tem o minimo de 1,5v e 90mA e maximo de 3v e 200mA tenho receio de queimar os pinos, pois me disseram que o maximo nos pinos do arduino é de 40mA. Minha intenção é funcionar um micro motor vibracall de cada vez e nunca mais de um, por um tempo de 3 segundos, porém cada micro motor pode funcionar alternativamente mais de… Leia mais »
Você pode usar transistores como chave para que estes consumam a corrente da fonte e não diretamente do arduino. Caso haja dúvidas visite WSM TRÔNIC (you tube) tenho um exemplo lá.
Bom Dia
estou fazendo um projeto queria controlar a velocidade de um motor trifásico com arduino usando o rele shield para acionamento do motor é alguém pode me ajudar
Para controle de velocidade de motor trifásico você precisa fazer um controle V/f, como explicado aqui: https://www.ti.com/lit/an/sprabq8/sprabq8.pdf
Você vai precisar implementar um PWM trifásico. Eu fiz essa aplicação usando um dsPIC que já possui hw preparado para isso.