Domine os Módulos CCP e PWM: Teoria, Cálculos e Aplicações

Os módulos Capture/Compare/PWM (CCP) e Pulse Width Modulation (PWM) são periféricos essenciais em microcontroladores PICPrimeiros Passos com PIC: Entendendo o Microcontrolador e suas VersõesPrimeiros Passos com PIC: Entendendo o Microcontrolador e suas VersõesAprenda sobre microcontroladores PIC com este guia completo. Conheça a teoria, as práticas de otimização e casos reais para aplicações embarcadas de sucesso. (como PIC16F877A, PIC18F452, PIC24 e dsPIC). Eles permitem controle preciso de motores, LEDs, servomotores e até geração de sinais analógicos via filtros RC. Este artigo combina teoria avançada, cálculos detalhados, exemplos práticos e técnicas de otimização para aplicações profissionais, abordando desde configurações básicas até tópicos especializados como modulação de fase e proteções de hardware.

Tabela de Conteúdo🔗

Conceitos Fundamentais: CCP e PWM🔗

Funcionalidades do Módulo CCP

Características do PWM

Arquitetura e Configuração dos Módulos🔗

Registradores Críticos

Configuração Básica para PWM:

1. Defina o pino CCP como saída (TRISC ou TRISx).

2. Configure PR2 para a frequência desejada:

\[

PR2 = \frac{F_{OSC}}{4 \times \text{Prescaler} \times F_{PWM}} - 1

\]

3. Ative o Timer2 com prescaler adequado (T2CON).

4. Carregue os 8 MSBs do duty cycle em CCPRxL e os 2 LSBs em CCPxCON<5:4>.

Exemplo para 10 kHz com PIC18F4550 (8 MHz):

PR2 = (8000000 / (4 * 1 * 10000)) - 1 = 199;
CCPR1L = 0x96;        // 150 em decimal (75% do ciclo)
CCP1CONbits.DC1B = 0; // Bits LSB
T2CON = 0x04;         // Timer2 ON, prescaler 1:1

Cálculos de Frequência e Duty Cycle🔗

Equações Fundamentais

1. Frequência PWM:

\[

F_{PWM} = \frac{F_{OSC}}{4 \times \text{Prescaler} \times (PR2 + 1)}

\]

2. Duty Cycle (10 bits):

\[ \text{Valor} = \frac{\text{Duty Cycle (\%)}}{100} \times 4 \times (PR2 + 1) \]
  • CCPRxL = Valor >> 2 (8 MSBs).
  • CCPxCON<5:4> = Valor & 0x03 (2 LSBs).

Tabela de ResoluçãoADC (Conversor Analógico-Digital): Lendo Valores Analógicos em PICADC (Conversor Analógico-Digital): Lendo Valores Analógicos em PICAprenda a configurar o ADC de microcontroladores PIC de forma avançada explorando teoria, implementação prática e técnicas de otimização para leituras precisas. vs Frequência (Exemplos):

Clock (MHz)PrescalerPR2FrequênciaResolução (bits)
412494 kHz10
8119910 kHz8
2042554.88 kHz8

Aplicações Práticas com Implementação Detalhada🔗

1. Controle de Servomotores

  • Especificações:
    • Frequência: 50 Hz (período de 20 ms).
    • Largura de pulso: 1 ms (0°) a 2 ms (180°).
  • Cálculo do CCPR:
\[ \text{CCPRx} = \frac{\text{Pulse Width (s)} \times F_{OSC}}{4 \times \text{Prescaler}} \]

Exemplo para 1.5 ms (8 MHz, prescaler=16):

\[ \text{CCPRx} = \frac{0.0015 \times 8\text{MHz}}{4 \times 16} = 187.5 \approx 188 \]

2. Ponte H e Controle Bidirecional de Motores

  • Estratégia:
    • Use dois módulos PWM com fases opostas.
    • Adicione dead time (2-5 µs) para evitar curto-circuitos.
  • Circuito Recomendado:
    • Driver L298N ou MOSFETs IRF520N com diodos flyback.
    • Filtro RC (R = 10kΩ, C = 1µF) para suavizar sinais.

