Le signal PWM est généré par des minuteries sur les puces AVR. Chaque temporisateur peut générer un signal PWM sur deux ou trois broches différentes. Chaque broche peut avoir son propre rapport cyclique, mais elles partagent la fréquence PWM. Vous pouvez changer la fréquence du PWM en changeant la source d'horloge des minuteries. Par défaut, ils utilisent l'horloge CPU divisée par 64, c'est-à-dire. ils ont leur prescaler mis à 64 par le code d'initialisation Arduino. Pour plus de confusion, il existe deux modes PWM différents: PWM rapide et PWM à phase correcte. En PWM rapide, le temporisateur compte jusqu'à 255, puis déborde et recommence à partir de 0 (256 états différents). En phase PWM correcte, le temporisateur compte jusqu'à 255, puis change de direction et compte à rebours jusqu'à zéro, change de direction, etc. (510 états différents).
L'Arduino Mega dispose de 5 minuteries, timer0 - timer4. Étant donné que timer0 est également utilisé pour les fonctions millis et micros, il utilise un PWM rapide, tandis que les autres temporisateurs sont configurés pour un PWM à phase correcte. Il en résulte des fréquences différentes sur différentes broches:
Broches 4 et 13, contrôlées par minuterie0:
16 Mhz / 64/256 = 976,56 Hz
Autres broches PWM, contrôlées par minuterie1-4:
16 Mhz / 64/510 = 490,20 Hz
Le calcul est le suivant: Horloge / Prescaler / PWM mode nombre d'états
La situation est la même pour toutes les autres cartes Arduino que je connais, sauf qu'elles ont moins de temporisateurs qui se connectent à différentes broches.
Vous pouvez changer la fréquence PWM en changeant le prédimensionneur de minuterie. Voir cette page: http://playground.arduino.cc/Main/TimerPWMCheatsheet
Il est également possible de faire en sorte que les temporisateurs comptent pour une valeur différente de 255. Sur les temporisateurs 8 bits, vous perdrez une broche de sortie, mais sur les temporisateurs 16 bits, vous pouvez utiliser le registre de capture d'entrée pour définir une valeur TOP. La fonctionnalité de capture d'entrée est une fonctionnalité rarement utilisée dans la communauté Arduino, vous ne la manquerez donc probablement pas.
Les bibliothèques Arduino vous permettent uniquement d'utiliser une résolution de 8 bits, même sur les temporisateurs de 16 bits. Si vous souhaitez une résolution plus élevée, vous devrez écrire votre propre analogWrite ou utiliser une bibliothèque conçue à cet effet. Sur l'Arduino Mega timer0 et timer2 sont 8 bits, tandis que les autres sont 16 bits.
En changeant le mode des minuteries 16 bits pour utiliser la pleine résolution, en combinaison avec le changement du prédéfinisseur et de la valeur TOP, vous pouvez obtenir une très large gamme de fréquences PWM.
La fréquence maximale que vous pouvez atteindre est d'horloge / 4, en réglant le pré-échelle sur 1 et TOP sur 3 en mode PWM rapide - une valeur inférieure n'est pas autorisée. Cela vous donnera un PWM de 4 MHz avec une résolution de 2 bits. Il peut s'agir de 0%, 25%, 50% ou 75% du temps. Une valeur TOP plus élevée vous donnera une résolution plus élevée à une fréquence plus basse.
Pour une explication plus longue, lisez cet article ou reportez-vous à la fiche technique .
La modification du prédéfinisseur, du mode PWM ou de la valeur TOP pour timer0 gâchera avec millis()
et micros()
.