Tutorialul Timer Arduino

Arduino Timer Tutorial

Cronometrele sunt o caracteristică esențială a microcontrolerelor, permițându -vă să efectuați sarcini la intervale precise, fără a vă baza pe întârzieri. Arduino Uno are trei cronometre hardware încorporate (Timer0, Timer1 și Timer2) care pot fi configurate pentru diverse funcții, cum ar fi generarea de semnale PWM, evenimente de sincronizare sau sarcini de planificare. Acest tutorial vă va ghida prin înțelegerea și utilizarea cronometrelor Arduino.


Ce vei avea nevoie

  1. Arduino UNO (sau o placă compatibilă)
  2. Rezistență LED și 220-ohm (pentru exemple bazate pe sincronizare)
  3. Tablă de pâine și jumper
  4. Arduino IDE instalat pe computer

Pasul 1: Înțelegerea cronometrelor Arduino

Microcontrolerul Auduino Uno ATMEGA328P are trei cronometre hardware:

Cronometru Rezoluție mică Utilizare primară
Timer0 8 biți Milis (), micros (), pwm pe pinii 5, 6
Timer1 16 biți Servo Library, PWM pe pinii 9, 10
Timer2 8 biți Funcția ton (), pwm pe pinii 3, 11

Caracteristici cheie ale cronometrelor

  • Cronometrele pot genera semnale PWM.
  • Cronometrele pot declanșa întreruperi.
  • Cronometrele sunt utilizate intern de funcții Arduino, cum ar fi delay() şi millis().

Pasul 2: Generarea unui semnal PWM simplu

Semnalele PWM (modularea lățimii pulsului) sunt utilizate în mod obișnuit pentru a controla luminozitatea LED -ului sau viteza motorului. Să folosim Timer0 pentru a crea un semnal PWM.

Exemplu de cod: Controlul luminozității LED cu 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);
  }
}

Pasul 3: Utilizarea cronometrelor cu întreruperi

Puteți configura cronometrele pentru a declanșa întreruperi la intervale regulate. De exemplu, Timer1 poate fi configurat pentru a comuta un LED în fiecare secundă.

Exemplu de cod: Timer1 întrerupere

#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
}

Pasul 4: Măsurarea timpului cu cronometrele

Puteți utiliza cronometre pentru a măsura duratele precise. Timer2 este potrivit pentru intervale mici, deoarece este un cronometru pe 8 biți.

Exemplu de cod: Timer2 pentru măsurarea timpului

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);
}

Pasul 5: Utilizarea bibliotecilor de cronometru

Pentru a simplifica lucrul cu cronometrele, puteți utiliza biblioteci precum Timone sau TimerThree.

Folosind biblioteca timerone

  1. Instalați biblioteca Timrone în IDE Arduino.
  2. Folosiți -l pentru a programa sarcinile cu ușurință:
#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
}

Aplicații de cronometre

  1. Generarea semnalelor PWM precise pentru controlul motorului
  2. Sarcini de planificare fără a bloca codul (de exemplu, multitasking)
  3. Măsurarea intervalelor de timp pentru evenimente
  4. Crearea de întârzieri precise fără a utiliza delay()
  5. Gestionarea acțiunilor periodice precum clipirea LED -urilor sau trimiterea de date

Depanare

  • Conflicte de cronometru: Asigurați -vă că nu utilizați același cronometru pentru mai multe funcții (de exemplu, Servo Library și PWM).
  • Întrerupe nu funcționează: Verificați dacă întreruperile sunt activate cu interrupts().
  • Comportament neașteptat: Prescaler dublu-verificare și comparați valorile de potrivire pentru sincronizarea corectă.

Concluzie

Ați învățat cum să utilizați cronometre Arduino pentru generarea semnalelor PWM, manipularea întreruperilor și timpului de măsurare. Stăpânirea cronometrelor deblochează caracteristici puternice pentru crearea de proiecte eficiente și precise Arduino. Experimentați cu diferite configurații și aplicați cronometre pentru a -ți optimiza următorul proiect!

Lasă un comentariu

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.