TOPに戻る

gpiozeroライブラリ入門⑭import MCP3001/MCP3002/MCP3004/MCP3008

 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   -  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

10ビットA-Dコンバータ

 A-Dコンバータはアナログの値をディジタルに変換します。例えば、基準電圧が3.3Vで10ビットのA-Dコンバータであれば、

  3.3[V] / 2^10 = 0.00322265625[V] 

が1LSB=一番細かな最小単位です。3.22265625mV以内のアナログ値は見分けられません。これを量子化誤差と呼びます。ビット数が増えるほど量子化誤差の絶対値は小さくなります。

 ここで取り上げるMCP3001/3002/3004/3008は、入力チャネル数が異なります。内部にA-D変換するユニットは一つですが、入力に切り替えスイッチで複数のチャネルを同時に扱えるように構成されています。

ピン配置

 ピン配置やピンの名称などシリーズの統一性はありません。SPIインターフェースの読み書きにも統一性はありません。

MCP3001

class gpiozero.MCP3001(max_voltage=3.3, **spi_args)

 MCP3001は、 チャネルは一つの10ビット・アナログ-ディジタル・コンバータ。MCP3001は常に差動モードで動作し、IN-に対するIN+の値を測定する。差動は疑似差動なのでマイナスは扱えない。

value

 デバイスから読み取られた現在の値。0〜1の値にスケーリングされる。

 Vrefは、1/2 6桁のDMMで測定した値です。


from gpiozero import MCP3001
from time import sleep

Vref = 3.301

adc = MCP3001()
while 1 :
    print(adc.value * Vref)
    sleep(1)

 実行中の様子です。

 二つの電圧の差を求めると、0.00322520762Vでした。これは、ほぼ 1 LSBと同じことがわかります。入力IN+とIN-には電圧源の1.0000Vをつないでいます。そのままだと不安定だったので、IN-をVssにつなぎました。

MCP3002

class gpiozero.MCP3002(channel=0, differential=False, max_voltage=3.3, **spi_args)

 MCP3002は、 2チャネル、10ビット・アナログ-ディジタル・コンバータ。

channel

 データを読み取るチャネル。

differential

 Trueの場合、デバイスは差動モードで動作する。このモードでは、一つのチャネル(チャネル属性で指定)が、2番目のチャネルの値(チップの設計によって暗示される)に対して読み取られる。
 データシートには、設定ビットによって、「Ch0がIN+、Ch1がIN-」と逆の「Ch0がIN-、Ch1がIN+」があるが、この解説に具体的なことは書かれていない。

value

 デバイスから読み取られた現在の値。0〜1(または、差動モードで動作している特定のデバイスの場合は-1〜 + 1)の値にスケーリングされる。

 実行例です。電圧源の1.0000VはCh0とVssにつないでいます。千回測定し、頻度のグラフを描きました。

MCP3004

class gpiozero.MCP3004(channel=0, differential=False, max_voltage=3.3, **spi_args)

 MCP3004は、 4チャネル、10ビット・アナログ-ディジタル・コンバータ。

channel

 データを読み取るチャネル。

differential

 Trueの場合、デバイスは差動モードで動作する。このモードでは、一つのチャネル(チャネル属性で指定)が、2番目のチャネルの値(チップの設計によって暗示される)に対して読み取られる。

value

 デバイスから読み取られた現在の値。0〜1の値にスケーリングされる。

 実行例です。チェネルは0と1を試しました。

●MCP3008

class gpiozero.MCP3008(channel=0, differential=False, max_voltage=3.3, **spi_args)

 MCP3008は、 8チャネル、10ビット・アナログ-ディジタル・コンバータ。

channel

 データを読み取るチャネル。

differential

 Trueの場合、デバイスは差動モードで動作する。デバイスのデータシートを参照して、相対ベース値として使用されるチャネルを決定する(たとえば、差動モードで使用する場合 、チャネル0はチャネル1に対して読み取られる)。

value

 デバイスから読み取られた現在の値。0〜1の値にスケーリングされる。

 実行例です。チェネルは0と7を試しました。

adc = MCP3008(channel=6, differential=True)

と指示したとき、電圧源からの入力は、Ch6に+、Ch7にーをつなぐことで正常に電圧を取り込めました。

測定器

 電圧源はタケダ理研TR6142、DMMは岩通VOAC7602を使いました。

疑似差動入力

 MCP3xxxシリーズの差動入力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を選択します。

連載 gpiozeroライブラリ入門

- OutputDevice -

(1) LED その1 (2) LED その2 (3) PWMLED (4) RGBLED

(5) Buzzer (6) TonalBuzzer

(7) Motor その1 BD65496 (8) その2 TB67H420FTG (9) その3 TB6612 (10) その4 MC33926 (11) PhaseEnableMotor DRV8835

(12) Servo (13) AngularServo

- SPI Device -

(14) 10ビットA-DコンバータMCP3001/MCP3002/MCP3004/MCP3008