Controle PWM básico com Espduino-32



O que é PWM?

 PWM (Pulse Width Modulation), em português significa "Modulação por Largura de Pulso".

Os Sinais PWM são produzidos por chips microcontroladores como o ESP-32, presente na placa Espduino-32.

Através da largura do pulso de uma onda quadrada, ondas características de sinais PWM, é possível o controle da potência dos mais diversos circuitos elétricos, como LEDs, resistências, motores e servo motores elétricos.

O PWM tem por finalidade contornar uma das limitações dos circuitos digitais, que só permitem 2 estados lógicos em uma determinada saída: "1" - Ligado (ON) ou "0" - Deslidado (OFF). No caso do Espduino-32, a tensão nas saídas digitais é 3,3 Volts quando  está Ligada ou  0,0 Volt quando Desligada.

Fisicamente falando, podemos afirmar que o PWM permite que a tensão média de uma saída digital possa ser controlada, de forma a assumir valores intermediários, simulando uma saída analógica.

Veja na sequência abaixo as 4 situações mostradas no Gift capa deste post:

Situação 1. Duty Cicle = 0%



Note no gráfico acima que o valor da tensão da saída 14 da placa está 100 % do tempo no estado lógico baixo (desligado), ou seja, o valor da tensão de saída é 0 Volt.

Situação 2. Duty Cicle = 50%



Agora vemos que a saída digital 14 está 50 % do Período ligada e 50 % desligada, de modo que a tensão média na saída é de 1,65 Volts e o LED acende com 50 % do brilho.

Situação 3. Duty Cicle = 80%



Acima vemos que para a duração do período do sinal, a saída 14 está 80% do tempo ON (Ligada) e 20 % do tempo OFF (Desligada), de modo que a tensão média da saída 14 em relação ao aterramento (GND) é de 2,64 V, e o LED acende com 80 % do brilho.

Situação 4. Duty Cicle = 100%


Por último foi ilustrado a situação  em que a saída 14 da placa está 100 % do tempo ON (Ligada) e o LED acende com o brilho máximo.

Conceitos e abstrações importantes!

1. Quanto mais tempo o sinal fica no estado ON (Ligado), para um determinado Período, maior será a tensão média de saída do sinal elétrico.
2. O Duty Cicle ou Ciclo de Trabalho representa a porcentagem do tempo que determinada saída fica no estado ON (Ligado), em relação a duração total do Ciclo ou Período (T),
3. A frequência (f) do sinal PWM é expressa como f = 1/T, ou seja , a frequência é numericamente igual ao inverso do Período (T).

Curiosidade!

O fato interessante sobre a plaquinha Espduino-32 é que qualquer saída pode ser utilizada como saída PWM o que não é possível na maioria das placas microcontroladoras disponíveis no mercado.

Exemplo 1: 

Aplicando o controle PWM no LED azul da placa Espduino-32.


O código em blocos mostrado abaixo foi montado com o aplicativo  Mixduino32 e serve para aplicar o controle PWM ao LED azul conectado à saída 2 , de modo a definir o brilho do LED em 25% do valor máximo.


Entendendo o Código


Primeiro declaramos as 4 variáveis essenciais, sendo todas do tipo "int" (representada por números inteiros) e atribuímos os seus respectivos valores. Depois encaixamos esses blocos dentro do bloco da função "Setup" (Configurações) como mostrado acima. Veja a seguir o detalhamento de cada uma das variáveis declaradas no escopo do código.

1.Frequência:
A essa variável atribuímos o nome "Frequence" (poderia ser outro nome qualquer). O seu valor deve ser compatível com a frequência do circuito a ser controlado. No exemplo 1 foi utilizado o valor de 5000 Hz (Hertz) que funciona bem para os Leds.

2. Canal:
A essa variável atribuímos o nome "Channel" (poderia ser outro nome qualquer). 
O chip ESP-32 possui 16 canais PWM numerados de 0 a 15, podendo ser utilizado qualquer canal. No exemplo acima foi utilizado o canal "0". 

