5ドル!ラズパイ・ゼロ(Raspberry pi Zero)でIoT (47) アナログ温度センサ5 白金抵抗体、ADS1220
白金(プラチナ)は、地球上でも安定な物質の一つです。Pt100と呼ばれる白金測温抵抗体は、0℃で100Ω、温度係数は1.3851です。つまり100℃では138.51Ωになります。抵抗値の変化が大きいので利用しやすいです。
ここでは、100Ωの白金薄膜温度センサSDT101BXN100DFを利用します。温度係数は1.35です。近似式がデータシートに書かれています。
Rt = R0 * (1+C1*T+C2*T^2) Rt;T℃での抵抗値 R0;0℃での抵抗値=100Ω T:周囲温度(℃) C1, C2;定数 C1=0.356297*10^-2、 C2=-0.617945*10^-6 |
エクセルでグラフを書きます。プロットして抵抗値から温度を求める近似曲線を得ます。
y = 0.0014*x^2 + 2.5323*x - 266.96 x=100 は0.27℃ 、x=135 は100.42℃ |
誤差が大きめなので少し式を修正して、
y = 0.0014*x^2 + 2.5323*x - 267.23 |
任意の温度でデータシートに書かれている温度-抵抗値表と比較しました。
データシート[Ω] | 96.07 | 100.00 | 107.10 | 110.28 | 113.44 | 119.40 | 134.66 | 135.00 |
---|---|---|---|---|---|---|---|---|
温度[℃] | -11 | 0 | 20 | 29 | 38 | 55 | 99 | 100 |
計算値[℃] | -11.03 | 0 | 20.04 | 29.06 | 38.05 | 55.09 | 99.16 | 100.15 |
差[℃] | 0.03 | 0 | 0.04 | 0.06 | 0.05 | 0.09 | 0.16 | 0.15 |
誤差[%] | 0.3 | 0 | 0.2 | 0.2 | 0.1 | 0.2 | 0.2 | 0.2 |
こちらの変換式を使うことにします。
●測定回路
普通のDMMでは2線式で抵抗値を測ります。抵抗の両端にリード線を当て、微弱な電流を流して電圧を測ってオームの法則で抵抗値を得ます。しかし、測定器DMMから被測定抵抗までのリード線の抵抗が無視できないので、誤差が生じます。
据え置き型のDMMでは4線式に対応しています。電流を流すためのケーブルと、電圧差を測るケーブルを使います。測っている場所ではどちらも結合しています。ケルビン・クリップと呼ばれます。
ケーブル自体は特別のものではありません。
ここで利用する24ビットA-DコンバータADS1220は、2線、3線、4線式のいずれの測定法にも対応しています。RTD(Resistance Temperature Detector)やブリッジ回路の電圧測定に適したA-Dコンバータです。データシートでは3線式の解説が丁寧です。
●ADS1220のおもなスペック
- 動作電圧 2.853~5.5V
- ビット数 24ビット
- 入力 シングルエンド;4チャネル。差動;2チャネル。レファレンス入力が2チャネル。
- 電流源 二つ、プログラマブル
- 基準電圧源 内蔵、外部
- インターフェース SPI+DRDY
- アンプ PGA(最大128倍)
- サンプリング・レート 最大2000SPS
●接続
入力端子Ain0とAin1で電圧を測ります。Ain3は電流出力として設定し、非測定抵抗Ptを通り3.3kΩで終端されます。3.3kΩはアンプPGAの電位を電源電圧の約半分シフトします。0.01uFはコモンモード・ノイズの除去、0.1uFはディファレンシャル・ノイズの除去フィルタ用です。50/60Hzの誘導ノイズはIC内部のフィルタで除去します。
ADS1220はリード線タイプのICをDigi-keyで購入し、秋月電子通商のピッチ変換基板にはんだ付けしました。はんだ付けは、こちらを参照ください。
ADS1220の電源は、ラズパイ5Vからローノイズ電源IC TPS7A4700で3.3Vを得ています。3端子のプリント基板に実装したボードはebayで購入しました。
●レジスタ
データシートには、3線式の詳細な設計手順が解説され、レジスタの設定内容が書かれています。3線式はリード線の補償を行います。これをケルビン接続の4線式にモディファイします。コンフィギュレーション・レジスタの0、1、2は変更なし、3は電流出力IDAC1 をAin2からAin3へ、IDAC2 は使わない設定に変更します。ADS1120と内部構成はよく似ているので、参考にしてください。
◆コンフィギュレーション・レジスタ0(オフセット= 0x00)[リセット時= 0x00] 0x66 AIN P = AIN1、AIN N = AIN0、ゲイン= 8、PGAイネーブル ◆コンフィギュレーション・レジスタ1(オフセット= 0x00)[リセット時= 0x00] 0x04 DR = 20 SPS、通常モード、連続変換モード ◆コンフィギュレーション・レジスタ2(オフセット= 0x00)[リセット時= 0x00] 0x55 外部リファレンス(REFP0、REFN0)、50Hzと60Hzの同時除去、IDAC =500μA ◆コンフィギュレーション・レジスタ3(オフセット= 0x00)[リセット時= 0x00] 0x80h IDAC1 = AIN3 |
●プログラム
16ビットADS1120と内部構成やタイミングは同じです。この時は、SPIのチップ・セレクトCSをLowにした後、変換データがDRDYの立ち上がりに同期して送られるため、ラズパイのspidevライブラリを使いませんでした。
ここでは、CSがLOWになったあと、RDATAコマンドを送ると変換データを送ってくれる方法をとります。この手順であれば、spidevライブラリが使えます。ADS1220のSPIタイミングを見ると、クロックの立ち下がりで確定しています。したがって、デフォルトではなくmode=1でデータを読み取ります。
Vrefは電流500uAと抵抗3.30571kΩ(DMMの実測値)を乗じた1.652855Vです。PGA=8で利用しているので、LSBは次の値になります。
2*Vref/8/2^24=2.46294588e-8 |
これは電圧なので、抵抗値にするには500uAで割ります。求まった抵抗値Rを下記の式から温度に換算します。
Temp = 0.0014*R^2 + 2.5323*R - 267.23 |
読み出しコマンド0x10に続いてダミー0xffを3バイト送ります。データシートによれば、温度データ3バイトが送られてくるはずですが、4バイトを受け取ります。最初の2バイトは同じ値なので、2番めからのデータを利用しました。
#!/usr/bin/env python
import spidev
import time
spi = spidev.SpiDev()
spi.open(0,0) #port 0,cs 0
spi.mode=0x01
spi.max_speed_hz = 1000000
def sign24(x):
return ( -(x & 0b100000000000000000000000) |
(x & 0b011111111111111111111111) )
#main
spi.xfer2([0x06]) #reset
time.sleep(0.01)
spi.xfer2([0x40,0x66]) #configregistor0,1byte
spi.xfer2([0x44,0x04]) #configregistor1,1byte
spi.xfer2([0x48,0x55]) #configregistor2,1byte
spi.xfer2([0x4c,0x80]) #configregistor3,1byte
while 1:
adc = spi.xfer2([0x10,0xff,0xff,0xff])
data = (adc[1] << 16) | (adc[2] << 8) | adc[3]
data_s = sign24(int(hex(data),16))
volt = (data_s*2*1.652855 ) /8 /16777216
R = volt/0.0005
temp= 0.0014*R*R + 2.5323*R -267.23
print volt,"V",R,"ohm",round(temp,2),"'C"
time.sleep(1)
spi.close()
実行結果です。温度の小数点第2位が安定に表示できているので、24ビットA-Dコンバータで16ビット程度の確度は確保できているのかもしれません。
※執筆時点;2017-11-29版をダウンロードし、sudo apt-get update と sudo apt-get upgrade -y および sudo rpi-update で更新し、カーネルはuname -a で確認。4.9.77でした。
※プログラムを仮にpt100.pyという名前で/home/piに保存すると、sudo chmod 755 pt100.py で実行権を付け、ターミナルから、python pt100.pyで実行します。I2CやSPIのグループにpiユーザが属しているので、sudoは不要です。
プログラム・リストは、表示の関係でTabキーが無視されるので、スペースに代えてあります。また、リスト中を2回クリックすると全選択になるので、CTRL-Cでコピーし、テキスト・エディタにCTRL-Vで貼り付けて利用してください。ラズパイに持っていくと、スペースやリターン・コードなどが化けていることがあるので、一度消して、ラズパイのテキスト・エディタで修正してください。
※I2Cの有効化は、こちらの説明を参照ください。SPIなどにもEnableにチェックを入れています。