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ć
- Arduino UNO (lub kompatybilna płyta)
- LED i rezystor 220-OHM (dla przykładów opartych na pomyłce)
- Druty chleba i skoczków
- 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()
Imillis()
.
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
- Zainstaluj bibliotekę TimerOne w Arduino IDE.
- 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
- Generowanie precyzyjnych sygnałów PWM do sterowania silnikiem
- Planowanie zadań bez blokowania kodu (np. Wielozadaniowość)
- Mierzenie przedziałów czasowych dla zdarzeń
- Tworzenie precyzyjnych opóźnień bez użycia
delay()
- 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!