ハードウェアエンジニア嶋田(@shozaburo)です。今日もソフト屋さんによく質問される、電子工作をかじると避けては通れない「プルアップ、プルダウン抵抗」について解説していきたいと思います。
2つの信号出力形態
プルアップ、プルダウン抵抗についてお話する前に、ICがデジタル信号を出力する際の2つの出力形態について知っておく必要があります。ひとつはプッシュプル出力、もうひとつはオープンドレイン(もしくはオープンコレクタ)出力1です。
下図にその違いを書きました。簡易化のため厳密な回路ではなく、動作が同じであるスイッチ(SW1, SW2, SW3)に置き換えて表現しています。
プッシュプル
上図左をごらんください。スイッチが2つ接続された構造になっています。SW1がオン(ショート)になると、出力信号=Vcc(電源電圧)となるためHIGH信号(以下Hと表記)になります。他方、SW2がオン(ショート)になると、出力信号=GND(0V)になるためLOW信号(以下Lと表記)になります。SW1とSW2が同時にオンになることはありません。
オープンドレイン
上図右のようにプッシュプルからSW1を削除したものです。SW3をオン(ショート)することで、出力信号をLにできます。SW3がオフ(オープン)のときは、どこにもつながっていないので、HでもLでもない不定状態(Hi-Z: ハイインピーダンス)です。
「え、Hはどうするの?」
ということで、登場するのがプルアップ抵抗です。プルアップ抵抗は下図R1のようにICの外で、出力信号とVcc(電源)を繋ぐように回路設計者自身が配置します。
動きを改めて見てみると、SW3がオフ(オープン)のときはR1に電流が流れないため、R1での電圧降下はなく出力信号=Vccとなり、H出力となります。他方、SW3がオン(ショート)のときは、GNDと出力信号がショート状態のため、L出力となります。このときR1の存在のおかげで電源とGNDが直接ショートせず、R1によって制限された電流しか流れない(I = Vcc/R1)ので電源が破壊されるようなことはありません。
なお、ICのデータシートには必ず出力信号がプッシュプルかオープンドレインかの記載があります。オープンドレインであれば、必ずプルアップ抵抗をつけるということを頭においてください。
データシート引用: http://www.tij.co.jp/product/jp/BQ24232
オープンドレインの存在意義
「抵抗を追加する必要のないプッシュプルがあれば、オープンドレインなんていらないでしょ」
と、思われるかもしれません。しかし、よく使う活用法としてワイヤードOR、レベルシフタがあります。
ワイヤードOR
ワイヤードORは下図のように信号の出力同士を直接結線してロジックを作る手法です。 下図左はプッシュプルの出力同士を直接結線した場合ですが、IC1がH(SW1-1をオン)でIC2がL(SW2-2がオン)を同時に出そうとするとIC1の電源からIC2のGNDがショートしてしまいます。逆にIC1がL、IC2がHでも同様です。
オープンドレインの場合はどうでしょうか。下図右のようにIC1がHi-Z(SW3-1をオフ)、IC2がL(SW3-2をオン)を同時に出しても、プルアップ抵抗R1を介して電源から電流が流れるためショート状態になることはありません。
真理値表を見ると、どちらか一方がLを出力しようとすると出力はLになります。これはOR(ただし負論理)なので、ワイヤードORと呼ばれており回路ではよく使われます。
レベルシフタ
ICで出力した信号は、別のICに入力するのが普通です。その際、”出力側ICの電源電圧”と”入力側ICの電源電圧”が異なると、ICが動作不良を起こしたり、電圧の低い側のICが故障を起こしたりと問題になります。そこで通常はIC同士の電源電圧を同じに揃えるようにするのですが、ICの仕様でどうしても同じ電圧にできないことがあります。その際に使用するのがレベルシフタと呼ばれる電圧レベルを合わせる回路です2。
下図をご覧ください。出力側IC1の電源が5V, 入力側IC2の電源が3.3Vと仮定します。左のプッシュプルでH出力をした場合、IC2の入力端子には5Vの電圧が印加されてしまい、IC2の電源電圧3.3Vを超えるためIC2の動作不良を引き起こします3。
そこで下図右のように出力側をオープンドレインにし、その信号のプルアップR1にIC2と同じ電圧を使います。こうするとH出力の電圧は3.3VとなりIC2と電圧レベルが揃いますので、問題がおきません。
プッシュプルとプルダウン抵抗
プルアップ抵抗については既にお話しましたが、オープンドレイン出力の際にHを出すための外付け抵抗でした。 プルダウン抵抗はプッシュプル出力とセットで使います。
プルダウン抵抗は電源を投入した直後や電源を落としたときに効果を発揮します。下図左はプルダウン抵抗なしのとき、右はプルダウン抵抗ありのときです。
回路に電源を入れると人間の感覚では一瞬で電源が入ったように思いますが、"電気的"にはmsecなどの時間をかけてゆっくりと立ち上がります。プッシュプル出力の場合は、ICに電源が入るまえはSWを制御することができないため、出力信号は電源にもGNDにもどこにも接続されていない不定状態(Hi-Z:ハイインピーダンス)となります。不定状態はHともLとも分からない曖昧な状態なので、その瞬間は意図しない動作不良を起こすことがあります。
また、出力側ICがマイコンなどの場合は、電源電圧が印加された後にプログラムを読み込んで動作を開始するまでの遅延時間(下図左のTdelay)が存在するので、その不定状態が長く続くことがあります。
そこで、下図右のように出力信号に抵抗値R2をつけてGNDと接続します。そうするとIC1のSWが制御できていない状態でも、信号がR2を介してGNDと接続されているため、出力信号はL(GND)と確定します。こうすることで曖昧な不定状態を回避することができます。
プルアップ/プルダウンの抵抗値
これについては検索するといろいろと出てくるので詳しくは書きません。プルアップもプルダウンも大体10k ~ 100k程度です。
プルアップ抵抗は、抵抗値を低くすると"消費電力"が増え、抵抗値を高くすると"ノイズやリーク電流による誤動作"のリスクが増えます。趣味の電子工作であれば消費電力を気にすることはないでしょうから低めに設定しておけば間違いないです。"抵抗値を高くするとノイズに弱い"から分かるように、プッシュプルとオープンドレインだとプッシュプルのほうが原理的にノイズに強いという特徴を持ちます。
プルダウン抵抗は、低くすると消費電力が増えるばかりか、通常動作にも影響を与えてしまうので私は高めに設定します。
まとめ
色々と書きましたがここで理解していただきたいことは、下記3点かなと思います。
- 信号出力にはプッシュプルとオープンドレインの2種類あり、どちらの出力形態かはデーターシートを読めばわかる
- オープンドレインの場合は、プルアップ抵抗を必ずつけること
- 回路を読むときに、プッシュプル出力の信号線にぶら下がっているプルダウン抵抗はあまり意識しなくてもよい(電源の立ち上がり/立ち下がり時用の回路なので、通常動作時には無関係)
それでは、楽しい電子工作ライフを!!!