ラズパイでアナログ電圧を扱う (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種類が利用されています。

  • 逐次比較(ちくじひかく)方式;比較的高速に変換する。分解能は多くても16から18ビット。インターフェースはSPIバスが多い
  • ΔΣ(デルタ・シグマ)方式;変換時間は中低速。分解能は様々で24ビットまである。インターフェースはI2Cバスが多い

 

 分解能は、基準電圧源を基準に2^nのnビットで表現します。分解能は、A-Dコンバータの電圧レベルの量子化を表しています。具体的に8ビットであれば、

  2^8 - 1 = 255

 基準電圧源が3.30Vであったならば、

  b00000001 = 0.0~0.01294(=3.30/255)[V]

 1 LSB(最小のビット数)は0.01294[V] = 12.94[mV]になります。つまり、ディジタル値は、アナログ電圧の0~12.94mV未満であれば全部'0'になります。12.94~25.87mVなら'1'です。とても荒っぽいですね。この粗さは24ビットA-Dコンバータを利用すれば小さくできますが、0にはできません。量子化誤差と呼ばれます。

分解能

 上記のように、8ビットより16ビット、さらには24ビットのA-Dコンバータを使えば、量子化誤差は少なくできるので、アナログの電圧を正確にマイコンへ取り込めます。しかし、次のように量子化誤差を超える変動が存在します。

  • マイコンが動くと電源の電流が変化し、GNDの電位がマイクロ・ボルト・レベルで変動する
  • LED電球などが部屋にあると、発生したノイズが、マイコン・ボードの信号にコモン・モード・ノイズとして混入し、配線の途中でディファレンシャル・ノイズに変化し、測定データに影響が出る
  • AC100Vの50もしくは60Hzが電源を通して、もしくは、人を媒体として、マイコンの信号線の電圧を変動させる

 これらのノイズなどは、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コンバータを使った記事です。

記事タイトル A-Dコンバータ マイコン・ボード
5ドル!ラズパイ・ゼロ(Raspberry pi Zero)でIoT (9) A-Dコンバータの利用6 MCP3002/MCP3008 10ビットSPI
MCP3002/3008
ラズパイ
A-Dコンバータ その1 10ビットSPI MCP3002 10ビットSPI MCP3002 Arduino
A-Dコンバータ その2 10ビットSPI MCP3008 -(1) 10ビットSPI MCP3008 Arduino
はじめての電気とIoT (8) SPI経由でアナログ電圧測定 その1 MCP3008 10ビットSPI MCP3008 ラズパイ
5ドル!ラズパイ・ゼロ(Raspberry pi Zero)でIoT (6) A-Dコンバータの利用3 ADS1015 12ビットI2C
ADS1015
ラズパイ
5ドル!ラズパイ・ゼロ(Raspberry pi Zero)でIoT (8) A-Dコンバータの利用5 MCP3208 12ビットSPI MCP3208 ラズパイ
A-Dコンバータ その4 12ビットSPI MCP3208-(1) 12ビットSPI MCP3208 Arduino
5ドル!ラズパイ・ゼロ(Raspberry pi Zero)でIoT (33) A-Dコンバータの利用8 AD7991 12ビットI2C
AD7991
ラズパイ
5ドル!ラズパイ・ゼロ(Raspberry pi Zero)でIoT (43) A-Dコンバータの利用13 SPI ADS7042 12ビットSPI AD7991 ラズパイ
5ドル!ラズパイ・ゼロ(Raspberry pi Zero)でIoT (5) A-Dコンバータの利用2 ADS1115 16ビットI2C
ADS1115
ラズパイ
5ドル!ラズパイ・ゼロ(Raspberry pi Zero)でIoT (7) A-Dコンバータの利用4 MCP3425 16ビットI2C
MCP3425
ラズパイ
A-Dコンバータ その6 16ビットI2C MCP3425-(1) 16ビットI2C
MCP3425
Arduino
5ドル!ラズパイ・ゼロ(Raspberry pi Zero)でIoT (13) A-Dコンバータの利用7 LTC2450 16ビットSPI
LTC2450
ラズパイ
5ドル!ラズパイ・ゼロ(Raspberry pi Zero)でIoT (34) A-Dコンバータの利用9 SX8725C 16ビットI2C
SX8725C
ラズパイ
5ドル!ラズパイ・ゼロ(Raspberry pi Zero)でIoT (35) A-Dコンバータの利用10 I2C ADS1110 16ビットI2C
ADS1110
ラズパイ
5ドル!ラズパイ・ゼロ(Raspberry pi Zero)でIoT (36) A-Dコンバータの利用11 I2C LTC2461 16ビットI2C
LTC2461
ラズパイ
5ドル!ラズパイ・ゼロ(Raspberry pi Zero)でIoT (37) A-Dコンバータの利用12 SPI ADS1120 16ビットSPI
ADS1120
ラズパイ
5ドル!ラズパイ・ゼロ(Raspberry pi Zero)でIoT (4) A-Dコンバータの利用1 MCP3424 18ビットI2C
MCP3424
ラズパイ
A-Dコンバータ その8 24ビットSPI ADS1220 24ビットSPI
ADS1220
Arduino
5ドル!ラズパイ・ゼロ(Raspberry pi Zero)でIoT (47) アナログ温度センサ5 白金抵抗体、ADS1220 24ビットSPI
ADS1220
ラズパイ
CircuitPython 10行プログラミング Step2 (6) ロードセル+ADS1220 24ビットSPI
ADS1220
CircuitPython
温度を測る その6 0.1℃まで測りたい 24ビットSPI
LTC2400
Arduino
離れた場所の〇〇が測りたい その2 UART 24ビットUART
ADS122U04
Arduino