PWM – Pulse Wide Modulation (modulação por largura de pulso)

Propaganda
Centro Tecnológico de Mecatrônica / Centro Tecnológico Automotivo
Disciplina PROGRAMAÇÃO
Instrutor DANIEL CORTELETTI
PWM – Pulse Wide Modulation (modulação por largura de pulso)
Os microcontroladores são dispositivos que comandados por programas podem facilmente realizar
o acionamento ou o desligamento de uma saída digital. Mas e se o dispositivo a ser controlado necessita
de um controle analógico ?
Por exemplo, ligar e desligar um motor conectado indiretamente (via transistores ou reles) a um
pino do microcontrolador não é complicado se usarmos as instruções de acionar (output_high) e desativa
(output_low) a saída. Mas se além de ligar e desligar este motor, for necessário “dosar” a tensão a ele
fornecida, de forma a controlar também a velocidade ou torque deste motor ?
Para isso, seria necessária uma saída analógica. Mas como realizar este controle, se tal saída não
existe em um dispositivo de controle discreto, como um microcontrolador ?
A saída é pulsar (ativar e desativar) uma saída, filtrando-a e gerando, com estes pulsos filtrados, o
efeito desejado.
Por exemplo, vamos imaginar um ventilador de uma única velocidade conectado a uma chave
liga/desliga. Se você manter a chave ligada, o ventilador acelera até obter 200 RPM. Se você desligar a
chave, o ventilador irá desacelerar até parar. Mas e se você ficar ligando e desligando a chave, em
intervalos de 1 segundo, perceberá que o ventilador irá girar a uma velocidade inferior que 200 RPM. E se
você exercer pulsos ligados mais largos, e pulsos desligados mais curtos, o ventilador irá acelerar.
É dessa forma que vamos proceder, trabalhando com freqüências bem elevada, com vários
acionamentos por segundo.
Desta forma, obtemos uma saída que
poderá ser adequada, usando-se um filtro RC
adequado, para a tensão necessária.
É comum também utilizar a saída
pulsante diretamente no dispositivo de
amplificação (transistor ou circuito integrado
de potência) para gerar a mesma saída
pulsante em níveis de tensão e corrente mais
elevados. Desta forma, é possível se controlar
intensidade de luminosidade, temperatura,
velocidade e torque de motores, som, etc...
E quais são as características de uma saída PWM ?
Podemos citar três características : O nível de tensão, o
tempo de ciclo e o tamanho do pulso. Quanto ao nível de tensão,
ficará restrito ao nível de trabalho do microcontrolador. No caso do
PIC16F877, que funciona a 5V, o nível dos pulsos também será de
5V. Caso haja interessem aumentar este valor, ou de aumentar a
corrente (que é só de sinal), será necessária a amplificação com
transistores ou outro circuito integrado (veja exemplo ao lado).
Já o tempo de ciclo e o tamanho do pulso podem ser
controlados por software.
Impresso em 29/05/2017 12:50:00– Página 1
Centro Tecnológico de Mecatrônica / Centro Tecnológico Automotivo
Disciplina PROGRAMAÇÃO
Instrutor DANIEL CORTELETTI
Veja o exemplo abaixo :
#include <16f877.h>
#use delay (clock=4000000)
#define use_portb_lcd true
#include <lcd.c>
// porque vamos usar um PIC16F877 ou PIC16F877A
// Importante que o valor do CLOCK esteja correto
void main()
{
long TEMPO_PULSO = 0;
// variável que determina tamanho do pulso ligado
setup_ccp1(CCP_PWM);
// ativa PWM 1 (pino C2)
setup_ccp2(CCP_PWM);
// ativa PWM 2 (pino C1)
setup_timer_2(T2_DIV_BY_4, 250, 1); // O tamanho do ciclo é 4*(4/CLOCK)*250.
lcd_init();
while(1)
// laço infinito
{
set_pwm1_duty(TEMPO_PULSO);
// Configura tamanho do pulso
set_pwm2_duty(1023 – TEMPO_PULSO); // Configura tamanho do pulso (inversamente proporcional)
delay_ms(50);
// Tempo de 50 milésimos de segundo
if (input(PIN_D0)&&TEMPO_PULSO>0) // Se sinal em D0 e TEMPO_PULSO for superior a ZERO
{
TEMPO_PULSO --;
// Diminui uma unidade da variável TEMPO_PULSO
}
if (input(PIN_D7)&&TEMPO_PULSO<1023) // Se sinal em D7 e TEMPO_PULSO menor que 1023
{
TEMPO_PULSO ++;
// Incrementa TEMPO_PULSO em uma unidade
}
printf(lcd_putc,"\fPWM: %lu", TEMPO_PULSO); // mostra no display o valor de TEMPO_PULSO
}
}
Obs importante :
O exemplo acima terá efeito sobre os pinos do PWM físico, ou seja, pinos C2 (PWM1) e C1 (PWM2).
Em outros casos, e para outros pinos, será necessário gerar um PWM via software. Isso quer dizer que seu programa deve ficar
ligando e desligando o pino em questão. Veja como seria no exemplo abaixo :
#include <16f877.h>
#use delay (clock=4000000)
#define use_portb_lcd true
#include <lcd.c>
void main()
{
long TEMPO_PULSO = 0;
while(1)
{
output_high(PIN_D0);
delay_us(TEMPO_PULSO);
output_low(PIN_D0);
delay_us(1024 – TEMPO_PULSO);
if (input(PIN_A1)) TEMPO_PULSO
if (input(PIN_A2)) TEMPO_PULSO
if (input(PIN_A3)) TEMPO_PULSO
if (input(PIN_A4)) TEMPO_PULSO
if (input(PIN_A5)) TEMPO_PULSO
}
}
// porque vamos usar um PIC16F877 ou PIC16F877A
// Importante que o valor do CLOCK esteja correto
// variável que determina tamanho do pulso ligado
// laço infinito
=
=
=
=
=
0;
200;
400;
800;
1023;
//
//
//
//
//
Se
Se
Se
Se
Se
A1
A2
A2
A2
A2
acionado,
acionado,
acionado,
acionado,
acionado,
tamanho
tamanho
tamanho
tamanho
tamanho
do
do
do
do
do
pulso
pulso
pulso
pulso
pulso
é
é
é
é
é
zero
200
400
800
1023
Exercício:
1)
2)
Com base nos exemplos aqui vistos, crie um programa que realize a
aceleração gradual de um motor ligado à saída PWM1.
Com base no segundo exemplo (PWM por software), crie um
programa que realize o acionamento de um buzzer ou autofalante,
conforme gráfico ao lado.
Impresso em 29/05/2017 12:50:00– Página 2
Download