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

安定な基準電圧源を内蔵

 LTC2461は、基準電源を内蔵した16ビットのA-Dコンバータです。60Hzのノッチ・フィルタが実装されているので、商用電源の誘導性ノイズに強くなっています。ディファレンシャル入力はLTC2463です。DIP化ボードは市販されていないようです。基準電圧源が1.25Vなので、入力電圧範囲は狭いですが、分解能はとれます。

LTC2461の主なスペック

  •  ビット数;16
  •  チャネル数;シングル・エンド1チャネル
  •  基準電圧;内蔵。1.25V 初期精度0.1%
  •  電源電圧; 2.7~5.5V
  •  消費電流;動作時2.5mA(5.5V時)
  •  変換レート;60もしくは30回/秒
  •  インターフェース;I2C
  •  I2C転送速度;最大400kHz
  •  スレーブ・アドレス;0x14(デフォルト)。A0ピンをVccにつなぐと0x54に変更できる

DIP化

 MSOPパッケージのLTC2461をDigi-Keyから購入しました。リード線のピッチは0.65mmの12ピンです。秋月電子通商のDIP変換ボードにはんだ付けしてから利用しました。はんだ付けは、こちらを参照ください。

 マニュアルに従って、Vcc、REFout、Comp端子からは0.1uFの積層セラミック・コンデンサをGND端子に接続しました。スレーブ・アドレス設定のA0ピンはGNDに落とし、0x14に設定しました。REF-端子はGNDへつなぎました。

接続

 ラズパイとは次のように接続し、電源を入れた後、i2cdetect -y 1で確認をしました。

 ラズパイのGPIO
接続先     
LTC2461 ラズパイのGPIO
接続先
- REFout 1番ピン 12 Vcc 1番 3.3V
- Comp 2 11 GND 6番 GND
6番 GND A0 3 10 GND 6番 GND
6番 GND GND 4 9 IN  
5番 SCL SCL 5 8 REF- 6番 GND
3番 SDA SDA 6 7 GND 6番 GND

   

 0x14にありました。複数のLTC2461を利用するときに使う0x77も見えています。

レジスタ

◆設定関係

 b7 b6  b5  b4  b3  b2  b1   b0
 EN1  EN0 SPD  SLP  - - - -
EN1,EN0が'10'で、次の2ビットが有効になる。
SPD;スピード・ビット。SLP;スリープ・ビット

◆出力レジスタ

 b15 b14 b13  b12  b11  b10  b9  b8 
 D15 D14  D13  D12  D11  D10  D9  D8 

 b7 b6 b5  b4  b3  b2  b1  b0 
 D7 D6  D5  D4  D3  D2  D1  D0 

プログラム

 通常はスリープしていますが、I2Cから読み出しが行われると、新しい変換を開始します。したがって、読み出したデータはひとつ前の古いデータです。設定時に書き込むデータは、EN1とEN2のイネーブル・ビットはデフォルトの’10’、スピード・ビットSPDはデフォルトの60Hzではなくバックグランド・オフセット較正が行われる30Hzの'1'に変更し、リファレンス電圧をスリープ(SLPビット)させないようにデフォルトの'0'のままにしました。下位4ビットはダミーの'f'とし、0xafを書き込みます。

 書き込んだ直後に読み出すとLTC2461はビジー状態のため、0.1秒待ちます。

#!/usr/bin/env python
import smbus
import time
i2c = smbus.SMBus(1)
addr=0x14
Vref=1.25

def swap16(x):
return (((x <<8) & 0xff00) | ((x >> 8 ) & 0x00ff))

#main
i2c.write_byte(addr, 0xaf)
time.sleep(0.1)
while 1:
data = i2c.read_word_data(addr,0x01)
data16 = swap16(int(hex(data),16))
print (round((Vref * data16 / 65535 ),5))
time.sleep(1)

 2バイト・データの読み出しでは、ダミーの0x01を送っていますが、LTC2461は無視してくれます。

実行結果

 電圧発生器で1.0000Vを設定したときの実行画面です。

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

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

※I2Cの有効化は、この説明を参照ください。1-Wireと同じく、I2CやSPIもEnableにチェックを入れています。

※電圧発生器はアドバンテストTR6142、DMMはケースレー2000を使いました。