Usando as saídas PWM do Arduino

Figura 2 - Saídas PWM na placa Arduino UNO

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:

 

PWM do Arduino

 

Fonte: http://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:

 

PWM do Arduino UNO
Figura 2 - Saídas PWM na placa Arduino UNO

 

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:

 

PWM do Arduino
Figura 3 - Circuito para teste de PWM com Arduino

 

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:

 

 

 

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

 

Primeiros Passos com Arduino

Arduino UNO

Arduino - O documentário

Placas Arduino - trajetória até o UNO

 

 

Referências

 

Aduino Reference - analogWrite()

Arduino Tutorial PWM

 

Outros artigos da série

<< Entendendo as Entradas Analógicas do ArduinoArduino - Comunicação Serial >>
NEWSLETTER

Receba os melhores conteúdos sobre sistemas eletrônicos embarcados, dicas, tutoriais e promoções.

Obrigado! Sua inscrição foi um sucesso.

Ops, algo deu errado. Por favor tente novamente.

Licença Creative Commons Esta obra está licenciada com uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.

Fábio Souza
Engenheiro com experiência no desenvolvimento de projetos eletrônicos embarcados. Hoje é diretor de operações do portal Embarcados, onde trabalha para levar conteúdos de eletrônica, sistemas embarcados e IoT para o Brasil. Também atua no ensino eletrônica e programação pelo Brasil. É entusiastas do movimento maker, da cultura DIY e do compartilhamento de conhecimento, publica diversos artigos sobre eletrônica e projetos open hardware, como o projeto Franzininho Participou da residência hacker 2018 no Redbull Basement. Quando não está ministrando palestras, cursos ou workshops, dedica seu tempo “escovando bits” ou projetando placas eletrônicas.

68
Deixe um comentário

avatar
 
36 Comment threads
32 Thread replies
5 Followers
 
Most reacted comment
Hottest comment thread
32 Comment authors
flashpaulBerdinioValdo SouzaGabrielJardel Recent comment authors
  Notificações  
recentes antigos mais votados
Notificar
flashpaul
Visitante
flashpaul

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 »

Berdinio
Visitante
Berdinio

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

Valdo Souza
Visitante
Valdo Souza

No inversor de frequência, para controle de velocidade em motores de Indução Trifásicos, como se faz para mudar a frequência do PWM? Ou esse valor já é ajustado automaticamente, ao se definir a velocidade no inversor?

Gabriel
Visitante
Gabriel

Bom dia
Estou montando um pequeno projeto utilizando as saídas PWM, mas eu preciso de um comando via software que desabilite as saída para que não passe nada, tipo como se cortase o fio o intuito é desligar por completo uma fita LED tem como ?

Lucas Freitas
Visitante
Lucas Freitas

Bom dia Fabio, o projeto acima eu ja havia feito mas estou tentando fazer o mesmo substituindo o potenciômetro por dois botões, seria muito bom se puder me ajudar nessa, agradeço desde ja

Jardel
Visitante
Jardel

olá Lucas, veja se a instrução abaixo te ajuda!

#define button1 5
#define button2 6
#define led 11

bool statBtn1=0,statBtn2=0;
byte blilhoLed=0;
lond delayBtn=0;

void setup(){
pinMode(button1,INPUT);
pinMode(button2,INPUT);
pinMode(led,OUTPUT)
}
void loop(){
statBtn1=digitalRead(button1);
statBtn2=digitalRead(button2);
if(millis()-delayBtn>250){
if(statBtn1){
if(brilhoLed0)brilhoLed--;
}
delayBtn=millis();
}
analogWrite(led,brilhoLed);
}

Pedro Brunetto
Membro
Pedro Brunetto

Olá, Fábio!

Estou usando a porta digital para ler um sinal PWM e usando a função micros() para contar o tempo do duty para fazer um tacômetro. Porém, não estou obtendo os valores reais, de acordo com um tacômetro calibrado.

Sabe qual pode ser o motivo?

Obrigado!

Vinicius Ferreira Oliveira
Visitante
Vinicius Ferreira Oliveira

Por favor. Não sei por onde começar a solução. Preciso controlar 6 pontenciometros simultaneamente de um equalizador de som. Obrigado

Sandro Mesquita
Visitante
Sandro Mesquita

Fábio boa noite, uso as portas PWM para controle de velocidade dos motores CC de carro seguidor de linha, no caso de uso das portas 5 e 6 no ENA e ENB da ponte H, me renderia um melhor desempenho já que a sua frequência é 2x maior?

Marcos Cardoso
Visitante
Marcos Cardoso

Fábio, boa tarde!

A montagem do circuito está levemente equivocada quanto à pinagem do potenciômetro, visto que a saída do meio que deve ser ligada à entrada analógica do arduino.

Cassiano Rodrigues
Visitante
Cassiano Rodrigues

boa tarde Fabio. Em um projeto estou usando os pinos 5 e 6 (pwm) para controlar um motor de passo... agora preciso tranferir esse ontrole para os pinos 10 e 11 mas não funciona... qual o motivo já que os dois pares são igualmente PWM?? e como posso fazer funcionar da mesma forma nos pinos 10 e 11?

Fabio_Souza_Embarcados
Visitante
Fabio_Souza_Embarcados

Pode ser conflito com outra biblioteca que faz uso do timer. O que mais você está usando para esse projeto?