ตัวจับเวลาเป็นคุณสมบัติที่สำคัญของไมโครคอนโทรลเลอร์ช่วยให้คุณสามารถทำงานในช่วงเวลาที่แม่นยำโดยไม่ต้องพึ่งพาความล่าช้า Arduino UNO มีตัวจับเวลาฮาร์ดแวร์ในตัวสามตัว (Timer0, Timer1 และ Timer2) ที่สามารถกำหนดค่าสำหรับฟังก์ชั่นต่าง ๆ เช่นการสร้างสัญญาณ PWM เหตุการณ์เวลาหรืองานกำหนดเวลา บทช่วยสอนนี้จะแนะนำคุณผ่านการทำความเข้าใจและใช้ตัวจับเวลา Arduino
สิ่งที่คุณต้องการ
- Arduino Uno (หรือคณะกรรมการที่เข้ากันได้)
- LED และตัวต้านทาน 220 โอห์ม (สำหรับตัวอย่างตามเวลา)
- เครื่องหั่นขนมปังและสายจัมเปอร์
- Arduino IDE ติดตั้งบนคอมพิวเตอร์ของคุณ
ขั้นตอนที่ 1: ทำความเข้าใจกับตัวจับเวลา Arduino
ไมโครคอนโทรลเลอร์ ATMEGA328P ของ Arduino UNO มีตัวจับเวลาฮาร์ดแวร์สามตัว:
ตัวจับเวลา | ความละเอียดบิต | การใช้งานหลัก |
---|---|---|
ตัวจับเวลา 0 | 8 บิต | Millis (), micros (), PWM บนพิน 5, 6 |
ตัวจับเวลา 1 | 16 บิต | Servo Library, PWM บน Pins 9, 10 |
ตัวจับเวลา 2 | 8 บิต | ฟังก์ชั่น Tone (), PWM บนพิน 3, 11 |
คุณสมบัติที่สำคัญของตัวจับเวลา
- ตัวจับเวลาสามารถสร้างสัญญาณ PWM
- ตัวจับเวลาสามารถกระตุ้นการขัดจังหวะ
- ตัวจับเวลาถูกใช้ภายในโดยฟังก์ชั่น Arduino เช่น
delay()
และmillis()
.
ขั้นตอนที่ 2: สร้างสัญญาณ PWM อย่างง่าย
สัญญาณ PWM (การปรับความกว้างพัลส์) มักใช้เพื่อควบคุมความสว่างของ LED หรือความเร็วมอเตอร์ มาใช้ Timer0 เพื่อสร้างสัญญาณ PWM
รหัสตัวอย่าง: การควบคุมความสว่างของ LED ด้วย 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);
}
}
ขั้นตอนที่ 3: การใช้ตัวจับเวลาที่มีการขัดจังหวะ
คุณสามารถกำหนดค่าตัวจับเวลาเพื่อกระตุ้นการขัดจังหวะในช่วงเวลาปกติ ตัวอย่างเช่น Timer1 สามารถตั้งค่าเพื่อสลับ LED ทุกวินาที
รหัสตัวอย่าง: 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
}
ขั้นตอนที่ 4: การวัดเวลาด้วยตัวจับเวลา
คุณสามารถใช้ตัวจับเวลาเพื่อวัดระยะเวลาที่แม่นยำ Timer2 เหมาะสำหรับช่วงเวลาเล็ก ๆ เพราะเป็นตัวจับเวลา 8 บิต
ตัวอย่างรหัส: Timer2 สำหรับการวัดเวลา
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: การใช้ไลบรารีตัวจับเวลา
เพื่อให้การทำงานกับตัวจับเวลาง่ายขึ้นคุณสามารถใช้ไลบรารีได้เช่น timerone หรือ Timerthree.
ใช้ไลบรารี Timerone
- ติดตั้งไลบรารี Timerone ใน Arduino IDE
- ใช้เพื่อกำหนดเวลางานได้อย่างง่ายดาย:
#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
}
แอปพลิเคชันของตัวจับเวลา
- สร้างสัญญาณ PWM ที่แม่นยำสำหรับการควบคุมมอเตอร์
- การกำหนดตารางเวลาโดยไม่ต้องปิดกั้นรหัส (เช่นมัลติทาสก์)
- การวัดช่วงเวลาสำหรับเหตุการณ์
- การสร้างความล่าช้าอย่างแม่นยำโดยไม่ต้องใช้
delay()
- การจัดการการกระทำเป็นระยะเช่น LED กระพริบหรือส่งข้อมูล
การแก้ไขปัญหา
- ตัวจับเวลาความขัดแย้ง: ตรวจสอบให้แน่ใจว่าคุณไม่ได้ใช้ตัวจับเวลาเดียวกันสำหรับหลายฟังก์ชั่น (เช่นไลบรารีเซอร์โวและ PWM)
-
ขัดจังหวะไม่ทำงาน: ตรวจสอบว่าเปิดใช้งานการขัดจังหวะด้วย
interrupts()
. - พฤติกรรมที่ไม่คาดคิด: ตรวจสอบ prescaler สองครั้งและเปรียบเทียบค่าการจับคู่สำหรับเวลาที่ถูกต้อง
บทสรุป
คุณได้เรียนรู้วิธีการใช้ตัวจับเวลา Arduino สำหรับสร้างสัญญาณ PWM จัดการการขัดจังหวะและเวลาในการวัด การควบคุมตัวจับเวลาปลดล็อคคุณสมบัติที่มีประสิทธิภาพสำหรับการสร้างโครงการ Arduino ที่มีประสิทธิภาพและแม่นยำ ทดลองกับการกำหนดค่าที่แตกต่างกันและใช้ตัวจับเวลาเพื่อเพิ่มประสิทธิภาพโครงการต่อไปของคุณ!