Arduinoの内部タイマー
コンポーネントと消耗品
> ![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 |
このプロジェクトについて
概要
正確な時間をカウントする必要がある場合は、タイマーを使用する必要がありますが、通常、Arduinoの内部タイマーを使用するのはそれほど簡単ではないため、このチュートリアルでは、簡単な方法でそれらを使用する方法を説明しようとしています。
>delay()関数の間は何もできないため、タイマーを使用することは非常に重要ですが、タイマーを使用すると、瞬間が来ると割り込みがアクティブになるため、すべてを実行できます。
TIMER0を使用するのは、これが最も簡単なタイマーであるためです。将来、他のタイマーについて説明する可能性があります。
仕組み
最初に確認する必要があるのは、ATmega328Pのデータシートです。
<図>
これはカウンターブロック図であり、これを見るとどのように機能するかを理解できます。
プリスケーラはクロックサイクルからパルスを受信し、それを制御ロジックに渡します。したがって、制御ロジックはTCNTnレジスタを1つインクリメントします。
これで、TCNTnの値を特定の値と比較できます。 TCNTnレジスタがこの値に到達すると、特定の時間が経過したことがわかります。
この方法は、「比較時にタイマーをクリア」のCTCモードと呼ばれます。値TCNTnレジスタはOCRnレジスタと比較され、比較一致が発生すると、TOVnは割り込みを生成します。
もう1つの重要なことは、プリスケーラーです。これを使用すると、クロックのさまざまな分周を作成できます。実際、16MHzは多すぎますが、プリスケーラーのおかげで、そのサブマルチプルを作成できます。これは、TCCR0Bレジスタの構成によって異なります。
<図>
<図>

もう1つの重要なことは、特定の時間をカウントするためにOCRnレジスタの値を決定することです。少し計算する必要があります。
<図>
これらすべてが複雑すぎるように思われることは承知していますが、以下のコードで各質問が解決されると確信しています。
この場合、0.001秒ごとに割り込み要求をアクティブにします。
TCCR0A | =(1 <
この命令の後でタイマーがカウントを開始するため、最後にプリスケーラーを設定することが重要です。タイマーを停止する必要がある場合は、TCCR0Bのすべてのビットをリセットする必要があります。
以下に例があります。
コード
- 内部タイマー
内部タイマー Arduino
/ *このプログラムは、内部タイマーを使用して1秒ごとにピン13のLEDをオン/オフします* / inttimer =0; bool state =0; void setup(){pinMode(13、OUTPUT); TCCR0A =(1 <=1000){state =!state; timer =0; } digitalWrite(13、state); } ISR(TIMER0_COMPA_vect){//これは割り込み要求タイマー++です;}
回路図

製造プロセス