On peut modifier la valeur de la fréquence du PWM généré par un micro-contrôleur. Dans le cas du robot à chenilles utilisé pour nos tests, l’intérêt de modifier cette fréquence est de sortir de la bande des sons audibles par l’homme car le PWM fait résonance avec la mécanique du châssis motorisé.
Article expliquant comment modifier la fréquence du PWM
Et n’oubliez pas de revenir ici quand vous l’aurez lu :)
Pourquoi un PWM ?
Mais au fait, pourquoi a-t-on besoin d’un PWM : il permet de modifier la vitesse en donnant un rapport cyclique variable sur la patte d’activation (enable) d’un circuit de puissance type pont en H.
Il y a deux façons de modifier la vitesse : utiliser la patte d’activation ou directement les signaux de commande des phases de chaque moteur.
Dans notre cas, on utilise un circuit L298 (double pont en H) de ST Microelectronics déjà câblé sur la carte Roméo. Il n’y a que deux pattes par moteur : une pour le sens (câblée en inverseur sur les signaux de commande) et une pour l’activation.
Le mode "PWM sur enable" est donc obligatoire. Passons maintenant au problème de fréquence.
Différentes fréquences disponibles
Comme nous l’avons vu dans l’article sur la modification de fréquence du PWM, il y a différentes valeurs de division de l’horloge (prescaler), correspondant aux fréquences suivantes :
prescaler | fréquence |
---|---|
1 | 62,5 kHz |
8 | 7,8 kHz |
64 | 976 Hz |
256 | 244 Hz |
1024 | 61 Hz |
La bande audible est généralement comprise entre 16 hertz et 20 kHz (selon les capacités auditives de chacun). Il n’y a donc que le premier choix (pas de division donc horloge I/O en direct) qui est en-dehors de cette bande de fréquences.
On pense donc à utiliser cette fréquence en premier.
Mais il y a un inconvénient
Et de taille : quand on teste un PWM de valeur moitié (duty cycle de 50%) après modification du timer, le robot n’avance plus. Etrange non ? Il y a en fait une perte de couple quand la fréquence du PWM est trop élevée.
Je n’ai pas trouvé d’explication dans la datasheet du L298. Mais la solution est donc d’utiliser une fréquence basse (le 61 Hz est inaudible par rapport au bruit que font les engrenages, en tout cas pour moi, et j’interdis toute blague comportant le mot "baleine").
Impact sur les autres fonctions
On a déjà vu que la modification du prescaler du timer 0 avait un impact direct dans le code Arduino (dont dépend la Romeo) sur la fonction "delay" : il faut donc adapter notre code, puisqu’on passe d’un diviseur 64 à un diviseur 1024 soit 16 fois plus. Un arrêt d’une seconde devient donc "delay(62)".