บทช่วยสอนการจับเวลา Arduino

Arduino Timer Tutorial

ตัวจับเวลาเป็นคุณสมบัติที่สำคัญของไมโครคอนโทรลเลอร์ช่วยให้คุณสามารถทำงานในช่วงเวลาที่แม่นยำโดยไม่ต้องพึ่งพาความล่าช้า Arduino UNO มีตัวจับเวลาฮาร์ดแวร์ในตัวสามตัว (Timer0, Timer1 และ Timer2) ที่สามารถกำหนดค่าสำหรับฟังก์ชั่นต่าง ๆ เช่นการสร้างสัญญาณ PWM เหตุการณ์เวลาหรืองานกำหนดเวลา บทช่วยสอนนี้จะแนะนำคุณผ่านการทำความเข้าใจและใช้ตัวจับเวลา Arduino


สิ่งที่คุณต้องการ

  1. Arduino Uno (หรือคณะกรรมการที่เข้ากันได้)
  2. LED และตัวต้านทาน 220 โอห์ม (สำหรับตัวอย่างตามเวลา)
  3. เครื่องหั่นขนมปังและสายจัมเปอร์
  4. 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

  1. ติดตั้งไลบรารี Timerone ใน Arduino IDE
  2. ใช้เพื่อกำหนดเวลางานได้อย่างง่ายดาย:
#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
}

แอปพลิเคชันของตัวจับเวลา

  1. สร้างสัญญาณ PWM ที่แม่นยำสำหรับการควบคุมมอเตอร์
  2. การกำหนดตารางเวลาโดยไม่ต้องปิดกั้นรหัส (เช่นมัลติทาสก์)
  3. การวัดช่วงเวลาสำหรับเหตุการณ์
  4. การสร้างความล่าช้าอย่างแม่นยำโดยไม่ต้องใช้ delay()
  5. การจัดการการกระทำเป็นระยะเช่น LED กระพริบหรือส่งข้อมูล

การแก้ไขปัญหา

  • ตัวจับเวลาความขัดแย้ง: ตรวจสอบให้แน่ใจว่าคุณไม่ได้ใช้ตัวจับเวลาเดียวกันสำหรับหลายฟังก์ชั่น (เช่นไลบรารีเซอร์โวและ PWM)
  • ขัดจังหวะไม่ทำงาน: ตรวจสอบว่าเปิดใช้งานการขัดจังหวะด้วย interrupts().
  • พฤติกรรมที่ไม่คาดคิด: ตรวจสอบ prescaler สองครั้งและเปรียบเทียบค่าการจับคู่สำหรับเวลาที่ถูกต้อง

บทสรุป

คุณได้เรียนรู้วิธีการใช้ตัวจับเวลา Arduino สำหรับสร้างสัญญาณ PWM จัดการการขัดจังหวะและเวลาในการวัด การควบคุมตัวจับเวลาปลดล็อคคุณสมบัติที่มีประสิทธิภาพสำหรับการสร้างโครงการ Arduino ที่มีประสิทธิภาพและแม่นยำ ทดลองกับการกำหนดค่าที่แตกต่างกันและใช้ตัวจับเวลาเพื่อเพิ่มประสิทธิภาพโครงการต่อไปของคุณ!

แสดงความคิดเห็น

Notice an Issue? Have a Suggestion?
If you encounter a problem or have an idea for a new feature, let us know! Report a problem or request a feature here.