Chapter 19
GPIO とディジタル入出力
この章がなぜ必要なのか——GPIO は「1 を書けば H が出る」だけの部品ではないから.
- 「プルアップ抵抗は何 kΩ にすればいいのか」
- 「LED の電流制限抵抗はどう決めるのか」
- 「ボタンを押すと 1 回のはずが複数回反応する」
- 「基板を触ると入力が反応する」
- 「5 V のセンサを 3.3 V の MCU に繋いでいいのか」
- 「MCU のピンが壊れた。なぜ?」
GPIO の中身は 出力ドライバ + 入力バッファ + プルアップ/ダウン + 保護ダイオード の 4 つだけである。この 4 つで上記の全部が説明できる。
この章で使う既出の用語(定義は各リンク先). LED(04 章 4 節)、スイッチ(05 章 2 節)、MOSFET(06 章 6 節)、大電流(06 章 6 節)、CMOS(07 章 2 節)、低消費電力(07 章 6 節)、反転(08 章 2 節)、\(V_{DD}\)(11 章 3 節)、74LVC(11 章 6 節)、レベルシフタ(11 章 6 節)、並列(11 章 2 節)、直列(11 章 2 節)、PMOS(14 章 2 節)、ヒステリシス(15 章 6 節)、モード(15 章 9 節)、プルアップ抵抗(16 章 5 節)、トリガ(17 章 6 節)、ハイインピーダンス(18 章 7 節)、容量負荷(18 章 7 節)、後述(18 章 3 節)
1. GPIO ピンの内部構造
この 1 枚の絵から、以下がすべて出る。
| 要素 | 帰結 |
|---|---|
| PMOS + NMOS | プッシュプル出力。H も L も能動的に駆動する |
| PMOS を切れる | オープンドレイン(NMOS だけで駆動、H は外部プルアップ) |
| \(R_{pu}\) / \(R_{pd}\) | 内蔵プルアップ/プルダウン。値は 30〜50 kΩ 程度で精度が悪い |
| シュミットトリガ | ノイズと遅いエッジに耐える(09 章) |
| D1 / D2 | ESD 保護。ここが全ての「壊れた」の原因 |
2. 保護ダイオード——最重要
ピンの電圧が \(V_{DD}+0.7\) V を超えると、D1 が導通して \(V_{DD}\) へ電流が流れる。 ピンの電圧が \(-0.7\) V を下回ると、D2 が導通して GND から電流が流れ込む。
これが「絶対最大定格: \(-0.3\) V 〜 \(V_{DD}+0.3\) V」の意味である。
帰結 1: 5 V を 3.3 V MCU の入力に直結してはいけない
\(5 - 3.3 - 0.7 = 1.0\) V が D1 にかかる。 ダイオードの抵抗が数十 Ω なら 数十 mA が流れる。
| 起きること | 内容 |
|---|---|
| 短期 | ピンの入力値が不定になる。他のピンも誤動作 |
| 中期 | \(V_{DD}\) が押し上げられる(電流が MCU の電源に注入される) |
| 長期 | ラッチアップ(11 章)、または D1 の破壊 |
「5V トレラント」ピンとは.
一部のピンには D1(上側ダイオード)がない、 または高耐圧構造になっている。これが 5V トレラント。
注意点:
- ピンごとに違う。 データシートのピン表で確認すること
- アナログ機能を持つピンは 5V トレラントでないことが多い
- プッシュプル出力に設定すると、5V トレラントでなくなる品種がある (5 V を H に引っ張れないので、実質オープンドレイン専用)
- \(V_{DD}\) が落ちているとき(未電源時)は保証されないことがある
帰結 2: 未電源の MCU に信号を入れてはいけない
\(V_{DD} = 0\) V の MCU の入力ピンに 3.3 V を入れると、 D1 を通って MCU の電源ラインに 3.3 V が回り込む。
これで MCU が「中途半端に起動する」(ファントム給電)。 04 章で扱ったのと同じ現象である。
電源シーケンスの問題(16 章)は、多くがこれである。
帰結 3: 誘導性負荷は必ずクランプする
リレー、ソレノイド、モータをドライブしたあと、 インダクタの逆起電力が数十〜数百 V に達する。
フライホイールダイオードを必ず付ける(04 章)。 MCU の ESD ダイオードは、この電流を流す能力を持っていない。
帰結 4: 保護のしかた
直列抵抗が ESD ダイオードに流れる電流を制限する。
\(R = 10\) kΩ なら、20 V の誤入力でも \((20 - 4.0)/10\text{k} = 1.6\) mA。ダイオードの許容内(通常 数 mA)。
ただし \(R\) と入力容量で帯域が落ちるので、高速信号には使えない。
3. 出力——どれだけ電流を流せるか
出力ドライバは MOSFET である
H を出す = PMOS が ON = ピンが \(R_{DS(on)}\) で \(V_{DD}\) に繋がる
つまり 電流を流すほど、H は下がり L は上がる。
| 典型値 | 内容 |
|---|---|
| \(R_{DS(on)}\) | 30〜100 Ω(ドライブ強度設定で変わる) |
| \(I_{OH}\) / \(I_{OL}\) 定格 | ピンあたり ±4〜20 mA |
| 合計電流の制限 | ポートあたり/チップ全体でも制限がある |
合計電流の制限を見落とすと壊れる.
「1 ピン 20 mA まで」と書いてあっても、 「\(V_{DD}\) ピンからの合計は 100 mA まで」 「ポート A の合計は 60 mA まで」といった別の制限がある。
LED を 8 個直接ドライブして 8×15 = 120 mA は、 個別には合格でも合計で超えている。
LED を光らせる
\(V_{DD}=3.3\) V、赤 LED(\(V_F = 2.0\) V)、\(I = 5\) mA、ドライバ降下 0.15 V:
| LED 色 | \(V_F\) の目安 | 3.3 V で使えるか |
|---|---|---|
| 赤 | 1.8〜2.2 V | ○ |
| 黄・橙 | 2.0〜2.2 V | ○ |
| 緑(旧来 GaP) | 2.0〜2.2 V | ○ |
| 緑(InGaN)・青・白 | 3.0〜3.4 V | △ 余裕がない。昇圧か 5 V が要る |
青・白 LED を 3.3 V で光らせるときの注意.
\(V_F = 3.2\) V だと、抵抗にかけられるのは 0.1 V 未満。 輝度が電源電圧と個体差で激しく変わる。
対策: 定電流ドライバ IC を使う、5 V から引く、昇圧する。
シンク(吸い込み)とソース(吐き出し).
多くの MCU は シンク側のほうが強い(NMOS のほうが PMOS より 同面積で電流を流せるため、05 章)。
多くの MCU はシンク側のほうが強い。大電流が要るならシンク接続にする(ただし論理は反転する) 大きな電流が要るならシンク接続にする。 ただし論理が反転するので、ソフトで注意。
ドライブ強度とスルーレート
多くの MCU は出力の強さ/速さを設定できる。
| 設定 | 効果 | 副作用 |
|---|---|---|
| 強い/速い | 立ち上がりが速い。長い配線や重い容量負荷を駆動できる | EMI が増える。リンギング、グラウンドバウンス |
| 弱い/遅い | EMI が減る | 高速信号が波形として成立しない |
原則: 必要な速度を満たす、最も遅い設定を選ぶ(12 章)。
4. 入力
しきい値
| パラメータ | 意味 |
|---|---|
| \(V_{IH}\) | これ以上なら確実に H と読む |
| \(V_{IL}\) | これ以下なら確実に L と読む |
| 中間 | 不定。読むたびに変わりうる |
CMOS 入力の典型値(3.3 V): \(V_{IL} = 0.99\) V、\(V_{IH} = 2.31\) V (\(0.3V_{DD}\) と \(0.7V_{DD}\))。
シュミットトリガ
MCU の GPIO 入力はほぼすべてシュミットトリガである(09 章)。
- 立ち上がりのしきい値と立ち下がりのしきい値が異なる
- ヒステリシス幅は \(0.1 V_{DD}\) 程度
- 遅いエッジやノイズの乗った信号でも、出力が 1 回だけ切り替わる
それでもチャタリングは止まらない.
シュミットトリガが防ぐのは「1 回のエッジでの多重遷移」である。
機械式スイッチの接点は、物理的に何度も跳ねる(1〜20 ms)。 これは本物の複数エッジなので、シュミットでは消せない。
チャタリング対策:
方法 内容 ソフトウェア(推奨) 10〜50 ms の間、状態が安定していたら確定 RC + シュミット \(\tau\) = 10 ms 程度。放電経路に注意 専用 IC MAX6816 など。高信頼が要る場合 ソフトが最も安く確実である。 割り込みで即座に判定するのではなく、 「割り込みで検出 → タイマで確認」の 2 段構成がよい。
未接続の入力を放置してはいけない
11 章のとおり、CMOS 入力が中間電位になると 貫通電流が流れる。
| 状況 | 対策 |
|---|---|
| 未使用ピン | アナログ入力に設定(最も低リーク)、または出力 L に固定 |
| 外部から駆動されないことがあるピン | プルアップまたはプルダウンを有効に |
| ハイインピーダンス状態のバス | バスホルダまたは外部プルアップ |
「基板を触ると入力が反応する」の正体.
入力ピンがどこにも繋がっていない(フローティング)。 人体が近づくと数 pF の結合で電位が動き、しきい値を跨ぐ。
必ずプルアップかプルダウンを入れること。
5. オープンドレインとプルアップ
なぜオープンドレインが要るのか
| 理由 | 説明 |
|---|---|
| 複数デバイスで 1 本の線を共有する | プッシュプルだと H と L がぶつかって短絡する |
| ワイヤード AND | 1 つでも L に引けば L になる。割り込み線、I2C |
| 電圧の異なる系に繋ぐ | プルアップ先を相手の電源にすればレベル変換になる |
| 誘導性/容量性負荷を安全に | H 側を能動的に駆動しない |
プルアップ抵抗の決め方
2 つの制約に挟まれる。
制約 1(下限): L のときに流れる電流が、ドライバの \(I_{OL}\) 定格以下
\(V_{DD}=3.3\) V、\(V_{OL}=0.4\) V、\(I_{OL}=3\) mA:
制約 2(上限): 立ち上がり時間が許容内
H への遷移は \(R_{pu}\) とバス容量 \(C_b\) の RC で決まる(03 章)。 これがオープンドレインの弱点である。
\(V_{IH} = 0.7V_{DD}\) まで上がる時間は:
I2C 規格の \(t_r\) 上限:
| モード | 速度 | \(t_r\) 上限 |
|---|---|---|
| 標準 | 100 kHz | 1000 ns |
| ファースト | 400 kHz | 300 ns |
| ファーストプラス | 1 MHz | 120 ns |
\(C_b = 150\) pF、400 kHz なら:
1 kΩ 〜 1.67 kΩ の範囲。 意外に狭い。
I2C のプルアップ選定の実際.
条件 推奨値 100 kHz、基板内(\(C_b\) < 50 pF) 4.7 kΩ〜10 kΩ 400 kHz、基板内 2.2 kΩ〜4.7 kΩ 400 kHz、デバイスが多い/配線が長い 1 kΩ〜2.2 kΩ 1 MHz 1 kΩ 以下 + バスバッファ検討 確認方法: オシロで立ち上がり波形を見る。 丸まって指数関数的に上がっているなら、抵抗を下げるか容量を減らす。
プルアップは基板内で 1 セットだけ。 センサモジュールに載っているプルアップが並列に入って、 合成抵抗が下がりすぎる(=ドライバが L に引けない)事故が多い。 例: 4.7 kΩ × 4 モジュール = 1.18 kΩ。
消費電流への影響.
2.2 kΩ のプルアップ 2 本(SDA・SCL)で、 バスが L のとき 3 mA が流れる。
電池駆動では致命的(16 章の計算例では平均 19 µA だった)。 スリープ時はバスを H にしておくか、 プルアップの電源を GPIO で切る設計が要る。
プルアップ抵抗を選ぶ
バス容量・電源電圧・速度を変えて、 立ち上がり波形と \(I_{OL}\) 制約から、使える \(R_{pu}\) の範囲を見る。
6. レベル変換
異なる電源電圧の系を繋ぐ。
| 方向 | 方法 | 注意 |
|---|---|---|
| 高 → 低(3.3 V → 1.8 V など) | 分圧抵抗 | 速度が落ちる。低速のみ |
| 高 → 低 | 専用レベルシフタ IC | 確実 |
| 低 → 高(1.8 V → 3.3 V) | 相手が \(V_{IH}\) を満たすなら不要 | 要確認。3.3 V → 5 V CMOS は多くの場合 NG |
| 低 → 高 | バッファ IC(74LVC など) | 電源が両方要るものと片方でよいものがある |
| 双方向(I2C) | MOSFET 1 個 + プルアップ 2 個 | 定番回路(後述) |
| 双方向 | 自動方向検出 IC | 便利だが制約あり |
MOSFET による双方向レベルシフタ
動作:
- 低圧側が L → NMOS の \(V_{GS} = 1.8\) V で ON → 高圧側も L に引かれる
- 高圧側が L → NMOS のボディダイオードが導通して低圧側が下がり、 さらに \(V_{GS}\) が増えて ON → 両側 L
- どちらも駆動しない → 両側それぞれのプルアップで H
ゲートを低いほうの電源に繋ぐのがポイント。 \(V_{th}\) が低い NMOS(2N7002、BSS138 など)を使う。
注意: この回路も RC で立ち上がる。 オープンドレインの制約(上記)がそのまま効く。 さらに MOSFET の容量が加算されるので、 高速な I2C では専用 IC のほうが安全。
7. その他の実務知識
割り込み入力
| 項目 | 注意 |
|---|---|
| エッジ/レベル | レベルトリガは要因をクリアするまで再入する |
| チャタリング | 割り込みが多重に入る。ソフトでマスクする |
| 共有割り込み線 | 多くの MCU で、同じ番号のピンは 1 本しか使えない(EXTI の制約) |
| ウェイクアップ可能なピン | 限られている。低消費電力設計では最初に確認 |
| ノイズ | 長い配線を割り込みに繋ぐなら、RC + シュミットで鈍らせる |
アナログとディジタルの兼用ピン
| 注意 | 内容 |
|---|---|
| アナログモードではディジタル入力バッファが切れる | 貫通電流もリークも最小 |
| ディジタルのままアナログ電圧を入れると貫通電流 | 必ずアナログモードに設定 |
| 隣接ピンのスイッチングがクロストークになる | ADC 入力の隣に高速信号を置かない |
起動時の状態
| 項目 | 内容 |
|---|---|
| リセット直後は通常「入力・フローティング」 | 外部が定まらないなら外付けプルダウンが要る |
| ブートモードピン | 起動時にサンプルされる。外付けで確定させる |
| 出力を要求される信号 | 例: モータドライバの ENABLE。外付けプルダウンで安全側に固定 |
安全設計の原則.
「MCU が起動していない/暴走している間も安全な状態になる」 ように外付け抵抗で固定する。
- モータドライバの EN → プルダウン(停止側)
- リレー駆動 → プルダウン(OFF 側)
- 電源の EN → 用途による
- 通信の CS → プルアップ(非選択側)
ESD 対策
| 場所 | 対策 |
|---|---|
| 外部コネクタ | TVS をコネクタ直近に。IC の近くでは遅い |
| 押しボタン | 指が触れる。TVS または直列抵抗 |
| 長い配線 | 直列抵抗 + TVS |
| 基板端 | GND ガードリング |
まとめ
| ポイント | 内容 |
|---|---|
| GPIO の中身 | PMOS/NMOS ドライバ + プル抵抗 + シュミット入力 + ESD ダイオード |
| 絶対最大定格 | \(-0.3\) V 〜 \(V_{DD}+0.3\) V。超えると ESD ダイオードが導通 |
| 5V トレラント | ピンごとに違う。アナログ兼用ピンは非対応が多い |
| 未電源への入力 | ファントム給電で MCU が中途半端に起動する |
| 保護 | 直列 1〜10 kΩで ESD ダイオード電流を制限。高速信号には使えない |
| 出力 | \(V_{OH} = V_{DD} - I R_{DS(on)}\)。合計電流の制限を見落とさない |
| LED | \(R = (V_{DD}-V_F-V_{OL})/I\)。青・白は \(V_F\) が高く 3.3 V では厳しい |
| シンク優先 | NMOS のほうが強い。大電流はシンク接続 |
| ドライブ強度 | 必要な速度で最も遅い設定。EMI に直結 |
| チャタリング | シュミットでは消せない。ソフトで 10〜50 ms |
| フローティング入力 | 貫通電流 + 誤動作。必ずプル抵抗か固定出力に |
| プルアップ選定 | 下限は \(I_{OL}\)、上限は \(t_r = 1.2 R C_b\)。400 kHz で 1〜2.2 kΩ |
| プルアップの重複 | モジュール側の抵抗が並列に入る事故が多い |
| 電池駆動 | プルアップは常時電流を食う。mA 単位になる |
| レベル変換 | MOSFET 1 個 + プルアップ 2 個が双方向の定番 |
| 起動時の安全 | MCU が動いていない間も安全な側に外付けで固定する |
次章では、この GPIO の上に載るシリアル通信の物理層を扱う。