3. Resolução:

 A essa variável atribuímos o nome "Resolution" (poderia ser outro nome qualquer). 
 resolução é definida em "bits", e é representada por um número inteiro de 1 a 16. No exemplo foi utilizado o valor 10 bits que corresponde a 2^10 = 1024 valores possíveis.

4. DutyCicle:
 A essa variável atribuímos o nome "DutyCicle" (poderia ser outro nome qualquer). 
Para uma resolução de 10 bits, o DutyCicle é um número decimal inteiro entre 0 e 1024. Como exemplo,  512 corresponde a um DutyCicle de 50%, e 1024 corresponde a  um DutyCicle de 100%. No exemplo acima foi utilizado 256, que corresponde a um DutyCicle de 25% para a resolução escolhida (10 bits).

Após declarar as variáveis e atribuir os valores, foram definidas as 3 funções que integram o bloco de configurações (Setup). São elas:

a) ledcSetup:
No bloco da função "ledcSetup" foram encaixados os blocos das variáveis criados na etapa anterior, que representam o canal, a frequência e a resolução utilizadas. 

b) ledcAttachPin:

No bloco da função "ledcAttachPin" foram conectados os blocos com o número da saída a ser controlada e o canal utilizado para controlar a saída especificada.

c) ledcWrite:

No bloco da função "ledcWrite" são conectados os blocos das variáveis "Channel" e "DutyCicle" utilizados para controlar a saída 2.

Após montar o código na IDE do Mixduino32, basta conectar a placa ao PC ou Notebook utilizando o cabo USB, e clicar em Carregar, como mostrado abaixo. 



Conforme mostrado acima, na IDE Mixduino32 também é possível visualizar o código em linguagem C (linguagem de programação textual). Para ocultar/desocultar essa opção, basta clicar na seta da lateral direita.

Para montar os blocos do código do exemplo acima, é só clicar em "Abrir", selecionar o Exemplo 3.1_PWM_Simple_Control.mix e fazer as alterações necessárias.

Uma  observação importante é que na linguagem C as variáveis são declaradas antes da função "void setup", mas para facilidade, no Mixduino32 os blocos das variáveis podem ficar antes ou dentro do bloco setup.

O código do Exemplo 1 foi carregado 5 vezes, aplicando-se diferentes  valores para o DutyCicle. Veja o resultados abaixo: 


DutyCicle = 51 (~ 5 %)


DutyCicle = 102 (~10 %)


DutyCicle = 256 (25 %)


DutyCicle = 512 (50 %)


DuttyCicle = 768 (75%)
 


DutyCicle = 1024 (100%)
 


Exemplo 2: 

Aplicando o controle PWM com a função  seno(x).

Neste exemplo você vai aprender como aplicar o controle PWM ao LED azul conectado à saída 2 , de modo que o brilho varie de um valor mínimo até um valor máximo, e voltando ao valor mínimo novamente, nesse caso zero.
Para fazer isso, vamos acrescentar aos conceitos vistos anteriormente a seguinte hipótese: 

Vamos supor que o Dutycicle não seja uma constante, mas sim uma função variável, cujo resultado é o produto do valor da resolução em bits pelo valor do seno(x), onde x é a uma variável que representa os valores positivos da função Seno no intervalo de 1 a 180 graus. Neste exemplo, vamos utilizar a resolução de 12 bits (4095).

Então a expressão matemática para o DutyCicle,  será a seguinte:

DutyCicle =  seno(x) *4095

Veja abaixo o código do Exemplo 2, que foi montado com as opções de blocos do IDE gráfico Mixduino32.



Observe que fizemos algumas adaptações em relação ao código do Exemplo 1:
- Acrescentamos os blocos de matemática para calcular o valor do Dutycicle;
- Acrescentamos o bloco para imprimir os resultados no Monitor serial ;
-Incluímos o bloco que aplica de modo iterativo os cálculos e imprime os resultados para todos os valores de 1 a 180;
- Por último, definimos o intervalo de tempo de cada iteração em 20 ms (milissegundos), de modo que o ciclo completo durará 3600 ms (3,6 s), ou seja, o brilho do LED irá aumentar de zero até o máximo em 1,8 segundos, e diminuirá do máximo até zero em mais 1,8 segundos, descrevendo um movimento harmônico e cíclico de acordo com  função matemática Seno.



