Arduino Timer Tutorial

Arduino Timer Tutorial

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

  1. Arduino Uno (o una scheda compatibile)
  2. Resistenza a LED e 220 ohm (per esempi basati sui tempi)
  3. Breadboard e fili jumper
  4. 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() E millis().

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

  1. Installare la libreria TimerOne nell'IDE Arduino.
  2. 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

  1. Generare segnali PWM precisi per il controllo del motore
  2. Attività di pianificazione senza bloccare il codice (ad es. Multitasking)
  3. Misurare gli intervalli di tempo per gli eventi
  4. Creazione di ritardi precisi senza usare delay()
  5. 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!

Lascia un commento

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.