マイコンのタイマ/カウンタ活用の定石

マイコンには、クロックや外部から入力されるパルスを数える「タイマ/カウンタ」が搭載されています。本記事では、内部クロックを基準に時間を計測する動作を「タイマ」、外部入力パルスを基準に回数を計測する動作を「イベントカウント」と呼び、両者を総称して「タイマ/カウンタ」と表記します。

マイコン制御では、目的に応じて、ポーリング、タイマ割り込み、PWM出力、インプットキャプチャなどを適切に使い分けることが重要です。選択を誤ると、処理の遅れや信号の取りこぼしにつながるおそれがあります。

本記事では、マイコンのタイマ/カウンタの基本的な役割を整理したうえで、代表的な活用方法と実装時の判断ポイントを解説します。

マイコン制御におけるタイマ/カウンタの役割

マイコン制御におけるタイマ/カウンタは、時間の経過や信号の変化を扱う基本的な周辺機能です。一定周期で処理を実行する以外にも、PWM信号によるモータ制御やLED調光、インプットキャプチャによる外部信号の周期・パルス幅測定に使われます。外部パルスやイベント数を数える場合は、タイマをカウンタとして利用することもあります。設計時には、処理の周期性や測定対象に応じて使い分けることが、安定した制御の実現につながります。

タイマ/カウンタの使い分けを判断するポイント

マイコンのタイマ/カウンタの用途を示した相関図。中央のタイマ(内部クロックで時間を計測する)から、ポーリング、タイマ割り込み、PWM出力、インプットキャプチャの4つの用途へ分岐する。隣のイベントカウンタ(外部パルス数を数える)はイベントカウントにつながり、エンコーダや流量センサで回転数や個数を把握する。同じ周辺回路でも設定によって役割が変わることを表している。

タイマ/カウンタは、処理内容に応じて使い分けることが大切です。確認タイミングに多少のずれが許される処理、一定周期で実行したい処理、信号の出力・測定では、それぞれ適した方法が異なります。

厳密な周期精度が不要な処理はポーリングで対応する

厳密な周期精度が不要な処理は、メインループでタイマ値やフラグを確認するポーリングで対応できます。処理タイミングが多少前後しても問題ない処理に適した方法です。

周期性が重要な処理はタイマ割り込みを使う

センサ値の取得や制御演算など、一定周期で実行する必要がある処理にはタイマ割り込みが適しています。ただし、割り込み処理が長くなるとシステム全体の応答性に影響するため、処理はできるだけ短くまとめます。

信号の出力・測定には専用機能を活用する

信号の生成や測定を扱う場合は、タイマに備わるPWM出力機能やインプットキャプチャ機能を活用します。PWMでは周期とデューティ比を設定して安定したパルスを出力でき、インプットキャプチャでは外部信号のエッジ検出時点のタイマ値(カウント値)をキャプチャレジスタへ取り込めます(多くの場合、同時にキャプチャフラグが立ち、割り込み要因にもできます)。用途に合う機能を選ぶことで、CPUによる処理の遅れや信号の取りこぼしを抑えやすくなります。

周期処理にタイマを使う方法

周期処理とは、一定時間ごとに決まった処理を繰り返し実行する制御方法です。マイコンではタイマを基準に、LED点滅やセンサ監視、制御演算などを一定間隔で動かします。

メインループでタイマ値を確認して実行する

メインループ内で現在のタイマ値や経過時間を確認し、設定時間が経過したら対象の処理を実行する方法です。ポーリングによる処理は実装が比較的シンプルで、LED点滅、状態監視、通信タイムアウト確認などに活用できます。一方で、メインループ内の処理量に応じて確認タイミングが遅れ、周期がぶれる可能性があるため、厳密な周期精度が必要な処理には向きません。

タイマ割り込みで一定周期ごとに実行する

タイマのオーバーフローや比較一致を契機に割り込みを発生させ、メインループの進行状況に左右されず一定周期で処理を実行する方法です。センサ値の取得、制御演算、カウンタ更新など、タイミングのずれが動作に影響する処理に適しています。

