Quelle est la fréquence de sortie PWM sur Arduino

22

Quelle fréquence les Arduinos utilisent-ils pour le PWM normal lorsque vous utilisez analogWrite ()?

Et est-ce différent pour différents modèles Arduino? Je m'intéresse spécifiquement au Mega 2560, mais je veux également savoir s'il est cohérent entre les modèles.

J'ai vu passer des références à l'Arduino en utilisant 500 Hz, ce qui semble vraiment lent.

Duncan C
la source
Cela dépend également de la broche que vous utilisez.
Gerben

Réponses:

31

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().

user2973
la source
1
Je suppose donc que la fréquence la plus rapide que vous pourriez obtenir pour PWM est 16Mhz / 256 (prescaler = 1), ou 62,5Khz?
Duncan C
Et en outre que la fréquence PWM doit être un facteur pair de 62,5 KHz? Quelqu'un sur un autre thread voulait contrôler la vitesse du ventilateur d'un ventilateur PC à 4 broches. Apparemment, il veut un signal de contrôle PWM de 25KHz. 62,5 / 25 est 2,5, ce qui n'est pas une valeur entière.
Duncan C
J'ai mis à jour la réponse pour élaborer davantage sur les possibilités d'atteindre des fréquences spécifiques,
user2973
Du côté des basses fréquences, vous pouvez pré-mettre à l'échelle une minuterie 16 bits en mode à phase correcte par un pré-échelle 1024 pour obtenir 16e6 / 1024/2 ^ 16/2 = 0,119 Hz, ou 7,1 cycles / minute. Pour plus bas que cela, il faudrait basculer les bits en fonction de quelque chose comme millis (). Ou peut-être déclencher le compteur sur la broche d'entrée externe T?.
Dave X