Az időzítők a mikrovezérlők alapvető jellemzői, lehetővé téve a feladatok elvégzését pontos időközönként anélkül, hogy a késésekre támaszkodnának. Az Arduino UNO-nak három beépített hardver-időzítője van (Timer0, Timer1 és Timer2), amelyek különféle funkciókhoz konfigurálhatók, például PWM jelek előállítása, időzítési események vagy feladatok ütemezése. Ez az oktatóanyag vezeti Önt az Arduino időzítők megértésén és használatán.
Mire lesz szüksége
- Arduino UNO (vagy egy kompatibilis tábla)
- LED és 220-OHM ellenállás (időzítésen alapuló példákhoz)
- Kenyérlemez és jumper vezetékek
- Arduino IDE telepítve a számítógépére
1. lépés: Az Arduino időzítők megértése
Az Arduino UNO ATMEGA328P mikrovezérlőjének három hardver időzítője van:
Időzítő | Bit felbontás | Elsődleges használat |
---|---|---|
Időzítő0 | 8 bites | Millis (), micros (), PWM az 5., 6. csapon |
Időzítő1 | 16 bites | Szervo könyvtár, PWM a 9., 10. csapokon |
Időzítő2 | 8 bites | Tone () függvény, PWM a 3., 11. csapokon |
Az időzítők legfontosabb jellemzői
- Az időzítők PWM jeleket generálhatnak.
- Az időzítők megszakításokat válthatnak ki.
- Az időzítőket az arduino funkciók, például
delay()
ésmillis()
.
2. lépés: Egyszerű PWM jel előállítása
A PWM (impulzusszélesség -moduláció) jeleket általában használják a LED fényerejének vagy a motor sebességének szabályozására. Használjuk az Timer0 -ot PWM jel létrehozásához.
Példa kód: LED -es fényerő -vezérlés PWM -mel
#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);
}
}
3. lépés: Időzítők használata megszakításokkal
Konfigurálhatja az időzítőket a megszakítások rendszeres időközönként történő kiváltására. Például az Timer1 beállítható, hogy másodpercenként váltson egy LED -et.
Példa kód: Timer1 megszakítás
#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
}
4. lépés: Az idő mérése az időzítőkkel
Az időzítők segítségével mérheti a pontos időtartamokat. Az Timer2 kis időközönként alkalmas, mivel ez egy 8 bites időzítő.
Példa kód: Timer2 az időméréshez
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);
}
5. lépés: Időzítő könyvtárak használata
Az időzítőkkel való munka egyszerűsítéséhez használhat olyan könyvtárakat, mint Időzítő vagy Időtartam.
Az időzítő könyvtár használata
- Telepítse az időzítő könyvtárat az Arduino IDE -be.
- Használja azt a feladatok egyszerű ütemezéséhez:
#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
}
Az időzítők alkalmazásai
- Pontos PWM jelek generálása a motorvezérléshez
- A feladatok ütemezése blokkolási kód nélkül (például multitasking)
- Az események időintervallumának mérése
- Pontos késések létrehozása nélkül
delay()
- Periodikus műveletek kezelése, például villogó LED -ek vagy adatok küldése
Hibaelhárítás
- Időzítő konfliktusok: Győződjön meg arról, hogy nem használja ugyanazt az időzítőt több funkcióhoz (például a Servo Library és a PWM).
-
Megszakítja a nem működik: Ellenőrizze, hogy a megszakítások engedélyezve vannak -e
interrupts()
. - Váratlan viselkedés: Ellenőrizze duplán az PresCaler-t, és hasonlítsa össze a megfelelő időzítéshez való egyeztetési értékeket.
Következtetés
Megtanulta, hogyan kell használni az Arduino időzítőket a PWM jelek előállításához, a megszakítások kezeléséhez és az idő méréséhez. Az időzítők elsajátítása nagy teljesítményű funkciókat nyit a hatékony és pontos Arduino projektek létrehozásához. Kísérletezzen különböző konfigurációkkal, és alkalmazza az időzítőket a következő projekt optimalizálásához!