Tutoriel de la minuterie Arduino

Arduino Timer Tutorial

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

  1. Arduino Uno (ou une carte compatible)
  2. Résistance LED et 220-OHM (pour des exemples basés sur le synchronisation)
  3. Fils de planche à pain et de cavalier
  4. 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() et millis().

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

  1. Installez la bibliothèque TIMERON dans l'ide Arduino.
  2. 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

  1. Générer des signaux PWM précis pour le contrôle du moteur
  2. Planification des tâches sans bloquer le code (par exemple, multitâche)
  3. Mesurer les intervalles de temps pour les événements
  4. Créer des retards précis sans utiliser delay()
  5. 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!

Laissez un commentaire

Notice an Issue? Have a Suggestion?
If you encounter a problem or have an idea for a new feature, let us know! Report a problem or request a feature here.