5ドル!ラズパイ・ゼロ(Raspberry pi Zero)でIoT (43) A-Dコンバータの利用13 SPI ADS7042

高速なのに消費電流の少ない12ビットA-Dコンバータ

 ADS7042は、1MSPSと中速度の変換ができるのに動作時に約200uAと消費電流が少ない12ビットのA-Dコンバータです。小信号用LEDを1個点灯させると3mA程度の電流が流れることを考えれば、ポータブル機器などでの利用に適しています。ここでは、消費電力の少ないOPアンプなどとともに実験できる評価用ボードBOOST-ADS7042 BoosterPack Plug-In Moduleを入手しました。デバイスは2.25mm角と大変小さいので、実験には変換ボードが役立ちます。

ADS7042のスペック

  • 電源電圧 1.65~3.6V(AVddとDVddは別端子)
  • 分解能 12ビット(設定用レジスタなし)
  • チャネル数 1
  • 入力範囲 0~3.6V(シングルエンド)
  • インターフェース SPI(最大16MHz)
  • 変換速度 最大1MSPS
  • 基準電圧源 AVddの電源端子

ADS7042ボードのスペック

  • 電源電圧 3.3V
  • ローパワーOPアンプOPA316の入力バッファ
  • AVdd用3.0Vの基準電源REF3330
  • 環境光用センサ
  • A-Dコンバータの消費電流測定回路

接続

 ラズパイとの接続です。

ADS7042ボード ラズパイ
SCLK(7番ピン) 23番ピン(CLK)
- 19番ピン(MOSI)
Dout(14番ピン) 21番ピン(MISO)
/CS(12番ピン) 24番ピン(CE0)
Vdd(1番ピン) 1番ピン
GND(20番ピン) 5番ピン

読み出しレジスタの構成

 CS信号がLowになった後、'0'が2個送られ、続いて12ビットのデータがMSBから送られてきます。変換速度などを設定するレジスタはありません。

b15 b14 b13 12 b11 b10 b9 b8 b7 b6 b5 b4 b3 b2 b1 b0
0 0 D11 D10 D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 - -

 ラズパイのspidevライブラリでは8ビット単位の読み書きをするので、読み取った2バイトのデータを右に2だけシフトすると12ビット・データになります。

プログラム

 マスタのラズパイからスレーブのADS7042へは、クロックを発生させるためにダミーの0xffを送っています。基準電圧Vrefは、6.5桁のDMMで基準電圧REF3330の出力を測った値を代入しています。

#!/usr/bin/env python
import time
import spidev
Vref = 2.99935
spi = spidev.SpiDev()
spi.open(0,0) #port 0,cs 0
spi.max_speed_hz = 1000

#main
while 1:
adc = spi.xfer2([0xff,0xff])
data = ((adc[0] <<8) | adc[1]) >> 2
print round(Vref*data/4096,3),"V"
time.sleep(1)
spi.close()


(2020/05/09)4095は間違いなので、4096に変更した。上記のスケッチも修正したが、実行結果は変更していない

 電圧発生器で1.0010Vを設定し、測っているときの表示です。

消費電流

 ADS7042ボードには、OPアンプOPA378を使ったハイサイドの電流-電圧変換回路が実装されています。電流検出抵抗は200Ω、増幅用抵抗は1.5Mと4.99kΩなので、出力電圧Voutに16.63を乗じるとuA単位の電流が求まります。

 Iout = Vout * (1/200) * (4.99k/1.5M) [A]

 検出回路の入力はDVddと同じく3.3V、電流検出抵抗の後ろには、基準電圧源のREF3330とA-DコンバータのADS7042がつながっています。REF3330の消費電流は約3.9uAです。REF3330の出力は、ADS7042のAVddにつながっています。DVddの消費電流はデータシートに見つかりませんでした。消費電流測定回路ではA-Dコンバータのアナログ回路部分の電流を測定していることになります。

 動作していないときからSPIの動作周波数を1kHz~16MHzへ変更しましたが、いずれも4.8uA、基準電圧ICの消費電流3.9uAブリーダ抵抗への電流15uAを引くと0.906uAでした。

 SPIのクロックを16MHzの状態で、測定ループの繰り返しを1秒から0.01秒に変更すると0.94uAとわずかに電流が増加し、0.001秒だと1.1uA、0.0001秒とより高速に読み出すと1.73uAに増加しました。

OPアンプOPA316

 OPA316はローパワーOPアンプの1個入りで、2個入りはOPA2316、4個入りはOPA4316です。電源電圧は1.8~5.5Vで、増幅率1倍で安定です。GBPは10MHzと高く、スルーレートは6V/usなので、オーディオ帯域でも使えます。

 1個当たりの消費電流は400uAと低いので、増幅回路の負帰還抵抗などに数十kΩを使うと、そちらのほうの消費電流が多くなります。数百kから数MΩを使うと外からのノイズを拾いやすくなりますが、RFI-EMIフィルタが内蔵されています。

※執筆時点;2017-11-29版をダウンロードし、sudo apt-get update と sudo apt-get upgrade -y および sudo rpi-update で更新し、カーネルはuname -a で確認。4.9.73でした。

※プログラムを仮にads7042.pyという名前で/home/piに保存すると、sudo chmod 755 ads7042.py で実行権を付け、ターミナルから、python ads7042.pyで実行します。I2CやSPIのグループにpiユーザが属しているので、sudoは不要です。
 プログラム・リストは、表示の関係でTabキーが無視されるので、スペースに代えてあります。また、リスト中を2回クリックすると全選択になるので、CTRL-Cでコピーし、テキスト・エディタにCTRL-Vで貼り付けて利用してください。ラズパイに持っていくと、スペースやリターン・コードなどが化けていることがあるので、一度消して、ラズパイのテキスト・エディタで修正してください。

※I2Cの有効化は、こちらの説明を参照ください。SPIなどにもEnableにチェックを入れています。