Ang mga timer ay isang mahalagang tampok ng mga microcontroller, na nagpapahintulot sa iyo na magsagawa ng mga gawain sa tumpak na agwat nang hindi umaasa sa mga pagkaantala. Ang Arduino Uno ay may tatlong built-in na mga timer ng hardware (Timer0, Timer1, at Timer2) na maaaring mai-configure para sa iba't ibang mga pag-andar tulad ng pagbuo ng mga signal ng PWM, mga kaganapan sa tiyempo, o mga gawain sa pag-iskedyul. Ang tutorial na ito ay gagabay sa iyo sa pamamagitan ng pag -unawa at paggamit ng mga timer ng Arduino.
Ano ang kakailanganin mo
- Arduino uno (o isang katugmang board)
- LED at 220-OHM Risistor (para sa mga halimbawa na batay sa tiyempo)
- Mga wire ng tinapay at jumper
- Ang Arduino IDE ay naka -install sa iyong computer
Hakbang 1: Pag -unawa sa Arduino Timers
Ang Arduino Uno's ATMEGA328P Microcontroller ay may tatlong mga timer ng hardware:
Timer | Bit resolusyon | Pangunahing paggamit |
---|---|---|
Timer0 | 8-bit | Millis (), micros (), PWM sa mga pin 5, 6 |
Timer1 | 16-bit | Servo Library, PWM sa mga pin 9, 10 |
Timer2 | 8-bit | Tono () function, PWM sa mga pin 3, 11 |
Mga pangunahing tampok ng mga timer
- Ang mga timer ay maaaring makabuo ng mga signal ng PWM.
- Ang mga timer ay maaaring mag -trigger ng mga pagkagambala.
- Ang mga timer ay ginagamit sa loob ng mga pag -andar ng Arduino tulad ng
delay()
atmillis()
.
Hakbang 2: Bumubuo ng isang simpleng signal ng PWM
Ang mga signal ng PWM (Pulse Width Modulation) ay karaniwang ginagamit upang makontrol ang LED na ningning o bilis ng motor. Gumamit ng Timer0 upang lumikha ng isang signal ng PWM.
Halimbawa ng code: LED control control na may 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);
}
}
Hakbang 3: Paggamit ng mga timer na may mga pagkagambala
Maaari mong i -configure ang mga timer upang ma -trigger ang mga pagkagambala sa mga regular na agwat. Halimbawa, ang Timer1 ay maaaring mai -set up upang i -toggle ang isang LED bawat segundo.
Halimbawa Code: Makagambala ang Timer1
#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
}
Hakbang 4: Pagsukat ng oras sa mga timer
Maaari kang gumamit ng mga timer upang masukat ang tumpak na mga tagal. Ang Timer2 ay angkop para sa mga maliliit na agwat dahil ito ay isang 8-bit timer.
Halimbawa Code: Timer2 para sa pagsukat ng oras
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);
}
Hakbang 5: Paggamit ng Mga Aklatan ng Timer
Upang gawing simple ang pagtatrabaho sa mga timer, maaari kang gumamit ng mga aklatan tulad ng Timerone o Timerthree.
Gamit ang library ng Timerone
- I -install ang library ng Timerone sa Arduino IDE.
- Gamitin ito upang mag -iskedyul ng mga gawain nang madali:
#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
}
Mga Aplikasyon ng Timers
- Bumubuo ng tumpak na mga signal ng PWM para sa kontrol ng motor
- Mga gawain sa pag -iskedyul nang walang pagharang ng code (hal., Multitasking)
- Pagsukat ng mga agwat ng oras para sa mga kaganapan
- Lumilikha ng tumpak na pagkaantala nang hindi gumagamit
delay()
- Pamamahala ng mga pana -panahong pagkilos tulad ng kumikislap na mga LED o pagpapadala ng data
Pag -aayos
- Mga Salungatan sa Timer: Tiyaking hindi mo ginagamit ang parehong timer para sa maraming mga pag -andar (hal., Servo library at PWM).
-
Hindi nagagambala hindi gumagana: Suriin na ang mga pagkagambala ay pinagana
interrupts()
. - Hindi inaasahang pag -uugali: Double-check prescaler at ihambing ang mga halaga ng tugma para sa tamang tiyempo.
Konklusyon
Nalaman mo kung paano gamitin ang mga timer ng Arduino para sa pagbuo ng mga signal ng PWM, paghawak ng mga pagkagambala, at oras ng pagsukat. Ang mga mastering timer ay nagbubukas ng mga makapangyarihang tampok para sa paglikha ng mahusay at tumpak na mga proyekto ng Arduino. Eksperimento sa iba't ibang mga pagsasaayos at mag -apply ng mga timer upang ma -optimize ang iyong susunod na proyekto!