Arduino timer handledning

Arduino Timer Tutorial

Timers är ett viktigt inslag i mikrokontroller, så att du kan utföra uppgifter med exakta intervaller utan att förlita sig på förseningar. Arduino UNO har tre inbyggda hårdvaritimers (timer0, timer1 och timer2) som kan konfigureras för olika funktioner som att generera PWM-signaler, timinghändelser eller schemaläggningsuppgifter. Denna handledning kommer att vägleda dig genom att förstå och använda Arduino Timers.


Vad du behöver

  1. Arduino Uno (eller ett kompatibelt bräde)
  2. LED och 220-ohm-motstånd (för tidsbaserade exempel)
  3. Breadboard och jumpertrådar
  4. Arduino Ide installerad på din dator

Steg 1: Förstå Arduino Timers

Arduino UNO: s ATMEGA328P -mikrokontroller har tre hårdvarutimers:

Timer Lite upplösning Primäranvändning
Timer0 8-bitars Millis (), micros (), pwm på stift 5, 6
Timer1 16-bitars Servo -bibliotek, PWM på stift 9, 10
Timer2 8-bitars Ton () funktion, pwm på stift 3, 11

Tiders viktiga funktioner

  • Timers kan generera PWM -signaler.
  • Timers kan utlösa avbrott.
  • Timers används internt av Arduino -funktioner som delay() och millis().

Steg 2: Generera en enkel PWM -signal

PWM -signaler (pulsbreddmodulering) används ofta för att styra LED -ljusstyrka eller motorhastighet. Låt oss använda timer0 för att skapa en PWM -signal.

Exempelkod: LED -ljusstyrka med 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);
  }
}

Steg 3: Använd timers med avbrott

Du kan konfigurera timers för att utlösa avbrott med jämna mellanrum. Timer1 kan till exempel ställas in för att växla en LED varje sekund.

Exempelkod: timer1 avbrott

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

Steg 4: Mätningstid med timers

Du kan använda timers för att mäta exakta varaktigheter. Timer2 är lämplig för små intervaller eftersom det är en 8-bitars timer.

Exempelkod: Timer2 för tidsmätning

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

Steg 5: Använda timerbibliotek

För att förenkla att arbeta med timers kan du använda bibliotek som Timeron eller Timerton.

Använda TimerOne -biblioteket

  1. Installera Timerone -biblioteket i Arduino IDE.
  2. Använd den för att enkelt schemalägga uppgifter:
#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
}

Applikationer av timers

  1. Generera exakta PWM -signaler för motorstyrning
  2. Schemaläggningsuppgifter utan att blockera kod (t.ex. multitasking)
  3. Mätning av tidsintervall för händelser
  4. Skapa exakta förseningar utan att använda delay()
  5. Hantera periodiska åtgärder som att blinka lysdioder eller skicka data

Felsökning

  • Timerkonflikter: Se till att du inte använder samma timer för flera funktioner (t.ex. servobibliotek och PWM).
  • Avbrott fungerar inte: Kontrollera att avbrott är aktiverade med interrupts().
  • Oväntat beteende: Dubbelkontrollera presskaler och jämföra matchvärden för korrekt timing.

Slutsats

Du har lärt dig hur du använder Arduino -timers för att generera PWM -signaler, hantera avbrott och mäta tid. Mastering Timers låser upp kraftfulla funktioner för att skapa effektiva och exakta Arduino -projekt. Experimentera med olika konfigurationer och tillämpa timers för att optimera ditt nästa projekt!

Lämna en kommentar

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.