Cronometrele sunt o caracteristică esențială a microcontrolerelor, permițându -vă să efectuați sarcini la intervale precise, fără a vă baza pe întârzieri. Arduino Uno are trei cronometre hardware încorporate (Timer0, Timer1 și Timer2) care pot fi configurate pentru diverse funcții, cum ar fi generarea de semnale PWM, evenimente de sincronizare sau sarcini de planificare. Acest tutorial vă va ghida prin înțelegerea și utilizarea cronometrelor Arduino.
Ce vei avea nevoie
- Arduino UNO (sau o placă compatibilă)
- Rezistență LED și 220-ohm (pentru exemple bazate pe sincronizare)
- Tablă de pâine și jumper
- Arduino IDE instalat pe computer
Pasul 1: Înțelegerea cronometrelor Arduino
Microcontrolerul Auduino Uno ATMEGA328P are trei cronometre hardware:
Cronometru | Rezoluție mică | Utilizare primară |
---|---|---|
Timer0 | 8 biți | Milis (), micros (), pwm pe pinii 5, 6 |
Timer1 | 16 biți | Servo Library, PWM pe pinii 9, 10 |
Timer2 | 8 biți | Funcția ton (), pwm pe pinii 3, 11 |
Caracteristici cheie ale cronometrelor
- Cronometrele pot genera semnale PWM.
- Cronometrele pot declanșa întreruperi.
- Cronometrele sunt utilizate intern de funcții Arduino, cum ar fi
delay()
şimillis()
.
Pasul 2: Generarea unui semnal PWM simplu
Semnalele PWM (modularea lățimii pulsului) sunt utilizate în mod obișnuit pentru a controla luminozitatea LED -ului sau viteza motorului. Să folosim Timer0 pentru a crea un semnal PWM.
Exemplu de cod: Controlul luminozității LED cu 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);
}
}
Pasul 3: Utilizarea cronometrelor cu întreruperi
Puteți configura cronometrele pentru a declanșa întreruperi la intervale regulate. De exemplu, Timer1 poate fi configurat pentru a comuta un LED în fiecare secundă.
Exemplu de cod: Timer1 întrerupere
#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
}
Pasul 4: Măsurarea timpului cu cronometrele
Puteți utiliza cronometre pentru a măsura duratele precise. Timer2 este potrivit pentru intervale mici, deoarece este un cronometru pe 8 biți.
Exemplu de cod: Timer2 pentru măsurarea timpului
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);
}
Pasul 5: Utilizarea bibliotecilor de cronometru
Pentru a simplifica lucrul cu cronometrele, puteți utiliza biblioteci precum Timone sau TimerThree.
Folosind biblioteca timerone
- Instalați biblioteca Timrone în IDE Arduino.
- Folosiți -l pentru a programa sarcinile cu ușurință:
#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
}
Aplicații de cronometre
- Generarea semnalelor PWM precise pentru controlul motorului
- Sarcini de planificare fără a bloca codul (de exemplu, multitasking)
- Măsurarea intervalelor de timp pentru evenimente
- Crearea de întârzieri precise fără a utiliza
delay()
- Gestionarea acțiunilor periodice precum clipirea LED -urilor sau trimiterea de date
Depanare
- Conflicte de cronometru: Asigurați -vă că nu utilizați același cronometru pentru mai multe funcții (de exemplu, Servo Library și PWM).
-
Întrerupe nu funcționează: Verificați dacă întreruperile sunt activate cu
interrupts()
. - Comportament neașteptat: Prescaler dublu-verificare și comparați valorile de potrivire pentru sincronizarea corectă.
Concluzie
Ați învățat cum să utilizați cronometre Arduino pentru generarea semnalelor PWM, manipularea întreruperilor și timpului de măsurare. Stăpânirea cronometrelor deblochează caracteristici puternice pentru crearea de proiecte eficiente și precise Arduino. Experimentați cu diferite configurații și aplicați cronometre pentru a -ți optimiza următorul proiect!