TOPに戻る

gpiozeroライブラリ入門⑯import MCP3301/MCP3302/MCP3304

 使用環境
  • 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 差動2  - 100k SPI
MCP3304 13  差動4  -  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

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

 A-Dコンバータはアナログの値をディジタルに変換します。MCP33xxシリーズは差動入力ができるので、分解能は次の式で得られます。

  2 * Vref / 8192 = Vref /4096 = 基準電圧 / 2^12

 例えば、基準電圧が3.3Vであれば、

  3.3[V] / 2^12 = 0.00080566406[V] 

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

 MCP31xx/MCP32xxシリーズでは疑似差動入力だったので、マイナスの電圧は扱えませんでした。MCP33xxシリーズの差動は、基準電圧が3.3Vのとき、-3.3~+3.3Vの入力電圧が扱えます。

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

 データシート MCP3301 MCP3202/3204

ピン配置

 ピン配置やピンの名称などシリーズの統一性はありません。SPIインターフェースの読み書きにも統一性はありません(写真はMCP31xxを加工して使用。ピン配置と名称はまったく同じ)。

MCP3301

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

 MCP3301は、 チャネルは一つの12ビット・アナログ-ディジタル・コンバータ。MCP3301は常に差動モードで動作し、IN-に対するIN+の値を測定する。

value

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

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

 実行例です。電圧源は電池を使ったTL431の約2.5Vです。

◆IN+プラス入力、IN-マイナス入力

◆IN+マイナス入力、IN-プラス入力

MCP3302

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

 MCP3302は、 4チャネル・シングルエンド/2チャネル差動、12ビット・アナログ-ディジタル・コンバータ。

channel

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

differential

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

value

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

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

 実行例は省略します。

●MCP3304

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

 MCP3304は、 8チャネル・シングルエンド/4チャネル差動、12ビット・アナログ-ディジタル・コンバータ。

channel

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

differential

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

value

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

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

 実行例です。電圧源は電池を使ったTL431の約2.5Vです。

◆ch0-プラス入力、ch1-マイナス入力 adc = MCP3304(channel=0, differential=True)

◆ch0-マイナス入力、ch1-プラス入力 adc = MCP3304(channel=0, differential=True)

◆ch0-プラス入力、ch1-マイナス入力 adc = MCP3304(channel=1, differential=True)

◆ch0-マイナス入力、ch1-プラス入力 adc = MCP3304(channel=1, differential=True)

基準電圧

 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