最近、https://hidetatz.github.io/diary/#20260909 を読んだ。
プルアップ抵抗については、高専にいたときに必要になって勉強したもののスッと体に入らなくて理解に時間がかかった。
自分なりの理解を共有したい。専門家ではないので間違っていたらごめんなさい。
マイコン外部 マイコン内部
│
VCC │
│ │
R1 │
│ │
●──────── GPIO入力ピン ──-─┤─── 入力回路
│ │ │
SW │ R2
│ │ │
GND │ GND
│
マイコンの入力ピンの奥には入力インピーダンスが存在する。
これは、マイコンの入力に大量の電流が吸われないように、マイコン内部に存在する大きな抵抗源である。100 kΩ - 10M Ω程度と言われている。
自分が使っているESP32 C3というマイコンではHigh-level input currentが50 nAなので3.3 V / 50 nA = 66 MΩと単純計算できる。
https://documentation.espressif.com/esp32-c3_datasheet_en.pdf

つまり、とにかく大きい抵抗が内部にある。
スイッチをOFFにしたとき
R2がR1と比べて十分大きいので、入力ピンはほぼ3.3Vになる。 $$ V = 3.3 \times \frac{R2}{R1 + R2} $$
スイッチをONにしたとき
入力ピンがGNDに接地しているので、0Vになる。
プルアップ抵抗を用意しなくても良いケース
そこそこのマイコンには内部にプルアップ抵抗をつけるオプションがある。例えば、Arduinoにはあり、pinMode(2, INPUT_PULLUP);と指定することで内部プルアップ抵抗を有効化できる。
https://docs.arduino.cc/tutorials/generic/digital-input-pullup/
マイコン内部
┌────────────────────────────┐
│ │
│ VDD(電源) │
│ │ │
│ │ │
│ Rpull-up │
│ (内蔵プルアップ抵抗) │
│ │ │
│ ●──────── 入力バッファ │
│ │ │ │
│ │ Zin │
│ │ │ │
│ │ GND │
└────┼───────────────────────┘
│
GPIOピン
│
スイッチ
│
GND
電圧は相対的な指標であり、絶対的ではない
よくマイコンをいじっていると、3.3 VのHIGHか0 VのLOWかという話があるが、僕は根底にもっと大事な電圧という概念があると思う。
電圧は2点の電位差で定義されており、1点のみでは電圧は決まらないということである。例えば自分が立っている高さはどれくらいか問われたら普通は海抜を0 mとした位置の差を標高とするだろう。一方で、自分が住んでいる寮の1階の床を0 mと定義することもできる点で高さは相対的な指標で絶対的ではない。
マイコンではまずGND = 0 Vを定義し、GNDから3.3 V高い電位をHIGHと呼んでいるだけである。
だから、プルアップをするときにはマイコンと外のGNDを共通化して適切なVCCを印加する必要がある。 極端な例を言えば、プルアップのGNDがなぜかマイコンよりも3.3V高い場合には全ての結論が崩れる。そして、ハイインピーダンス状態(ピンがどこにも接地していない)は基準となる電位が無いため未定義動作を引き起こす。
参考