3. Conversor Digital-Analógico (PWM para Tensão Contínua)

  • Filtro Passa-Baixas:
\[

F_c = \frac{1}{2\pi R C} \quad (\text{Ex.: } R = 10k\Omega, C = 10\mu F \Rightarrow F_c \approx 1.6 \text{ Hz})

\]
  • Saída Analógica:
\[

V_{out} = V_{cc} \times \text{Duty Cycle}

\]

Exemplos de Código🔗

Controle Bidirecional de Motor DC (PIC16F877A)

#include <xc.h>
#define _XTAL_FREQ 4000000
void PWM_Init() {
    PR2 = 249;              // 4 kHz @ 4MHz
    CCP1CON = 0x0C;         // PWM mode (CCP1)
    CCP2CON = 0x0C;         // PWM mode (CCP2)
    T2CON = 0x04;           // Timer2 ON, prescaler 1:1
    TRISC = 0x00;           // CCP1 (RC2) e CCP2 (RC1) como saídas
}
void setMotorSpeed(int8_t speed) { // -100 a 100
    if (speed >= 0) {
        CCPR1L = speed * 2.55;  // Sentido horário
        CCPR2L = 0;
    } else {
        CCPR1L = 0;
        CCPR2L = (-speed) * 2.55; // Sentido anti-horário
    }
}
void main() {
    PWM_Init();
    while(1) {
        setMotorSpeed(70);  // 70% velocidade
        __delay_ms(2000);
        setMotorSpeed(-30); // 30% reverso
        __delay_ms(2000);
    }
}

Controle de Servo com PIC18F4550

void setServoAngle(uint8_t angle) {
    uint16_t pulse = 1000 + (angle * 1000)/180; // 1ms a 2ms
    CCPR1L = pulse >> 2;        // 8 MSBs
    CCP1CONbits.DC1B = pulse & 0x03; // 2 LSBs
}

Otimização, Proteções e Solução de Problemas🔗

Redução de Ruído e Melhoria de Estabilidade

  • Filtragem: Adicione capacitor de desacoplamento (100nF) próximo ao motor.
  • Layout: Utilize ground plane e minimize trilhas de alta corrente.
  • Isolamento: Optoacopladores (ex.: PC817) para cargas de alta tensão.

Erros Comuns e Correções

ProblemaCausaSolução
PWM não iniciaTimer não habilitadoVerificar T2CONbits.TMR2ON
Duty Cycle erráticoAtualização não atômicaDesabilitar interrupções durante atualização
Aquecimento do DriverDead time insuficienteAjustar dead time para 2-5 µs

Tópicos Avançados e Integração com Ferramentas🔗

1. Modulação de Fase Correta (ECCP)

2. Sincronização de Múltiplos Módulos PWM

T2CON = 0x04; // Timer2 compartilhado para CCP1 e CCP2

3. Uso do MPLAB Code Configurator (MCC)

Conclusão:

Dominar os módulos CCP e PWM permite implementar sistemas de controle precisos e eficientes. Integre as técnicas deste artigo com ferramentas como MCC e práticas de otimizaçãoTeste de Estresse: Avaliando o PIC em Condições Extremas de UsoTeste de Estresse: Avaliando o PIC em Condições Extremas de UsoDescubra técnicas avançadas para qualificação e testes de sistemas embarcados em PIC, combinando normas, instrumentação e análise científica de dados. de hardware para projetos profissionais. Para mais detalhes, consulte o datasheet do seu microcontrolador e explore bibliotecas como Harmony.

Autor: Marcelo V. Souza - Engenheiro de Sistemas e Entusiasta em IoT e Desenvolvimento de Software, com foco em inovação tecnológica.

Referências🔗

Compartilhar artigo

Artigos Relacionados