Vous êtes sur la page 1sur 2

Modulation de Largeur d'Impulsion (MLI, PWM)

Il est trs souvent ncessaire de faire varier la puissance transmise une charge. Par exemple,
l'intensit d'une lampe doit varier ou la vitesse d'un moteur doit tre rgle. La premire ide qui
vient l'esprit est de faire varier la tension ou le courant dans la charge. Mais il faut pour cela des
circuits lectronique complexes. Il est gnralement beaucoup plus simple d'alterner des instants o
la puissance maximale est transmise la charge avec des moments o aucune puissance n'est
transmise.
La technique la plus utilise est la Modulation de Largeur d'Impulsion (MLI) ou Pulse Width
Modulation (PWM) en anglais.

Comme on le voit sur la figure, le signal est de priode constante, mais la dure de la partie active
du signal varie. Dans la premire partie, 25% de la puissance maximale est envoye la charge, vu
que le signal est 1 durant 25% du temps alors qu'il est 0 le reste du temps. De mme, la
puissance passe 50% au milieu du trac et 75% sur la dernire partie.
La frquence du signal va dpendre de l'application. Pour commander une diode lumineuse, la
frquence doit tre suprieure 100Hz, pour que l'oeil humain ne peroive pas le clignotement.
Dans ce cas, c'est bien l'oeil qui effectue l'intgration du signal pour en percevoir une valeur
moyenne. Pour un moteur courant continu, ce sont la fois l'inductance de son circuit lectrique et
son inertie mcanique qui participent cette intgration. Les frquences des signaux PWM peuvent
aller couramment jusqu' des centaines de kHz. Mais plus la frquence est leve, plus les pertes
lectriques l'instant des commutation sont importantes et peuvent dissiper de l'nergie dans les
lments de commutation.
Voici un programme qui gnre un signal PWM:
void main() {
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P1DIR |= (1<<5);
char commande=75;
char temps;
volatile char i;
while (1) {
P1OUT |= (1<<5);
for(temps=0; temps<commande; temps++){
for (i=0; i<50; i++);
}
P1OUT &= ~(1<<5);
for(temps=0; temps<(100-commande); temps++){
for (i=0; i<50; i++);
}
}
}

2010-2013 Pierre-Yves Rochat, pierre-yves.rochat@epfl.ch, version du 01/04/2013

Aprs les initialisations de la sortie et des variables, la boucle infinie alterne la partie active et la
partie inactive du signal. Les attentes sont obtenues par une simple boucle d'attente active, dont le
nombre d'instructions dtermine le temps. Attention: le terme volatile est ncessaire pour que le
compilateur, dans son mode optimis, ne supprime pas les boucles for constatant qu'elles sont vides.
Ce programme donne l'impression que la diode lumineuse est demi-intensit. C'est li au fait que
la rponse de l'oeil n'est pas linaire, mais logarithmique. On remarque aussi que le PWM est visible
en dplaant rapidement la diode devant l'oeil.
Beaucoup de microcontrleurs disposent l'intrieur de circuits ddis facilitant la gnration de
signaux PWM. Ils sont bass sur des timers (dcrits plus en dtail dans la fiche Les Timers).
De manire simplifie, le principe est le suivant:

=0
H

Set
Sortie PWM

CNT
=

Reset

OC
Un compteur binaire (CNT) est actionn par une horloge de frquence rglable, drive de l'horloge
du processeur. Deux comparateurs sont prsents. L'un permet de mettre la sortie 1 lors du passage
du compteur la valeur 0, l'autre permet de mettre la sortie 0 lorsque le compteur atteint la valeur
contenue dans un registre (OC: Output Compare).
Voici un programme pour le microcontrleur MSP430G2553. Notez qu'il y a deux modles
diffrents de timers dans les processeurs MSP430, selon le modle. Ici, le TimerA est utilis.
void main(){
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P1DIR |= (1<<2); // P1.2 en sortie
P1SEL |= (1<<2); // Slection de P1.2 pour le timer TA0.1
CCR0 = 512; // Priode du PWM, dans le registre de comparaison 0
CCTL1 = OUTMOD_7; // CCR1 activation du mode PWM
CCR1 = 128; // valeur de la priode active du PWM (25% de 512)
TACTL = TASSEL_2 + MC_1; // choix de l'horloge, mode montant, signal actif 1
while(1) { // il n'y a plus rien faire
}

dans la boucle principale !

Il n'y a malheureusement pas moyen de choisir la pin sur laquelle les PWM est gnr. Dans ce cas,
il s'agit de la pin P1.2, note aussi TA0.1 ( Timer0_A).
Remarquez la simplicit du programme et la boucle while(1) totalement vide. Le processeur est
donc libre pour excuter d'autres tches !
2010-2013 Pierre-Yves Rochat, pierre-yves.rochat@epfl.ch, version du 01/04/2013

Vous aimerez peut-être aussi