Fréquence PWM Arduino Nano

Jutilise un Arduino Nano comme contrôleur PWM pour un élément chauffant.

Jutilise actuellement D11 (PB3). Je pourrais changer, bien que toutes les broches avec PWM soient utilisées, et nécessiterait une réécriture et un recâblage.

Cela produit un signal à ~ 490Hz, mais jaimerais essayer de changer cela en une fréquence plus élevée.

Je pense quil est possible de faire varier la fréquence en changeant le diviseur de sa valeur par défaut 64.

Mon croquis utilise Utilise http://playground.arduino.cc/Main/SevenSegmentLibrary et appelle millis () – la modification du diviseur PWM aura-t-elle un impact sur lun ou lautre de ces éléments?

NOTE Jai lu la documentation setPwmFrequency, mais je trouve que « perturbe le fonctionnement normal » inutile – je suis en fait après quelques explications sur leffet concret. Jutilise uniquement millis() pour chronométrer les pressions sur les boutons et faire clignoter une LED, ce qui nest pas critique pour le temps

Veuillez garder à lesprit que changer la fréquence PWM change le Atmega « s » temporise et perturbe le fonctionnement normal de nombreuses fonctions qui reposent sur le temps (delay (), millis (), bibliothèque Servo).

Jai fait une étude plus approfondie. http://playground.arduino.cc/Code/PwmFrequency indique Les changements sur les broches 3, 5, 6 ou 11 peuvent entraîner le retard () et les millis ( ) pour arrêter de fonctionner.

Dautres références indiquent que 3, 11 utilisent timer 2 donc font ils affectent millis() ou non car dautres références prétendent que timer 0 est utilisé pour ces derniers.

Commentaires

  • Oui et non, selon le minuteur pwm utilisé.

Réponse

Je ne sais pas doù vient cette désinformation … La réponse est non , la reconfiguration du minuteur 2 ne pas affectent millis() ni delay(), car ces fonctions reposent sur le Timer 0. AFAIK le noyau Arduino nutilise pas du tout le Timer 2. Mais notez quil peut y avoir dautres bibliothèques Arduino ou tierces qui reposent sur Timer 2.

Vous pouvez voir ici le code source de millis() et delay() .

Comme MITU RAJ lindique correctement dans sa réponse, le signal PWM sur la broche 11 est fourni par Minuterie 2, pour que vous puissiez lutiliser en toute sécurité.

Commentaires

  • La désinformation vient du terrain de jeu de .arduino.cc / Code / PwmFrequency . Je suis sûr que je ne suis pas le seul utilisateur à avoir été induit en erreur. Lautre réponse vient de publier un extrait de la documentation trompeuse.

Réponse

La réponse est NON , la modification du diviseur PWM pour la broche 11 naffectera pas la fonction millis() (ni delay()).


Explication:
L Arduino Nano utilise le microcontrôleur ATMega328P, identique à l Arduino Uno .

Le PWM de la broche 11 « est contrôlé par la minuterie 2. Par défaut, la minuterie 2 a une pré-échelle de 64 (cest-à-dire le réglage 0x04). 31372.55 / 64 = 490.1961).

Dautre part, la minuterie de microseconde (cest-à-dire celle utilisée par millis(), micros(), delay() et delayMicroseconds()) est contrôlé par la minuterie 0.

Donc changer le prédécaleur du Timer 2 naffectera pas millis().

Cela changera cependant la fréquence PWM de la broche 3.


Retour à votre question:
Les fréquences PWM possibles de la broche 11 (supérieures à 488 Hz) sont:

31373/32 = 980,4 Hz
31373/8 = 3921,6 Hz
31373/1 = 31373 Hz

Où 32, 8, 1 sont le prédécaleur.
Ce qui équivaut à une valeur de réglage de 0x03, 0x02 & 0x01 respectivement.

Ajoutez cette ligne de code:

TCCR2B = TCCR2B & 0b11111000 | setting; 

setting est la valeur du paramètre pour le prédécaleur respectif.

============================================ || Frequency [Hz] || Prescaler || Setting || ============================================ || 31373.55 || 1 || 0x01 || || 3921.57 || 8 || 0x02 || || 980.39 || 32 || 0x03 || || 490.20 || 64 || 0x04 || || 245.10 || 128 || 0x05 || || 122.55 || 256 || 0x06 || || 30.64 || 1024 || 0x07 || ============================================ 

Code source : https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c

Commentaires

  • Juste pinailler mais … la fréquence de base de la minuterie ‘ en mode PWM correct de phase est F_CPU / 510 (31373 Hz), pas F_CPU / 512: il faut 255 cycles pour compter F rom 0 à 255, puis 255 de plus pour revenir à zéro. C.f. léquation de la fréquence PWM dans la fiche technique.
  • @EdgarBonet Bon point. La réponse a maintenant été corrigée.
  • serait-il possible de descendre un cran plus lentement à 15,31 HZ?

Réponse

Dépend de la broche que vous avez utilisée pour le PWM.

Les spécifications Arduino UNO / NANO indiquent les choses suivantes:

La fréquence de base des broches 3, 9, 10 et 11 est de 31250 Hz.

La fréquence de base des broches 5 et 6 est de 62500 Hz.

Les diviseurs disponibles sur les broches 5, 6, 9 et 10 sont: 1, 8, 64, 256 et 1024.

Les diviseurs disponibles sur les broches 3 et 11 sont: 1, 8, 32, 64, 128, 256 , et 1024.

Les fréquences PWM sont liées entre elles par paires de broches. Si lune des paires est modifiée, lautre est également modifiée pour correspondre.

Les broches 5 et 6 sont associées sur timer0.

Les broches 9 et 10 sont associées sur timer1.

Les broches 3 et 11 sont appariées sur timer2.

Les changements sur les broches 3, 5, 6 ou 11 peuvent provoquer un retard () et millis () pour arrêter de fonctionner. Dautres fonctions liées au timing peuvent également être affectées.

Commentaires

  • Puisque vous ‘ citant les spécifications, ‘ seriez-vous gentil si vous pouviez également créer un lien vers elles? 🙂

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *