Comment pousser Arduino à la fréquence maximum

Bonjour à tous , j'aimerai faire clignoter une LED à la fréquence maximum possible 16 MHz seulement après avoir mis tous les préscal des différentes horloge à zéro j'obtient une fréquence de 200kHz. Si quelqu'un peut m'expliquer pourquoi , j'ai pourtant utiliser directement les interruptions pour allumer ma diode donc .... je sais pas ? Merci d'avance:) voici mon code

// ARDUINO UNO - IT Timer 2

// Mode Clear Timer On Compare



// Fonction de traitement IT n°10 = Timer 2 OverFlow

ISR(TIMER2_COMPA_vect){




PORTB ^=(1<<PORTB5); 


}

void setup(){ 

// Configuration Timer 2 
cli();

CLKPR = _BV(CLKPCE);
 CLKPR = 0;

TCCR2A=B010; // Mode CTC (Clear Timer On Compare)

OCR2A=1; // Registre de comparaison A = 156

TCCR2B=B1; // Prescaler =1

TIMSK2=B010; // IT Timer2 Quand TCNT2=OCR2A

//Configuration PORTB.5

DDRB |= B100000; // PB5 en sortie 

PORTB &= ~(1<<PORTB5); // PORTB.5 <-0

sei(); // activation des IT (SREG.7=1)

}

void loop() { }

Et les balises code ?

http://forum.arduino.cc/index.php?topic=315372.0

Edite ton message et corrige ça....

A part ça 16MHz c'est la fréquence d'horloge du Mcu.... et ça ne correspond pas à la fréquence d'une itération.

Avoir une série d'itérations à cette fréquence est impossible dans ce cas là.

Le problème également est que 1 ligne de code == un cycle :

PORTB ^=(1<<PORTB5);

Il y a un shifting x 5 (facultatif il me semble, tout dépend la config du compilo), une lecture, une écriture, l'interruption et une opération logique. Et le tout x 2 puisque qu'il y a les deux fronts.

Une solution pour être plus rapide consiste à lier le comparateur à la sortie (du PWM à 50% quoi).

"En limitant au strict minimum les opérations de sauvegarde et de récupération du contexte, il est possible de limiter le temps de traitement d'une interruption (hors routine) à 18 cycles, ce qui représente encore 0,8889 µs."

"En l'occurrence, on peut programmer un timer afin de piloter directement une sortie du microcontrôleur (OCnA ou OCnB avec n le numéro du timer). C'est de cette manière qu'Arduino génère les signaux PWM à basse fréquence."

Interessant, merci beaucoup
mais je suis au lycée et j'avoue que comprendre la datasheet du ATmega 328p en ANGLAIS m'est assez difficile ^^" si vous pouriez juste me donner les grandes lignes pour programmer un timer afin de piloter directement une sortie du microcontrôleur ou comment limiter le temps de traitement à 18 cycles?

Je vais peut-être passer pour quelqu'un d'assez terre-à-terre, mais pourquoi veux-tu faire clignoter une led à 16MHz ? Sachant qu'au delà de 25Hz, le clignotement sera invisible à l’œil.

En réalité je travaille sur un projet sur la limite de communication de données par laser. Or la vitesse de transmission dépend de la fréquence et j'aimerai tester la limite de la carte arduino dans ce contexte. D'où ma volonté d'atteindre des fréquence élevés pour faire clignoter une led dans un premier temps ensuite apprendre à moduler une diode laser à une fréquence maximum sur la carte arduino et étudier débit maximum de données que je peux envoyé. Le laser pointera ensuite vers une photo-diode pour réinterprétera l'information.Si quelqu’un peut m'aider :slight_smile: ....

mais je suis au lycée et j'avoue que comprendre la datasheet du ATmega 328p en ANGLAIS m'est assez difficile

mais tu es doué, vu le jeu de mots :slight_smile:

Pourquoi ne pas utliser un multiplicateur de frequence?

Un doubleur de fréquence n'est pas compliqué à faire si la fréquence du signal d'origine est constante

avec porte NAND et porte AND

Parce que la programmation me plait ^^ Merci beaucoup ,du coup si j'ai bien compris

_BV(WGM21) | _BV(WGM20)et _BV(WGM22)

