Arduino Timer Tutorial

Arduino Timer Tutorial

Timers zijn een essentieel kenmerk van microcontrollers, zodat u taken met precieze intervallen kunt uitvoeren zonder te vertrouwen op vertragingen. De Arduino UNO heeft drie ingebouwde hardwaretimers (timer, timer1 en timer2) die kunnen worden geconfigureerd voor verschillende functies, zoals het genereren van PWM-signalen, timinggebeurtenissen of planningstaken. Deze zelfstudie zal u begeleiden door Arduino Timers te begrijpen en te gebruiken.


Wat u nodig hebt

  1. Arduino Uno (of een compatibel bord)
  2. LED- en 220-OHM-weerstand (voor gebaseerde voorbeelden op timing)
  3. Breadboard en jumper draden
  4. Arduino Ide geïnstalleerd op uw computer

Stap 1: Arduino Timers begrijpen

De Atmega328P -microcontroller van de Arduino Uno heeft drie hardwaretimers:

Timer Bit resolutie Primair gebruik
Timer0 8-bit Millis (), Micros (), PWM op pennen 5, 6
Timer1 16-bit Servo Library, PWM op pennen 9, 10
Timer2 8-bit Tone () functie, PWM op pennen 3, 11

Belangrijkste kenmerken van timers

  • Timers kunnen PWM -signalen genereren.
  • Timers kunnen onderbrekingen veroorzaken.
  • Timers worden intern gebruikt door Arduino -functies zoals delay() En millis().

Stap 2: Een eenvoudig PWM -signaal genereren

PWM -signalen (pulsbreedtemodulatie) worden vaak gebruikt om LED -helderheid of motorsnelheid te regelen. Laten we Timer0 gebruiken om een ​​PWM -signaal te maken.

Voorbeeldcode: LED -helderheidsregeling met 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);
  }
}

Stap 3: Timers gebruiken met onderbrekingen

U kunt timers configureren om onderbroken te activeren met regelmatige tussenpozen. Timer1 kan bijvoorbeeld worden ingesteld om elke seconde een LED te schakelen.

Voorbeeldcode: 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
}

Stap 4: Tijd meten met timers

U kunt timers gebruiken om precieze duur te meten. Timer2 is geschikt voor kleine intervallen omdat het een 8-bit timer is.

Voorbeeldcode: timer2 voor tijdsmeting

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

Stap 5: Timer -bibliotheken gebruiken

Om het werken met timers te vereenvoudigen, kunt u bibliotheken zoals gebruiken Timeron of TimerThree.

Met behulp van de timerone -bibliotheek

  1. Installeer de timerone -bibliotheek in de Arduino IDE.
  2. Gebruik het om taken gemakkelijk te plannen:
#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
}

Toepassingen van timers

  1. Het genereren van precieze PWM -signalen voor motorbesturing
  2. Taken plannen zonder code te blokkeren (bijv. Multitasking)
  3. Tijdsintervallen meten voor gebeurtenissen
  4. Precieze vertragingen creëren zonder te gebruiken delay()
  5. Het beheren van periodieke acties zoals knipperende LED's of het verzenden van gegevens

Problemen oplossen

  • Timerconflicten: Zorg ervoor dat u niet dezelfde timer gebruikt voor meerdere functies (bijv. Servo -bibliotheek en PWM).
  • Onderbrekingen werken niet: Controleer of onderbrekingen zijn ingeschakeld met interrupts().
  • Onverwacht gedrag: Controleer Double-Check Prescaler en vergelijk de matchwaarden voor de juiste timing.

Conclusie

Je hebt geleerd hoe je Arduino -timers kunt gebruiken voor het genereren van PWM -signalen, het afhandelen van interrupts en het meten van tijd. Mastering timers ontgrendelt krachtige functies voor het maken van efficiënte en precieze Arduino -projecten. Experimenteer met verschillende configuraties en pas timers toe om uw volgende project te optimaliseren!

Laat een reactie achter

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.