Samouczek Timer Arduino

Arduino Timer Tutorial

Timery są istotną cechą mikrokontrolerów, umożliwiając wykonywanie zadań w precyzyjnych odstępach czasu bez polegania na opóźnieniu. Arduino UNO ma trzy wbudowane czasowe timery sprzętowe (Timer0, Timer1 i Timer2), które można skonfigurować dla różnych funkcji, takich jak generowanie sygnałów PWM, zdarzenia czasowe lub zadania planowania. Ten samouczek poprowadzi Cię przez zrozumienie i używanie timerów Arduino.


Czego będziesz potrzebować

  1. Arduino UNO (lub kompatybilna płyta)
  2. LED i rezystor 220-OHM (dla przykładów opartych na pomyłce)
  3. Druty chleba i skoczków
  4. Arduino IDE zainstalowane na komputerze

Krok 1: Zrozumienie timerów Arduino

Mikrokontroler Arduino Uno Uno ma trzy liczniki sprzętu:

Regulator czasowy Rozdzielczość bitowa Pierwotne użycie
Timer0 8-bit Millis (), micros (), PWM na pinach 5, 6
Timer1 16-bit Servo Library, PWM on Pins 9, 10
Timer2 8-bit Funkcja tone (), PWM na pinach 3, 11

Kluczowe funkcje timerów

  • Timery mogą generować sygnały PWM.
  • Timery mogą wywoływać przerwania.
  • Timery są używane wewnętrznie przez funkcje Arduino, takie jak delay() I millis().

Krok 2: Generowanie prostego sygnału PWM

Sygnały PWM (modulacja szerokości impulsu) są powszechnie stosowane do kontrolowania jasności LED lub prędkości silnika. Użyjmy Timer0, aby utworzyć sygnał PWM.

Przykładowy kod: Kontrola jasności LED z 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);
  }
}

Krok 3: Używanie timerów z przerwami

Możesz skonfigurować liczniki czasu, aby wyzwalają przerwy w regularnych odstępach czasu. Na przykład Timer1 można skonfigurować w celu przełączania diody LED co sekundę.

Przykładowy kod: przerwanie timer1

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

Krok 4: Mierzenie czasu z timerami

Możesz użyć liczników do pomiaru precyzyjnych czasów trwania. Timer2 nadaje się do małych przedziałów, ponieważ jest to 8-bitowy timer.

Przykładowy kod: timer2 dla pomiaru czasu

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

Krok 5: Korzystanie z bibliotek timer

Aby uprościć pracę z timerami, możesz używać bibliotek takich jak Timerone Lub TimerThree.

Korzystanie z biblioteki timerone

  1. Zainstaluj bibliotekę TimerOne w Arduino IDE.
  2. Użyj go, aby łatwo zaplanować zadania:
#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
}

Zastosowania liczników

  1. Generowanie precyzyjnych sygnałów PWM do sterowania silnikiem
  2. Planowanie zadań bez blokowania kodu (np. Wielozadaniowość)
  3. Mierzenie przedziałów czasowych dla zdarzeń
  4. Tworzenie precyzyjnych opóźnień bez użycia delay()
  5. Zarządzanie okresowymi działaniami, takimi jak miganie diod LED lub wysyłanie danych

Rozwiązywanie problemów

  • Konflikty timera: Upewnij się, że nie używasz tego samego timera dla wielu funkcji (np. Biblioteka serwomena i PWM).
  • Przerwania nie działają: Sprawdź, czy przerwania są włączone za pomocą interrupts().
  • Nieoczekiwane zachowanie: Dwukrotnie sprawdź prescaler i porównaj wartości dopasowania dla prawidłowego czasu.

Wniosek

Nauczyłeś się używać timerów Arduino do generowania sygnałów PWM, obsługi przerwań i pomiaru czasu. Mastering Timers odblokowuje potężne funkcje do tworzenia wydajnych i precyzyjnych projektów Arduino. Eksperymentuj z różnymi konfiguracjami i zastosuj liczniki, aby zoptymalizować następny projekt!

Zostaw komentarz

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.