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.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にチェックを入れています。