Les PWM de MTobjects

Le PWM délivre un signal rectangulaire (un certain temps à HIGH, un certain temps à LOW) qui recommence sans fin. Si cela va très lentement, cela peut faire marcher un moteur pendant une heure, l'arrêter pendant deux, et recommencer ce cycle. Un peu plus vite, cela peut faire clignoter une LED. Si on dépasse les 50 fois par secondes, une LED clignotera si vite qu'on verra un éclairement moyen. C'est une bonne façon de faire varier l'intensité lumineuse.

Pour faire varier l'intensité lumineuse, on peut utiliser le PWM (hard) accessible par analogWrite. Pour ces applications, on n'a pas forcément besoin d'une fréquence particulière et normalement 256 niveaux suffisent.

Pour commander certains moteurs pas à pas, on peut envoyer des impulsions régulières pour le faire progresser à chaque fois d'un pas. Mais souvent on a besoin de connaître le nombre de pas. A la limite, on pourrait utiliser MTclock ou MTsoftPWM qui peuvent compter le nombre d'impulsion, mais cela ne gère pas la position finale ni le sens. Je conseille plutôt MTstepper qui est dédié à cette tâche.

Un servomoteur est commandé par un signal PWM, en général de période 20ms, avec une impulsion de 0,5ms à 2,5ms. On pourait utiliser le PWM de MTobjet pour le commander, mais il faut gérer le déplacement. Il vaut mieux utiliser alors PWservo qui est plus adapté.

MThardPWM et MTsoftPWM permettent de faire du PWM en choisissant la fréquence et en ayant une résolution de la tension moyenne souvent supérieure à 256 valeurs.

 

Hard ou soft?

Il y a deux façons d'avoir une tension PWM sur une broche de l'Arduino : par hard ou par soft.

Gérer le PWM par hard, c'est utiliser une partie spécifique du microcontrôleur qui est conçu pour cela. Pour faire un signal, on calcule l'ordre que l'on envoie à un "timer" qui fait le travail. Cela demande très peu de ressources, une fois lancé, on n'a plus rien à faire. On peut avoir des vitesses élevées (max 8MHz pour un signal carré). Mais on ne peut pas descendre facilement en dessous de 4Hz.

En plus on ne peut utiliser que certaines broches associée aux timers 16 bits (MThardPWM ne permet pas d'utiliser les timers 8 bits). Sur Uno/Nano, on ne peut profiter que des broches 8 et 9. Sur Mega le choix se porte sur les broches 2, 3, 5, 6, 7, 8, 11, 12, 13, 44, 45 et 46. De plus sur Uno/Nano, les broches 8 et 9 utilisent le même timer et la fréquence est la même. Il en est de même avec les triplets de la Mega (2, 3, 5), (6, 7, 8), (11, 12, 13), (44, 45, 46).

Gérer le PWM par soft, c'est demander au programme de regarder l'heure régulièrement et de mettre une sortie à HIGH ou LOW. Cela demande donc du temps d'exécution. Pour un signal carré, on ne peut aller plus vite que 10kHz (on peut aller un peu plus vite en réglant différemment l'horloge de MTobjects). Par contre on n'est moins limité pour les vitesses lentes (5 jours pour un signal carré).

Mais le gros avantage du PWM soft, c'est que l'on peut utiliser toutes les broches (sauf A6 et A7 d'une Nano qui ne sont que des entrées).

Comme la gestion de MTsoftPWM est logicielle, il y a la possibilité de compter les niveaux, afin d'en donner un nombre fixé par l'utilisateur. Il y a aussi la possibilité de déclencher une action en fin de comptage.


 

Guide de choix

MThardPWMMTsoftPWM
Broches utilisables Uno/Nano8,9Toutes
Broches utilisables Mega2, 3, 5, 6, 7, 8, 11, 12, 13, 44, 45, 46Toutes
Fréquence des brochesLa même pour 3 sortiesBroches indépendantes
Période mini1µs200µs (1)
Période maxi4s5 jours (1)
Résolution62ns à 64µs100µs (1)
Ressources matériellesun timeraucune
Temps d'exécution0non nulle
(1) par défaut, mais un facteur 10 est possible

 

AnalogWrite

La fonction AnalogWrite() génère un signal rectangulaire par hard. On ne peut utiliser que 6 broches sur la Nano/Uno et 12 broches sur la Mega. La période est fixée à 490HZ ou 980Hz suivant la broche utilisée. La résolution est de 256 pas (8µs à 490Hz).

Détail des fonctions sur la page de référence d'Arduino.

 

MThardPWM

Un objet MThardPWM génère un signal rectangulaire par hard. On ne peut utiliser que 2 broches sur la Nano/Uno et 12 broches sur la Mega. Si on ne précise pas, la période est de 20ms (fréquence de 50Hz), signal carré. La plus petite résolution est de 62ns, mais elle dépend de la fréquence. On ne peut pas mettre en place le PWM avant l'initialisation de la carte Arduino qui remettrait les fonctions standards; le PWM démarre donc 16ms environ après le début du setup.

 

MTsoftPWM

Un objet MTsoftPWM génère un signal rectangulaire par logiciel. On peut utiliser toutes les broches disponibles en sortie. La résolution est de 100µs, c'est celle d'une base de temps. On peut avoir une plus petite résolution (jusqu'à 10µs) en réglant l'horloge de MTobjects, voir "Réglage de la bibliothèque".

Détail des fonctions sur ce pdf (car aussi imprimable).