IOポートなどでデジタル信号の入力を行う際の動作を考えてみる。以下の図は、その参考。
IOポートの入力回路は、左側の青の点線部分。
IOポートの入力ピンに与えられる信号によって、LEDの点滅が制御される。(LEDの点滅=入力されたデジタル値、点灯なら1、消灯なら0)
IOの入力ピンは、プルアップ抵抗を介して、+5Vに接続されるとともに、押しボタンスイッチを介して、GNDにも接続される。
この回路の動作では、
のように動作する。
スイッチのON/OFFの情報(データとしては1/0)は、電流を介して伝達される。実際のIOポートでは、情報の伝達時に流れる電流(特に1.のIOポートに流れ込む電流)はごく僅か(Rin≒∞)である。従って、IOの入力ピンには、ほぼ、電源電圧に等しい電圧(Vsw≒5V)が発生する。...
であるので、情報の伝達は電流で行われるのだが、ピンに加わる電圧の有無で、データの1/0を判断して差し支えない。
コンピュータが処理するソフトウエアやデータは、2進数(もしくは、それを束ねた16進数)で表現される。コンピュータを構成する電子回路(ロジック回路)は、2進数を以下の様な電気信号として扱うことで、処理を行う。
電圧値 | デジタル値 |
0V (閾値より小さな電圧) | 0 |
5V (閾値より大きな電圧) | 1 |
図で表すと、以下の様な感じ。
例えば、I/Oを通じて外部とデータのやり取りを行う場合で考えてみる。
コンピュータの外側から与えられるデータは、通常、電圧のある/なしで与えられる。(下図参照)例えば、電源にスイッチSWが直列に接続されていて、SWがON/OFFする場合を考えてみる。この時、SWのON/OFFによって、電圧センサの入力端子の電圧(Vsw)が変化する。
電圧センサは、入力端子に加わる電圧(Vsw)が一定電圧を超えた場合、1を出力し、それ以下の場合は0を出力する。出力値はCPUに渡される。
SWの状態 | 入力に加わる電圧(Vsw) | デジタル値(電圧センサの出力) |
ON(押した) | 0V | 1 |
OFF(離した) | 5V | 0 |
図 スイッチの状態と入力端子の電圧
スイッチを離した状態では、5Vの電源から流れ出た電流は、プルアップ抵抗を通じて入力端子に加わる。電圧センサも見かけ上は数GΩの抵抗に見える。この時、入力端子に加わる電圧Vswは、
電圧センサの抵抗値 >> プルアップ抵抗の抵抗値 |
なので、ほぼ、電源電圧に等しくなる。逆に、スイッチが押されると、入力端子と電源のマイナス(グランド)はショートされて、Vswは0Vになる。
これまでの説明で、なんとなく釈然としない人がいるかもしれない。上の回路でプルアップ抵抗なるものが挿入されていたり、スイッチを押すとデジタル値が0になる(直感的にはスイッチを押した時に1になる方が分かりやすい)など、なんでこんな変な事をやっているのだろう。無駄に複雑にしてやしないか?
そう考えた人は、下の図のようにした方が簡単じゃん、と思ったりしないだろうか?
このような構成だと、スイッチを押した時はVswは5Vになり、離したら電源が繋がって無いので0Vになる(なって欲しい)と思われるので、シンプルだし、直感的で良いじゃないか!
実は、この回路、スイッチを押した時は良いのだが、離した時に動作が不安定になるという問題がある。
なぜなら、スイッチを離した状態だと、電圧センサの入力端子には、配線パターンの先に電気的な接続が無い状態となり、配線パターンがアンテナの役割を果たして、雑音(ノイズ)を拾ってしまう。その結果として、スイッチを離した状態だとVswが不安定に変化し、電圧センサからみるとSWが不規則にON/OFFしているように見えてしまう。(結果として、使い物にならない)
プルアップ抵抗は、このような問題点を解決するため、抵抗を通じて入力端子の電圧を強制的に引き上げ(プルアップ)、入力端子がどこにも繋がらないという状態を作らないようにすること動作を安定させる。