コンテンツにスキップ

Pull-up / Pull-down

Pull-up / Pull-downとは

Pull-up(プルアップ)とPull-down(プルダウン)は、デジタル入力端子の状態を安定させるために使用される抵抗である。

マイコンの入力ピンを何も接続せずに放置すると、入力状態が不安定になる。

これを防ぐためにPull-up抵抗やPull-down抵抗を使用する。


なぜ必要なのか

例えばSTM32のGPIO入力を以下のように接続したとする。

GPIO
 │
(未接続)

この状態では入力電圧が定まらない。

その結果、

0
1
0
1
1
0
1
...

のようにランダムな値を読み取ることがある。

これをフローティング(Floating)状態という。


Pull-up抵抗

Pull-up抵抗は入力を通常時にHighへ固定するための抵抗である。

回路例

3.3V
 │
[10kΩ]
 │
GPIO
 │
SW
 │
GND

スイッチOFF

SW = OFF

の場合

GPIO = High

となる。


スイッチON

SW = ON

の場合

GPIO = Low

となる。


動作イメージ

OFF → 1

ON → 0

Pull-down抵抗

Pull-down抵抗は入力を通常時にLowへ固定するための抵抗である。

回路例

3.3V
 │
SW
 │
GPIO
 │
[10kΩ]
 │
GND

スイッチOFF

GPIO = Low

スイッチON

GPIO = High

動作イメージ

OFF → 0

ON → 1

なぜ抵抗が必要なのか

もし抵抗を使わずに直接接続すると、

3.3V
 │
GPIO
 │
SW
 │
GND

スイッチを押した瞬間

3.3V
 ↓
GND

が直接つながる。

これをショート(短絡)という。

大電流が流れて部品を破損する可能性がある。


抵抗を入れることで電流を制限できる。


よく使われる抵抗値

一般的には以下の値が使用される。

抵抗値 用途
1kΩ 強いPull
4.7kΩ I2Cなど
10kΩ 最も一般的
47kΩ 消費電力重視
100kΩ 弱いPull

STM32では10kΩがよく利用される。


STM32の内部Pull-up / Pull-down

STM32には内部Pull-upとPull-downが搭載されている。

そのため外付け抵抗が不要な場合も多い。


CubeMX設定例

GPIO Mode

Input Pull-Up

または

Input Pull-Down

を選択するだけで利用できる。


内部Pull-upの仕組み

内部では以下のような抵抗が自動で接続される。

3.3V
 │
[内部抵抗]
 │
GPIO

通常は30kΩ~50kΩ程度である。


スイッチ回路での利用

最もよく使われる例である。


Pull-up方式

3.3V
 │
[10kΩ]
 │
GPIO
 │
SW
 │
GND

状態

押していない → High

押した → Low

STM32開発ではこの構成が非常に多い。


I2CとPull-up抵抗

I2CではPull-up抵抗が必須である。


I2C信号

SCL

SDA

はオープンドレイン方式で動作する。

そのため、

3.3V
 │
[4.7kΩ]
 │
SDA

のようなPull-up抵抗が必要になる。


3.3V
 │
├─4.7kΩ─ SDA
 │
└─4.7kΩ─ SCL

オープンドレインとの関係

オープンドレイン出力は

Low

しか出力できない。

HighはPull-up抵抗によって作られる。


そのため

I2C

割り込み信号

リセット信号

などで頻繁に利用される。


Pull-upとPull-downの選び方

一般的にはPull-upの方が利用されることが多い。

理由

  • 多くのマイコンが内部Pull-upを搭載
  • I2Cでも利用される
  • ノイズ耐性が高い場合が多い

Asterでの利用例

Asterでは以下の場所で利用される可能性がある。

DIPスイッチ

GPIO
 ↓
Pull-up
 ↓
DIP SW
 ↓
GND

ボタン入力

GPIO
 ↓
Pull-up
 ↓
Push SW
 ↓
GND

I2C通信

SDA
 ↓
4.7kΩ
 ↓
3.3V
SCL
 ↓
4.7kΩ
 ↓
3.3V

よくあるトラブル

Pull抵抗を付け忘れる

入力がフローティング状態になり誤動作する。


Pull-upとPull-downを逆に設定する

押した時の判定が逆になる。


I2CにPull-upが無い

通信できなくなる。


抵抗値が小さすぎる

無駄な電流が流れる。


抵抗値が大きすぎる

ノイズの影響を受けやすくなる。


まとめ

Pull-upとPull-downは入力信号を安定させるための抵抗である。

  • フローティング状態を防ぐ
  • スイッチ入力でよく利用される
  • STM32には内部Pull機能がある
  • I2CではPull-up抵抗が必須
  • 一般的には10kΩ前後が利用される

組み込み開発では非常に基本的な知識であり、GPIOやI2Cを扱う際には必ず理解しておくべき重要な仕組みである。