Professional Documents
Culture Documents
Ø 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
§ RAPPORT CYCLIQUE
COMP$T CLK
T DC = 16
Ø 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 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
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
}
}