Vous êtes sur la page 1sur 2

PWM avec le PIC 16F876

Claude Barbaud 2 février 2005

Principe:
La modulation de largeur d'impulsion (Pulse Width Modulation ou PWM) consiste à
commander le duty cycle d'une onde carrée à fréquence fixe. Ce principe permet de
transférer à une charge une énergie proportionnelle à ce Duty Cycle.

Exemples

DC = 10%

DC = 50%

DC = 90 %

Utilisation du PWM du PIC:


Le PIC 16F876 possède 2 PWM indépendants:
 Sur la broche RC1/CCP2
 Sur la broche RC2/CCP1

La fréquence est définie en utilisant le timer 2.


Le fonctionnement de chaque PWM est indépendant du fonctionnement du programme.
La fréquence et le Duty Cycle sont alors précis. La fréquence peut être définie dès le
début pour tout le programme(initialisation). Le Duty cycle peut être modifié dams le
programme.

Programmation du PWM sur RC1/CCP2:


On doit d'abord initialiser le temporisateur(timer):

setup_timer_2(mode, période, 1);


Le mode peut être T2_DIV_BY_1, T2_DIV_BY_4, T2_DIV_BY_16
La période est une valeur à 8 bits (0 à 255)
La période est alors:
PWM period = Tosc * 4 * mode * (période + 1);
la fréquence est évidemment f(PWM) = 1/PWM period
les montages réalisés (PIC232) ont une fréquence d'oscillation de 20 MHz, soit
une période de 1/20e6 = 50 ns

Par exemple
setup_timer_2(T2_DIV_BY_1,124, 1);

PWM period = 50 ns * 4 * 1 * (124 +1) = 25 s

16-1
f(PWM) = 1/25 s = 40 kHz

Les fréquences peuvent donc aller de 1221 Hz (T2_DIV_BY_16,255, 1) à


2500 kHz (T2_DIV_BY_1,1, 1)

On doit ensuite définir le fonctionnement en PWM: la broche CCP2 est la même que C1

setup_ccp2(CCP_PWM); // CCP2 en PWM

On pourrait l'arrêter avec:


setup_ccp2(CCP_OFF);

On doit ensuite régler le rapport cyclique; le rapport est sur 7 bits:


set_pwm2_duty(valeur)
Le duty cycle est alors = valeur/(période + 1)

Exemple:
set_pwm2_duty(63); // Duty cycle = valeur/(période+1)
DC = 63/(124+1) = 50%

Programmation du PWM sur RC2/CCP1:


Les étapes sont les mêmes:
setup_timer_2(mode, période, postscale);

setup_ccp1(CCP_PWM); // RC2/CCP1 en PWM

set_pwm1_duty(valeur)

16-2

Vous aimerez peut-être aussi