📈 Qu'est-ce que le PWM ?

Le PWM (Pulse Width Modulation — Modulation de Largeur d'Impulsion) est une technique qui consiste à faire varier le rapport cyclique d'un signal rectangulaire pour contrôler la puissance moyenne délivrée à un composant.

Concrètement, au lieu de fournir une tension continue de 2.5V (ce qu'un PIC ne peut pas faire directement), on alterne rapidement entre 0V et 5V avec un rapport cyclique de 50%. Le composant reçoit en moyenne 2.5V. En faisant varier ce rapport de 0% à 100%, on contrôle la luminosité d'une LED ou la vitesse d'un moteur.

Le PIC16F683 intègre un module CCP (Capture/Compare/PWM) capable de générer un signal PWM matériel sur la broche RC2 ou RC5, sans mobiliser le processeur.

⚙️ Configuration du module CCP en mode PWM

Registres utilisés

RegistreRôle
CCP1CONMode du module CCP (PWM = 0b00001100)
PR2Période du signal PWM (registre Timer2)
CCPR1LRapport cyclique (8 bits MSB)
CCP1CON[5:4]Rapport cyclique (2 bits LSB)
T2CONConfiguration et activation du Timer2

📝 Exemple : Contrôler la luminosité d'une LED

C (XC8)
#include <xc.h>
#define _XTAL_FREQ 4000000

void initPWM(void) {
    TRISCbits.TRISC2 = 0;   // RC2 (CCP1) en sortie

    // Période PWM : PR2 = 249 → ~1kHz à 4MHz/prescaler 4
    PR2 = 249;

    // Mode PWM
    CCP1CON = 0b00001100;  // Mode PWM actif

    // Rapport cyclique initial : 50%
    CCPR1L = 125;            // 8 bits MSB

    // Timer2 : prescaler 1:4, activé
    T2CON = 0b00000101;    // Prescaler 4, TMR2 ON
}

void setPWM(unsigned int duty) {
    // duty : 0 à 1000 (0% à 100%)
    CCPR1L = duty >> 2;               // 8 bits MSB
    CCP1CONbits.DC1B = duty & 0x03;   // 2 bits LSB
}

void main(void) {
    OSCCON = 0b01100000;
    ANSEL = 0;
    initPWM();

    // Effet de respiration (fade in / fade out)
    unsigned int i;
    while(1) {
        // Fade in
        for(i = 0; i < 1000; i += 5) {
            setPWM(i);
            __delay_ms(5);
        }
        // Fade out
        for(i = 1000; i > 0; i -= 5) {
            setPWM(i);
            __delay_ms(5);
        }
    }
}

🧮 Calcul de la fréquence PWM

Formule

Fréquence PWM = Fosc / (4 × Prescaler × (PR2 + 1))

Avec Fosc = 4 MHz, Prescaler = 4, PR2 = 249 :

F = 4000000 / (4 × 4 × 250) = 1000 Hz (1 kHz)

Le rapport cyclique se règle sur 10 bits (0-1023), offrant 1024 niveaux de contrôle.

🔧 Applications courantes du PWM