Arduinoタイマーチュートリアル

Arduino Timer Tutorial

タイマーはマイクロコントローラーの重要な機能であり、遅延に頼らずに正確な間隔でタスクを実行できます。 Arduino UNOには、PWM信号の生成、タイミングイベント、スケジューリングタスクなどのさまざまな機能に対して構成できる3つの組み込みハードウェアタイマー(Timer0、Timer1、およびTimer2)があります。このチュートリアルでは、Arduinoタイマーの理解と使用をガイドします。


あなたが必要とするもの

  1. Arduino uno(または互換性のあるボード)
  2. LEDおよび220-OHM抵抗器(タイミングベースの例用)
  3. ブレッドボードとジャンパーワイヤ
  4. Arduino IDEがコンピューターにインストールされています

ステップ1:Arduinoタイマーの理解

Arduino UNOのATMEGA328Pマイクロコントローラーには、3つのハードウェアタイマーがあります。

タイマー ビット解像度 主要な使用法
Timer0 8ビット millis()、micros()、pwm on pins 5、6
タイマー1 16ビット サーボライブラリ、ピン9、10のPWM
タイマー2 8ビット tone()関数、ピン3、11のpwm

タイマーの重要な機能

  • タイマーはPWM信号を生成できます。
  • タイマーは割り込みをトリガーできます。
  • タイマーは、Arduino関数のような内部で使用されます delay() そして millis().

ステップ2:単純なPWM信号の生成

PWM(パルス幅変調)信号は、一般にLEDの輝度またはモーター速度を制御するために使用されます。 Timer0を使用してPWM信号を作成しましょう。

例コード:PWMを使用したLED輝度制御

#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);
  }
}

ステップ3:割り込みのあるタイマーの使用

定期的に割り込みをトリガーするためにタイマーを構成できます。たとえば、Timer1をセットアップして、LEDを1秒ごとに切り替えることができます。

例コード:Timer1割り込み

#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
}

ステップ4:タイマーによる時間の測定

タイマーを使用して、正確な期間を測定できます。 Timer2は、8ビットタイマーであるため、小さな間隔に適しています。

例コード:時間測定のための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);
}

ステップ5:タイマーライブラリの使用

タイマーの作業を簡素化するには、次のようなライブラリを使用できます タイムロン または Timerthee.

Timeroneライブラリを使用します

  1. Arduino IDEにTimeroneライブラリを取り付けます。
  2. それを使用してタスクを簡単にスケジュールします。
#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
}

タイマーのアプリケーション

  1. モーター制御のための正確なPWM信号を生成します
  2. コードをブロックせずにタスクをスケジュールする(例:マルチタスク)
  3. イベントの時間間隔を測定します
  4. 使用せずに正確な遅延を作成します delay()
  5. LEDを点滅させたり、データの送信などの定期的なアクションを管理したりします

トラブルシューティング

  • タイマーの競合: 複数の関数に同じタイマーを使用しないでください(サーボライブラリやPWMなど)。
  • 中断が機能しない: 割り込みが有効になっていることを確認してください interrupts().
  • 予期しない動作: プリスケーラーを再確認し、正しいタイミングの一致値を比較します。

結論

Arduinoタイマーを使用して、PWM信号を生成し、割り込みの取り扱い、測定時間を生成する方法を学びました。マスタリングタイマーは、効率的で正確なArduinoプロジェクトを作成するための強力な機能のロックを解除します。さまざまな構成を試し、次のプロジェクトを最適化するためにタイマーを適用してください!

コメントを残す

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.