O que é PWM?
O 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.
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".
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.
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.
Autor: Prof. Farley Xavier
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).
A 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.
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.
Comentários