組み込み回路 19 · GPIO とディジタル入出力

Chapter 19

GPIO とディジタル入出力

この章がなぜ必要なのか——GPIO は「1 を書けば H が出る」だけの部品ではないから.

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 ピンの内部構造

GPIO ピンの内部MCU の内部VDDPMOSNMOS出力ピンVDDD1D2R_puVDDR_pdシュミット入力バッファ入力レジスタへD1 / D2 が「壊れた」の原因のほぼ全部定格 −0.3 V 〜VDD+0.3 V
この 1 枚で GPIO の疑問はほぼ全部説明できる。出力ドライバ・プル抵抗・シュミット入力・ESD ダイオード

この 1 枚の絵から、以下がすべて出る。

要素帰結
PMOS + NMOSプッシュプル出力。H も L も能動的に駆動する
PMOS を切れるオープンドレイン(NMOS だけで駆動、H は外部プルアップ)
\(R_{pu}\) / \(R_{pd}\)内蔵プルアップ/プルダウン。値は 30〜50 kΩ 程度で精度が悪い
シュミットトリガノイズと遅いエッジに耐える(09 章)
D1 / D2ESD 保護。ここが全ての「壊れた」の原因

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 トレラント。

注意点:

帰結 2: 未電源の MCU に信号を入れてはいけない

\(V_{DD} = 0\) V の MCU の入力ピンに 3.3 V を入れると、 D1 を通って MCU の電源ラインに 3.3 V が回り込む。

これで MCU が「中途半端に起動する」(ファントム給電)。 04 章で扱ったのと同じ現象である。

電源シーケンスの問題(16 章)は、多くがこれである。

帰結 3: 誘導性負荷は必ずクランプする

リレー、ソレノイド、モータをドライブしたあと、 インダクタの逆起電力が数十〜数百 V に達する。

フライホイールダイオードを必ず付ける(04 章)。 MCU の ESD ダイオードは、この電流を流す能力を持っていない。

帰結 4: 保護のしかた

外部信号R = 1k〜10kMCU ピンTVS(必要なら)
直列抵抗が ESD ダイオードに流れる電流を制限する。ただし入力容量と組んで帯域が落ちる

直列抵抗が 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}\) に繋がる

\[ V_{OH} = V_{DD} - I_{OUT} \times R_{DS(on),PMOS}, \qquad V_{OL} = I_{OUT} \times R_{DS(on),NMOS} \]

つまり 電流を流すほど、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 を光らせる

\[ R = \frac{V_{DD} - V_F - V_{OL(driver)}}{I_{LED}} \]

\(V_{DD}=3.3\) V、赤 LED(\(V_F = 2.0\) V)、\(I = 5\) mA、ドライバ降下 0.15 V:

\[ R = \frac{3.3 - 2.0 - 0.15}{0.005} = 230\ \Omega \Rightarrow 220\ \Omega \]
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 章)。

ソース接続(H で点灯)ピンRPMOS が駆動する→ 電流はやや小さめシンク接続(L で点灯)VDDRピンNMOS が駆動する→ 大きな電流を扱える
多くの 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 章)。

それでもチャタリングは止まらない.

シュミットトリガが防ぐのは「1 回のエッジでの多重遷移」である。

機械式スイッチの接点は、物理的に何度も跳ねる(1〜20 ms)。 これは本物の複数エッジなので、シュミットでは消せない。

チャタリング対策:

方法内容
ソフトウェア(推奨)10〜50 ms の間、状態が安定していたら確定
RC + シュミット\(\tau\) = 10 ms 程度。放電経路に注意
専用 ICMAX6816 など。高信頼が要る場合

ソフトが最も安く確実である。 割り込みで即座に判定するのではなく、 「割り込みで検出 → タイマで確認」の 2 段構成がよい。

未接続の入力を放置してはいけない

11 章のとおり、CMOS 入力が中間電位になると 貫通電流が流れる。

状況対策
未使用ピンアナログ入力に設定(最も低リーク)、または出力 L に固定
外部から駆動されないことがあるピンプルアップまたはプルダウンを有効に
ハイインピーダンス状態のバスバスホルダまたは外部プルアップ

