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 suis particulièrement intéressé par le Mega 2560, mais je veux aussi savoir sil est cohérent entre les modèles.
Jai vu des références passagères à lArduino utilisant 500 Hz, ce qui semble vraiment lent.
Commentaires
- Cela dépend également de la broche que vous utilisez.
Réponse
Le signal PWM est généré par des minuteries sur les puces AVR. Chaque minuterie peut générer un signal PWM sur deux ou trois broches différentes. Chaque broche peut avoir son propre cycle de service, mais ils partagent la fréquence PWM. Vous pouvez changer la fréquence du PWM en changeant la source dhorloge des minuteries. Par défaut, ils utilisent lhorloge du processeur divisée par 64, cest-à-dire. ils ont leur prescaler réglé sur 64 par le code dinitialisation Arduino. Pour compliquer davantage les choses, il existe deux modes PWM différents: PWM rapide et PWM à phase correcte. En PWM rapide, la minuterie compte jusquà 255, puis déborde et recommence à partir de 0 (256 états différents). En phase correcte PWM, la minuterie compte jusquà 255, puis change de direction et compte à rebours jusquà zéro, change de direction et ainsi de suite (510 états différents).
LArduino Mega a 5 minuteries, timer0 – timer4. Comme 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 de phase correcte. Il en résulte des fréquences différentes sur différentes broches:
-
Les broches 4 et 13, contrôlées par timer0:
16 Mhz / 64/256 = 976,56 Hz -
Autres broches PWM, contrôlées par timer1-4:
16 Mhz / 64/510 = 490,20 Hz
Le calcul est: Horloge / Nombre détats du mode Prescaler / PWM
La situation est la même pour toutes les autres cartes Arduino que je connais, sauf quelles ont moins de minuteries qui se connectent à différentes broches.
Vous pouvez changer le Fréquence PWM en changeant le prescaler de la minuterie Voir cette page: http://playground.arduino.cc/Main/TimerPWMCheatsheet
Il est également possible de faire compter les minuteries jusquà un valeur différente de 255. Sur les minuteries 8 bits, vous perdrez une broche de sortie, mais sur les minuteries 16 bits, vous pouvez utiliser le registre de capture dentrée pour définir une valeur TOP. La fonctionnalité de capture dentré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 dutiliser une résolution de 8 bits, même sur les minuteries 16 bits. Si vous voulez la résolution la plus élevée, vous devrez écrire votre propre analogWrite, ou utiliser une bibliothèque faite à cet effet. Sur lArduino 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 prescaler 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 clock / 4, en réglant le prescaler sur 1 et TOP sur 3 en mode PWM rapide – une valeur inférieure nest pas autorisée. Cela vous donnera un PWM de 4 MHz avec une résolution de 2 bits. Cela peut être à 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 à l fiche technique .
La modification du prédécaleur, du mode PWM ou de la valeur TOP pour timer0 va déranger millis()
et micros()
.
Commentaires
- Je suppose donc que la fréquence la plus rapide que vous puissiez obtenir pour PWM est 16Mhz / 256 (prescaler = 1), ou 62.5Khz?
- Et en outre que la fréquence PWM doit être un facteur pair de 62,5KHz? Quelquun sur un autre thread voulait contrôler la vitesse du ventilateur dun ventilateur PC à 4 broches. Apparemment, il veut un signal de contrôle PWM de 25 KHz. 62,5 / 25 est 2,5, ce qui nest pas une valeur entière.
- Jai mis à jour la réponse pour élaborer plus sur les possibilités dobtenir des fréquences spécifiques,
- Sur lextrémité basse fréquence, vous pourriez mettre à léchelle une minuterie 16 bits en mode de correction de phase par un prédécaleur 1024 pour obtenir 16e6 / 1024/2 ^ 16/2 = 0,119 Hz, soit 7,1 cycles / minute. Pour plus bas, il faudrait basculer les bits en fonction de quelque chose comme millis (). Ou peut-être déclencher le compteur sur la broche dentrée externe T?.