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
- Arduino Uno (oder eine kompatible Karte)
- LED und 220-OHM-Widerstand (für zeitbasierte Beispiele)
- Breadboard- und Jumper -Drähte
- 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()
Undmillis()
.
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
- Installieren Sie die Timerone -Bibliothek in der Arduino -IDE.
- 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
- Präzise PWM -Signale für die Motorsteuerung erzeugen
- Planungsaufgaben ohne Blockierung von Code (z. B. Multitasking)
- Messen Sie Zeitintervalle für Ereignisse
- Erstellen präziser Verzögerungen ohne Verwendung
delay()
- 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!