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

オフセット付きアンプを内蔵した16ビットA-Dコンバータ

 SX8725Cは、SemtechのI2Cインターフェースをもつ16ビットA-Dコンバータです。DIP化ボードがマルツエレックから入手できます。3個のプログラマブル・ゲイン・アンプがあり、2番目と3番目のアンプはオフセットを与えられます。

 ボード上にはI2C信号のプルアップ抵抗2.2kΩが用意されていてデフォルトでつながっているので、ジャンパをカッタ・ナイフの刃先で切って使います。電源VbattとGND Vss間には0.1uFのコンデンサが入っています。

 ジャンパを切ったところ信号が途切れました。カット時に別の配線を切ったのか、もともと基板設計が間違っていたのか検証していませんが、はんだブリッジで元に戻しました。ラズパイ本体に1.8kΩのプルアップ抵抗がありパラレルになりますが、問題なく通信できました。

SX8725Cの主なスペック

  •  ビット数;16
  •  チャネル数;差動1チャネル(もしくはシングル・エンド2チャネル)
  •  アンプ;3個。ゲイン1/12から1000倍に設定できる。
  •  基準電圧;内蔵。1.22V
  •  電源電圧; 2.4~5.5V
  •  消費電流;動作時150uA(3.3V時)
  •  変換レート;0.483kSps
  •  インターフェース;I2C
  •  I2C転送速度;最大400kHz
  •  スレーブ・アドレス;0x48(デフォルト)。D0、D1ピンの接続で0x49、0x4a、0x4Bに変更できる

 ピン配置です。モジュールの基板上にはSDAやSCLのシルク印刷はありません。

       SX8725C ラズパイのGPIO 接続先
AC2(入力) 1番ピン 14 Vbatt 1番 3.3V
AC3(入力) 2 13 Vpump -
Ready 3 12 SCL 5番 SCL
Vss(GND) 4 11 SDA 3番 SDA
D1 5 10 D0 -

   ※SX8725Cの4番ピンGNDはラズパイの9番もしくは6番ピンへ接続。

入力

  • AC0 GND
  • AC1 Vref
  • AC2 信号入力
  • AC3 信号入力 

リファレンス外部入力

 Vbatt-Vss、Vref-Vssの4入力があり、PGA2、PGA3のオフセット(設定可)、ADCのVrefにつながっています。

GPIOピン

 D0とD1ピンがあり、モジュールでも端子に出ています。外部Vref入力にD1、VrefをD0端子に出せます。

 また、I2Cのスレーブ・アドレスの設定にも用いられます。D0/D1端子を開放している状態で0x48でした。

アドレス D1 D0
0x48
(デフォルト)
Vss(GND) Vss(GND)
0x49 Vss Vbatt
0x4a Vbatt Vss
0x4b Vbatt Vbatt

3個のプログラマブル・ゲイン・アンプ(PGA)

  • PGA1 ゲインは1もしくは10倍。オフセットなし。
  • PGA2 ゲインは1、2、5、10倍、オフセット±1V、0.2Vステップ
  • PGA3 ゲインは1/12から127/12倍、1/12ステップ。オフセット+63/12~-63/12、1/12Vステップ

 三つのアンプ・ユニットが、A-Dコンバータの入力側にシリーズにつながっています。

チャージ・ポンプ

 入力切り替え用アナログ・スイッチの電源を駆動電圧Vbattより上げるための回路が内蔵されています。Vbattが4.2V以下になると回路が働きます。Vpumpピンにはコンデンサ2.2nF以上の接続が推奨されており、本ボードは0.1uFがつながっています。デフォルトのレジスタ(RegACCfg5(0x57))設定では、無効です。3.3Vで使うので変更します。

レジスタ

◆読み出したデータ

 一般的なレジスタの並びではないです。オーバ・サンプリング周波数の設定によっては16ビット以下になります。デフォルトのレジスタ RegACCfg0(0x52) では16ビットの解像度の設定です。6ビットなどでは上位に何が入るのかは不明です。

RegACOutLsb(0x50)下位バイト。データ自体は符号付きの16ビット。

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

RegACOutMsb(0x51)上位バイト。

 D7 D6  D5  D4  D3  D2  D1  D0 
 b15最上位 b14 b13  b12  b11  b10  b9  b8 

◆設定関係

RegACCfg0(0x52) デフォルト値b00101000 

 D7 D6  D5  D4  D3  D2  D1  D0 
 start
シングル変換時に1をセット。読み出すと0に

SetNelconv
基数を2にする

