Le Signal PWM

Icône de l'outil pédagogique Signal à rapport cyclique variable (Pulse Width Modulation)
Un signal PWM est une sortie du micro-contrôleur qui permet, par exemple, de commander un hacheur. En général, la fréquence est fixée et on fait varier le rapport cyclique du signal.

Réaliser un signal PWM avec un circuit numérique nécessite un compteur qui fonctionne en continu. Un tour de compteur correspond à une période du signal PWM.

La fréquence peut donc être réglée par le choix de l'horloge du compteur et par la valeur maximale du compteur (N sur la figure). Un registre associé à un comparateur permet de fixer le rapport cyclique. A chaque fin de comptage, la sortie PWM est mise à 1 et elle est mise à 0 quand le compteur atteint la valeur fixée par le registre de rapport cyclique (W).

 

 

Exemple de chronogramme :

 

 

 

En réalité, la structure qui se trouve dans le micro-contrôleur est un peu plus compliquée. Seulement les 8 bits de poids forts de la valeur maximale du compteur sont configurables.

Une bibliothèque de fonctions est fournie pour configurer simplement les deux sorties PWM du micro-contrôleur.

Pour utiliser la bibliothèque des sorties PWM, il faut d'abord placer les fichiers suivants dans le répertoire du projet :

iut_pwm.h

iut_pwm.c

puis les ajouter au projet.

Après avoir inclus le fichier d'entêtes de la bibliothèque, il faut initialiser son utilisation par un appel à la fonction pwm_init au début du programme.

Le premier paramètre à passer à cette fonction permet de choisir la fréquence à générer.

La valeur est codée sur 8 bits (donc entre 0 et 255, notée N dans la suite) et la fréquence est calculée grâce à la formule suivante :

fréquence = 3.106 / (N + 1)

Le second paramètre permet de choisir le nombre de sorties (1 ou 2). Si on choisit 1, seule PWM1 (broche C2) est activée, si on choisit 2, les sorties PWM1 et PWM2 (broche C1) sont activées.

On peut remarquer que les deux sorties fonctionnent obligatoirement à la même fréquence.

 

Par exemple, pour activer les deux sorties PWM avec une fréquence de 20kHz, on écrira le code suivant :

#include <18f4550.h>

#include "iut_pwm.h"

void main(void)

{

pwm_init(149, 2);

...

}

 

Pour modifier le rapport cyclique, deux fonctions sont disponibles, une pour chaque sortie PWM.

La fonction pwm_setdc1 contrôle le rapport cyclique de PWM1 et pwm_setdc2 celui de PWM2.

Le paramètre à passer à ces fonctions correspond au nombre de cycles à l'état haut.

Il est codé sur 10 bits (donc de 0 à 1023, noté W dans la suite). Le rapport cyclique obtenu est lié à la configuration de la fréquence par la formule suivante :

rapport cyclique = W / (4 (N + 1))

Si W est supérieur à 4 (N + 1) alors le rapport cyclique vaut 1.

Avec la configuration précédente (N=149), la valeur de W doit être comprise entre 0 et 600.

 

On donne ci-dessous quelques valeurs de rapport cyclique en fonction de W :

si N=149

 

W Rapport Cyclique
0
0
150 0.25
300 0.5
450 0.75
600 1

 

Voici un exemple qui effectue la conversion de la voie du potentiomètre (AN0) et utilise la valeur obtenue pour modifier le rapport cyclique de PWM1. Le rapport cyclique de PWM2 évolue de manière opposée.

#include <p18f4550.h>

#include "iut_lcd.h"

#include "iut_adc.h"

#include "iut_pwm.h"

void main(void)

{

int potar = 0;

float a1, a2;

// initialisation

lcd_init();

adc_init(0);

pwm_init(149, 2);

lcd_position(0, 0);

lcd_printf("PWM1 POT PWM2");

// boucle infinie

while (1) {

potar = adc_read(0);

pwm_setdc1(potar);

pwm_setdc2(1023 - potar);

a1 = potar / 600.0;

if (a1 > 1) a1 = 1;

a2 = (1023 - potar) / 600.0;

if (a2 > 1) a2 = 1;

lcd_position(1, 0);

lcd_printf("%5.3f", a1);

lcd_position(1, 6);

lcd_printf("%4d", potar);

lcd_position(1, 11);

lcd_printf("%5.3f", a2);

}

 

}

 

 

Pour afficher les signaux PWM dans un oscilloscope virtuel, il faut aller dans le menu Fenêtre puis Oscilloscopes.