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 |
setOsr |
Continuous 1をセットすると前の変換が終了すると新しい変換が開始される |
- |
D7もしくはD1を'1'にセットしないと変換を開始しない。デフォルトではいずれも'0'なので、動かないように読み取れるが、実際は動く。 |
RegACCfg1(0x53) デフォルト値b11110000
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|
lbAmpAdc ADCのバイアス電流。 0:25%、...、11:100% |
lbAmpPga |
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 |
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 |
デフォルトはAC1のVref=1.22Vの電圧を測る設定。
|
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を使いました。