Imagine que você precisa controlar a potência entregue a uma carga, como a velocidade de um motor ou a intensidade luminosa de um led.
Inicialmente, vamos idealizar um primeiro cenário em que temos que controlar apenas um led. Para isso, temos uma fonte de energia, um led e uma chave. O nosso circuito tem todos os componentes conectados um ao outro em série. Neste caso, temos dois estados possíveis para o led: um totalmente aceso, com potência de 100% e outro, totalmente apagado, com potência de 0%. De fato, controlamos o nosso led.
Fonte: Tinkercad
Vamos modificar os requisitos do nosso cenário. Agora, além de acender e apagar o led, nós temos também que controlar a intensidade de seu brilho, como por exemplo, acionar o nosso led aceso com uma potência de 50%. Como faríamos? Vamos usar um resistor!
Com o resistor correto, temos a possibilidade de acender o nosso led com 50% do brilho. Mas embora isso funcione, não é muito eficiente. Existe muito desperdício de energia, pois os elementos resistivos dissipam uma parte dela em forma de calor. Então, como faríamos para tornar o nosso circuito mais eficiente e ainda atender ao requisito de controle da potência do led? Felizmente existe uma forma de fazer isso: a Modulação por Largura de Pulso ou PWM, de Pulse Width Modulation.
A PWM é uma forma de variar a entrega de potência através da variação entre o estado de ligado e desligado de uma carga em função do tempo. Vamos exemplificar: vamos pegar o nosso circuito inicial. Agora, em um período de 1 segundo. vamos oscilar o estado de ligado e desligado 1000 vezes. Se durante esse período nós alternarmos o estado da chave para a metade do tempo ligada e metade do tempo ela desligada, o estado médio de saída que poderemos verificar no led será igual à metade do brilho que teríamos se deixássemos a chave todo o tempo ligada.
Com o PWM podemos variar os valores entre 0% e 100% sem desperdiçar energia com a dissipação de calor desnecessária que ocorria em um resistor.
PWM no Arduino
É possível usar PWM no Arduino de uma forma muito fácil. Vamos montar o seguinte circuito:
Fonte: Gerada pelo autor no TinkerCad.
Agora, vamos ligar o NO LED a um pino da plaquinha que oferece a funcionalidade de PWM. Por exemplo, no Arduino Nano, temos 6 pinos que oferecem esta funcionalidade.
Ah, mas antes do código, tenho que chamar a atenção para uma coisa: no Arduino, a variação que pode ser aplicada para controlar o PWM varia com valores entre 0 e 255. Então, para usar uma escala de 0 até 100%, precisaremos aplicar uma conversão. Felizmente, a API padrão do Arduino oferece a função map. A função map converte um valor fornecido para outro valor correspondente dentro de um intervalo escolhido.
O nosso código para fazer isso é muito simples. Veja só:
Fonte: Autor (Arduino IDE)
Neste exemplo nós estamos utilizando o pino 3 do Arduino para controlar o nosso led. A linguagem permite que se dê um apelido para um valor. Por isso, utilizamos o PINO_LED (linha 4).
Na função setup, função que é executada uma única vez quando o nosso sistema é ligado, definimos que o nosso pino vai ser configurado como saída, utilizando a função pinMode (linha 8).
Em seguida, na função loop, que é a função principal do nosso código e é executada sempre, declaramos uma variável para controlar o valor da potência do PWM que queremos aplicar no led (linha 12). Para haver uma variação, foi utilizado um laço que variar o valor da potência (no caso a variável potencia) entre 0 e 100.
Como dito anteriormente, o PWM aceita valores até 255. Assim, utilizamos a função map a fim de adequar o valor de potência para o valor do PWM e atribuímos o resultado em outra variável chamada potenciaConvertida (linha16). Na linha 18, utilizamos a função analogWrite para acender o led com o valor de PWM contido na variável potenciaConvertida.
Na linha 21, verificamos se o valor da variável potencia excedeu o valor máximo permitido. Se o teste for verdadeiro, retornamos o valor para 0.
Por último, aguardamos um tempo de 100 ms com a utilização da função delay para executar uma nova interação do nosso laço.
Neste pequeno código pudemos conferir o funcionamento do PWM no Arduino utilizando um led. Mas tem mais! Este controle de potência pode também ser utilizado para controlar motores.
Desta forma podemos variar a velocidade de rotação entre 0, onde ele estará parado, e 100%, onde a sua rotação estará em velocidade máxima.
Referências
Instituto Newton C. Braga. O que é PWM (MEC071). Disponível em https://www.newtoncbraga.com.br/index.php/robotica/5169-mec071a.
Mundo da Elétrica. PWM – O que é e para que serve? Disponível em https://www.mundodaeletrica.com.br/pwm-o-que-e-para-que-serve/.
Arduino – setup. https://www.arduino.cc/reference/pt/language/structure/sketch/setup/
Arduino – loop. https://www.arduino.cc/reference/pt/language/structure/sketch/loop/
Arduino – pinMode. https://www.arduino.cc/reference/pt/language/functions/digital-io/pinmode/
Arduino – map. https://www.arduino.cc/reference/en/language/functions/math/map/
Arduino – analogWrite. https://www.arduino.cc/reference/pt/language/functions/analog-io/analogwrite/
Arduino – delay. https://www.arduino.cc/reference/pt/language/functions/time/delay/