permet le fast PWM mais vous pourriez expliciter un peu ces bits:

_BV(COM2A1) | _BV(COM2B1)

? De ce que j'ai compris , je crois que celà permet de comparer TCNT2 à OCR2B et dès qu'ils sont égaux TCNT2 se remet à 0 et ensuite ....... c'est la que je bloque dans le datasheet il y a écrit celà "Clear OC2B on Compare Match, set OC2B at BOTTOM,(non-inverting mode)." ? et tu met

OCR2A=1

pour que TCNT2 ne l’atteigne jamais c'est ça?

Génial j'ai compris merci j'en profite encor du coup ^^ pourquoi quand je met

OCR2B=1

et

OCR2A=2

j'obtient une fréquence de 5.3MHz logiquement ça devrait être 8/2=4 Mhz car je fait compter TCNT2 un seul fois de plus?

Un dernier soucis, avec ce code ,d'après

void setup()
{
  pinMode(11, OUTPUT);

  TCCR2A =  _BV(COM2A1)| _BV(WGM21) | _BV(WGM20);
  TCCR2B = _BV(WGM22) | _BV(CS20);
  OCR2A = 1;
  
}
void loop()
{

}

ce qu'on vient de dire je devrais pouvoir avoir 8MHz sur la pin 11 de l'arduino mais j'ai 0Hz? Car d'après la datasheet _BV(COM2A1) devrait faire varier l'état de la pin 11 lorsque TCNT2=0 et TNCT=OCR2A mais pas l'ombre d'une fréquence.De plus ce code fonctionne très bien adapté la pin 3 avec 8 MHz:

void setup()
{
  pinMode(3, OUTPUT);

  TCCR2A =  _BV(COM2B1)| _BV(WGM21) | _BV(WGM20);
  TCCR2B = _BV(WGM22) | _BV(CS20);
  OCR2A = 1;
   
  
}
void loop()
{

}

Dans ce cas tu pourrais me montrer le code pour faire du 8 MHz sur la pin 11 histoire de mieux comprendre STP? :slight_smile: car je comprend pas d'après ce que tu m'as dis le compteur ne fait que compter pour la pin 3 également,
pourtant elle est à 8MHz non?

Le timer 2 de l'AVR peut avoir 2 canaux pwm, avec des rapports cycliques différents le cas échéant.
Mais il n'y a qu'un seul timer, donc une seule fréquence.

En mode CTC, aux vitesses qui t'intéressent, le timer devient un simple générateur de signal carré, dont OCR2A détermine la fréquence.
La sortie B (COM2B1:0=1) peut alors produire le même signal que la sortie A, ou son inverse.

Note que tu peux obtenir 10MHz (...) en changeant quartz.

Merci beaucoup grâce à vous j'ai compris ^^ en fin de compte j'aimerai convertir par exemple mettons une variable A sur un octet en signal numérique soit A="01010111" et envoyer celà en sortie avec l'état 1 pour "1" et l'état 0 pour "0" mais je sais pas trop comment faire pour conserver une fréquence maximum étant donné que les instrution "if" "else" prennent du temps donc diminueront ma fréquence? Ai-je vraiment pas le choix que d'utiliser "if" et "else"?

En réalité je travaille sur un projet sur la limite de communication de données par laser.

Actuellement on a réalisé des transmissions numériques sur fibre optique à 160 gigahertz de fréquence horloge :grin: .
Industriellement on réalise du 40 gigahertz et du 10 gigahertz toujours de fréquence horloge.

Attention à ne pas mélanger fréquence horloge et fréquence des données.
Si le micro avec le timer en mode CTC ne peut pas générer plus de 8MHz c'est parce qu'avec une électronique synchrone on ne peut pas générer de signaux avec une fréquence supérieure à la moitiée de celle de l'horloge.
Voir le fonctionnement d'une bascule D pour comprendre pourquoi et/ou le théorème de Shannon.

