Arduino Timer Tutorial

Arduino Timer Tutorial

Timer sind ein wesentliches Merkmal von Mikrocontrollern, sodass Sie Aufgaben in präzisen Intervallen ausführen können, ohne sich auf Verzögerungen zu verlassen. Die Arduino Uno verfügt über drei integrierte Hardware-Timer (Timer0, Timer1 und Timer2), die für verschiedene Funktionen wie das Generieren von PWM-Signalen, Timing-Ereignissen oder Planungsaufgaben konfiguriert werden können. Dieses Tutorial führt Sie durch das Verständnis und die Verwendung von Arduino -Timern.


Was Sie brauchen werden

  1. Arduino Uno (oder eine kompatible Karte)
  2. LED und 220-OHM-Widerstand (für zeitbasierte Beispiele)
  3. Breadboard- und Jumper -Drähte
  4. Arduino IDE ist auf Ihrem Computer installiert

Schritt 1: Arduino -Timer verstehen

Der ATMEGA328P -Mikrocontroller von Arduino Uno hat drei Hardware -Timer:

Timer Bit -Lösung Hauptverbrauch
Timer0 8-Bit Millis (), micros (), PWM auf Pins 5, 6
Timer1 16-Bit Servo Library, PWM auf Pins 9, 10
Timer2 8-Bit Tone () Funktion, PWM auf Pins 3, 11

Schlüsselmerkmale von Timern

  • Timer können PWM -Signale erzeugen.
  • Timer können Interrupts auslösen.
  • Timer werden intern von Arduino -Funktionen verwendet delay() Und millis().

Schritt 2: Erzeugen eines einfachen PWM -Signals

PWM -Signale (Impulsbreitenmodulation) werden üblicherweise zur Steuerung der LED -Helligkeit oder der Motordrehzahl verwendet. Verwenden wir Timer0, um ein PWM -Signal zu erstellen.

Beispielcode: LED -Helligkeitskontrolle mit 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);
  }
}

Schritt 3: Verwenden von Timern mit Interrupts

Sie können Timer konfigurieren, um Interrupts in regelmäßigen Abständen auszulösen. Zum Beispiel kann Timer1 so eingerichtet werden, dass sie eine LED pro Sekunde umschalten.

Beispielcode: Timer1 Interrupt

#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
}

Schritt 4: Messen Sie die Zeit mit Timern

Sie können Timer verwenden, um präzise Dauer zu messen. Timer2 ist für kleine Intervalle geeignet, da es sich um einen 8-Bit-Timer handelt.

Beispielcode: Timer2 für die Zeitmessung

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);
}

Schritt 5: Verwenden von Timerbibliotheken

Um die Arbeit mit Timers zu vereinfachen, können Sie Bibliotheken wie verwenden Timeron oder Timerthree.

Verwenden der Timerone -Bibliothek

  1. Installieren Sie die Timerone -Bibliothek in der Arduino -IDE.
  2. Verwenden Sie es, um Aufgaben leicht zu planen:
#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
}

Anwendungen von Timern

  1. Präzise PWM -Signale für die Motorsteuerung erzeugen
  2. Planungsaufgaben ohne Blockierung von Code (z. B. Multitasking)
  3. Messen Sie Zeitintervalle für Ereignisse
  4. Erstellen präziser Verzögerungen ohne Verwendung delay()
  5. Verwalten regelmäßiger Aktionen wie Blinking LEDs oder Senden von Daten

Fehlerbehebung

  • Timerkonflikte: Stellen Sie sicher, dass Sie nicht denselben Timer für mehrere Funktionen verwenden (z. B. Servo -Bibliothek und PWM).
  • Interrupts nicht funktionieren: Überprüfen Sie, ob Interrupts mit aktiviert sind mit interrupts().
  • Unerwartetes Verhalten: Überprüfung Prescaler und vergleichen Sie die Übereinstimmungswerte für das korrekte Timing.

Abschluss

Sie haben gelernt, wie man Arduino -Timer verwendet, um PWM -Signale zu generieren, Interrupts zu behandeln und die Zeit zu messen. Mastering -Timer entsperren leistungsstarke Funktionen für effiziente und präzise Arduino -Projekte. Experimentieren Sie mit verschiedenen Konfigurationen und wenden Sie Timer an, um Ihr nächstes Projekt zu optimieren!

Hinterlasse einen Kommentar

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.