MicroPythonでADC(MCP3204)を使う


昨日試したMicroPython用のSPIクラスですが、OLEDはデータ出力しか確認できません。
手元にMCP3204というADコンバータがあったので、これでSPI経由でのデータ入力も実験してみました。

12bit 4ch ADコンバータ MCP3204-BI/P: 半導体 秋月電子通商 電子部品 ネット通販

MCP3204は、12bit(0~4095)のADコンバータを4つ搭載しています。同じタイプで、8つのADCを搭載するMCP3208というチップもあります。

Raspberry Piとの接続は、以下のように電源、クロック/MOSI/MISO、およびCS(Chip Select)です。CSはどのGPIOでもよいのですが、今回はGPIO22を使用しました。
そのほか、ADCの基準電圧(今回はVDDをそのまま使用)も接続が必要です。

MCP3204  Raspberry Pi
  VDD    3.3V
 VREF    3.3V
 DGND    GND
  CLK    SPI0-CLK(23)
 DOUT    SPI0-MISO(21)
  DIN    SPI0-MOSI(19)
   CS    GPIO22(15)


ADCの入力は、VRを接続しました。ちなみに写真のVRはpimoroniで購入したものです。

使い方ですが、MCP3204のデータシートにある以下の図で信号が概観できます。
ホスト側から送信するデータは24bitで、そのうち実質的なデータは6bit目から10bit目までで

6bit目:スタート信号(常に1)
7bit目:データを絶対値で取る(1)か差分を取る(0)か
8~10bit目:読み取るチャンネルの番号

となっています。

MCP3204/3208は2本の入力をペアにして、その差分の値を読むことができ、7bit目はそのための指定ですが今回は使いません。
また、チャンネル指定はMCP3208(8ch)と共通の仕様のため3bitありますが、MCP3204は4chしかないので8bit目は常に0となります。

以上から、たとえばCH2の値を絶対値で読み取るには

0000 1100 10xx xxxx xxxx xxxx → 16進で 06 80 00

というデータを送信すればよいことになります。
ADCからのデータも24bit送られてきますが、下位12bitだけが有効です。

MicroPythonでのサンプルコードを以下に載せておきます。
動かすと、1秒ごとにCH0の値を12bitの整数(0~4095)でプリントします。
値は信号がGNDレベルのとき0、VDDと同じ(3.3V)のとき4095です。

コメント