Вы находитесь на странице: 1из 2

MICROCONTRÔLEUR MODE PWM DU PIC16F877

Mode PWM des PIC16F87X

Ø PRÉSENTATION
Il s’agit d’obtenir, dans ce mode, un signal de fréquence fixe et dont la durée de l’état haut peut être
modulée (PWM = Pulse Width Modulation = MLI = Modulation de largeur d'impulsion ou rapport
cyclique variable).
CCPRxL CCP1con
5:4
w Ce mode permet la génération d'un ou
de deux signaux PWM, et utilise au COMP 10 bits CCPRxL=TMR2
plus 2 sorties : CCP1 (RC2) et CCP2 CLK(osc) R Q
TMR2 DIV
(RC1). 4 CCPx
S
w Les broches du port C correspondant à RESET
TMR2 = PR2
COMP 8 bits
CCP1 et CCP2 doivent être
configurées en sortie grâce au registre PR2
de direction TRISC pour pouvoir
générer un signal PWM.
w La période est obtenue par comparaison sur 8 bits du timer2 et du registre de période PR2.
w Le rapport cyclique est obtenu par comparaison du timer2 avec le registre CCPRxL. La
résolution sur le rapport cyclique peut être de 8 à 10 bits, car 2 bits supplémentaires du
registre CCPxCON permettent de réaliser une comparaison sur 10 bits.
w Ce mode PWM Utilise le Timer 2 ainsi que les registres CCPRxL et CCPxCON (x = 1 ou 2
selon la sortie considérée). Rem: Des registres CCPRxH sont utilisés (esclave de CCPRxL)
mais ne sont pas accessibles par l'utilisateur.

§ CONFIGURATION DE CCPXCON
Les bits 2 et 3 de mode du registre CPPxCON (x=1 ou 2) doivent être configurés à 1 pour être en
mode PWM (voir doc PIC pour plus de détails) :
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
Inutilisé Inutilisé CCPxY CCPxX CCPxM3 CCPxM2 CCPxM1 CCPxM0
0 0 Bits de poids faibles 1 1 X X

Ø CARACTÉRISTIQUES DU SIGNAL CCPx TPWM


§ PÉRIODE
TDC
TPWM = (PR2+1)$4 $T CLK

PR2 : Valeur du registre de période du TMR2=PR2 t


TMR2=PR2
Timer 2 (8 bits). TMR2=CCPRxL
T CLK : période du signal d’horloge

T CLK = 1 K est le rapport du prédiviseur du timer2, accessible dans le


K$F QUARTZ
registre T2CON.

§ CONFIGURATION DE T2CON : REGISTRE DE CONTRÔLE DU TIMER 2

Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0


Inutilisé TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 TMR2ON T2CKPS1 T2CKPS0
0 Postdiviseur du Timer 2 1 Voir tableau ci dessous
Bit 1 et 0 du registre T2CON Prédivision d’horloge
T2CKPS1 T2CKPS0 K
0 0 1
0 1 1/4
1 X 1/16

PWM_PIC2.LWP SECTION T.S. ÉLECTRONIQUE - PADIOLLEAU J-LUC ET COTTET JJ PAGE 1 SUR 3


MICROCONTRÔLEUR MODE PWM DU PIC16F877

§ RAPPORT CYCLIQUE

COMP$T CLK
T DC = 16

T DC : Durée de l’état de l’état haut du signal PWM.


COMP : Registre de comparaison 10 bits obtenu par la concaténation de CCPRxL (contient les
8 bits de poids forts) et des bits 5, 4 de CCPxCON (contient les 2 bits de poids faibles).

Ø INITIALISATION CORRESPONDANT À CE MODE PWM


1. Configuration des broches du port C correspondant à CCP1 et CCP2 en sortie par une
écriture dans le registre TRISC.
2. Initialisation de CCPxCON = 0 (Tout les modes sont sur arrêt: capture, comparaison et
PWm). Et TMR2 = 0 (Pour démarrage final du Timer 2).
3. Ecriture dans le registre PR2 afin d’établir la période (en choisissant déjà le rapport de
prédivision d'horloge du Timer 2).
4. Ecriture dans le registre CCPRxL afin d’établir le rapport cyclique initial (sur les 8 bits de
poids forts).
5. Ecriture dans le CCPxCON afin de configurer le mode PWM et d’établir le rapport cyclique
initial (sur 10 bits) à l'aide des bits CPPxY et CPPxX (2 bits de poids faibles).
6. Définition du rapport de prédivision d’horloge du Timer 2 et démarrage du Timer ,2 par une
écriture dans le registre T2CON.

Ø EXEMPLE EN LANGAGE C
#include <pic.h>
/* ***********************************************************************************************************************
Fichier PWM_T2.c version: 1.0 Mr COTTET jj Lycée Maurice GENEVOIX INGRE
Génération de 2 signaux à 20kHz, l'un avec rapport cyclique de 25% l'autre avec un rapport cyclique de 40%
(précision de 0.25% sur les deux) Manip avec un Quartz 8MHz fh= fq/4 = 2MHz
T2CON = - Toutps3 Toutps2 Toutps1 Toutps0 TMR2ON T2CKPS1 T2CKPS0
CCP1CON = - - DC1b1 DC1b0 CCP1M3 CCP1M2 CCP1M1 CCP1M0

On souhaite obtenir f PWM = 20kHz soit (fh / fPWM) = 100


si div = 1 => Fh Timer2 = 2Mhz et Tpwm = (PR2 +1).4.TQ soit fh = (PR2+1). Fpwm
Donc PR2 = (fh /fpwm)-1 = 99
Si on veut un rapport cyclique de 25%, il faut donc CCPR1L = PR2 * rapport cyclique
donc CCPR1L= 24.75 (car PR2 = 99), soit CCPR1L=24 et les deux bits DC1b1 DC1b0 = 11
pour obtenir 0.75 (résolution de 99/4 = 0.25 ici)

On veut (par exemple) également un rapport cyclique de 4/10 =0.4 % sur CCPR2L
CCPR2L = 0.4 * 99 = 39.6 soit CCPR2L = 39 + 0.5 (DC2b1 DC2b0 = 10)

************************************************************************************************************** ********* */
//************** Programme principal ***************
void main(void)
{ TRISC = TRISC & 0b11111001; // RC2 = CCP1 et RC1=CCP2 en sortie
CCP1CON = 0; // Modes comparaison, capture et PWM = arrêt
CCP2CON = 0;
TMR2 = 0; // Raz timer 2

PR2 = 99; // Registre de période pour obtenir 20kHz


CCPR1L = 24; // Pour rapport cyclique 1/4 (0 à PR2) sur 10 bits max
// les 2 bits de poids faibles sont DC1b1 et DC1b0 de
// CCP1CON
CCPR2L = 39;

CCP1CON = 0b00111100; // DC1b1 et DC1b0 = 11, et CCP1 Mode = 11XX pour PWM
CCP2CON = 0b00101100;
T2CON = 0x04; // soit Timer2 ON avec div = 1

while(1)
{
// Programme a compléter
}
}

PWM_PIC2.LWP SECTION T.S. ÉLECTRONIQUE - PADIOLLEAU J-LUC ET COTTET JJ PAGE 2 SUR 3