AVR – Chapitre 4 – Fabriquer des valeurs analogiques (PWM)

D’un point de vue numérique, l’analogique n’existe pas. Le courant est là, ou n’est pas là. La diode est allumée, ou éteinte. Il n’y a pas d’état intermédiaire. Si cela vous frustre, pas de panique ; il est toujours possible de simuler des valeurs analogiques, à condition d’avoir un bon compteur, avec une haute fréquence.

L’illusion

L’idée est plutôt simple : prenons le cas d’une diode que l’on veut allumer progressivement de 0 à 100%. Pour l’allumer à 25%, nous allons l’allumer sur 25% des cycles du microcontrôleur.
Soit un tic d’horloge allumée, et 3 tics d’horloge éteinte.

Rendered by QuickLaTeX.com

À première vue, on peut s’inquiéter d’un effet de scintillement, mais pas de souci à se faire : quand l’horloge tourne à une fréquence de l’ordre du méga-hertz, l’œil humain, lui ne perçoit ce phénomène qu’en deçà de 30 Hz. Nous avons donc une marge plus que confortable pour ces jeux d’éclairage.

Par contre, il n’est pas question de monopoliser un microcontrôleur de cette façon ; il a donc été créé un mécanisme : le PWM (Pulse Width Modulation), soit la modulation de largeur d’impulsion.

La modulation de largeur d’impulsion : PWM

Il s’agit d’un compteur, couplé à des comparateurs. L’ATtiny85 peut fonctionner suivant deux modes :

  • Fast PWM : modulation rapide
  • Phase Correct PWM : modulation réelle

 

Mode de modulation rapide

Un peu d’explications…

Il s’agit de définir un registre de référence, et d’incrémenter un compteur de 0 à 255 (dans le cas d’un compteur 8bit). On réalise à chaque pas une comparaison entre la référence et le compteur.

Tant que le compteur est inférieur à la référence, la sortie est à 1, puis une fois qu’on a dépassé le registre, la sortie passe à 0.

Une fois arrivé au maximum (TOP) on redescend directement au niveau bas (BOTTOM) et on recommence.

Ce diagramme résume la situation, pour un registre de référence qui correspond à 25% de la taille du compteur, soit {25\% \times {2}^{8}} = 64

Rendered by QuickLaTeX.com

Plus intéressant maintenant, il est possible de configurer le compteur pour se réinitialiser non plus après {2}^{8}-1 = 255 mais à une valeur arbitraire entre 0 et 255. Puisque l’on est habitué au décimal, pourquoi ne pas choisir 99 ? Dans ce cas, si l’on souhaite obtenir une valeur de 42%, elle sera plus facile à définir qu’en utilisant un maximum de 255 : 42\% \times \frac{100}{256} = 107.52.

Rendered by QuickLaTeX.com

La pratique

Dans ce microcontrôleur, il y a plusieurs registres à prendre en compte pour utiliser la modulation rapide ; il nous faut :

  • le registre de configuration du compteur 1 :  TCCR1
  • le registre de référence du comparateur du compteur 1 : OCR1A
  • le registre TOP du comparateur du compteur 1 : OCR1C
  • le registre de configuration du port B : DDRB

Reprenons le dernier exemple ; on cherche à allumer une diode, connectée à la broche 1 du port B (broche 6), à 42%.

 

Voilà ! Votre diode « clignote » maintenant à 80kHz, restant allumée 42 fois sur 100.

Mode de modulation réelle

Ce mode de fonctionnement fonctionne presque de la même façon que le précédent, à ceci près qu’une fois arrivé au TOP, on redescend vers BOTTOM, est on applique le même procédé de comparaison. Ceci à pour avantage d’augmenter la résolution, au détriment de la fréquence maximale, qui est divisée par deux.

Rendered by QuickLaTeX.com

Reprenons maintenant le premier exemple ; le code change peu, mais on utilisera ici le compteur 0 :

 

On sait maintenant utiliser les compteurs avec une application interessante : générer des valeurs analogiques. Une fois configurée, l’utilisation dans votre code est trivial ; il suffit d’affecter la valeur souhaitée au registre de référence (OCR0A ou OCR1A). Il est également possible de définir un second registre de référence sur chaque compteur (OCR0B et OCR1B), chacun utilisant son horloge respective (compteur 0 ou 1).

Et il est également possible d’utiliser un diviseur (prescaler) afin de réduire nettement la fréquence. Ceci peut vous permettre de créer des signaux oscillants au niveau du kilo-hertz, soit la possibilité de créer des sons !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*