Timers zijn een essentieel kenmerk van microcontrollers, zodat u taken met precieze intervallen kunt uitvoeren zonder te vertrouwen op vertragingen. De Arduino UNO heeft drie ingebouwde hardwaretimers (timer, timer1 en timer2) die kunnen worden geconfigureerd voor verschillende functies, zoals het genereren van PWM-signalen, timinggebeurtenissen of planningstaken. Deze zelfstudie zal u begeleiden door Arduino Timers te begrijpen en te gebruiken.
Wat u nodig hebt
- Arduino Uno (of een compatibel bord)
- LED- en 220-OHM-weerstand (voor gebaseerde voorbeelden op timing)
- Breadboard en jumper draden
- Arduino Ide geïnstalleerd op uw computer
Stap 1: Arduino Timers begrijpen
De Atmega328P -microcontroller van de Arduino Uno heeft drie hardwaretimers:
Timer | Bit resolutie | Primair gebruik |
---|---|---|
Timer0 | 8-bit | Millis (), Micros (), PWM op pennen 5, 6 |
Timer1 | 16-bit | Servo Library, PWM op pennen 9, 10 |
Timer2 | 8-bit | Tone () functie, PWM op pennen 3, 11 |
Belangrijkste kenmerken van timers
- Timers kunnen PWM -signalen genereren.
- Timers kunnen onderbrekingen veroorzaken.
- Timers worden intern gebruikt door Arduino -functies zoals
delay()
Enmillis()
.
Stap 2: Een eenvoudig PWM -signaal genereren
PWM -signalen (pulsbreedtemodulatie) worden vaak gebruikt om LED -helderheid of motorsnelheid te regelen. Laten we Timer0 gebruiken om een PWM -signaal te maken.
Voorbeeldcode: LED -helderheidsregeling met 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);
}
}
Stap 3: Timers gebruiken met onderbrekingen
U kunt timers configureren om onderbroken te activeren met regelmatige tussenpozen. Timer1 kan bijvoorbeeld worden ingesteld om elke seconde een LED te schakelen.
Voorbeeldcode: 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
}
Stap 4: Tijd meten met timers
U kunt timers gebruiken om precieze duur te meten. Timer2 is geschikt voor kleine intervallen omdat het een 8-bit timer is.
Voorbeeldcode: timer2 voor tijdsmeting
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);
}
Stap 5: Timer -bibliotheken gebruiken
Om het werken met timers te vereenvoudigen, kunt u bibliotheken zoals gebruiken Timeron of TimerThree.
Met behulp van de timerone -bibliotheek
- Installeer de timerone -bibliotheek in de Arduino IDE.
- Gebruik het om taken gemakkelijk te plannen:
#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
}
Toepassingen van timers
- Het genereren van precieze PWM -signalen voor motorbesturing
- Taken plannen zonder code te blokkeren (bijv. Multitasking)
- Tijdsintervallen meten voor gebeurtenissen
- Precieze vertragingen creëren zonder te gebruiken
delay()
- Het beheren van periodieke acties zoals knipperende LED's of het verzenden van gegevens
Problemen oplossen
- Timerconflicten: Zorg ervoor dat u niet dezelfde timer gebruikt voor meerdere functies (bijv. Servo -bibliotheek en PWM).
-
Onderbrekingen werken niet: Controleer of onderbrekingen zijn ingeschakeld met
interrupts()
. - Onverwacht gedrag: Controleer Double-Check Prescaler en vergelijk de matchwaarden voor de juiste timing.
Conclusie
Je hebt geleerd hoe je Arduino -timers kunt gebruiken voor het genereren van PWM -signalen, het afhandelen van interrupts en het meten van tijd. Mastering timers ontgrendelt krachtige functies voor het maken van efficiënte en precieze Arduino -projecten. Experimenteer met verschillende configuraties en pas timers toe om uw volgende project te optimaliseren!