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でした。