タイマ/カウンタ(PWM・キャプチャ・コンペア)
モータ制御やLED調光、周期測定でつまずく前に読む。カウンタとプリスケーラで時間を刻み、コンペアでPWMを吐き、キャプチャでパルス幅を測る——タイマ周辺機能の内部動作を原理から押さえられる。
- 1.タイマの中核は自走するカウンタとプリスケーラ。クロックを分周してカウンタを進め、周期は分周比とオートリロード値(ARR)で決まる。
- 2.出力コンペアはカウンタ値とコンペア値を比較して出力を反転/設定し、PWMを生成する。デューティ比はコンペア値÷周期で、CPUを介さず波形が出続ける。
- 3.入力キャプチャはエッジ検出の瞬間にカウンタ値をラッチし、周期やパルス幅を測る。2エッジ間のカウント差が時間、エンコーダモードは2相を数えて回転量を得る。
時間を「数える」ハードウェア
マイコンで「10ミリ秒ごとに制御ループを回す」「LEDを30%の明るさで光らせる」「入力パルスの幅を測る」——これらはすべて、ソフトウェアのループで数えていては精度も分解能も足りません。CPUが割り込みや他の処理で忙しければ、待ちループのカウントは簡単にずれます。そこで タイマ/カウンタ(timer/counter) という専用ペリフェラルが、クロックを数える仕事をハードウェアに肩代わりさせます。
タイマの本体は、クロックのたびに1ずつ増える(または減る)カウンタレジスタ です。これが自走し続けることを土台に、コンペアで波形を出す(PWM)、キャプチャで外部イベントの時刻を記録する、といった機能が積み上がります。本稿ではこのカウンタの計数から、PWM生成・パルス幅測定・エンコーダ計数・タイマ割り込みまでを、内部で何が起きているかに踏み込んで追います。周期割り込みで駆動する制御ループの割り込み側は /embedded/interrupt-handling-isr/ も併せて読むと理解が立体的になります。
カウンタとプリスケーラ:周期はどう決まるか
タイマに入るクロック(タイマクロック)は、しばしばシステムクロックそのままで、数十MHz〜数百MHzと速すぎます。そのままカウンタに入れると、たとえば16ビットカウンタ(0〜65535)は72MHzなら1ミリ秒足らずで一周してしまい、長い周期が作れません。これを解決するのが プリスケーラ(prescaler) です。
プリスケーラは入力クロックを整数比で分周するカウンタで、「N+1回に1回だけ本体カウンタを進める」働きをします。分周後の1カウントあたりの時間は次のようになります。
[タイマの時間分解能と周期]
tick周期 = (プリスケーラ値 + 1) / タイマクロック周波数
カウンタ周期 = (ARR + 1) × tick周期
= (PSC + 1) × (ARR + 1) / f_timer
例: f_timer = 72 MHz, PSC = 71, ARR = 999
tick = 72 / 72e6 = 1 μs
周期 = 1000 × 1 μs = 1 ms → 1 kHz の周期タイマ
ここで ARR(Auto-Reload Register、オートリロードレジスタ) は、カウンタが数え上がる上限値です。アップカウントの場合、カウンタはARRに達すると次のtickで0へ戻り(ラップし)、同時に 更新イベント(update event) を発生させます。この「一周した」という合図が、周期割り込みやPWMの1周期の区切りになります。分周(PSC)で粗く、ARRで細かく周期を刻む二段構えにより、遅い周期から速い周期まで広い範囲を1つのタイマでカバーできるわけです。
プリスケーラを大きくすると1tickが長くなり、長い周期を作れますが、そのぶん時間分解能(測れる/出せる最小刻み)は粗くなります。逆にプリスケーラを小さくすると分解能は上がるものの、カウンタがすぐ一周して長い周期が作れません。「必要な分解能を満たす範囲で、できるだけ分周を抑える」のが設定の勘どころです。16ビットでは足りない用途向けに、32ビットカウンタや、2つのタイマを連結して分解能と周期を両立させる構成もあります。
出力コンペアとPWM生成
カウンタが自走しているとき、コンペアレジスタ(CCR: Capture/Compare Register) に値を書いておくと、ハードウェアは毎tickで「カウンタ値とCCRが一致したか」を比較します。一致した瞬間に出力ピンを設定・クリア・反転する——これが 出力コンペア(output compare) です。CPUは一度設定すれば、あとは介入なしに波形が出続けます。
この仕組みで PWM(Pulse Width Modulation、パルス幅変調) を作ります。エッジアライン(左詰め)PWMの典型的な動作は次の通りです。
[エッジアラインPWMの1周期]
カウンタ: 0 ─────► CCR ─────► ARR ─(ラップ)─► 0 ...
・カウンタ = 0(更新イベント) → 出力を High にセット
・カウンタ = CCR(コンペア一致) → 出力を Low にクリア
・カウンタ = ARR で 0 へ戻り次周期へ
結果の波形:
┌────────┐ ┌────────┐
───┘ └─────────┘ └───
0 CCR ARR 周期の繰り返し
デューティ比 = CCR / (ARR + 1)
PWM周波数 = f_timer / ((PSC+1) × (ARR+1))
つまり CCRの値がそのままオン時間(デューティ比)を決める。CCRを大きくすればHigh区間が伸び、平均電圧が上がります。ARRで決まる周期は一定のまま、CCRだけを書き換えれば、LEDの明るさやモータへの印加電圧を滑らかに変えられます。周波数を固定したまま実効電力だけを連続的に制御できる点が、PWMがモータ制御・電源・調光で使われる理由です。
上のエッジアラインに対し、カウンタをアップ/ダウンで往復させる センターアライン(位相基準)PWM は、パルスが周期の中心に対して対称になり、モータ制御で低次高調波を抑えられます。さらにハーフブリッジ/フルブリッジ駆動では、上下スイッチが同時にオンして電源を短絡する「貫通電流」を防ぐため、両者のオン区間の間に強制的に隙間を入れる デッドタイム挿入 が要ります。モータ制御に特化した「アドバンストタイマ」は、相補PWM出力とデッドタイム生成、非常停止入力(ブレーク機能)をハードウェアで備えます。
PWM動作中にCCRやARRを不用意に書き換えると、周期の途中で値が変わり、その周期だけパルス幅が乱れる(グリッチ)ことがあります。多くのタイマはCCR/ARRに プリロード(シャドウレジスタ) を備え、書き込んだ値をいったん影のレジスタに溜め、更新イベント(周期の境目)でまとめて実レジスタへ反映します。これを有効にすれば、値の切り替えが必ず周期境界で起きるため、デューティ比を動的に変えても波形が乱れません。
入力キャプチャ:周期とパルス幅を測る
出力コンペアが「カウンタ値を出力イベントに変える」のに対し、入力キャプチャ(input capture) は逆に「外部エッジの瞬間のカウンタ値を記録する」機能です。入力ピンに指定したエッジ(立ち上がり/立ち下がり)が来ると、その瞬間のカウンタ値がハードウェアによってCCRへ即座にラッチされ、キャプチャ割り込みを上げます。
肝は、ラッチがハードウェアで行われるため、割り込み応答の遅れ(レイテンシ)に測定精度が左右されない ことです。ソフトウェアがカウンタを読みに行くと、割り込みが遅れたぶんだけ誤差が乗りますが、キャプチャはエッジと同時に値が凍結されるので、後からCPUがCCRを読めば正確なエッジ時刻が得られます。
[2エッジのキャプチャで周期・パルス幅を測る]
信号: ──┐ ┌────────┐ ┌──
└────────┘ └────────┘
↑立下り ↑立上り ↑立下り
cap1 cap2 cap3
周期 = cap3 - cap1 (同極性エッジの間隔)
Highパルス幅 = cap3 - cap2 (立上りと直後の立下りの間隔)
時間換算 = カウント差 × tick周期
周波数測定は「2つの立ち上がりエッジ間のカウント差」を時間へ換算して逆数を取る、パルス幅測定は「立ち上がりと直後の立ち下がりのカウント差」で得ます。多くのタイマは1入力を2つのキャプチャチャネルに同時に配線し、片方で立ち上がり、もう片方で立ち下がりを捉える PWM入力モード を持ち、周期とデューティ比を一度に測れます。
測定周期がカウンタの一周より長いと、cap間でカウンタがラップし、単純な引き算が負になったり誤った小さい値になったりします。更新イベント(オーバーフロー)の回数を割り込みで数え、上位カウントとして合成する必要があります。もう一つの落とし穴が オーバーキャプチャ:前回のキャプチャ値をCPUが読む前に次のエッジが来ると値が上書きされ、取りこぼしをオーバーキャプチャフラグが知らせます。高頻度の入力ではCPU読み出しが間に合わず、キャプチャからDMAへ値を吸い出す構成が定石です。タイマトリガのDMAは /embedded/dma-transfers/ を参照してください。
エンコーダモード:回転を数える
インクリメンタルロータリエンコーダは、90度位相のずれた2つの矩形波(A相・B相)を出します。この位相差から回転方向が、エッジ数から回転量が分かります。多くのタイマは エンコーダモード を内蔵し、A相・B相を2つのタイマ入力に与えると、ハードウェアが両相のエッジを見て カウンタを自動で増減 します。CPUはカウンタを読むだけで位置が得られます。
| 方式 | 計数するエッジ | 分解能 | 備考 |
|---|---|---|---|
| x1 | 片相の片エッジのみ | 1逓倍 | 実装は軽いが分解能は最低 |
| x2 | 片相の両エッジ | 2逓倍 | 分解能と負荷の折衷 |
| x4(4逓倍) | A相・B相の両エッジ | 4逓倍 | 最も高分解能、タイマ標準 |
方向判定の原理は、あるエッジが来た瞬間にもう一方の相がHighかLowかを見ることです。たとえばA相立ち上がり時にB相がLowなら正転、Highなら逆転、というように、2相の組み合わせ({A,B} の遷移)から進む向きが一意に決まり、カウンタを+1/−1します。チャタリング(接点のばたつき)による誤カウントを避けるため、入力に デジタルフィルタ(数サンプル連続で同値なら確定)を掛けられるタイマが多く、機械式エンコーダでは有効化が実務上ほぼ必須です。
タイマ割り込みとイベント
タイマは各所でイベントを発生させ、割り込みやDMA要求に変換します。主なものは次の通りです。
| イベント | 発生タイミング | 主な用途 |
|---|---|---|
| 更新(オーバーフロー) | カウンタがARRに達し0へ戻る周期の境目 | 周期割り込み、制御ループの起床、ラップ計数 |
| コンペア一致 | カウンタ=CCRになった瞬間 | PWMのエッジ、指定時刻でのアクション、位相ずれ割り込み |
| キャプチャ | 入力エッジを検出した瞬間 | 周期・パルス幅測定、外部イベントのタイムスタンプ |
最も多用されるのが更新イベントによる 周期割り込み で、「一定周期で必ず1回」という時間基準を作ります。RTOSのシステムティック(スケジューラの時間刻み)も、多くはこの周期タイマ割り込みが土台です。ここで重要なのは、周期タイマがハードウェアで時刻を刻む以上、ISRの実行が多少遅れても次の割り込みタイミングはずれない ことです。ソフトのループと違い、位相がドリフトしないので、制御周期やサンプリング周期の基準として信頼できます。
「周期割り込みの中でGPIOをトグルして波形を作る」設計は、割り込みレイテンシのばらつき(ジッタ)がそのまま波形のエッジ揺れになります。正確な波形が要るなら、エッジ生成はコンペア出力(PWM)にハードウェアで任せ、CPUはデューティ比の更新だけを行うのが定石です。同様に、一定周期のデータ出力はタイマ更新をトリガにDMAで流せば、CPUの割り込み処理を完全に外せます。周期タイマは低消費電力の定期起床にも使われ、スリープ運用は /embedded/low-power-sleep-modes/ が詳しいです。
「PWM周波数とデューティ比の式」は『周波数 = f_timer /((PSC+1)×(ARR+1))、デューティ = CCR/(ARR+1)』。「入力キャプチャの利点」は『エッジと同時にハードがカウンタ値をラッチするため、割り込み遅延に測定精度が影響されない』。「周期割り込みがドリフトしない理由」は『次の満了時刻をハードウェアが刻むから』。エンコーダの4逓倍(両相・両エッジ)、CCRプリロードで周期境界に反映、ラップ時の上位カウント合成、まで押さえると強い。
まとめ
タイマ/カウンタは、プリスケーラで分周したクロックをカウンタで数えることを土台に、コンペアで波形を出し(PWM)、キャプチャで外部イベントの時刻を測り、エンコーダモードで回転を数え、更新イベントで周期割り込みを供給する、多機能な時間エンジンです。周期は (PSC+1)×(ARR+1)/f_timer、PWMのデューティ比は CCR/(ARR+1) という2本の関係式が設計の背骨になります。要点は、時間に関わる正確さの必要な部分(波形エッジ・エッジ時刻・周期基準)をCPUのソフトループから切り離し、ハードウェアに刻ませること。これがジッタとドリフトを避け、CPUを解放する組み込み制御の定石です。より上位の制御則やサンプリングの設計は /dsp-control/ も参照してください。
組込み・IoT Article
タイマ/カウンタ(PWM・キャプチャ・コンペア)を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
組み込み
比較で見る軸
難易度: advanced / カテゴリ: 組込み・IoT / タグ数: 5
導入後に効く点
出力コンペアはカウンタ値とコンペア値を比較して出力を反転/設定し、PWMを生成する。デューティ比はコンペア値÷周期で、CPUを介さず波形が出続ける。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- 組込み・IoT
- タグ数
- 5
判断チェックリスト
- 自社の用途が「組み込み / タイマ」に近いか確認する。
- 強みである「タイマの中核は自走するカウンタとプリスケーラ。クロックを分周してカウンタを進め、周期は分周比とオートリロード値(ARR)で決まる。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。