Pourquoi certaines broches ont-elles une fréquence PWM différente?

20

Selon la référence Arduino pouranalogWrite() , la fréquence PWM sur la plupart des broches est ~ 490 Hz. Cependant, c'est ~ 980 Hz pour les broches 5 et 6 sur l'Uno, et pour les broches 3 et 11 sur le Leonardo.

Pourquoi sont-ils différents? Est-ce une caractéristique délibérée de la conception ou est-elle en quelque sorte dictée par le matériel?

Peter Bloomfield
la source

Réponses:

23

Ce ne sont pas les seules fréquences disponibles pour les signaux PWM. Cependant, ce sont les fréquences déterminées par le prédéfinisseur appliqué (que vous pouvez facilement modifier comme détaillé ci-dessous).

Chacune des 3 paires de broches PWM est liée à une minuterie, chacune ayant sa propre fréquence de base, comme suit:

  • Les broches 5 et 6 sont appariées sur timer0, avec une fréquence de base de 62500Hz
  • Les broches 9 et 10 sont appariées sur la minuterie 1, avec une fréquence de base de 31250 Hz
  • Les broches 3 et 11 sont appariées sur la minuterie 2, avec une fréquence de base de 31250 Hz

Ensuite, chaque jeu de broches a un certain nombre de valeurs de pré-échelle qui peuvent être choisies, qui diviseront la fréquence de base de cette paire de broches. Les valeurs de mise à l'échelle disponibles sont:

  • Les broches 5 et 6 ont des valeurs de mise à l'échelle de 1, 8, 64, 256 et 1024
  • Les broches 9 et 10 ont des valeurs de mise à l'échelle de 1, 8, 64, 256 et 1024
  • Les broches 3 et 11 ont des valeurs de pré-échelle de 1, 8, 32, 64, 128, 256 et 1024

Les différentes combinaisons produisent des fréquences différentes dans une broche PWM donnée. Notez que le temporisateur 2 (lié aux broches 3 et 11) a plus de valeurs de pré-échelle disponibles, résultant en plus de fréquences disponibles.

Maintenant, pourquoi la minuterie 2 est différente, c'est une question distincte.

Edit: Voici une liste des fréquences PWM possibles par broche (à partir de cet article ):

Pour les broches 6 et 5 (OC0A et OC0B):

  • Si TCCR0B = xxxxx001, la fréquence est de 64 kHz
  • Si TCCR0B = xxxxx010, la fréquence est de 8 kHz
  • Si TCCR0B = xxxxx011, la fréquence est de 1 kHz (c'est la valeur par défaut du chargeur de démarrage Diecimila)
  • Si TCCR0B = xxxxx100, la fréquence est de 250 Hz
  • Si TCCR0B = xxxxx101, la fréquence est de 62,5 Hz

Pour les broches 9, 10, 11 et 3 (OC1A, OC1B, OC2A, OC2B):

  • Si TCCRnB = xxxxx001, la fréquence est de 32 kHz
  • Si TCCRnB = xxxxx010, la fréquence est de 4 kHz
  • Si TCCRnB = xxxxx011, la fréquence est de 500 Hz (c'est la valeur par défaut du chargeur de démarrage Diecimila)
  • Si TCCRnB = xxxxx100, la fréquence est de 125 Hz
  • Si TCCRnB = xxxxx101, la fréquence est de 31,25 Hz

TCCRnBest l'endroit où vous définissez les bits de mise à l'échelle pour la minuterie n, en les remplaçant npar 0, 1 ou 2, selon la minuterie que vous souhaitez définir. Si vous n'êtes toujours pas sûr des opérations au niveau du bit, lisez ce didacticiel de mathématiques sur les bits .

Mes sources:

Notez qu'il semble y avoir une divergence dans ces sources quant à savoir si les broches 9 et 10 ont le même comportement que 5 et 6 ou 3 et 11, mais vous avez quand même l'idée. Je lis le datashet pour essayer de déterminer ce qui est correct, ou s'il s'agit d'une différence entre les cartes.

Ricardo
la source
1
À quel ATmega cette réponse fait-elle référence? Je n'ai pas vérifié, mais je parie que cela diffère légèrement par contrôleur.
jippie
@jippie Bon point! Les sources se réfèrent à ATmega168 et 328.
Ricardo
@jippie Juste pour clarifier, dans ma réponse, les numéros de broches se réfèrent à la façon dont ils sont assignés sur la carte Uno (la broche 1 signifie la broche numérique 1 ou D1, par exemple), pas l'IC (la broche 1 de l'ATmega328 est réinitialisée).
Ricardo
1
Je crois que ces détails changent aussi avec les planches, Uno, Duemilanove, Mega, ...
jippie
@jippie Certainement, oui.
Ricardo
8

Je ne suis pas au courant des considérations de conception, mais si vous consultez la fiche technique du microcontrôleur sur votre Arduino, vous remarquerez que les broches PWM sont regroupées et par groupe connectées à une minuterie. La vitesse à laquelle cette minuterie est augmentée varie en fonction du prédimensionneur configuré. Si vous modifiez le prédéfinisseur pour une certaine minuterie, vous modifiez la fréquence PWM pour les broches PWM associées. Je crois que certains minuteries doublent à d'autres fins comme la millis();fonction. Si vous modifiez le prédimensionneur pour ce minuteur, les valeurs renvoyées par millis()seront désactivées du même facteur.

Vous pouvez calculer le paramètre du détartreur comme suit:

$$ \ text {prescaler} = \ dfrac {f_ {CPU}} {PWMresolution × f_ {PWM}} = \ dfrac {16 \ text {MHz}} {256 × 490} \ environ 128 $$

prescaler = f [CPU] / (PWMresolution × f [PWM]) = 16000000 / (256 × 490) = environ 128.

Vérifiez la fiche technique et vous constaterez que 128 est en effet l'une des valeurs de pré-échelle que vous pouvez sélectionner.

jippie
la source
2
Garçon, nous manque MathJax ou quoi? J'espère que nous l'activerons après la bêta.
Ricardo
1
@Ricardo J'ai un bouton MathJax dans mon navigateur; o) meta.arduino.stackexchange.com/questions/13/…
jippie