Zamanlayıcılar mikrodenetleyicilerin önemli bir özelliğidir ve gecikmelere güvenmeden görevleri kesin aralıklarla gerçekleştirmenizi sağlar. Arduino Uno, PWM sinyalleri, zamanlama olayları veya zamanlama görevleri üretme gibi çeşitli işlevler için yapılandırılabilen üç dahili donanım zamanlayıcısına (zamanlayıcı, zamanlayıcı1 ve zamanlayıcı2) sahiptir. Bu öğretici, Arduino zamanlayıcılarını anlama ve kullanarak size rehberlik edecektir.
Ne İhtiyacınız Olacak
- Arduino Uno (veya uyumlu bir tahta)
- LED ve 220-OHM direnç (zamanlama tabanlı örnekler için)
- Breadboard ve jumper telleri
- Bilgisayarınızda yüklü Arduino IDE
1. Adım: Arduino zamanlayıcılarını anlamak
Arduino Uno’nun Atmaga328P mikrodenetleyicisinin üç donanım zamanlayıcısı var:
Zamanlayıcı | Bit çözünürlüğü | Birincil kullanım |
---|---|---|
Zamanlayıcı | 8 bit | Millis (), micros (), pimlerde PWM 5, 6 |
Zamanlayıcı1 | 16 bit | Servo Kütüphanesi, Pins 9, 10 Üzerinde PWM |
Zamanlayıcı2 | 8 bit | Tone () işlevi, pinlerde PWM 3, 11 |
Zamanlayıcıların temel özellikleri
- Zamanlayıcılar PWM sinyalleri oluşturabilir.
- Zamanlayıcılar kesintileri tetikleyebilir.
- Zamanlayıcılar, arduino işlevleri tarafından dahili olarak kullanılır
delay()
Vemillis()
.
2. Adım: Basit bir PWM sinyali oluşturma
PWM (darbe genişliği modülasyonu) sinyalleri, LED parlaklığı veya motor hızını kontrol etmek için yaygın olarak kullanılır. PWM sinyali oluşturmak için Timer0'ı kullanalım.
Örnek kodu: PWM ile LED parlaklık kontrolü
#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);
}
}
Adım 3: Kesmalarla zamanlayıcılar kullanma
Zamanlayıcıları kesintileri düzenli aralıklarla tetikleyecek şekilde yapılandırabilirsiniz. Örneğin, Timer1 bir LED'i her saniyede değiştirecek şekilde ayarlanabilir.
Örnek Kodu: Timer1 kesinti
#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
}
Adım 4: Zamanlayıcılarla süreyi ölçme
Kesin süreleri ölçmek için zamanlayıcılar kullanabilirsiniz. Timer2, 8 bitlik bir zamanlayıcı olduğu için küçük aralıklar için uygundur.
Örnek Kodu: Zaman ölçümü için Timer2
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);
}
Adım 5: Zamanlayıcı kitaplıklarını kullanma
Zamanlayıcılarla çalışmayı basitleştirmek için, Zaman ayı veya TimeThree.
Timerone Kütüphanesini Kullanma
- Timerone kütüphanesini Arduino IDE'ye yükleyin.
- Görevleri kolayca planlamak için kullanın:
#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
}
Zamanlayıcıların uygulamaları
- Motor kontrolü için kesin PWM sinyalleri üretme
- Kodu engellemeden görevleri zamanlama (ör. Çoklu görev)
- Olaylar için zaman aralıklarını ölçme
- Kullanmadan kesin gecikmeler yaratmak
delay()
- Yanıp sönen LED'ler veya veri gönderme gibi periyodik eylemleri yönetmek
Sorun giderme
- Zamanlayıcı Çatışmaları: Aynı zamanlayıcıyı birden çok işlev için kullanmadığınızdan emin olun (örn. Servo kütüphanesi ve PWM).
-
Kesme çalışmıyor: Kesmaların etkinleştirildiğini kontrol edin
interrupts()
. - Beklenmedik davranış: Presclarer'ı çift kontrol edin ve doğru zamanlama için eşleşme değerlerini karşılaştırın.
Çözüm
PWM sinyalleri oluşturmak, kesintileri işlemek ve süreyi ölçmek için Arduino zamanlayıcılarını nasıl kullanacağınızı öğrendiniz. Mastering Timers, verimli ve hassas Arduino projeleri oluşturmak için güçlü özelliklerin kilidini açar. Farklı konfigürasyonları deneyin ve bir sonraki projenizi optimize etmek için zamanlayıcılar uygulayın!