gpiozeroライブラリ入門⑮import MCP3201/MCP3202/MCP3204/MCP3208
使用環境
|
gpiozeroパッケージの基底クラスSPI( Serial Peripheral Interface )Devicesは、A-Dコンバータのクラスがたくさん用意されています。いずれもマイクロチップのA-Dコンバータで、10ビット、12ビットおよび13ビット用です。同社のA-Dコンバータは22ビット以上も発表されていますが、下の表の品種が入手しやすいようです。
MCP3xxxはマイクロチップのA-Dコンバータ・シリーズです。内部に基準電圧源を搭載していないモデルは、通常、電源電圧を利用します。端子に基準電源Vrefがあるモデルでは、安定な基準電圧ICの出力をつなぎます。
型番 | ビット数 | チャネル数 | 基準電圧源[V] | 変換速度[sps] | インターフェース |
---|---|---|---|---|---|
MCP3001 | 10 | 差動1 | - | 200k | SPI |
MCP3002 | 10 | 2もしくは差動1 | - | 200k | SPI |
MCP3004 | 10 | 4 | - | 200k | SPI |
MCP3008 | 10 | 8 | - | 200k | SPI |
MCP3021 | 10 | 1 | - | 22.3k | I2C |
MCP3201 | 12 | 差動1 | - | 100k | SPI |
MCP3202 | 12 | 2 | - | 100k | SPI |
MCP3204 | 12 | 4 | - | 100k | SPI |
MCP3208 | 12 | 8 | - | 100k | SPI |
MCP3221 | 12 | 1 | - | 22.3k | I2C |
MCP3301 | 13 | 差動1 | - | 100k | SPI |
MCP3302 | 13 | 4 | - | 100k | SPI |
MCP3304 | 13 | 8 | - | 100k | SPI |
MCP3421 | 18 | 差動1 | 2.048 | 3.75 | I2C |
MCP3422 | 18 | 差動2 | 2.048 | 3.75 | I2C |
MCP3423 | 18 | 差動2 | 2.048 | 3.75 | I2C |
MCP3424 | 18 | 差動4 | 2.048 | 3.75 | I2C |
MCP3425 | 16 | 差動1 | 2.048 | 15 | I2C |
MCP3426 | 16 | 2 | 2.048 | 15 | I2C |
MCP3427 | 16 | 2 | 2.048 | 15 | I2C |
MCP3428 | 16 | 4 | 2.048 | 15 | I2C |
MCP3550 | 22 | 差動1 | - | 12.5/15 | SPI |
MCP3551 | 22 | 差動1 | - | 13.75 | SPI |
MCP3553 | 22 | 差動1 | - | 60 | SPI |
●12ビットA-Dコンバータ
A-Dコンバータはアナログの値をディジタルに変換します。例えば、基準電圧が3.3Vで12ビットのA-Dコンバータであれば、
3.3[V] / 2^12 = 0.00080566406[V]
が1LSB=一番細かな最小単位です。0.80566406mV以内のアナログ値は見分けられません。これを量子化誤差と呼びます。ビット数が増えるほど量子化誤差の絶対値は小さくなります。
ここで取り上げるMCP3201/3202/3204/3208は、入力チャネル数が異なります。内部にA-D変換するユニットは一つですが、入力に切り替えスイッチで複数のチャネルを同時に扱えるように構成されています。
データシート MCP3201 MCP3202 MCP3204/3208
●ピン配置
ピン配置やピンの名称などシリーズの統一性はありません。SPIインターフェースの読み書きにも統一性はありません(写真はMCP31xxを加工して使用。ピン配置と名称はまったく同じ)。
●MCP3201
class gpiozero.MCP3201(max_voltage=3.3, **spi_args)MCP3201は、 チャネルは一つの12ビット・アナログ-ディジタル・コンバータ。MCP3201は常に差動モードで動作し、IN-に対するIN+の値を測定する。差動は疑似差動なのでマイナスは扱えない。
|
(図の写真はMCP31xxを加工して流用しています)
Vrefは、1/2 6桁のDMMで測定した値です。
from gpiozero import MCP3201
from time import sleep
Vref = 3.29
adc = MCP3201()
while 1 :
print(adc.value * Vref)
sleep(1)
実行中の様子です。
二つの電圧の差を求めると、0.00080332071Vでした。これは、ほぼ 1 LSBと同じことがわかります。入力IN+とIN-にはTL431電圧源の約2.48Vをつないでいます。
●MCP3202
class gpiozero.MCP3202(channel=0, differential=False, max_voltage=3.3, **spi_args)MCP3202は、 2チャネル、12ビット・アナログ-ディジタル・コンバータ。
|
(図の写真はMCP31xxを加工して流用しています)
実行例です。TL431電圧源の約2.48VはCh0とCh1につないでいます。不安定だったのでCh1はVssにつないでいます。千回測定し、頻度のグラフを描きました。
●MCP3204
class gpiozero.MCP3204(channel=0, differential=False, max_voltage=3.3, **spi_args)MCP3204は、 4チャネル、12ビット・アナログ-ディジタル・コンバータ。
|
(図の写真はMCP31xxを加工して流用しています)
実行例です。TL431電圧源の出力は、Ch1とVssにつないでいます。
●MCP3208
class gpiozero.MCP3208(channel=0, differential=False, max_voltage=3.3, **spi_args)MCP3208は、 8チャネル、12ビット・アナログ-ディジタル・コンバータ。
|
(図の写真はMCP31xxを加工して流用しています)
実行例です。チャネルはCh1を試しました。
●疑似差動入力
MCP32xxシリーズの差動入力IN+ IN-は、疑似差動入力(pseudo-differential mode)です。これは、回路図中のグラウンドから浮いた電圧を測るような用途には適していません。グラウンド・ループやノイズ耐性を上げるために用意されています。したがって、マイナスの電圧が測れるわけではありません。
IN+入力は、IN-から(VREF + IN-)まで変動できます。IN-入力は、Vssレール±100mV に限定されます。具体的には、入力は-0.1~3.40Vの範囲で、最大100mVの同相(コモン・モード)ノイズが入っても除去されるということだと解釈できます。
参考;http://digital.ni.com/public.nsf/allkb/649202233E3EF06286257408002FDDBD
●基準電圧
Vref端子にA-D変換のかなめとなる基準電圧を入力します。基準電圧は0.25V~Vddの範囲です。このとき、A-Dコンバータの入力電圧は、0V~基準電圧の範囲になります。
電源電圧Vddを5.0Vとすれば、Doutなどの出力端子のHIGHレベルVohは4.0V以上になるため、ラズパイのGPIO入力電圧の上限を超えます。Vdd=3.3Vのときのスペックがデータシートにないのですが、0.7Vddとすれば、2.31Vです。ラズパイの入力端子のHIGHレベルを満足しています。
(※)インターネットを検索すると、ラズパイのHIGHレベルVohは1.34~3.30V、LOWレベルVolは0~1.19Vが多いようです。これはラズパイ4に当てはまるかは不明です。
電源電圧を3.30Vとした場合、Vrefは3.30V以下を選ぶことになりますが、データシートから、2.5V以上ないと、有効ビットENOB、利得誤差、オフセット誤差が大きく劣化し、1V以下だと積分非直線性 (INL)も劣化します。したがって、2.5~3.30Vを選択します。