fréquence max sur sorties arduino?

Bonjour, je voudrais une info toute simple, je n'ai trouvé aucune info a ce sujet.
Quelle est la fréquence max pouvant être générée sur les pins 0 à 13?
Je sais que la frequ. PWM est d'environ 490Hz, mais peut-on monter plus haut?
Merci

Oui, tu peux monter beaucoup plus haut.

Je ne sais pas si ça fait partie de l'API Arduino, mais les timers 16 bits des ATmega ont un mode Fast PWM.
Tout dépendra du modèle que tu as.

Par exemple avec l'ATmega1280 l'utilisation du mode Fast PWM est décrite dans le manuel à la page 161.

Ci-dessous un exemple qui utilise le Timer/Counter2 de l'ATmega1280.

Il y a deux étapes : d'abord il faut configurer le timer.

// EXCLK = 0 and AS2 = 0 : clock the timer from the I/O clock (p.165)
ASSR &= ~(_BV(EXCLK) | _BV(AS2)); 
// WGM20 = 1 and WGM21 = 1 : set Fast PWM mode (p.161)
TCCR2A |= _BV(WGM21) | _BV(WGM20); 
// WGM22 = 0 : set Fast PWM mode (p.161)
TCCR2B &= ~_BV(WGM22);
// COM2A1 = 1 and COM2A0 = 0 : at compare match, OC2A = 1 when the next cycle begins (p.159)
TCCR2A = (TCCR2A | _BV(COM2A1)) & ~_BV(COM2A0); 
// COM2B1 = 0 and COM2B0 = 0 : OC2B disconnected (p.160)
TCCR2A &= ~(_BV(COM2B1) | _BV(COM2B0)); 
// CS20 = 1, CS21 = 0 and CS22 = 0 : clock select no prescaling (p.163)
TCCR2B = (TCCR2B & ~(_BV(CS22) | _BV(CS21))) | _BV(CS20);

Ensuite il suffit de modifier la valeur du registre nommé OCR2A pour changer le niveau de la PWM.
C'est très simple, il suffit de charger dedans la valeur que tu veux, comprise entre 0 et 255, pour faire varier le rapport cyclique entre 0 et 1.

Avec le code ci-dessus, la PWM est à 16MHz/256 soit 62.5kHz

Par exemple pour avoir ta sortie PWM à 0V :

OCR2A = 0;

Pour avoir ta sortie PWM à 5V :

OCR2A = 255;

Pour avoir ta sortie PWM à 2.5V :

OCR2A = 127;

En espérant que ça te soit utile :slight_smile:

En espérant que ça te soit utile

Oui! merci :slight_smile:
Enfin mon but n'est pas d'utiliser le PWM mais un signal "normal", je pourrais donc théoriquement monter à 16 Mhz avec mon arduino UNO?
(je suppose que tu divise par 256 pour la PWM).

Si la question est de savoir à quelle fréquence on peut commuter une sortie sur un arduino Uno, je pense que tu peux atteindre des fréquences de commutation de quelques MHz.

Par contre, hors de question d'utiliser digitalWrite, c'est beaucoup trop lent. Il faut manipuler le port directement.

Par exemple la pin désignée par le numéro 13 dans Arduino est la pin 7 du port B.

Pour l'initialiser, la commande Arduino habituelle :

pinMode(13, OUTPUT);

Ensuite, pour la faire changer d'état il suffit de faire un XOR, qui va la passer à l'état haut si elle est à l'état bas, et réciproquement.

PORTB ^= _BV(PINB7);

Cette opération ne prend pas toujours un seul cycle d'horloge, mais elle est quand même beaucoup plus rapide que de faire le classique

digitalWrite(13, LOW);
digitalWrite(13, HIGH);

Bonjour,

La fréquence maximale d'éxecution est de 16MHz (si bien sûr les fusibles ne sont pas programmés pour diviser la fréquence de l'horloge externe par 8 ).
Si tu veux aller vite, regarde la datasheet de l'ATMega correspondant.
Dans les dernières pages, tu as la liste des instructions en asm (RISC) supportées. Et avec elles, le nombre de cycles d'horloge (16MHz ou 2MHz comme cité plus haut) qu'elles utilisent pour leur exécution.
Ainsi, en incluant ces instructions en assembleur, tu es sur de savoir exactement ce que ton microContrôleur va faire, et donc le nombre de cycles d'horloges qu'il va consommer.

Pour inclure de l'asm dans un programme en C :

asm(" instruction en assembleur ");

Si tu as plusieurs instructions :

asm("instruction 1 \n"
       "instruction 2 \n");

Toutes les infos ici : Inline Assembler Cookbook

En espérant t'avoir renseigné,

Bonne journée.


Stéphane.