setOsr
オーバサンプリング・レシオ。2^N(Nは3からスタート)
8,16,32,...,512,1024

Continuous
1をセットすると前の変換が終了すると新しい変換が開始される
-
  • D6,D5を01、D4,D3,D2を010にしたとき、解像度は11ビット。
  • D6,D5を00、D4,D3,D2を000にしたとき、解像度は6ビット。
  • D6,D5を11、D4,D3,D2を100(~111)にしたとき、解像度は16ビット。
    D6,D5を10、D4,D3,D2を101(~111)にしたとき、解像度は16ビット。
    D6,D5を01、D4,D3,D2を101(~111)にしたとき、解像度は16ビット。
    D6,D5を00、D4,D3,D2を111(~111)にしたとき、解像度は16ビット。

 D7もしくはD1を'1'にセットしないと変換を開始しない。デフォルトではいずれも'0'なので、動かないように読み取れるが、実際は動く。

RegACCfg1(0x53) デフォルト値b11110000

 D7 D6  D5  D4  D3  D2  D1  D0 
 lbAmpAdc
ADCのバイアス電流。
0:25%、...、11:100%

lbAmpPga
PGAのバイアス電流。
0:25%、...、11:100%

Enable
ADCはビットD0、PGAはそれぞれ、ビットD1,D2,D3。PGAをディセーブルにするとバイパスされる 
 Enableが'1'。デフォルトのb11110000でも測定はする。なにかパラメータを変更したときは、b11111111。

RegACCfg2(0x54) デフォルト値b00000000

 D7 D6  D5  D4  D3  D2  D1  D0 
 SetFS
オーバサンプリング周波数。
11:500kHz、10:250kHz、
01:125kHz、00:62.5kHz

Pga2Gain
00:1, 01:2, 10:5, 11:10

Pga2Offset
0000:0、0001:+0.2、...、1001:+1、1000:0、1001:-0.2、...、1101:-1.0
 オーバ・サンプリング周波数は、解像度と変換時間に影響する。また、電源電圧によっても制限があるが、データシートを読んでも複雑。デフォルトで動く。

 

RegACCfg3(0x55) デフォルト値b00001100

 PGA3の’0001100'は増幅率1の設定。

 D7 D6  D5  D4  D3  D2  D1  D0 
 Pga1Gain
0:1, 1:10
Pga3Gain
0000000:0、0000001:1/12 (=0.083)、...、0000110:6/12、
...、0001100:12/12、...、1111111:127/12 (=10.58)

 

RegACCfg4(0x56) デフォルト値b00000000

 デフォルトでは、PGA3のオフセットは0の設定。

 D7 D6  D5  D4  D3  D2  D1  D0 
 - Pga3Offset
0000000:0、0000001: +1/12 (=0.083)、...、0000110:+6/12、
...、0100000:32/12、...、 0111111:+63/12 (=+5.25)、1000000:0、1000001:-1/12 (=-0.083)、...、1111111:-63/12 (=-5.25)

RegACCfg5(0x57)  デフォルト値b00000000

 D7 D6  D5  D4  D3  D2  D1  D0 
 Busy
変換中1

Def
デフォルト値に戻して新しい変換を始める

Amux 
D5:(0はディファレンシャル、1はシングル)、D4:(接続の入れ替え 0 はストレート, 1はクロス)、D3,D2,D1:チャネル

Vmux
ディファレンシャル入力。0:Vbatt、1:Vref

  デフォルトはAC1のVref=1.22Vの電圧を測る設定。

  • AC2入力のシングルエンド入力で、電源(約3.3V)を基準電圧源として使う;b00100100
  • AC2(-)、AC3(+)のディファレンシャル入力で、電源(約3.3V)を基準電圧源として使う;b00000010。測定電圧範囲は±1.65V
  • AC2入力のシングルエンド入力で、内部基準電圧源(1.22V)を使う;b00100101
  • AC2(-)、AC3(+)のディファレンシャル入力で、内部基準電圧源(1.22V)を使う;b00000011。測定電圧範囲は±0.61V

RegMode(0x70) デフォルト値b10000100

 デフォルトでは、4.5V以上の電源で使うチャージ・ポンプが動かない設定。ラズパイは3.3Vで動かすので、D3を'1'に変更する。

 D7 D6  D5  D4  D3  D2  D1  D0 
 - - Chopper  MultForceOn MultForceOff VrefD0Out VrefD1In

配線

 ブレッドボード上では、3.3V-GND間に0.1uFの積層セラミック・コンデンサと22uFの電解コンデンサを入れています。

 配線が終わったらラズパイの電源を入れます。確認のためにターミナルで i2cdetect -y 1 を実行すると0x48でした。

