Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Maîtrisez les Timers Internes Arduino pour un Chronométrage Précis

Composants et fournitures

Composant Quantité
Arduino UNO 1
LED (standard) 1
Résistance 220 Ω 1

À propos du projet

Vue d'ensemble

Pour mesurer le temps avec précision, il faut utiliser un timer matériel. Les timers internes de l'Arduino (ATmega328P) ne sont pas triviaux à configurer, ce tutoriel les explique simplement.

L'intérêt majeur : pendant delay(), le processeur est bloqué. Avec un timer, le programme continue ; une interruption se déclenche exactement au moment voulu.

Nous utilisons le TIMER0 (le plus simple). Les autres (Timer1, Timer2) pourront faire l'objet de futurs tutoriels.

Fonctionnement

Consultez la datasheet de l'ATmega328P. Le schéma bloc du compteur montre :

  1. L'horloge (16 MHz) entre dans le prédiviseur (prescaler).
  2. Le prédiviseur génère des impulsions à fréquence réduite vers la logique de contrôle.
  3. Celle-ci incrémente le registre TCNTn.
  4. On compare TCNTn à une valeur de référence dans OCRn.
  5. Lors de l'égalité (mode CTC - Clear Timer on Compare), le flag TOVn génère une interruption.
Maîtrisez les Timers Internes Arduino pour un Chronométrage Précis

Le prédiviseur se configure via le registre TCCR0B :

Maîtrisez les Timers Internes Arduino pour un Chronométrage Précis
Maîtrisez les Timers Internes Arduino pour un Chronométrage Précis

Pour calculer la valeur d'OCR0A afin d'obtenir une période souhaitée :

Maîtrisez les Timers Internes Arduino pour un Chronométrage Précis

Exemple : interruption toutes les 1 ms (prédiviseur 64) :


TCCR0A |= (1 << WGM01);       // Mode CTC
OCR0A = 0xF9;                 // 249 -> 1 ms @ 16MHz/64
TIMSK0 |= (1 << OCIE0A);      // Active interruption COMPA
sei();                        // Active interruptions globales
TCCR0B |= (1 << CS01) | (1 << CS00);  // Prédiviseur 64 (démarre le timer)

Important : régler le prédiviseur en dernier, car le timer démarre immédiatement. Pour l'arrêter, remettre TCCR0B à 0.

Code exemple : Clignotement LED 1 Hz via Timer0


/* Clignote la LED broche 13 chaque seconde via timer interne */
int timer = 0;
bool state = 0;

void setup() {
  pinMode(13, OUTPUT);
  TCCR0A = (1 << WGM01);      // Mode CTC
  OCR0A = 0xF9;               // Valeur pour 1 ms
  TIMSK0 |= (1 << OCIE0A);    // Interruption sur compare match
  sei();                      // Interruptions globales
  TCCR0B |= (1 << CS01) | (1 << CS00);  // Prescaler 64
}

void loop() {
  if (timer >= 1000) {  // 1000 * 1 ms = 1 s
    state = !state;
    timer = 0;
  }
  digitalWrite(13, state);
}

ISR(TIMER0_COMPA_vect) {
  timer++;  // Incrémenté chaque 1 ms
}

Schéma de câblage

Maîtrisez les Timers Internes Arduino pour un Chronométrage Précis

Processus de fabrication

  1. Construire un Spybot Arduino piloté par Bluetooth
  2. FlickMote : Télécommande IR à gestes pour maison connectée
  3. TV-B-Gone DIY Arduino : Télécommande universelle pour toutes les TV
  4. Construire une horloge maître LED personnalisée avec alarme – Visible à 12 mètres
  5. Find Me : Localisateur d'objets intelligent avec Arduino et Bluetooth
  6. Solutions d'alimentation optimisées pour projets Arduino
  7. Morpion sur matrice LED MAX7219 avec boîtier en carton
  8. Construire un robot quadrupède Arduino intelligent : guide étape par étape
  9. Volant Joystick Arduino Personnalisé pour Jeux Vidéo