Accueil _ News _ Tutoriels _ Forums _ Mes projets _ Livre d'or

Chapitre 6 : Notion de PWM



Vous avez toujours envie de continuer ce tutoriel ? J'espère bien car vous verrez le résultat sera magnifique et vous serez surpris de votre réalisation.
Peut-être qu'à ce stade du tutoriel vous vous découragez et vous vous demandez "Mais pourquoi tant d'efforts et de matériel pour un robot qui avance et recule !".
La réponse est simple : Lorsque vous aurez fini easybot, vous arriverez très facilement à créer d'autres robots à partir de easybot. Non seulement vous aurez déjà le matériel de base mais en plus les connaissance suffisantes pour vous débrouiller tout seul, je vous le garantis ! De toute façon vous le verrez bien dans le tutoriel suivant ;)

Passons maintenant à un sujet plus barbare : La notion de PWM.



Partie 1 : Le signal PWM en général



PWM c'est quoi ça ?

Eh bien c'est quelque chose de compliqué malheureusement.
Le PWM (Pulse Width Modulation) ou MLI (Modulation de largeur d'impulsion) est un signal auquel on fait varier la tension sans modifier ni l'amplitude ni la fréquence mais la largeur de l'impulsion.

En fait le signal PWM n'est pas continu, c'est un signal à impulsions (ressemble au signal carré). Il possède un état haut (un 1 logique) et un état bas (un 0 logique).
Voici un schéma représentant un signal PWM :

Vous voyez sur ce schéma que le signal est tantôt à l'état haut tantôt à l'état bas. Nous avons dit avant qu'un signal PWM est une tension qu'on peut varier.
Mais comment ?
Plus le signal reste à l'état haut, plus la tension sera élevée, et vice versa. Exemple ici la tension sera moins élevée :
Le Duty Cycle ou Rapport cyclique

A votre avis, si le signal PWM a la moitié du temps 5V, et l'autre moitié du temps 0V (comme dans le premier schéma) ou autrement dit si le signal reste 50% à l'état haut et les 50% restant à l'état bas. Quelle sera la tension qui sortira ?
La tension sera de 2.5V

C'est logique.
Le pourcentage représentant la fréquence où la tension est à l'état haut est appelé "Rapport cyclique" ou "Duty Cycle" en anglais et comporte le plus souvent la lettre "alpha".
Voici l'équation qui détermine la tension en fonction du rapport cyclique :
Tension PWM (en V) = Tension maximale (en V) X Rapport cyclique / 100

Exemple : Je veux avoir une tension PWM de 3.8V, sachant que ma tension maximale est de 5V (c'est généralement le cas). Quel sera mon rapport cyclique ?
Rapport cyclique = 100 X Tension PWM / Tension maximale
Rapport cyclique = 100 x 3.8 / 5
Rapport cyclique = 76%

Donc ici, le signal sera à 76% du temps à l'état haut.

J'ai un rapport cyclique de 97%, quelle sera ma tension PWM ?
Tension PWM = Tension maximale X Rapport cyclique / 100
Tension PWM = 5 X 98 / 100
Tension PWM = 4.9V


La période du signal

Comme tout signal variable, le signal PWM a une période qu'on peut calculer via la formule que vous devez bien-sûr savoir sur le bout des doigts : T = 1/F
Quand on veut générer un signal PWM, on va initialiser le signal à une certaine fréquence et ainsi obtenir la période voulue.
Attention, je vous rappelle que le PWM est un signal auquel on fait varier la tension sans modifier ni l'aplitude : Vous avez vu qu'elle reste de 5V tout le temps. Ni la fréquence : La période reste la même.
Nous allons simplement initialiser le signal à une certaine fréquence qui resta toujours la même, vous allez comprendre


Exemple : J'aimerais un signal PWM d'une période de 20 ms, quelle fréquence dois-je attribuer ?
J'espère que je ne vous apprends rien, on applique la formule : F = 1/T
F = 1/0,020 (on oublie pas de convertir les milli-secondes en secondes, gare à vous !)
F = 50Hz


Exercices

Passons maintenant au concret.
J'aimerais, enfin je veux un signal PWM d'une période de 27ms et d'une largeur d'impulsion de 7ms.
Quelle sera ma fréquence ?
Quel sera mon rapport cyclique ?

Réponse : Pour la fréquence, on applique la formule : F = 1/T
F = 1/0,027
F = 37Hz

Pour le rapport cyclique on va faire un produit en croix :
sachant qu'un rapport cyclique est en %, et que j'ai un largeur d'impulsion de 7ms sur 27ms (la largeur d'impulsion maximale),on fait :
7 X 100 / 27 = 26% arrondi par excès

Ma fréquence sera donc de 37Hz et mon rapport cyclique de 26%


J'aimerais une tension PWM de 3.7V en sachant que la tension maximale est de 5V :
Quel sera mon rapport cyclique ?
Et ma fréquence ?

Réponse : On applique la formule pour le Duty Cycle : Rapport Cyclique = 100 X Tpwm / Tension maximale
RC = 100 X 3.7 / 5
RC = 74%

Maintenant, pour la fréquence, c'est bien simple. Je vous avais dit au départ qu'on faisait varier une tension PWM en ne modifiant que la largeur de l'impulsion et pas la fréquence.
Donc on peut mettre n'importe quelle fréquence, la tension PWM ne variera pas. Par contre la période changera bien-sûr, mais la condition de l'exercice était d'avoir simplement une tension PWM de 3.7V. En clair ici on s'en fiche de la période.

Partie 2 : Le PWM et le 16F877


Aïe les choses sérieuses arrivent !
Notre pic 16F877 dans toute sa magnificence est capable de produire un signal PWM, ça tombe à pic pour l'utilisation du L293D non ?
En réalité, notre pic est doté de deux modules CCP (broches 16 et 17 -> CCP1 et CCP2). Ces initiales signifient : Capture Compare and PWM. C'est à dire qu'il a 3 fonctions, on ne s'occupera pas des deux premières (Capture et Compare) mais seulement de la troisième -> PWM.
On en déduit qu'on peut générer deux signaux PWM indépendant l'un de l'autre avec le 16F877.

On ne va pas étudier le fonctionnement interne à ces modules,car d'une c'est assez compliqué et de deux : MikroC nous évite cette besogne ! Mais si ça vous intéresse, vous pouvez lire la partie 2 du cours de bigonoff.

Les 3 fonctions de MikroC : PWM_Init() - PWM_Start() - PWM_Change_Duty()

Si il y a des fonction à retenir pour générer un signal PWM, c'est bien ces trois là. Elle sont ultra simple d'utilisation, regardez par vous même :
-PWM_Init();
C'est dans cette fonction que vous préciserez entre parenthèses la fréquence du signal PWM (en hertz).
Exemple : Je veux une fréquence de 4khz : PWM_Init(4000);

-PWM_Start();
Cette fonction démarre le module CCP et donc le signal PWM.

-PWM_Change_Duty();
C'est dans cette fonction que vous indiquerez le rapport cyclique. Malheureusement, il ne sera pas donné en pourcentage mais en valeur décimale (de 0 à 255).
Je ne vais pas vous faire un cours sur les valeurs décimales, mais sachez que pour convertir un pourcentage en valeur décimale on fait en prenant pour exemple 87% :
87 X 255 / 100 = 221.85
Note : Une valeur décimale ne comporte pas de virgules, donc ici on indiquera : 222, c'est sur c'est moins précis, mais on n'a pas le choix.

Exercices

Je veux un signal PWM de 30ms de période et de 1.2ms d'impulsion (ou état bas) sur la broche RC1(CCP2)
Écrivez le bout de code avec seulement les 3 fonctions qu'on vient d'utiliser qui génère un tel signal :

Réponse :
PWM2_Init(33);
PWM2_Start();
PWM2_Change_Duty(10);


Explications : Pour la fréquence :
F = 1/T
F = 1/0.03 (conversion en secondes)
F = 33.33333 = 33Hz

Pour le rapport cyclique :
On va déjà le calculer en pour cents, pour cela on va faire comme dans l'exercice précédent :
1.2 X 100 / 30 = 4%

Maintenant on va le convertir en valeur décimale :
4 X 255/100 = 10.2 = 10


J'aimerais une tension PWM de 4.7V sachant que ma tension maximale est de 5V sur la broche RC2 (CCP1) :
Écrivez le code entier qui génèrera cette tension. (si vous avez oublié, revoyez le chapitre 3)

Réponse :
void main()

{

TRISC = 0b00000000; //On n'oublie pas de mettre la broche RC2 en sortie !

PWM1_Init(5000); //On peut mettre n'importe quelle fréquence (cf exercice du dessus).

PWM1_Start(); //On démarre le module CCP1

PWM1_Change_Duty(240); //l'explication ci-dessous

}

Pour le rapport cyclique :
Calcul du RC en pour cents :
100 X 4.7 / 5 = 94%

Conversion en valeur décimale :
94 X 255 / 100 = 239.7 = 240


Ouf ! On y est arrivé ! J'espère qu'avec tout ceci, vous avez compris ce qu'était un signal PWM, bon courage pour la suite !


Signaler un bug, une faute d'orthographe | Me contacter | Plan du site | Partenaires | En savoir plus

Haut de page