Ajuster le Fréquence PWM sur un Arduino

Introduction
Disposé d'une pulsation à fréquence définie peut être un sacré avantage dans certaines situations.

Sur Arduino, la porteuse PWM est d'environ 500Hz... et en utilisant un analogWrite( broche, valeur) avec une valeur de 0 à 255 pour couvrir la partie utile du cycle de 0 à 100%

Ajuster la pulsation
Par contre, que faire si l'on désire une pulsation à 31Hz ou à 62 Khz?
La solution réside dans la division de la fréquence de base (attaché à certaines broches) par un diviseur. Cela permet du coup d'obtenir toute une gamme de pulsation sur toute une série de broche :-)

La fréquence de base et le diviseur
Donc la fréquence résultante est égale à la fréquence de base divisé par un diviseur donné:

Fréquences de base:
  • Pour les  pins broches/pins 3, 9, 10 et 11: la fréquence de base est de 31250 Hz. 
  • Pour les pins/broches 5 et 6: la fréquence de base est de 62500 Hz.
Les diviseurs disponibles:
  • Pour les broches/pins 5, 6, 9 et 10 : les diviseurs sont 1, 8, 64, 256 et 1024.
  • Pour les broches/pins 3 et 11: les diviseur sont: 1, 8, 32, 64, 128, 256 et 1024.
Les fréquences PWM lie des pairs de broches/pin. Si une fréquence d'une pair changes pour une broche... l'autre broche de la pair sera également modifiée.
  • Les broches/pins 5 et 6 sont en paire sur le timer0 
  • Les broches/pins 9 et 10 sont en paire sur le timer1
  • Les broches/pins 3 et 11 sont en paire sur le timer2
Conséquences
Il y a des choses importantes à savoir à propos de cette méthode/approche:

  1. La modification de fréquence des pins 3, 5, 6 ou 11 entraine également une modification de certaines fonctions Arduino comme Delay() et Millis()  
  2. La modification de fréquence pins 9 ou 10 entrainera un fonctionnement incorrect de la librairie Servo.
Exemples
Sur base des informations donnée si dessus, voici quelques exemples de mise en pratique:

Broche 9 à 3906 Hertz
Pour ajuster la fréquence PWM de la broche/pin 9 à 3906 Hz, il faut diviser la fréquence de base (31255) par 8 soit: 31250/8 = 3906
   setPwmFrequency(9, 8);
Notez que la fréquence de base de 31250 est la même pour les broches 3, 9, 10 et 11
 
Broche 6 à 62500 Hertz
Pour ajuster la fréquence de la broche/pin 6 à 62500 Hz, il faut diviser la fréquence de base (62500) par 1 soit: 62500/1 = 62500
   setPwmFrequency(6, 1);
Notez que la fréquence de base de 62500 Hz est la même pour les broches 5 et 6.
 
Broche 10 à 31 Hertz
Pour ajuster la fréquence de la broche/pin 10 à 31 Hz, il faut diviser la fréquence de base (31250) par 1024 soit: 31250/1024 = 31
  setPwmFrequency(10, 1024);
 
Mise en pratique
Pour en savoir plus, sur le mise en pratique, vous trouverez le code dans cet article d'Arduino PlayGround.

Une excellente référence.