O resultado do controle PWM do LED azul da placa Espduino-32 utilizando o código acima pode ser visualizado no  vídeo abaixo.



Veja a seguir visualização gráfica da função DutyCicle, que define a variação do Brilho do LED.



O modo gráfico mostrado acima pode ser ativado clicando na opção "Monitor serial" na tela inicial do Mixduino32. Após abrir o Monitor serial, altere a velocidade de transmissão para 115200 bit/s e escolha a opção "Desenhar".


Exemplo 3: 

Ajustando o controle PWM com um Potenciômetro.

No Exemplo 2 utilizamos uma função matemática para alterar o valor da variável DutyCicle e consequentemente o valor da tensão média fornecida ao circuito  através do sinal PWM.

Agora vamos utilizar um potenciômetro para fazer o ajuste manual da variável Dutycicle, de modo que possamos variar manualmente o valor do sinal PWM.

O Potenciômetro é um resistor de resistência variável, cujo valor da resistência elétrica pode ser ajustado de forma linear por meio de um eixo giratório. O valor da Resistência elétrica no Sistema Internacional de Unidades -SI é o Ohm (Ω). 

Uma das aplicações mais comuns dos potenciômetro é mesmo o controle de potência, como por exemplo aquele botão que você gira para aumentar ou diminuir o volume em um aparelho de som, ou para ajustar a velocidade de um motor elétrico, ou ainda o brilho e uma lâmpada.

Para demonstrar este conceito, vamos controlar a intensidade do brilho de um LED vermelho em um circuito externo ao microcontrolador, conforme mostrado no esquema abaixo.



Observe no desenho acima que vamos coletar o valor lido pelo potenciômetro no pino 4 e utilizar esse valor para definir o valor da variável DutyCicle e aplicar o controle PWM na saída 26, de modo que para cada valor lido no potenciômetro teremos um valor de DutyCicle, podendo assim definirmos diferentes valores para a tensão média de saída no pino 26.  Veja a seguir como fica a montagem real na protoboard (matriz de contatos) para circuito esquematizado acima.



Resumindo, podemos controlar a intensidade do brilho do Led eletronicamente, girando o eixo potenciômetro. Veja abaixo o exemplo de programação em blocos para executar esse controle.



Observe que agora definimos o valor da variável "DutyCicle" como sendo o valor da leitura analógica do potenciômetro conectado ao pino 4 da placa Espduino-32.

Em seguida o valor obtido para o  DutyCicle é aplicado ao canal (Channel) 0 através da função "ledcWrite". Esse processo  é repetido continuamente  a cada intervalo de tempo definido (100 ms).

O valor da leitura analógica é um numero inteiro entre 0 e 4095 (4096 valores  ou 16 bits), que corresponde a resolução da entrada analógica da placa Espduino-32.

Isso quer dizer que o valor da tensão de entrada,  que pode ser ajustada para um valor de 0 a 3,3 Volts girando o eixo do potenciômetro pode assumir 4096 valores discretos diretamente proporcionais aos valores das tensões lidas.

Ou seja, podemos variar o valor do DutyCicle de  0% (0) até  100% (4095), com base no valor lido na entrada 4 e aplicar o resultado na saída 26 para controlar o brilho do Led.

Veja a seguir o resultado em vídeo do conceito demonstrado nesse exemplo:



O mesmo sinal PWM utilizado para controlar o brilho do Led poderia ser utilizado para controlar um circuito de maior potência, como por exemplo controlar a velocidade de um motor elétrico DC, o brilho de uma lâmpada ou um servo motor de um braço robótico por exemplo, bastando conectar os componentes (ou módulos) adequados para amplificar o sinal.


Autor: Prof. Farley Xavier

Comentários