- Qu'est-ce que TIMER dans l'électronique embarquée?
- Registres de minuterie Arduino
- Interruptions de la minuterie Arduino
- Composants requis
- Schéma
- Programmation des minuteries Arduino UNO
La plate-forme de développement Arduino a été initialement développée en 2005 en tant qu'appareil programmable facile à utiliser pour les projets de conception artistique. Son intention était d'aider les non-ingénieurs à travailler avec l'électronique de base et les microcontrôleurs sans beaucoup de connaissances en programmation. Mais ensuite, en raison de sa nature facile à utiliser, il a été rapidement adapté par les débutants et les amateurs d'électronique du monde entier et aujourd'hui, il est même préféré pour le développement de prototypes et les développements POC.
Bien qu'il soit acceptable de commencer avec Arduino, il est important de passer lentement aux microcontrôleurs de base tels que AVR, ARM, PIC, STM, etc. et de le programmer à l'aide de leurs applications natives. En effet, le langage de programmation Arduino est très facile à comprendre car la plupart du travail est effectué par des fonctions prédéfinies telles que digitalWrite (), AnalogWrite (), Delay () etc. tandis que le langage machine de bas niveau est caché derrière eux. Les programmes Arduino ne sont pas similaires aux autres codages Embedded C où nous traitons les bits de registre et les rendons hauts ou bas en fonction de la logique de notre programme.
Timers Arduino sans délai:
Par conséquent, pour comprendre ce qui se passe à l'intérieur des fonctions prédéfinies, nous devons creuser derrière ces termes. Par exemple, lorsqu'une fonction delay () est utilisée, elle définit les bits de registre de minuterie et de compteur du microcontrôleur ATmega.
Dans ce didacticiel de minuterie Arduino, nous allons éviter l'utilisation de cette fonction delay () et traiter à la place les registres eux-mêmes. La bonne chose est que vous pouvez utiliser le même IDE Arduino pour cela. Nous allons définir nos bits de registre de minuterie et utiliser l'interruption de dépassement de la minuterie pour faire basculer une LED à chaque fois que l'interruption se produit. La valeur de préchargement du bit Timer peut également être réglée à l'aide de boutons poussoirs pour contrôler la durée pendant laquelle l'interruption se produit.
Qu'est-ce que TIMER dans l'électronique embarquée?
La minuterie est une sorte d'interruption. C'est comme une simple horloge qui peut mesurer l'intervalle de temps d'un événement. Chaque microcontrôleur a une horloge (oscillateur), disons dans Arduino Uno, c'est 16Mhz. Ceci est responsable de la vitesse. Plus la fréquence d'horloge sera élevée, plus la vitesse de traitement sera élevée. Une minuterie utilise un compteur qui compte à une certaine vitesse en fonction de la fréquence d'horloge. Dans Arduino Uno, il faut 1/16000000 secondes ou 62nano secondes pour faire un seul décompte. Cela signifie qu'Arduino passe d'une instruction à une autre pour chaque 62 nano seconde.
Minuteries dans Arduino UNO:
Dans Arduino UNO, trois minuteries sont utilisées pour différentes fonctions.
Minuterie0:
Il s'agit d'un minuteur 8 bits et utilisé dans des fonctions de minuterie telles que delay (), millis ().
Timer1:
Il s'agit d'un minuteur 16 bits utilisé dans la bibliothèque d'asservissement.
Minuterie2:
Il s'agit d'une minuterie 8 bits utilisée dans la fonction tone ().
Registres de minuterie Arduino
Pour modifier la configuration des minuteries, des registres de minuterie sont utilisés.
1. Registres de contrôle de la minuterie / compteur (TCCRnA / B):
Ce registre contient les principaux bits de contrôle de la minuterie et sert à contrôler les pré-calibreurs de la minuterie. Il permet également de contrôler le mode de la minuterie à l'aide des bits WGM.
Format du cadre:
TCCR1A | sept | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
COM1A1 | COM1A0 | COM1B1 | COM1B0 | COM1C1 | COM1C0 | WGM11 | WGM10 |
TCCR1B | sept | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
ICNC1 | ICES1 | - | WGM13 | WGM12 | CS12 | CS11 | CS10 |
Prescaler:
Les bits CS12, CS11, CS10 dans TCCR1B définissent la valeur du prescaler. Un prescaler est utilisé pour configurer la vitesse d'horloge de la minuterie. Arduino Uno a des pré-calibres de 1, 8, 64, 256, 1024.
CS12 | CS11 | CS10 | UTILISATION |
0 | 0 | 0 | Pas d'horloge Timer STOP |
0 | 0 | 1 | CLCK i / o / 1 Pas de pré-mise à l'échelle |
0 | 1 | 0 | CLK i / o / 8 (du Prescaler) |
0 | 1 | 1 | CLK i / o / 64 (à partir du Prescaler) |
1 | 0 | 0 | CLK i / o / 256 (à partir du Prescaler) |
1 | 0 | 1 | CLK i / o / 1024 (à partir du Prescaler) |
1 | 1 | 0 | Source d'horloge externe sur la broche T1. Horloge sur front descendant |
1 | 1 | 1 | Source d'horloge externe sur la broche T1. Horloge sur front montant. |
2. Registre de minuterie / compteur (TCNTn)
Ce registre est utilisé pour contrôler la valeur du compteur et pour définir une valeur de préchargement.
Formule pour la valeur de préchargement pour le temps requis en seconde:
TCNTn = 65535 - (16x10 10 xTime en s / Valeur du Prescaler)
Pour calculer la valeur de préchargement pour timer1 pour une durée de 2 s:
TCNT1 = 65535 - (16x10 10 x2 / 1024) = 34285
Interruptions de la minuterie Arduino
Nous avons déjà entendu parler des interruptions Arduino et avons vu que les interruptions de la minuterie sont des sortes d'interruptions logicielles. Il existe différentes interruptions de minuterie dans Arduino qui sont expliquées ci-dessous.Interruption de dépassement de la minuterie:
Chaque fois que la minuterie atteint sa valeur maximale, disons par exemple (16 bits-65535), l' interruption de dépassement de la minuterie se produit. Ainsi, une routine de service d'interruption ISR est appelée lorsque le bit d'interruption de dépassement de la minuterie est activé dans le TOIEx présent dans le registre de masque d'interruption de minuterie TIMSKx.
Format ISR:
ISR (TIMERx_OVF_vect) { }
Registre de comparaison de sortie (OCRnA / B):
Ici, lorsque l'interruption de correspondance de comparaison de sortie se produit, le service d'interruption ISR (TIMERx_COMPy_vect) est appelé et le bit indicateur OCFxy sera également défini dans le registre TIFRx. Cet ISR est activé en définissant le bit d'activation dans OCIExy présent dans le registre TIMSKx. Où TIMSKx est le registre de masque d'interruption de minuterie.
Capture d'entrée de minuterie:
Ensuite, lorsque l'interruption de capture d'entrée de la minuterie se produit, le service d'interruption ISR (TIMERx_CAPT_vect) est appelé et le bit d'indicateur ICFx sera également défini dans TIFRx (registre d'indicateur d'interruption de minuterie). Cet ISR est activé en définissant le bit d'activation dans ICIEx présent dans le registre TIMSKx.
Composants requis
- Arduino UNO
- Boutons poussoirs (2)
- LED (toute couleur)
- Résistance 10k (2), 2,2k (1)
- Écran LCD 16x2
Schéma
Connexions du circuit entre Arduino UNO et écran LCD 16x2:
Écran LCD 16x2 |
Arduino UNO |
VSS |
GND |
VDD |
+ 5V |
V0 |
Vers la broche centrale du potentiomètre pour le contrôle du contraste de l'écran LCD |
RS |
8 |
RW |
GND |
E |
9 |
D4 |
dix |
D5 |
11 |
D6 |
12 |
D7 |
13 |
UNE |
+ 5V |
K |
GND |
Deux boutons poussoirs avec des résistances pull down de 10K sont connectés aux broches Arduino 2 et 4 et une LED est connectée à la broche 7 d'Arduino via une résistance de 2,2K.
La configuration ressemblera à l'image ci-dessous.
Programmation des minuteries Arduino UNO
Dans ce tutoriel, nous utiliserons le TIMER OVERFLOW INTERRUPT et l'utiliserons pour faire clignoter la LED ON et OFF pendant une certaine durée en ajustant la valeur du préchargement (TCNT1) à l'aide de boutons poussoirs. Le code complet pour Arduino Timer est donné à la fin. Ici, nous expliquons le code ligne par ligne:
Comme l'écran LCD 16x2 est utilisé dans le projet pour afficher la valeur du préchargeur, la bibliothèque de cristaux liquides est utilisée.
#comprendre
La broche d'anode LED connectée à la broche 7 d'Arduino est définie comme ledPin .
#define ledPin 7
Ensuite, l'objet pour accéder à la classe Liquid Crystal est déclaré avec les broches LCD (RS, E, D4, D5, D6, D7) qui sont connectées à Arduino UNO.
LCD LiquidCrystal (8,9,10,11,12,13);
Réglez ensuite la valeur de préchargement 3035 pendant 4 secondes. Vérifiez la formule ci-dessus pour calculer la valeur du préchargeur.
valeur flottante = 3035;
Ensuite, dans void setup (), réglez d'abord l'écran LCD en mode 16x2 et affichez un message de bienvenue pendant quelques secondes.
lcd.begin (16,2); lcd.setCursor (0,0); lcd.print ("ARDUINO TIMERS"); retard (2000); lcd.clear ();
Ensuite, définissez la broche LED comme broche OUTPUT et les boutons poussoirs sont définis comme broches INPUT
pinMode (ledPin, OUTPUT); pinMode (2, INPUT); pinMode (4, ENTRÉE);
Désactivez ensuite toutes les interruptions:
noInterrupts ();
Ensuite, le Timer1 est initialisé.
TCCR1A = 0; TCCR1B = 0;
La valeur du temporisateur de préchargement est définie (initialement sur 3035).
TCNT1 = valeur;
Ensuite, la valeur de pré-échelle 1024 est définie dans le registre TCCR1B.
TCCR1B - = (1 << CS10) - (1 << CS12);
L'interruption de dépassement de la minuterie est activée dans le registre du masque d'interruption de la minuterie afin que l'ISR puisse être utilisé.
TIMSK1 - = (1 << TOIE1);
Enfin, toutes les interruptions sont activées.
interruptions ();
Maintenant, écrivez l'ISR pour l'interruption de dépassement de la minuterie qui est responsable de l'allumage et de l' extinction de la LED à l'aide de digitalWrite . L'état change chaque fois que l'interruption de dépassement de la minuterie se produit.
ISR (TIMER1_OVF_vect) { TCNT1 = valeur; digitalWrite (ledPin, digitalRead (ledPin) ^ 1); }
Dans la boucle vide (), la valeur du préchargeur est incrémentée ou décrémentée en utilisant les entrées de bouton-poussoir et la valeur est également affichée sur l'écran LCD 16x2.
if (digitalRead (2) == HIGH) { valeur = valeur + 10; // Valeur de précharge d'incément } if (digitalRead (4) == HIGH) { value = value-10; // Décrémente la valeur de précharge } lcd.setCursor (0,0); lcd.print (valeur); }
Voici donc comment une minuterie peut être utilisée pour produire un retard dans le programme Arduino. Regardez la vidéo ci-dessous où nous avons démontré le changement de délai en augmentant et en diminuant la valeur du préchargement à l'aide des boutons poussoirs.