Arduino Timer : jouez avec le timing dans vos projets

Minuteur Arduino UNO

Il y a quelque temps, nous avons publié plus d'informations sur le fonction millis() de ArduinoNous allons maintenant approfondir la Minuterie Arduino, pour commencer avec cette fonctionnalité pour la fonctionnalité, comprenez comment cette carte gère le temps avec le MCU, ainsi que d'autres fonctions au-delà de millis().

Qu'est-ce que la minuterie Arduino ?

minuterie arduino

El Minuterie Arduino, ou minuterie, est une fonction implémentée par le matériel (dans le microcontrôleur, à l'aide du cristal de quartz qui génère les impulsions d'horloge et qui définit le "rythme", sans avoir besoin de matériel externe ou de CI 555) qui permet de contrôler des événements temporaires grâce à des horloges interne. Par exemple, faire en sorte qu'une tâche se produise à intervalles réguliers, effectuer des mesures de temps précises, etc., indépendamment du code d'esquisse.

Comme Arduino UNO Il a une puce MCU qui fonctionne à 16 Mhz, 16.000.000 16 XNUMX peuvent être exécutés chaque seconde. Les instructions ont besoin de X cycles pour s'exécuter, elles ne sont pas toutes exécutées dans les mêmes cycles d'horloge, par exemple, les XNUMX bits ont besoin de plus de cycles dans cette architecture AVR.

Imaginez que vous utilisez le fonction delay(), cela bloquera l'exécution sur le MCU Arduino jusqu'à ce que le temps spécifié se soit écoulé, puis poursuivra le programme, mais la minuterie ne bloquera pas. Ce sera le moment où le MCU continuera d'exécuter d'autres instructions simultanément. C'est le grand avantage.

La minuterie est liée à interruptions d'Arduino, car ils seront exécutés à travers eux pour assister à une tâche spécifique. En d'autres termes, l'Arduino Timer est une fonction qui se déclenche à un certain moment, exécutant une fonction d'interruption. C'est pourquoi il est également important de connaître ces interruptions.

modes

La minuterie Arduino a 2 modes de fonctionnement, pouvant l'utiliser dans :

  • Signal PWM: Vous pouvez contrôler le Broches Arduino (~).
  • CTC (effacer le minuteur lors de la comparaison): compte le temps à l'intérieur d'un compteur et lorsqu'il atteint la valeur spécifiée dans un registre des temporisateurs, l'interruption est exécutée.

Combien de minuteries a-t-il ? Types de minuteries

Arduino UNO fonctions millis

3 minuteries sur les assiettes Arduino UNO, bien qu'il puisse y en avoir plus sur d'autres plaques supérieures :

  • Minuterie 0: 8 bits, peut compter de 0 à 255 (256 valeurs possibles). Utilisé par des fonctions telles que delay(), millis() et micros(). Sa modification est déconseillée afin de ne pas altérer les programmes.
  • Minuterie 1: égal au Timer 0. Utilisé par la bibliothèque Servo dans UNO (Timer 5 pour MEGA).
  • Minuterie 2: 16 bits, et peut aller de 0 à 65.525 65.536 (XNUMX XNUMX valeurs possibles). Utilisé pour la fonction tone(), s'il n'est pas utilisé, il peut être utilisé librement pour votre application.
  • Minuterie 3, 4, 5 (uniquement sur Arduino MEGA): tous 16 bits.

Comment fonctionne la minuterie Arduino ?

minuteries, minuteries

Pour travailler avec une minuterie Arduino, il est vital de savoir comment tout cela fonctionne électroniquement dans le MCU de cette carte de développement :

  • Fréquence d'horloge: est le nombre de cycles par seconde qu'il est capable de développer, dans le cas d'Arduino c'est 16 Mhz, ou ce qui revient au même, le signal d'horloge oscille 16.000.000 XNUMX XNUMX fois par seconde (cycles).
  • Période: est représenté par le T, et est mesuré en secondes, et est l'inverse des cycles. Par exemple, T=1/C, ce qui donnerait 1/16000000 = 0.0000000625, le temps qu'il faudrait pour que chaque cycle se termine. Et la fréquence est l'inverse de la période, donc f = 1/T.
  • Cycle: est chacune des répétitions du signal qui se produisent par unité de temps. Sur Arduino, ce serait 16M en une seconde. Ou ce qui revient au même, dans ce cas, lorsque 16 millions de cycles se sont écoulés, une seconde s'est écoulée. Par conséquent, on peut dire qu'un cycle prend 625 ns.
  • bord d'un signal: Les signaux d'horloge sont carrés et les fronts peuvent être montants ou descendants. Un front est la ligne droite du signal lorsqu'il passe de :
    • 0 (bas) à 1 (haut) : front montant.
    • 1 (haut) à 0 (bas) : front descendant.

Les fronts sont importants car les minuteries Arduino mesurent les cycles à partir des fronts de signal. A) Oui le compteur il s'incrémente à chaque cycle et lorsqu'il atteint la valeur du registre, l'interruption est exécutée.

