Contrôlez la luminosité et la vitesse avec la modulation 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.
| Registre | Rôle |
|---|---|
| CCP1CON | Mode du module CCP (PWM = 0b00001100) |
| PR2 | Période du signal PWM (registre Timer2) |
| CCPR1L | Rapport cyclique (8 bits MSB) |
| CCP1CON[5:4] | Rapport cyclique (2 bits LSB) |
| T2CON | Configuration et activation du Timer2 |
#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); } } }
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.