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