「基板を触ると入力が反応する」の正体.

入力ピンがどこにも繋がっていない(フローティング)。 人体が近づくと数 pF の結合で電位が動き、しきい値を跨ぐ。

必ずプルアップかプルダウンを入れること。

5. オープンドレインとプルアップ

なぜオープンドレインが要るのか

理由説明
複数デバイスで 1 本の線を共有するプッシュプルだと H と L がぶつかって短絡する
ワイヤード AND1 つでも L に引けば L になる。割り込み線、I2C
電圧の異なる系に繋ぐプルアップ先を相手の電源にすればレベル変換になる
誘導性/容量性負荷を安全にH 側を能動的に駆動しない

プルアップ抵抗の決め方

2 つの制約に挟まれる。

制約 1(下限): L のときに流れる電流が、ドライバの \(I_{OL}\) 定格以下

\[ R_{pu} \geq \frac{V_{DD} - V_{OL}}{I_{OL}} \]

\(V_{DD}=3.3\) V、\(V_{OL}=0.4\) V、\(I_{OL}=3\) mA:

\[ R_{pu} \geq \frac{2.9}{0.003} = 967\ \Omega \Rightarrow 1\ \text{k}\Omega\ \text{以上} \]

制約 2(上限): 立ち上がり時間が許容内

H への遷移は \(R_{pu}\) とバス容量 \(C_b\) の RC で決まる(03 章)。 これがオープンドレインの弱点である。

\(V_{IH} = 0.7V_{DD}\) まで上がる時間は:

\[ t_r = R_{pu}C_b \ln\frac{1}{1-0.7} = 1.2\,R_{pu}C_b \]

I2C 規格の \(t_r\) 上限:

モード速度\(t_r\) 上限
標準100 kHz1000 ns
ファースト400 kHz300 ns
ファーストプラス1 MHz120 ns

\(C_b = 150\) pF、400 kHz なら:

\[ R_{pu} \leq \frac{300\times10^{-9}}{1.2 \times 150\times10^{-12}} = 1.67\ \text{k}\Omega \]

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 MHz1 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 による双方向レベルシフタ

MOSFET 1 個による双方向レベルシフタ1.8 VR1.8 V 側3.3 VR3.3 V 側ゲートは低いほうの電源(1.8 V)へ低圧側が L → V_GS = 1.8 V でオン。高圧側が L → ボディダイオードで下がってさらにオン。どちらも駆動しなければ両側のプルアップで H
V_th の低い NMOS(BSS138 など)を使う。ただし立ち上がりは RC なので、高速な I2C では専用 IC を

動作:

ゲートを低いほうの電源に繋ぐのがポイント。 \(V_{th}\) が低い NMOS(2N7002、BSS138 など)を使う。

注意: この回路も RC で立ち上がる。 オープンドレインの制約(上記)がそのまま効く。 さらに MOSFET の容量が加算されるので、 高速な I2C では専用 IC のほうが安全。

7. その他の実務知識

割り込み入力

項目注意
エッジ/レベルレベルトリガは要因をクリアするまで再入する
チャタリング割り込みが多重に入る。ソフトでマスクする
共有割り込み線多くの MCU で、同じ番号のピンは 1 本しか使えない(EXTI の制約)
ウェイクアップ可能なピン限られている。低消費電力設計では最初に確認
ノイズ長い配線を割り込みに繋ぐなら、RC + シュミットで鈍らせる

アナログとディジタルの兼用ピン

注意内容
アナログモードではディジタル入力バッファが切れる貫通電流もリークも最小
ディジタルのままアナログ電圧を入れると貫通電流必ずアナログモードに設定
隣接ピンのスイッチングがクロストークになるADC 入力の隣に高速信号を置かない

起動時の状態

項目内容
リセット直後は通常「入力・フローティング」外部が定まらないなら外付けプルダウンが要る
ブートモードピン起動時にサンプルされる。外付けで確定させる
出力を要求される信号例: モータドライバの ENABLE。外付けプルダウンで安全側に固定

安全設計の原則.

「MCU が起動していない/暴走している間も安全な状態になる」 ように外付け抵抗で固定する。

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 の上に載るシリアル通信の物理層を扱う。