Autre point tu veux envoyer une suite d'octets le plus rapidement possible mais as-tu défini un protocole ?
Un protocole aide à "retrouver ses petits" en réception. Mais pour ce faire il introduit des informations suplémentaires donc le débit utile, celui des données à transmettre, est inférieur au débit réel.
L'exemple le plus simple est le protocole de l'UART avec ses bits de start, stop, parité, etc.
En transmission en France on parle de "débit en ligne" et de "charge utile", aux US ils parlent aussi de débit en ligne mais au lieu de charge utile ils utilisent "payload". Nous pensons fonctionnement, les américains pensent manque à gagner. :astonished:

Le protocole peut induire un codage en ligne. Je ne vais parler que des deux faciles à générer avec la PWM : le mode NRZ (Non Retour à Zéro) et le mode RZ (Retour à Zéro).
La bande passante du canal de transmission (émetteur, conduit, récepteur) en mode RZ est le double de celle du mode NRZ. Par contre s'il faut récupérer une horloge à partir du flux de données c'est plus simple en mode RZ.

En mode NRZ le canal de transmission doit avoir une bande passante minimale de 0,8 fois la fréquence horloge. Cela correspond à la fréquence du théorème de Shannon plus une marge de sécurité pour assurer une linéarité de la phase.

Quel est ton besoin ?

  1. Tirer le maximum d'une carte arduino et puis c'est tout

  2. Réaliser une liaison la plus rapide.

Si c'est cette deuxième proposition je pense que les bonnes questions que tu devrais te poser sont :

  • De quel débit j'ai réellement besoin ?
  • qu'est ce qu'il me faut faire pour être en mesure de retrouver l'information dans le flot de données reçues.
    En particulier quel protocole je vais utiliser à l'émission et quel traitement je vais devoir faire à la réception ?

En fonction des différentes réponses tu devrais être en mesure de déterminer quelle devra être la fréquence d'horloge du micro-processeur.

Edit :
Les trois timers peuvent faire du CTC ou du PWM
T2 est 8 bits
T1 est 16 bits --> pas utile pour aller vite
T0 est 8 bits --> il est utilisé par les fonctions arduino de gestion du"temps" : delay, millis,etc
A mon avis T2 est à utiliser en priorité, T0 peut l'être si tu n'a pas besoin des fonctions arduino gérant le temps.

