Les minuteries sont une caractéristique essentielle des microcontrôleurs, vous permettant d'effectuer des tâches à des intervalles précis sans compter sur les retards. L'Arduino UNO dispose de trois minuteries matérielles intégrées (TIMER0, TIMER1 et TIMER2) qui peuvent être configurées pour diverses fonctions telles que la génération de signaux PWM, des événements de synchronisation ou des tâches de planification. Ce didacticiel vous guidera à travers la compréhension et l'utilisation des minuteries Arduino.
Ce dont vous aurez besoin
- Arduino Uno (ou une carte compatible)
- Résistance LED et 220-OHM (pour des exemples basés sur le synchronisation)
- Fils de planche à pain et de cavalier
- Arduino IDE installé sur votre ordinateur
Étape 1: Comprendre les minuteries Arduino
Le microcontrôleur ATMEGA328P d'Arduino Uno a trois minuteries matérielles:
Minuteur | Bit Resolution | Primary Usage |
---|---|---|
Timer0 | 8 bits | Millis (), Micros (), PWM sur les broches 5, 6 |
Minuterie | 16 bits | Bibliothèque servo, PWM sur les broches 9, 10 |
Timer2 | 8 bits | Fonction Tone (), PWM sur les broches 3, 11 |
Caractéristiques clés des minuteries
- Les minuteries peuvent générer des signaux PWM.
- Les minuteries peuvent déclencher des interruptions.
- Les minuteries sont utilisées en interne par des fonctions Arduino comme
delay()
etmillis()
.
Step 2: Generating a Simple PWM Signal
Les signaux PWM (modulation de largeur d'impulsion) sont couramment utilisés pour contrôler la luminosité du LED ou la vitesse du moteur. Utilisons Timer0 pour créer un signal PWM.
Exemple de code: contrôle de luminosité LED avec PWM
#define ledPin 6 // Pin 6 uses Timer0 for PWM
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
for (int brightness = 0; brightness <= 255; brightness++) {
analogWrite(ledPin, brightness); // Increase brightness
delay(10);
}
for (int brightness = 255; brightness >= 0; brightness--) {
analogWrite(ledPin, brightness); // Decrease brightness
delay(10);
}
}
Étape 3: Utilisation des minuteries avec des interruptions
Vous pouvez configurer les minuteries pour déclencher des interruptions à intervalles réguliers. Par exemple, Timer1 peut être configuré pour basculer une LED à chaque seconde.
Exemple de code: interruption de TIMER1
#define ledPin 13 // Built-in LED
void setup() {
pinMode(ledPin, OUTPUT);
// Configure Timer1
noInterrupts(); // Disable interrupts during setup
TCCR1A = 0; // Clear Timer1 control registers
TCCR1B = 0;
TCNT1 = 0; // Initialize counter value to 0
OCR1A = 15624; // Compare match register (1Hz at 16MHz with 1024 prescaler)
TCCR1B |= (1 << WGM12); // CTC mode
TCCR1B |= (1 << CS12) | (1 << CS10); // 1024 prescaler
TIMSK1 |= (1 << OCIE1A); // Enable Timer1 compare interrupt
interrupts(); // Enable interrupts
}
ISR(TIMER1_COMPA_vect) {
digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle LED
}
void loop() {
// Main loop does nothing; timer handles the LED
}
Étape 4: Mesurer le temps avec les minuteries
Vous pouvez utiliser des minuteries pour mesurer des durées précises. Timer2 convient aux petits intervalles car il s'agit d'une minuterie 8 bits.
Exemple de code: TIMER2 pour la mesure du temps
volatile unsigned long overflowCount = 0;
void setup() {
Serial.begin(9600);
// Configure Timer2
noInterrupts();
TCCR2A = 0;
TCCR2B = 0;
TCNT2 = 0;
TCCR2B |= (1 << CS22); // Prescaler 64
TIMSK2 |= (1 << TOIE2); // Enable Timer2 overflow interrupt
interrupts();
}
ISR(TIMER2_OVF_vect) {
overflowCount++;
}
void loop() {
unsigned long timeElapsed = overflowCount * 16.384; // Each overflow = 16.384ms
Serial.print("Time elapsed: ");
Serial.print(timeElapsed);
Serial.println(" ms");
delay(1000);
}
Étape 5: Utilisation des bibliothèques de minuterie
Pour simplifier le travail avec les minuteries, vous pouvez utiliser des bibliothèques comme Trombard ou Minuterie.
Utilisation de la bibliothèque TIMERON
- Installez la bibliothèque TIMERON dans l'ide Arduino.
- Utilisez-le pour planifier facilement les tâches:
#include <TimerOne.h>
#define ledPin 13
void toggleLED() {
digitalWrite(ledPin, !digitalRead(ledPin));
}
void setup() {
pinMode(ledPin, OUTPUT);
Timer1.initialize(1000000); // Set timer to 1 second (1,000,000 microseconds)
Timer1.attachInterrupt(toggleLED); // Attach the interrupt function
}
void loop() {
// Main loop does nothing; Timer1 handles the LED
}
Applications des minuteries
- Générer des signaux PWM précis pour le contrôle du moteur
- Planification des tâches sans bloquer le code (par exemple, multitâche)
- Mesurer les intervalles de temps pour les événements
- Créer des retards précis sans utiliser
delay()
- Gérer des actions périodiques comme clignoter des LED ou envoyer des données
Dépannage
- Conflits de la minuterie: Assurez-vous de ne pas utiliser le même minuteur pour plusieurs fonctions (par exemple, Servo Library et PWM).
-
Les interruptions ne fonctionnent pas: Vérifiez que les interruptions sont activées avec
interrupts()
. - Comportement inattendu: Vérifiez le préscaler et comparez les valeurs de correspondance pour la synchronisation correcte.
Conclusion
Vous avez appris à utiliser les minuteries Arduino pour générer des signaux PWM, la manipulation des interruptions et la mesure du temps. La maîtrise des minuteries débloque des fonctionnalités puissantes pour créer des projets Arduino efficaces et précis. Expérimentez avec différentes configurations et appliquez des minuteries pour optimiser votre prochain projet!