TL

タイマ/カウンタ(PWM・キャプチャ・コンペア)

モータ制御やLED調光、周期測定でつまずく前に読む。カウンタとプリスケーラで時間を刻み、コンペアでPWMを吐き、キャプチャでパルス幅を測る——タイマ周辺機能の内部動作を原理から押さえられる。

応用組み込みタイマPWMマイコンペリフェラル最終更新: 2026-06-21
TL;DR要点だけ先に
  • 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出力とデッドタイム生成、非常停止入力(ブレーク機能)をハードウェアで備えます。

CCRの書き換えはプリロードで同期する

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の実行が多少遅れても次の割り込みタイミングはずれない ことです。ソフトのループと違い、位相がドリフトしないので、制御周期やサンプリング周期の基準として信頼できます。

ジッタを避けるならPWMやDMAでCPUを外す

「周期割り込みの中で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、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
  • 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。

次に確認する観点

組み込みタイマPWMマイコンペリフェラル組み込みタイマPWM