タイマーはマイクロコントローラーの重要な機能であり、遅延に頼らずに正確な間隔でタスクを実行できます。 Arduino UNOには、PWM信号の生成、タイミングイベント、スケジューリングタスクなどのさまざまな機能に対して構成できる3つの組み込みハードウェアタイマー(Timer0、Timer1、およびTimer2)があります。このチュートリアルでは、Arduinoタイマーの理解と使用をガイドします。
あなたが必要とするもの
- Arduino uno(または互換性のあるボード)
- LEDおよび220-OHM抵抗器(タイミングベースの例用)
- ブレッドボードとジャンパーワイヤ
- 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ライブラリを使用します
- Arduino IDEにTimeroneライブラリを取り付けます。
- それを使用してタスクを簡単にスケジュールします。
#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
}
タイマーのアプリケーション
- モーター制御のための正確なPWM信号を生成します
- コードをブロックせずにタスクをスケジュールする(例:マルチタスク)
- イベントの時間間隔を測定します
- 使用せずに正確な遅延を作成します
delay()
- LEDを点滅させたり、データの送信などの定期的なアクションを管理したりします
トラブルシューティング
- タイマーの競合: 複数の関数に同じタイマーを使用しないでください(サーボライブラリやPWMなど)。
-
中断が機能しない: 割り込みが有効になっていることを確認してください
interrupts()
. - 予期しない動作: プリスケーラーを再確認し、正しいタイミングの一致値を比較します。
結論
Arduinoタイマーを使用して、PWM信号を生成し、割り込みの取り扱い、測定時間を生成する方法を学びました。マスタリングタイマーは、効率的で正確なArduinoプロジェクトを作成するための強力な機能のロックを解除します。さまざまな構成を試し、次のプロジェクトを最適化するためにタイマーを適用してください!