変更要約: 初版
4.5GPIO・バス・タイマ
汎用入出力ピンGPIOの入力回路設計(プルアップ・オープンドレイン)、CPUと周辺デバイスを結ぶアドレスバス/データバス/制御バス、そして時間計測・波形生成を担う入力キャプチャ・出力コンペア・PWMタイマ機能を学び、組込みハードウェアの基礎的な入出力設計判断力を養います。
組込み機器の基礎的な入出力を支えるのがGPIO(汎用入出力ピン)とバス(CPU-周辺デバイス間の配線)、そしてタイマ(時間計測・波形生成)です。これらは地味に見えて、入力回路の設計を誤ると誤動作し、バス設計を誤ると性能が出ず、タイマ機能を使い分けられないと時間計測や波形生成に無駄なCPU負荷がかかるという、組込み設計の土台を支える技術です。この節では、それぞれの正しい使い方と設計判断を学びます。
4.5.1GPIOとプルアップ/オープンドレイン
- GPIO(General Purpose Input/Output)=ソフトウェアから入力/出力・Hi/Lowを設定できる汎用ピン。入力として使う場合、未接続(Hi-Z:ハイインピーダンス)状態のピンは電位が不定になり、外来ノイズを拾って誤ったHigh/Lowを検出する原因になる。プルアップ抵抗(ピンを電源電圧側へ弱く引き上げる)またはプルダウン抵抗(GND側へ引き下げる)を入れることで、スイッチが開いている(未接続)時のデフォルト電位を確定させ、誤動作を防ぐ。
- オープンドレイン(オープンコレクタ)出力=出力段がHigh側のトランジスタを持たず、Lowへの引き込みしかできない(Highにするには外付けのプルアップ抵抗が必須)出力方式。この方式の利点は、複数デバイスの出力を1本の信号線に接続しても、どれか1つでもLowを出せば線全体がLowになる(ワイヤードAND)ため、I2Cのように複数デバイスが同じ線を共有するバスに向く点。プッシュプル出力(High/Low両方を能動的に駆動)と異なり、複数出力の競合による短絡(バス衝突)が起きない。
4.5.2アドレスバス・データバス・制御バス
- CPUと周辺デバイス(メモリ・I/O)を結ぶバスは3種類に大別される。アドレスバス=CPUがどのメモリ番地/デバイスにアクセスするかを指定する信号線群で、ビット幅がアドレス空間の広さ(アクセス可能な最大メモリ容量)を決める(例:アドレスバスがnビットなら最大2^n番地を指定できる)。データバス=実際にやり取りされるデータの信号線群で、ビット幅が一度に転送できるデータ量(性能)を決める。
- 制御バス=読み出し/書き込みの区別(
R/W)・データ有効タイミング・割込み要求・バス調停信号などを伝える信号線群で、アドレスバスとデータバスが「どこに何を」運ぶのに対し、制御バスは「いつ・どう扱うか」というタイミング/動作の指示を運ぶ点が本質的な違い。3つのバスが揃って初めてCPUと周辺デバイス間のメモリマップドI/Oアクセスが正しく成立する。
「プルアップ/プルダウン=未接続時の電位を確定させ誤動作を防ぐ」「オープンドレイン=Lowのみ駆動・ワイヤードANDでバス共有向き」「アドレスバス幅=アドレス空間、データバス幅=転送性能、制御バス=タイミング/動作指示」が最頻出です。オープンドレインを「Highも能動的に駆動できる」と誤解しないこと——Highへの復帰はプルアップ抵抗頼みです。
4.5.3入力キャプチャ・出力コンペア・PWMタイマ
- 入力キャプチャ=外部信号のエッジ(立ち上がり/立ち下がり)が来た瞬間のタイマカウンタ値を自動的にレジスタへ記録する機能。CPUがポーリングで信号変化を監視する必要がなく、割込みハンドラでキャプチャ値を読むだけで正確なタイミング(パルス幅・周期)を計測できるため、CPU負荷をかけずに高精度な時間計測ができる。
- 出力コンペア=タイマカウンタがあらかじめ設定した値に達した瞬間に自動的にピンの出力レベルを変化させる(または割込みを発生させる)機能。CPUがループで時間を監視して手動でピンを切り替える必要がなく、正確なタイミングで矩形波・パルスを生成できる。PWMタイマ機能は、この出力コンペアを周期的に繰り返し、デューティ比を変えることで実効電圧を制御する応用形。
ある組込み技術者が、超音波距離センサ(パルスを送信し、反射波を受信するまでの時間から距離を算出するセンサ)のドライバを実装しているとします。当初の実装では、CPUがソフトウェアループで受信ピンの状態をポーリングし続け、Highに変化した瞬間の時刻をmillis()関数で記録する方式を採っていましたが、他の処理(通信・センサ読み取り等)でループが遅延すると、実際のエッジ発生から検出までに数ミリ秒のずれが生じ、距離計算の精度が大きくばらつくという不具合に直面します。この原因はポーリング方式の本質的な弱点で、CPUが別の処理をしている間はエッジの発生タイミングを正確に捉えられないためです。対処として、MCUの入力キャプチャ機能に切り替えます——受信ピンをタイマの入力キャプチャチャネルに割り当てれば、エッジが来た瞬間のタイマカウンタ値がハードウェアで自動的にレジスタへ記録されるため、CPUが他の処理でどれだけ遅延していても、キャプチャされた値自体は正確です。CPUは都合の良いタイミングで割込みハンドラ内のキャプチャレジスタを読むだけで、正確なパルス幅(=反射までの時間)を計算できます。同様に、超音波の送信パルス自体も、CPUがソフトウェアループでピンをHigh/Low切替する方式では正確な幅(例えば10マイクロ秒)を作るのが困難ですが、出力コンペア機能でタイマカウンタが目標値に達した瞬間に自動でピンをLowへ戻す設計にすれば、CPU負荷やソフトウェア遅延に左右されない正確なパルス幅生成ができます。ここで注意すべきひっかけは「ポーリングでも十分に高速なループを書けば入力キャプチャと同等の精度が出せる」という誤解です——割込み駆動のポーリングであってもCPUが他のタスクを実行している間は原理的に取りこぼしうるのに対し、入力キャプチャはハードウェアが独立して動作するため、タイミング精度が要求される用途ではポーリングではなく専用タイマ機能を使うのが正しい設計判断です。
| 機能 | 動作 | 用途 |
|---|---|---|
| 入力キャプチャ | エッジ発生瞬間のカウンタ値を自動記録 | パルス幅・周期の高精度計測 |
| 出力コンペア | カウンタが設定値到達時に自動でピン出力/割込み | 正確なタイミングでの矩形波・パルス生成 |
| PWM | 出力コンペアを周期的に繰り返しデューティ比を変える | モータ速度・LED輝度など実効電圧の制御 |
ひっかけ: 「十分に高速なポーリングループを書けば入力キャプチャと同じ精度のタイミング計測ができる」は誤りです——CPUが他のタスクを実行している間はポーリングでは原理的にエッジを取りこぼしうるのに対し、入力キャプチャはハードウェアが独立して動作するためCPU負荷に左右されません。また「オープンドレイン出力はプルアップ抵抗なしでもHighを出力できる」も誤り=オープンドレインはLowへの引き込みしかできず、Highへの復帰は外付けプルアップ抵抗頼みです。
4.5.4この節のまとめ
- プルアップ/プルダウンは未接続時の電位を確定、オープンドレインはLowのみ駆動しワイヤードANDでバス共有に向く
- アドレスバス幅=アドレス空間、データバス幅=転送性能、制御バス=タイミング/動作の指示
- 入力キャプチャ/出力コンペア/PWMはハードウェアが独立動作しCPU負荷やソフト遅延に左右されない高精度な計測/生成を実現
進捗の記録にはログインが必要です。
理解度チェック
(軽い確認用)Q1. 超音波距離センサの受信パルスの立ち上がりタイミングを、CPUが他の処理で遅延していても正確に記録したい。最も適した方式はどれか。
Q2. 複数のデバイスが同じ信号線を共有し、どれか1つでもLowを出せば線全体がLowになるバス構成を実現したい。この出力方式として最も適切なものはどれか。
Q3. CPUと周辺デバイスを結ぶバスのうち、読み出し/書き込みの区別やデータ有効タイミングなど「いつ・どう扱うか」を伝える信号線群はどれか。

