ラズパイでアナログ電圧を扱う (1) MCP3208①
マイコン・ボードRaspberry Piでは、外部とのデータのやり取りにGPIOを使います。下記のように40ピンが用意されています。信号のレベルは3.3Vです。
この中にはアナログ入力がありません。そこで、この連載では、複数のアナログのデータを扱えるようにします。
●A-Dコンバータのバス
アナログというのは、通常電圧を指します。もちろん、電流や温度のこともあります。マイコンはディジタル・データしか扱えないので、アナログ電圧をディジタルへ変換するデバイスを利用します。A-DコンバータもしくはA-D変換器と呼ばれます。短くはADCと略されることがあります。
A-D変換をした後ディジタル値は何らかのバスに出力されます。それぞれのビットが一つの信号ピンに出力されるパラレル・バスがあります。30年ほど前はこのタイプが多くありました。現在は、I2C(アイ・スクエアード・シー)バスもしくはSPI(エス・ピー・アイ)バスのどちらかがほとんどです。
これらのバスを利用してマイコンへデータを送ります。
I2Cバスは2本の信号線でつなげられます。データの転送速度は比較的遅く、100kbpsもしくは400kbpsが多いです。SPIバスは3本もしくは4本の信号線を使い、データの転送速度は10Mbpsを超える場合が多いです。高速です。
●A-D変換の方法
A-Dコンバータの内部は利用者にとって気にするところはありません。大きく分けると、おもに次の2種類が利用されています。
|
分解能は、基準電圧源を基準に2^nのnビットで表現します。分解能は、A-Dコンバータの電圧レベルの量子化を表しています。具体的に8ビットであれば、
2^8 - 1 = 255 2^8 = 256
(2020/05/09)255は間違いなので、256に変更した。以下の数値も修正。
基準電圧源が3.30Vであったならば、
b00000001 = 0.0~0.01289(=3.30/256)[V]
1 LSB(最小のビット数)は0.01289[V] = 12.89[mV]になります。つまり、ディジタル値は、アナログ電圧の0~12.89mV未満であれば全部'0'になります。12.89~25.78mVなら'1'です。とても荒っぽいですね。この粗さは24ビットA-Dコンバータを利用すれば小さくできますが、0にはできません。量子化誤差と呼ばれます。
●分解能
上記のように、8ビットより16ビット、さらには24ビットのA-Dコンバータを使えば、量子化誤差は少なくできるので、アナログの電圧を正確にマイコンへ取り込めます。しかし、次のように量子化誤差を超える変動が存在します。
|
これらのノイズなどは、8ビットではほとんど影響を受けません。量子化誤差が大きいからです。16ビットを超える分解能になると、1 LSBがノイズのレベルより小さくなるので、最後のビット付近は常に変動します。24ビットではもっと顕著で、最小LSBから数ビットは常に変動するので、実質20~21ビットしか信用できません。
もうひとつ、大きな問題があります。A-Dコンバータは、基準電圧に従って変換をします。ラズパイの5VはUSB経由の電源電圧です。4.7~5.1Vぐらいの違いが普通にあります。この5Vを基準電圧に使った場合、8ビットや10ビットでは大きな誤差になりませんが、それ以上の分解能では、何を測っているのかわからないぐらい、大きな誤差になります。
半導体は温度係数をもっています。言い換えると、温度で特性が変化します。基準電源の電圧も温度で変化します。例えば北海道の車の中は、1年を通して-30~60℃の温度変化があります。
24ビットA-Dコンバータは、昔に比べれば、相当低価格で入手できます。それは、ΔΣ方式が発明されたからです。日本人による発明が、この業界に大きなインパクトを与えました。
50/60Hzのノイズを取り除くノッチ・フィルタが内蔵された製品も増え、差動入力であれば、コモン・モード・ノイズを抑えられます。しかし、プリント基板への実装ノウハウなど、電子工作のようにバラックで配線をするレベルでは、20ビットの分解能さえ無理だと言えます。
●サンプリング・レート
1秒間に何回変換ができるかという指標があります。センサ類は急激に出力が変化するものはまれなので、A-Dコンバータの変換速度は特別に考慮する必要はありません。
●12ビットA-Dコンバータを使う
ある程度の分解能は欲しいので、12もしくは16ビットA-Dコンバータを使いたいです。世の中には13とか14、18ビットの製品もありますが一般的ではありません。
入力が複数の製品が多くあります。逆に1チャネルの製品が少ないです。入力部分には切り替え器がついていて、変換するブロックは一つだけです。
基準電源が内蔵された製品、そうでない製品、内蔵されてはいるが、外部から入力できる端子をもつものなど、様々です。
●MCP3208を使う
この連載では、12ビット、8チャネル入力のA-DコンバータMCP3208を利用します。選んだのは、使い勝手が一番良いという理由です。そして、DIP形状の製品があるので、ブレッドボードなどでも利用しやすいことです。
●コラム 記事
過去のA-Dコンバータを使った記事です。