I timer sono una caratteristica essenziale dei microcontrollori, consentendo di eseguire attività a intervalli precisi senza fare affidamento sui ritardi. Arduino UNO ha tre timer hardware integrati (Timer0, Timer1 e Timer2) che possono essere configurati per varie funzioni come la generazione di segnali PWM, eventi di temporizzazione o attività di pianificazione. Questo tutorial ti guiderà attraverso la comprensione e l'uso di timer Arduino.
Cosa avrai bisogno
- Arduino Uno (o una scheda compatibile)
- Resistenza a LED e 220 ohm (per esempi basati sui tempi)
- Breadboard e fili jumper
- Arduino IDE installato sul tuo computer
Passaggio 1: comprensione dei timer Arduino
Il microcontrollore ATDUINO UNO ATMEGA328P ha tre timer hardware:
Timer | Risoluzione bit | Uso primario |
---|---|---|
Timer0 | 8 bit | Millis (), Micros (), PWM sui pin 5, 6 |
Timer1 | 16 bit | Biblioteca servo, PWM sui pin 9, 10 |
Timer2 | 8 bit | Funzione tone (), PWM sui pin 3, 11 |
Caratteristiche chiave dei timer
- I timer possono generare segnali PWM.
- I timer possono innescare interruzioni.
- I timer sono usati internamente dalle funzioni di Arduino come
delay()
Emillis()
.
Passaggio 2: generazione di un semplice segnale PWM
I segnali PWM (Modulazione della larghezza dell'impulso) sono comunemente usati per controllare la luminosità dei LED o la velocità del motore. Usiamo Timer0 per creare un segnale PWM.
Codice di esempio: controllo della luminosità LED con 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);
}
}
Passaggio 3: usando i timer con interruzioni
È possibile configurare i timer per attivare interruzioni a intervalli regolari. Ad esempio, Timer1 può essere impostato per attivare un LED ogni secondo.
Codice di esempio: 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
}
Passaggio 4: misurare il tempo con i timer
È possibile utilizzare i timer per misurare le durate precise. Timer2 è adatto per piccoli intervalli perché è un timer a 8 bit.
Codice di esempio: timer2 per la misurazione del tempo
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);
}
Passaggio 5: utilizzando le librerie del timer
Per semplificare il lavoro con i timer, è possibile utilizzare librerie come Timerone O Timerthree.
Utilizzando la libreria Timerone
- Installare la libreria TimerOne nell'IDE Arduino.
- Usalo per pianificare facilmente le attività:
#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
}
Applicazioni dei timer
- Generare segnali PWM precisi per il controllo del motore
- Attività di pianificazione senza bloccare il codice (ad es. Multitasking)
- Misurare gli intervalli di tempo per gli eventi
- Creazione di ritardi precisi senza usare
delay()
- Gestione di azioni periodiche come LED lampeggianti o invio di dati
Risoluzione dei problemi
- Conflitti del timer: Assicurati di non utilizzare lo stesso timer per più funzioni (ad es. Servo Library e PWM).
-
Interrompe non funzionano: Verificare che gli interrupt siano abilitati
interrupts()
. - Comportamento inaspettato: Prescaler a doppio controllo e confronta i valori di corrispondenza per il tempismo corretto.
Conclusione
Hai imparato come utilizzare i timer Arduino per generare segnali PWM, gestire interruzioni e misurare il tempo. Mastering Timer sblocca funzionalità potenti per la creazione di progetti Arduino efficienti e precisi. Sperimenta diverse configurazioni e applica timer per ottimizzare il tuo prossimo progetto!