プログラム

 基準電源に内部Vrefを使うプログラムです。 内部Vrefは1.22Vです。Vrefに電源電圧を使うときは、6桁半のDMMでラズパイGPIOの1番ピンを測定し、Vrefに記述しました。

 測定できる入力電圧はVref/2の電圧以内です。シングルエンド入力のときは0~Vref/2、ディファレンシャル入力では±Vref/2です。 

 プログラムは、ディファレンシャル入力で内部基準電圧源(1.22V)を使う設定です。

#!/usr/bin/env python
import smbus
import time
i2c = smbus.SMBus(1)
addr = 0x48
Vref = 1.22
RegACOutLsb = 0x50
RegACOutMsb = 0x51
RegACCfg0 = 0x52
RegACCfg1 = 0x53
RegACCfg2 = 0x54
RegACCfg3 = 0x55
RegACCfg4 = 0x56
RegACCfg5 = 0x57
RegMode = 0x70
#init
i2c.write_byte_data(addr, RegACCfg0 , 0b01111110)
i2c.write_byte_data(addr, RegACCfg1 , 0b11111111)
i2c.write_byte_data(addr, RegACCfg5 , 0b00000011)
i2c.write_byte_data(addr, RegMode , 0b10001000)

def sign16(x):
return ( -(x & 0b1000000000000000) | (x & 0b0111111111111111) )

#main
while 1:
data = i2c.read_i2c_block_data(addr,RegACOutLsb,2)
  data16 = (data[1]<<8 | data[0])
dataDiff = sign16(int(hex(data16),16))
print round((Vref * dataDiff / 65535),4),"V"
time.sleep(1)

実行結果

 電圧発生器で小数点第4位まで出力した値を測っています。0.0300V/-0.0300Vの設定で、上記のプログラムは0.0325V/-0.0266Vの表示、DMMで測ると0.03005V/-0.03008Vでした。SX8725Cの入力インピーダンスが低いので、影響が出ているのかもしれません。ロードセル用のA-Dコンバータでは、ブリッジ回路との配線距離を短くする注意があるので、40cmほど電圧発生器と離れているのも誤差の原因かもしれません。実験中の室温は16℃でした。

 PGA1のゲインを1から10に変更します。#initに下記の命令を追加します。

i2c.write_byte_data(addr, RegACCfg3 , 0b10001100)

 実行結果は0.278V/-0.272V前後でした。ばらつきが比較的大きいです。

 PGA1を元のゲイン1に戻し、PGA2のゲインを1から10に変更します。#initに下記の命令を追加します。

i2c.write_byte_data(addr, RegACCfg3 , 0b00001100)
i2c.write_byte_data(addr, RegACCfg2 , 0b00110000)

 実行結果は0.3015V/-0.2895V前後でした。測定結果の変動は、PGA1より小幅です。

 PGA2を元のゲイン1に戻し、PGA2のオフセットを+0.2Vに変更します。#initに下記の命令を追加します。

i2c.write_byte_data(addr, RegACCfg3 , 0b00001100)
i2c.write_byte_data(addr, RegACCfg2 , 0b00000001)

 実行結果は-0.2217V/-0.2709V前後でした。オフセットを-0.2Vにしたときは、0.2481V/0.2481Vでした。予想と異なっていますが、変化はしています。

 AC2のシングルエンド入力、Vref=電源電圧=約3.29Vにします。0~1.65Vの範囲が測れます。電圧発生器で0.0300Vを発生させます。読み取りは0.0356Vでした。

i2c.write_byte_data(addr, RegACCfg5 ,0b00100100)

 PGA2のオフセットを+0.2Vに変更します。#initに下記の命令を追加します。

i2c.write_byte_data(addr, RegACCfg3 , 0b00001100)
i2c.write_byte_data(addr, RegACCfg2 , 0b00000001)

 実行結果は+2.6703Vでした。オフセット-0.2Vの設定では+0.6948Vでした。

オフセット値 実行結果[V] 偏差[V]
+0.4 -1.2831 -1.3187
+0.2 2.6703 2.6347
# 0.0356 -
-0.2 0.6948 0.6592
-0.4 1.3545 1.3189

 規則性がよくわかりませんでした。プログラムに問題があるかもしれません。ロードセルなどのブリッジ測定回路に適した構成のデバイスなので、そのような用途では、アンプやオフセットを適切に設定すると精度良くデータを取得できるのかもしれません。

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

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

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

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