Par conséquent, une fois que vous savez cela, si vous avez 16Mhz sur le microcontrôleur Arduino, et qu'un temporisateur 8 bits est utilisé, on peut dire que les interruptions se produiront toutes les 16 μs (256/16000000) ou 4 ms pour 16 bits (65536/16000000). Par conséquent, si vous définissez le registre du compteur 16 bits au maximum, avec la valeur 65535, l'interruption se produira à 4 ms pour exécuter la tâche quelle qu'elle soit.

Lorsque le compteur atteint la valeur maximale possible, il reviendra à 0. C'est-à-dire qu'un débordement se produit et qu'il compte à rebours depuis le début.

Pour contrôler le taux d'augmentation de la minuterie, vous pouvez également utiliser un prédiviseur, qui prend les valeurs 1, 8, 64, 256 et 1024 et modifie le timing comme ceci :

Vitesse de la minuterie (Hz) = Fréquence d'horloge de l'Arduino/Prescaler

Si c'est 1 le prédiviseur le contrôleur augmentera à 16 Mhz, s'il est de 8 à 2 Mhz, s'il est de 64 à 250 kHz, et ainsi de suite. N'oubliez pas qu'il y aura un comparateur d'état de compteur de minuterie pour comparer la valeur du compteur et du prédiviseur jusqu'à ce qu'ils soient égaux, puis exécuter une action. Pourtant, fréquence d'interruption est donné par la formule :

+1 est dû au fait que le registre du compteur est indexé à 0, c'est-à-dire qu'il ne commence pas à compter à 1, mais à 0.

Vitesse d'interruption (Hz) = Fréquence d'horloge Arduino / Prescaler (valeur du registre du comparateur + 1)

Heureusement, il ne faut pas modifier les enregistrements des temporisateurs Arduino, car il sera pris en charge par les bibliothèques que nous utilisons dans le code. Mais s'ils ne sont pas utilisés, ils doivent être configurés.

Exemples dans l'IDE Arduino

Arduino IDE, types de données, programmation

Afin de comprendre un peu mieux tout cela, je montre ici deux codes de croquis pour Arduino IDE avec lesquels vous pouvez faire l'expérience de l'utilisation des minuteries. Le premier est un code qui fera clignoter une LED connectée à la broche 8 d'Arduino toutes les secondes :

#define ledPin 8
void setup()
{
  pinMode(ledPin, OUTPUT);
  // Configurar Timer1
  TCCR1A = 0;                        //Registro control A a 0, pines OC1A y OC1B deshabilitados
  TCCR1B = 0;                        //Limpia el registrador
  TCCR1B |= (1<<CS10)|(1 << CS12);   //Configura prescaler a 1024: CS12 = 1 y CS10 = 1
  TCNT1 = 0xC2F8;                    //Iniciar timer para desbordamiento a 1 segundo
                                     //65536-(16MHz/1024/1Hz - 1) = 49912 = 0xC2F8 en hexadecimal
  
  TIMSK1 |= (1 << TOIE1);           //Habilitar interrupción para Timer1
}
void loop()
{
}
ISR(TIMER1_OVF_vect)                              //Interrupción del TIMER1 
{
  TCNT1 = 0xC2F7;                                 // Reniciar Timer1
  digitalWrite(ledPin, digitalRead(ledPin) ^ 1); //Invierte el estado del LED
}

Programmez le clignotement ou le clignotement de la LED, comme dans le cas précédent toutes les secondes, mais cette fois en utilisant CTC, c'est-à-dire comparaison:

#define ledPin 8
void setup()
{
  pinMode(ledPin, OUTPUT);
  
  // Configuración Timer1
  TCCR1A = 0;                //Registro de control A a 0
  TCCR1B = 0;                //Limpiar registro
  TCNT1  = 0;                //Inicializar el temporizador
  OCR1A = 0x3D08;            //Carga el valor del registro de comparación: 16MHz/1024/1Hz -1 = 15624 = 0X3D08
  TCCR1B |= (1 << WGM12)|(1<<CS10)|(1 << CS12);   //Modo CTC, prescaler de 1024: CS12 = 1 y CS10 = 1  
  TIMSK1 |= (1 << OCIE1A);  //Habilita interrupción por igualdad de comparación
}
void loop()
{
}
ISR(TIMER1_COMPA_vect)          //Interrupción por igualdad de comparación en TIMER1
{
  digitalWrite(ledPin, digitalRead(ledPin) ^ 1);   //Invierte el estado del LED
}

En savoir plus sur la programmation Arduino

acheter une assiette Arduino UNO Rév3

Soyez le premier à commenter

Laisser un commentaire

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

*

*

  1. Responsable des données: Miguel Ángel Gatón
  2. Finalité des données: Contrôle du SPAM, gestion des commentaires.
  3. Légitimation: votre consentement
  4. Communication des données: Les données ne seront pas communiquées à des tiers sauf obligation légale.
  5. Stockage des données: base de données hébergée par Occentus Networks (EU)
  6. Droits: à tout moment, vous pouvez limiter, récupérer et supprimer vos informations.