メインループと割り込み処理の役割を分ける

実装時には、メインループと割り込み処理の役割分担が重要です。割り込み処理で時間のかかる処理をおこなうと、他の処理の遅れや割り込みの取りこぼしにつながる場合があります。そのため、割り込み側ではフラグ設定やカウンタ更新などにとどめ、時間のかかる演算や通信処理はメインループ側で実行する設計が基本です。この分担により、周期処理の安定性を保ちやすくなります。

PWM出力でモータやLEDを制御する方法

PWM出力は、一定周期のパルス信号を使い、モータの回転速度やLEDの明るさを調整する方法です。タイマ機能を使えば、CPUで出力を細かく切り替え続けなくても、安定したパルスを生成できます。

タイマのPWMモードで周期とデューティ比を設定する

PWMでは、タイマのカウント周期と比較値を基に、出力のオン時間とオフ時間を決めます。周期はパルスが繰り返される間隔、デューティ比は1周期のうち信号がアクティブ(有効)になっている割合です。実装時は、使用するタイマ、出力チャネル、比較レジスタの値、出力ピンの割り当てを設定します。マイコンによって設定方法は異なるため、使用する周辺機能の仕様を確認することが重要です。

デューティ比を変えて出力の強さを制御する

PWMでは、周期そのものではなくデューティ比を変えることで、出力の強さを調整します。一般的には、デューティ比を高くするとオン時間が長くなり、モータの回転速度を上げたり、LEDを明るくしたりできます。DCモータの速度制御、LEDの調光、パッシブブザーのトーン制御(音程制御)、簡易的な出力制御などが代表的な用途です。

用途にあわせてPWM周波数や出力方式を調整する

PWMを使う際は、用途にあわせて周波数や出力方式を調整します。モータでは可聴域のノイズを避けつつ、周波数を高くしすぎた場合の損失やノイズ対策も考慮します。LEDの調光では、ちらつきが見えにくい周波数を選ぶことが大切です。負荷を直接駆動できない場合は、ドライバICやトランジスタを介して出力し、負荷の特性や部品の仕様にあわせて設定します。

インプットキャプチャで外部信号を測定する方法

インプットキャプチャは、外部信号の変化が起きた瞬間のタイマ値を記録する機能です。信号の周期やパルス幅をソフトウェアだけで測るよりも、タイミングのずれを抑えやすくなります。

入力端子とキャプチャ条件を設定する

インプットキャプチャを使うには、外部信号を入力するピン、使用するタイマ、検出するエッジを設定します。立ち上がりエッジを検出するか、立ち下がりエッジを検出するか、両エッジを検出するかによって測定できる内容は変わります。例えば、同じエッジ間を測定すれば周期を求められ、異なるエッジ間を測定すればパルス幅を確認できます。

キャプチャ値の差分から周期やパルス幅を求める

外部信号のエッジを検出すると、その時点のタイマ値がキャプチャレジスタに保存されます。前回のキャプチャ値と今回のキャプチャ値の差分(カウンタ周回=オーバーフローを考慮)を取ることで、信号の周期やパルス幅を算出できます。周期が分かれば周波数を求められ、オン時間と周期を組みあわせれば、PWM入力信号のデューティ比も算出できます。

測定対象にあわせてタイマ設定を調整する

正確に測定するには、信号の速さにあわせてタイマ設定を調整します。低周波信号では長い時間を測定できるカウント範囲が必要になり、高周波信号では細かい時間差を読み取る分解能が重要です。必要に応じて、タイマクロックを分周するプリスケーラ、カウント幅、入力フィルタなどを設定します。また、タイマがオーバーフローする可能性があるため、測定範囲にあわせて分周・カウント幅を選び、必要ならオーバーフロー回数を加味して計算します。入力ノイズが大きい場合は入力フィルタの適用も検討します。

組み込みソフトの世界 トップへ戻る