- O que é um sinal PWM?
- PWM usando PIC16F877A:
- Programando PIC para gerar sinais PWM:
- Esquemas e testes:
- Trabalhando no Hardware:
Este é o nosso décimo tutorial sobre como aprender microcontroladores PIC usando MPLAB e XC8. Até agora, cobrimos muitos tutoriais básicos como LED piscando com PIC, temporizadores em PIC, interface de LCD, interface de 7 segmentos, ADC usando PIC etc. Se você for um iniciante absoluto, visite a lista completa de tutoriais de PIC aqui e Comece a aprender.
Neste tutorial, aprenderemos como gerar sinais PWM usando PIC PIC16F877A. Nosso PIC MCU tem um módulo especial chamado módulo Compare Capture (CCP) que pode ser usado para gerar sinais PWM. Aqui, geraremos um PWM de 5 kHz com um ciclo de trabalho variável de 0% a 100%. Para variar o ciclo de trabalho, estamos usando um potenciômetro, portanto, é recomendável aprender o tutorial ADC antes de começar com o PWM. O módulo PWM também usa temporizadores para definir sua frequência, portanto, aprenda a usar temporizadores de antemão aqui. Além disso, neste tutorial, usaremos um circuito RC e um LED para converter os valores PWM para tensão analógica e usá-lo para escurecer a luz do LED.
O que é um sinal PWM?
A modulação por largura de pulso (PWM) é um sinal digital que é mais comumente usado em circuitos de controle. Este sinal é definido como alto (5v) e baixo (0v) em um tempo e velocidade predefinidos. O tempo durante o qual o sinal permanece alto é chamado de “tempo de ativação” e o tempo durante o qual o sinal permanece baixo é chamado de “tempo de desligamento”. Existem dois parâmetros importantes para um PWM, conforme discutido abaixo:
Ciclo de trabalho do PWM:
A porcentagem de tempo em que o sinal PWM permanece ALTO (no tempo) é chamada de ciclo de serviço. Se o sinal estiver sempre LIGADO, ele está em 100% do ciclo de trabalho e se estiver sempre desligado, ele está em 0% do ciclo de trabalho.
Ciclo de trabalho = tempo para ligar / (tempo para ligar + tempo para desligar)
Frequência de um PWM:
A frequência de um sinal PWM determina a rapidez com que um PWM completa um período. Um período é LIGADO e DESLIGADO completo de um sinal PWM, conforme mostrado na figura acima. Em nosso tutorial, definiremos uma frequência de 5KHz.
PWM usando PIC16F877A:
Os sinais PWM podem ser gerados em nosso microcontrolador PIC usando o módulo CCP (Compare Capture PWM). A resolução do nosso sinal PWM é de 10 bits, ou seja, para um valor de 0 haverá um ciclo de trabalho de 0% e para um valor de 1024 (2 ^ 10) haverá um ciclo de trabalho de 100%. Existem dois módulos CCP em nosso PIC MCU (CCP1 e CCP2), isso significa que podemos gerar dois sinais PWM em dois pinos diferentes (pino 17 e 16) simultaneamente, em nosso tutorial estamos usando CCP1 para gerar sinais PWM no pino 17.
Os seguintes registros são usados para gerar sinais PWM usando nosso PIC MCU:
- CCP1CON (Registro de controle CCP1)
- T2CON (Registro de controle do temporizador 2)
- PR2 (registro de período dos módulos do cronômetro 2)
- CCPR1L (Registro CCP 1 baixo)
Programando PIC para gerar sinais PWM:
Em nosso programa, vamos ler uma tensão analógica de 0-5v de um potenciômetro e mapear para 0-1024 usando nosso módulo ADC. Em seguida, geramos um sinal PWM com frequência de 5000 Hz e variamos seu ciclo de trabalho com base na tensão analógica de entrada. Ou seja, 0-1024 será convertido em 0% -100% do ciclo de trabalho. Este tutorial presume que você já aprendeu a usar ADC no PIC, se não, leia a partir daqui, porque ignoraremos os detalhes sobre ele neste tutorial.
Assim, uma vez que os bits de configuração são definidos e o programa é escrito para ler um valor analógico, podemos prosseguir com o PWM.
As seguintes etapas devem ser executadas ao configurar o módulo CCP para operação PWM:
- Defina o período PWM escrevendo no registrador PR2.
- Defina o ciclo de trabalho PWM gravando no registrador CCPR1L e nos bits CCP1CON <5: 4>.
- Faça do pino CCP1 uma saída limpando o bit TRISC <2>.
- Defina o valor de pré-escala TMR2 e habilite o Timer2 escrevendo para T2CON.
- Configure o módulo CCP1 para operação PWM.
Existem duas funções importantes neste programa para gerar sinais PWM. Uma é a função PWM_Initialize () que irá inicializar os registros necessários para configurar o módulo PWM e, em seguida, definir a frequência na qual o PWM deve operar, a outra função é a função PWM_Duty () que definirá o ciclo de trabalho do sinal PWM em os registros necessários.
PWM_Initialize () {PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1; // Definir as fórmulas PR2 usando folha de dados // Faz o PWM funcionar em 5KHZ CCP1M3 = 1; CCP1M2 = 1; // Configure o módulo CCP1 T2CKPS0 = 1; T2CKPS1 = 0; TMR2ON = 1; // Configure o módulo Timer TRISC2 = 0; // cria o pino da porta em C como saída}
A função acima é a função de inicialização de PWM, nesta função O módulo CCP1 é configurado para usar PWM tornando os bits CCP1M3 e CCP1M2 tão altos.
O prescaler do módulo temporizador é definido tornando o bit T2CKPS0 tão alto e T2CKPS1 tão baixo quanto o bit TMR2ON é definido para iniciar o temporizador.
Agora, temos que definir a frequência do sinal PWM. O valor da freqüência deve ser escrito no registrador PR2. A frequência desejada pode ser definida usando as fórmulas abaixo
Período PWM = * 4 * TOSC * (Valor Pré-escala TMR2)
Reorganizar essas fórmulas para obter PR2 resultará
PR2 = (Período / (4 * Tosc * TMR2 Pré-escala)) - 1
Sabemos que Período = (1 / PWM_freq) e Tosc = (1 / _XTAL_FREQ). Portanto…..
PR2 = (_XTAL_FREQ / (PWM_freq * 4 * TMR2PRESCALE)) - 1;
Depois de definir a frequência, essa função não precisa ser chamada novamente, a menos e até que precisemos alterar a frequência novamente. Em nosso tutorial, atribuí PWM_freq = 5000; para que possamos obter uma frequência de operação de 5 KHz para nosso sinal PWM.
Agora vamos definir o ciclo de trabalho do PWM usando a função abaixo
PWM_Duty (não assinado int duty) {if (duty <1023) {duty = ((float) duty / 1023) * (_XTAL_FREQ / (PWM_freq * TMR2PRESCALE)); // Na redução // duty = (((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE); CCP1X = dever & 1; // Armazena o primeiro bit CCP1Y = duty & 2; // Armazena o 0º bit CCPR1L = duty >> 2; // Armazena os 8 bits restantes}}
Nosso sinal PWM tem resolução de 10 bits, portanto, este valor não pode ser armazenado em um único registro, pois nosso PIC tem apenas linhas de dados de 8 bits. Portanto, temos que usar outros dois bits de CCP1CON <5: 4> (CCP1X e CCP1Y) para armazenar os dois últimos LSB e então armazenar os 8 bits restantes no registrador CCPR1L.
O tempo do ciclo de trabalho PWM pode ser calculado usando as fórmulas abaixo:
Ciclo de trabalho PWM = (CCPRIL: CCP1CON <5: 4>) * Tosc * (Valor de pré-escala TMR2)
Reorganizar essas fórmulas para obter o valor de CCPR1L e CCP1CON resultará em:
CCPRIL: CCP1Con <5: 4> = PWM Duty Cycle / (Tosc * TMR2 Prescale Value)
O valor do nosso ADC será 0-1024, precisamos que esteja em 0% -100%, portanto, PWM Duty Cycle = duty / 1023. Além disso, para converter este ciclo de trabalho em um período de tempo, temos que multiplicá-lo pelo período (1 / PWM_freq)
Também sabemos que Tosc = (1 / PWM_freq), portanto..
Duty = (((float) duty / 1023) * (1 / PWM_freq)) / ((1 / _XTAL_FREQ) * TMR2PRESCALE);
Resolver a equação acima nos dará:
Duty = ((float) duty / 1023) * (_XTAL_FREQ / (PWM_freq * TMR2PRESCALE));
Você pode verificar o programa completo na seção Código abaixo, juntamente com o Vídeo detalhado.
Esquemas e testes:
Como de costume, vamos verificar a saída usando a simulação Proteus. O diagrama do circuito é mostrado abaixo.
Conecte um potenciômetro ao 7º pino para alimentar uma tensão de 0-5. O módulo CCP1 está com o pino 17 (RC2), aqui será gerado o PWM que pode ser verificado usando o osciloscópio digital. Além disso, para converter isso em uma tensão variável , usamos um filtro RC e um LED para verificar a saída sem um osciloscópio.
O que é um Filtro RC?
Um filtro RC ou um filtro passa-baixa é um circuito simples com dois elementos passivos, ou seja, o resistor e o capacitor. Esses dois componentes são usados para filtrar a frequência do nosso sinal PWM e torná-lo uma tensão DC variável.
Se examinarmos o circuito, quando uma tensão variável for aplicada à entrada de R, o capacitor C começará a carregar. Agora, com base no valor do capacitor, o capacitor levará algum tempo para ficar totalmente carregado, uma vez carregado, ele bloqueará a corrente DC (lembre-se que os capacitores bloqueiam DC, mas permitem AC), portanto, a tensão DC de entrada aparecerá na saída. O PWM de alta frequência (sinal AC) será aterrado através do capacitor. Assim, um DC puro é obtido através do capacitor. Um valor de 1000Ohm e 1uf foi considerado apropriado para este projeto. O cálculo dos valores de R e C envolve a análise do circuito usando a função de transferência, que está fora do escopo deste tutorial.
A saída do programa pode ser verificada usando o Osciloscópio Digital conforme mostrado abaixo, varie o Potenciômetro e o ciclo de trabalho do PWM deve mudar. Também podemos notar a tensão de saída do circuito RC usando o voltímetro. Se tudo estiver funcionando conforme o esperado, podemos prosseguir com nosso hardware. Além disso, verifique o vídeo no final para ver o processo completo.
Trabalhando no Hardware:
A configuração do hardware do projeto é muito simples, vamos apenas reutilizar nossa placa PIC Perf mostrada abaixo.
Também precisaremos de um potenciômetro para alimentar a tensão analógica. Anexei alguns fios terminais fêmea ao meu potenciômetro (mostrado abaixo) para que possamos conectá-los diretamente à placa PIC Perf.
Finalmente, para verificar a saída, precisamos de um circuito RC e um LED para ver como o sinal PWM funciona, eu simplesmente usei uma pequena placa de perf e soldei o circuito RC e o LED (para controlar o brilho) como mostrado abaixo
Podemos usar fios de conexão simples de fêmea para fêmea e conectá-los de acordo com o esquema mostrado acima. Assim que a conexão for feita, carregue o programa para o PIC usando nosso pickit3 e você deverá ser capaz de obter uma tensão variável com base na entrada de seu potenciômetro. A saída variável é usada para controlar o brilho do LED aqui.
Usei meu multímetro para medir as saídas variáveis, também podemos notar o brilho do LED mudando para diferentes níveis de tensão.
É isso que temos programado para ler a tensão analógica do POT e converter em sinais PWM que por sua vez foram convertidos em tensão variável usando o filtro RC e o resultado é verificado usando nosso hardware. Se você tiver alguma dúvida ou ficar preso em algum lugar, por favor, use a seção de comentários abaixo, ficaremos felizes em ajudá-lo. O trabalho completo está funcionando no vídeo.
Verifique também nossos outros Tutoriais PWM em outros microcontroladores:
- Tutorial Raspberry Pi PWM
- PWM com Arduino Due
- Dimmer LED baseado em Arduino usando PWM
- Dimmer LED de energia usando microcontrolador ATmega32