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

低消費電力16ビットA-Dコンバータ

 LTC2450は、リニアテクノロジー(現アナログ・デバイセズ)の外形が2mm角と小型形状のSPIインターフェースをもつA-Dコンバータです。DIP化ボードが秋月電子通商から入手できます。基準電圧は電源を用いるので、ラズパイでは、5Vから精度の高い3.3V出力の安定化ICによる電源を用意すると、精度がとれると思われます。

 IC内部のサンプリング・レートは3.9Mspsですが、平均化されたデータが出力されるので、変換速度は30spsです。

LTC2450の主なスペック

  •  ビット数;16
  •  チャネル数;1チャネル
  •  基準電圧;電源端子と共通
  •  電源電圧; 2.7~5.5V
  •  消費電流;300uA
  •  入力;シングルエンド
  •  変換方式;ΔΣ(デルタ・シグマ)方式
  •  サンプリング・レート;30sps
  •  インターフェース;SPI

 ピン配置です。

LTC2450 ラズパイのGPIO 接続先
電源、Vref 1番ピン 6 SCK(CLK) 23番 CLK
入力 2 5 SDO(out) 21番 MISO
GND 3 4 CS 24番 CE0

電源を用意する

 8ビットから10ビットのA-Dコンバータなら、電源を基準電源に用いても、十分でなくとも確度はそれほど不正確にならずに済みます。16ビットでは不十分です。

 16ビットA-Dコンバータの基準電圧を3.3Vとすると、1 LSBは、

3.3/2^16 = 50.4uV

と微小です。

(※)2019/03/13 50.4uVの桁を間違えていたのを訂正。

 ミスミの検索から、3.3Vで使える最も安定なIC ADR4533BRZが見つかりました。電圧の許容誤差 ±0.02%、温度係数 2ppm/°Cです。出力電流も10mAとれるので、LTC2450の電源を十分に供給できます。

ADR4533BRZをDIP化

 基準電圧発生ICのADR4533BRZは、リード線の間隔がDIPのピン間の半分しかないので、ブレッドボードで実験するのに、変換基板にはんだ付けします。

 メンディング・テープを細く切り、変換基板とICを板に貼り付け動かないようにします。はんだ付けします。

 ピンをはんだ付けします。ピンはブレッドボードに挿してからはんだ付けを行うと、スムースに作業できます。入力Vinは2番ピン、3.3V出力は6番ピン、GNDは4番ピンです。

配線

 配線図ではコンデンサは省略しています。ブレッドボード上では、0.1uFの積層セラミック・コンデンサを、5V-GND、3.3V-GNDに、22uFの電解コンデンサを5V-GNDに入れています。A-Dコンバータ基板には入力に0.1uFのコンデンサが、電源には10uFと0.1uFの端子直下に入れてあります。入力のコンデンサは、データシートにも指示されています。

 SPIインターフェースですが、マスタのラズパイからはLTC2450へコマンドを送らないので、MOSIの配線はありません。

プログラム

 LTC2450のデータシートを読むと、パワーオン時に最初の変換値がメモリに入ります。SPIからの読み出しの最後に次の変換がトリガされます。したがって、SPIで読み出す値はひとつ前のデータです。

 Vrefの電圧は1/2 6桁のDMMで測定しました。DMMによって、最後の桁はいろいろな数値が表示されます。

 データシートのタイムチャートを見ると、何も送らなくても、CSがLowになった後に、2バイトのデータが送られてきます。したがって、ダミーデータを2バイト送ります。しかし、最初に読み出したのは前回のデータですから、50ms経過後、もう一度読み出します。

#!/usr/bin/env python
import spidev
import time
Vref = 3.29989

spi = spidev.SpiDev()
spi.open(0,0) #port 0,cs 0

adc = spi.xfer2([0x00,0x00])
time.sleep(0.05)
adc = spi.xfer2([0x00,0x00])
data = (adc[0] << 8) | adc[1]

print (Vref*data/65536)
spi.close()


(2020/05/09)65535は間違いなので、65536に変更した。プログラムも修正したが、実行結果は変更していない

 連続して読み出します。

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

while 1:
adc = spi.xfer2([0x00,0x00])
data = (adc[0] << 8) | adc[1]
print (Vref*data/65536)
time.sleep(0.1)
spi.close()

実行結果

 電圧発生器で小数点第4位まで出力した値を測っています。1.0000V出力時に、DMMではICの入力端子を測ると1.00002Vでした。