Mon but est simplement (même si c'est surement pas simple x) d'étudier les communications optiques en espace libre et en particulier le laser. Mettre en évidence les limites théorique et pratique de cette transmission, réaliser un montage expérimentale avec les moyen du bord c'est à dire ma carte Arduino et observer les différences et les erreur selon le débit , la fréquence etc... . Maintenant que j'ai un peu près compris comment générer la fréquence que je veux en sortie il me faut comme tu dis que je "retrouve mes petits" en réception, soit établir un protocole mais je sais pas où chercher Mon idée de base était de décomposer l'information en bits , d'envoyer une impulsion laser si le bit est 1 rien si le bit est 0 puis "retrouver mes petits" avec une photo diode qui recevra ces impulsions les retraduira en bit puis en octet... jusqu'à retrouver l'info envoyer, le tout à base de"if" "else" Mais je suppose qu'il y mieux comme protocole si j'ai bien compris ce que tu entendais par protocole ^^ .D'où ma question, si vous avez une idée? Si t'as de la doc ou des explication sur le mode RZ/NRZ et comment l'appliquer sur ma carte Arduino je suis preneur ^^

P.S. j'ai trouver ça dans la datasheet du ATmega328 " SPI – Serial Peripheral Interface" c'est vers là que mes recherche doivent se tourner?

Mettre en évidence les limites théorique et pratique de cette transmission../... ../.. optique en espace libre

Pose les pieds sur terre les labos de recherche sont arrivés à plusieurs centaines de gigahertz avec des budgets collossaux. Tu ne vas pas être plus fort qu'eux !
La NASA et l'armée de terre US ont réussi à partir de la Terre à "toucher" un satellite avec un rayon Laser : question distance tu vas avoir du mal à faire mieux.

Le domaine des transmissions numériques est hyper complexe dès que tu sort des techniques de base.
Le fait que le moyen soit optique est totalement secondaire.

Le plus simple est de te renseigner sur la norme RS232/ UART. Tu peux aussi faire des recherches sur le forum Bardudor a écrit un document très intéressant (voir dans Cours et Tutauriaux).
J'espère que tu as remarqué que dans les micro-contrôleur la gestion de l'UART n'est pas logicielle mais matérielle et ce n'est pas par hasard : c'est parce que l'électronique est bien plus puissante et bien plus rapide que la programmation, il en est de même pour l'I2C et le SPI. Cerise sur le gâteau l'électronique est autonome, ses seuls rapports avec le logiciel sont pour les réglages/configuration et l'échange des données.

Tu peut arriver à comprendre et à optimiser avec une carte arduino et son micro avr à condition d'oublier totalement ton projet de tester les limites.
Conseil : Reste dans les bas débits tant que tu ne maîtrise pas la technique (matérielle et logicielle), il n'y a pas de honte à travailler à 1 kHz.
Débuter en liaison filaire avant de passer en optique serait aussi une sage décision. L'optique ce n'est pas magique, c'est juste des complications supplémentaires.

NRZ /RZ
Une recherche dans wikipédia te permettra de voir de beaux graphiques qui seront bien plus parlants qu'un (trop) long discours.
Ce qu'il faut retenir c'est qu'un micro-contrôleur est constitué en électronique synchrone c'est à dire qu'il faut une horloge en plus des données.
Dans les micro-contrôleurs y a plusieurs mode de communication pré-conçus : l'UART et L'I2C/SPI

  • L'I2C et le SPI sont synchrones : le maître fourni une horloge aux esclaves. Le traitement des données est simplifié.
  • L'UART est "faussement" asynchrone dans le sens où seules les données sont transmises mais pour que cela puisse fonctionner l'électronique de l'UART possède des circuits qui permettent de resynchroniser les données reçues sur l'horloge système du récepteur.

LASER.
Contrairement à ce que croient beaucoup de personnes un faisceau Laser est divergeant : c'est un cône, c'est pour cela qu'on utilise massivement la fibre optique qui permet de le confiner. Le faisceau étant conique la puissance par unité de surface diminue avec l'éloignement. Or la surface de réception (la photo-diode) est fixe donc le courant généré par la photo-diode va vite décroître avec la distance.

Longueur d'onde (DEL ou Laser) :
L'atténuation de la lumière est due principalement aux ion OH- (dans le verre de la fibre comme dans l'air ambiant)
Il existe des fenêtres de moindre absorption. Des composants existent pour trois d'entre elles :
la moins efficace : 0,9µm
puis 1,3µm et 1,55 µm (ces deux longueurs d'onde sont difficiles à trouver en non professionnel)

Attention:
En émission avec une del il n'y a pas de danger mais pour le Laser un rappel de la mise en garde habituelle s'impose :
un laser c'est hyper dangereux pour les yeux que la lumière soit visible ou non, concernant les tiens si tu veux prendre le risque de devenir aveugle c'est ton problème .
Mais tu n'as pas le droit de faire courir des risques à ton entourage.

"La NASA et l'armée de terre US ont réussi à partir de la Terre à "toucher" un satellite avec un rayon Laser : question distance tu vas avoir du mal à faire mieux." Oui bein oui je comptais faire mieux que la NASA --" mes pieds sont sur terre quand je disait : "Mettre en évidence les limites théorique et pratique de cette transmission. " je parlais de la transmission laser en général pas de mon vulgaire montage^^ autant pour moi si je me suis mal exprimé et merci pour ton explication

Question de novice :
Comment pourrait-on tester la limite d'une liaison qui peut aller très très vite (lumière) avec un contrôleur (Arduino) qui est beaucoup moins rapide ?

Il y a la porteuse et la fréquence de modulation.
En radio les ondes électromagnétiques se propagent à la vitesse de la lumière (normal la lumière est une onde électromagnétique parmi d'autres). La transmission de la parole (quelques kHz) sur porteuse GO, PO, OC () fonctionne sans problème.
(
) Pour les jeunes qui découvrent qu'il a existé autre chose que la FM : grandes ondes, petites ondes et ondes courtes.

Il y a deux notions :

  • la vitesse de propagation de la porteuse.
  • la vitesse de propagation des données, on parle aussi de "vitesse de propagation de groupe" ou en abrégé "vitesse de groupe". Cette dernière est beaucoup plus petite.