Ajastimet ovat mikrokontrollerien olennainen ominaisuus, jonka avulla voit suorittaa tehtäviä tarkalla väliajoin luottamatta viiveisiin. Arduino UNO: ssa on kolme sisäänrakennettua laitteistoajasinta (ajastin0, ajastin1 ja ajastin2), jotka voidaan määrittää erilaisille toiminnoille, kuten PWM-signaalien, ajoitustapahtumien tai aikataulutehtävien luominen. Tämä opetusohjelma opastaa sinua ymmärtämään ja käyttämään Arduino -ajastimia.
Mitä tarvitset
- Arduino UNO (tai yhteensopiva lauta)
- LED ja 220-OHM-vastus (ajoituspohjaisiin esimerkkeihin)
- Leipälevy- ja hyppyjohdot
- Arduino IDE asennettu tietokoneellesi
Vaihe 1: Arduino -ajastimien ymmärtäminen
Arduino UNO: n ATMEGA328P -mikrokontrollerissa on kolme laitteistoajasinta:
Ajastin | Bittisolu | Ensisijainen käyttö |
---|---|---|
Ajastin | 8-bittinen | Millis (), Micros (), PWM nastailla 5, 6 |
Ajastin1 | 16-bittinen | Servo -kirjasto, PWM nastailla 9, 10 |
Ajastin2 | 8-bittinen | Sävy () -toiminto, PWM nastailla 3, 11 |
Ajastimien keskeiset piirteet
- Ajastimet voivat tuottaa PWM -signaaleja.
- Ajastimet voivat laukaista keskeytykset.
- Ajastimia käyttävät sisäisesti arduino -toiminnot, kuten
delay()
jamillis()
.
Vaihe 2: Yksinkertaisen PWM -signaalin luominen
PWM (pulssin leveyden modulaatio) signaaleja käytetään yleisesti LED -kirkkauden tai moottorin nopeuden hallintaan. Käytä Tkerer0: tä PWM -signaalin luomiseen.
Esimerkki koodi: LED -kirkkauden hallinta PWM: llä
#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);
}
}
Vaihe 3: Ajastimien käyttäminen keskeytyksillä
Voit määrittää ajastimet laukaisemaan keskeytyksiä säännöllisin väliajoin. Esimerkiksi ajastin1 voidaan asettaa kytkemään LED joka sekunti.
Esimerkki Koodi: Ajastin1 keskeyttää
#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
}
Vaihe 4: Ajoittajan mittaus ajastimilla
Voit käyttää ajastimia tarkkojen kestojen mittaamiseen. Timer2 is suitable for small intervals because it is an 8-bit timer.
Example Code: Timer2 for Time Measurement
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);
}
Step 5: Using Timer Libraries
To simplify working with timers, you can use libraries like TimerOne tai TimerThree.
Using the TimerOne Library
- Asenna Timerone -kirjasto Arduino IDE: hen.
- Käytä sitä aikataulut helposti:
#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
}
Ajastimien sovellukset
- Tarkat PWM -signaalit moottorin ohjaamiseksi
- Aikataulutehtävät estämättä koodia (esim. Monitehtävät)
- Tapahtumien ajanjaksojen mittaus
- Tarkkojen viivästysten luominen käyttämättä
delay()
- Määräaikaiset toimenpiteet, kuten vilkkuvat LEDit tai tietojen lähettäminen
Vianetsintä
- Ajastinkonfliktit: Varmista, että et käytä samaa ajastinta useisiin toimintoihin (esim. Servo -kirjasto ja PWM).
-
Keskeytykset eivät toimi: Tarkista, että keskeytykset ovat käytössä
interrupts()
. - Odottamaton käyttäytyminen: Kaksois-tarkista prescaler ja vertaa vastaavia arvoja oikeaa ajoitusta varten.
Johtopäätös
Olet oppinut käyttämään Arduino -ajastimia PWM -signaalien, käsittelyn ja mittausajan luomiseen. Ajastimien hallitseminen avaa tehokkaita ominaisuuksia tehokkaiden ja tarkkojen Arduino -projektien luomiseksi. Kokeile erilaisia kokoonpanoja ja käytä ajastimia seuraavan projektin optimoimiseksi!