TOPに戻る

gpiozeroライブラリ入門⑮import MCP3201/MCP3202/MCP3204/MCP3208

 使用環境
  • Raspberry Pi Raspberry Pi 4 Model B 2MB
  • OS Raspberry Pi OS(32ビット)5.10.17
  • Python3 3.7.3
  • gpiozeroライブラリ 1.5.1
  • エディタ Mu

 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

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+の値を測定する。差動は疑似差動なのでマイナスは扱えない。

value

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

 (図の写真は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ビット・アナログ-ディジタル・コンバータ。

channel

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

differential

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

value

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

 (図の写真は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ビット・アナログ-ディジタル・コンバータ。

channel

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

differential

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

value

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

 (図の写真はMCP31xxを加工して流用しています)

 実行例です。TL431電圧源の出力は、Ch1とVssにつないでいます。

●MCP3208

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

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

channel

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

differential

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

value

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

 (図の写真は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を選択します。

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

(15) 12ビットA-DコンバータMCP3201/MCP3202/MCP3204/MCP3208

(16) 13ビットA-DコンバータMCP3301/MCP3302/MCP3304