Arduino zamanlayıcı öğreticisi

Arduino Timer Tutorial

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

  1. Arduino Uno (veya uyumlu bir tahta)
  2. LED ve 220-OHM direnç (zamanlama tabanlı örnekler için)
  3. Breadboard ve jumper telleri
  4. 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() Ve millis().

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

  1. Timerone kütüphanesini Arduino IDE'ye yükleyin.
  2. 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ı

  1. Motor kontrolü için kesin PWM sinyalleri üretme
  2. Kodu engellemeden görevleri zamanlama (ör. Çoklu görev)
  3. Olaylar için zaman aralıklarını ölçme
  4. Kullanmadan kesin gecikmeler yaratmak delay()
  5. 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!

Yorum bırak

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.