ÍNDICE DE CONTEÚDO
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: 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:
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
/* 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
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: http://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.
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?
É feito o controle V/f. Segue dois app note que explicam essa como fazer controle de motor de indução: http://www.ti.com/lit/an/sprabq8/sprabq8.pdf
http://ww1.microchip.com/downloads/cn/AppNotes/cn012129.pdf
É um projeto bacana
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 ?
Olá Gabriel. Você pode colocar nivel zero na saída com a função digitalWrite.