RaspberryPi ADS1115でK型熱電対を使う

 2017-03-23
ADS1115とK型熱電対を用いて-200℃~1000℃程度まで計測できる温度計を作りました。
 
熱電対は熱起電力(ゼーベック効果)によって発生する電位差を観測することによって温度差を知るセンサーである。
ここで重要なのは、測定対象はあくまで温度差である点で、別途、基準となる絶対温度を知るすべが必要になる。
熱電対の一端を氷水で冷やすことで0℃の基準温度を作り出す手法もあるが、今回はLM61CIZを使って絶対温度を取得し、熱電対の測定値に冷点補正をかける方法を試してみる。


機材

  • ADS1115
    • I2Cを喋れるPGA付き16bit ADC
    • PGA最大で1LSB=7.8125uV ( range: ±0.256V )
    • 4chマルチプレクサ付きで、差動入力・シングルエンド入力 選択可能
  • K型熱電対
    • 40.7uV/℃ でほぼ一定(K型)
    • 1250℃くらいまで測定可能(らしい)
  • LM61CIZ
    • 10mV/℃
    • 0.6Vのオフセット(600mV=0℃)をもち単電源で-30℃まで測定可能
    • 精度は室温25℃で±4℃以内

ADS1115の詳細はTIのデータシート参照
http://www.ti.com/lit/ds/symlink/ads1115.pdf



接続

I2CでPiと接続する。熱電対は差動入力とするのでANI0とANI1に接続。LM61CIZはシングルエンド入力とするのでANI2かANI3どちらかに接続する。
熱電対のアルメル側をANInに接続することで、AD変換値の正負がそのまま温度差の正負として扱えうことができ、計算が簡単になる。
                  ADS1115                    Pi
┌──────┐ ┌──┐
│ ALART○─Open │ │
Thermo(Cr)──○ANI0 SCL○──┬───○SCL │
Thermo(Al)─┬○ANI1 SDA○──┼┬──○SDA │
LM61CIZ─┼○ANI2 VDD○─┬┼┼──○3.3V│
NC─┼○ANI3 ADDR○┬┼┼┼┬─○GND │
││ GND○┘││││ │ │
│└──────┘ ││││ └──┘
│ ││││
├──[R 2k Ohm]──┤│││
└┬─[R 2k Ohm]──┼┼┼┤
└─[C 0.1 uF]──┼┼┼┤
││││
AQM0802 ││││
┌────┐ ││││
│ VDD○┬───────┘│││
│ RESET○┘ │││
│ SCL○─────────┘││
│ SDA○─┐ ││
│ GND○─┼┬───────┼┘
└────┘ ││ │
││ │
2SA1015 ││ │
┌───┐ ├┼─[100k Ohm]─┤
│ B○──┘│ │
│ C○───┘ │
│ E○───────────┘
└───┘
利便性upのためキャラクタLCD等も付けたので、最終的には上記のようになりました

ADC動作

ADS1115のデータシートを参照しつつ、i2csetとi2cgetでアクセスする。

i2cset,i2cgetの詳細は下記が詳しい

http://www.hogetan.net/note/memo/pi_i2ccmd.html


下記の手順で熱電対とLM61CIZの電圧を取得できる。
  1. ADS1115(SLAVE_ADDR=0x48)のConfig Register(REG_ADDR=0x01)に書き込みを行う
    i2cset -y 1 0x48 0x01 0x8f 0x03 i
    OS=1 A/D変換開始
    MUX=000 AINp=ANI0,AINn=AIN1
    PGA=111 FSR=±0.256V
    MODE=1 Single-shot mode
    DR=000 8 Sample/Sec
    COMP_MODE=0 Traditional comparator (not use)
    COMP_POL=0 Active low (not use)
    COMP_LAT=0 Nonlatching comparator (not use)
    COMP_QUE=11 Disable comparator (default)
  2. Config RegisterのOS=0を確認するか、単に時間待ち(8spsの時125ms以上)する
  3. Conversion Register(ADDR=0x00)から変換結果を読み出す
    i2cget -y 1 0x48 0x00 w
    16bitの変換結果が返ってくる
  4. Config Registerに書き込みを行う
    i2cset -y 1 0x48 0x01 0xe5 0x03 i
    OS=1 A/D変換開始
    MUX=110 AINp=ANI3,AINn=GND
    PGA=010 FSR=±2.048V
    MODE=1 Single-shot mode
    DR=000 8 Sample/Sec
    COMP_MODE=0 Traditional comparator (not use)
    COMP_POL=0 Active low (not use)
    COMP_LAT=0 Nonlatching comparator (not use)
    COMP_QUE=11 Disable comparator (default)
  5. Config RegisterのOS=0を確認するか、単に時間待ち(8spsの時125ms以上)する
  6. Conversion Register(ADDR=0x00)から変換結果を読み出す
    i2cget -y 1 0x48 0x00 w
    16bitの変換結果が返ってくる


測定用shellscript

  1. i2csetで測定対象のchの設定を行う
  2. 変換時間を待つ(8spsで125ms以上)
  3. i2cgetで変換結果を読み出す
  4. 小文字を大文字に変換する(bcコマンドは16進数入力時に大文字のみ認識するため)
  5. 読み出したデータのバイトスワップを行う(0x1234 -> 0x3412)
  6. bcコマンドで温度の算出を行う(必要に応じて2の補数表現を考慮する)



実行結果

[pi@raspi1bp-01]% ./ads1115.sh
Thermocouple_raw_HEX : 0008
LM61CIZ_raw_HEX : 2FC4
Thermocouple_raw : 8
LM61CIZ_raw : 12228
Thermocouple_uV : 62.5000 uV
LM61_uV : 764250.0 uV
Thermocouple_degC : 1.535626535626 degC
LM61_degC : 16.425000000000 degC
RESULT : 17.960626535626 degC

マイナスの温度も測ってみよう、と冷凍庫にセンサーを突っ込んでみた。
[pi@raspi1bp-01]% ./ads1115.sh
Thermocouple_raw_HEX : FF23
LM61CIZ_raw_HEX : 335B
Thermocouple_raw : -221
LM61CIZ_raw : 13147
Thermocouple_uV : -1726.5625 uV
LM61_uV : 821687.5 uV
Thermocouple_degC : -42.421683046683 degC
LM61_degC : 22.168750000000 degC
RESULT : -20.252933046683 degC


所感

  • 変換速度を速めようと64spsや128sps等を試してみたが、繰り返し精度が悪化した。
  • 複数サンプリングして平均化するのでもなければ、8spsのほうがマシかなと思った。
  • PGAで手軽に数十uVの分解能が得られるのは小気味いい。
    • レンジが狭くなるが、熱電対のような微小電圧には最適。
    • PGA最大でLSB=7.8125uV,Vpp=±0.256Vだが、K型熱電対ならVpp=±0.064Vまで狭くなってもいいかな。
  • 測定誤差に関してはLM61CIZの±4℃というのが支配的のようだ。


試験運用 ハンディウォーマー

Zippo Handy Warmerに少量の燃料を入れて温度ログを取った。
燃料切れ間際に温度が上昇する特性があるかもしれない?
thermocouple_handywarmer.png

試験運用 冷凍庫

マイナスの温度も測ろうと、冷凍庫へセンサーを突っ込んだ。冷凍庫内の壁面に接触しないように保持した。
8時以降は冷凍庫の調整つまみで冷凍強度を「強」にした。たしかに8時以降は温度が下がっている。
13時過ぎに0℃近くまで温度が上がっている。おそらく霜取り動作だろう。
thermocouple_freezer.png


ADT7410との比較

誤差±0.5℃というADT7410と比較してみた。
温度差を最小にするため、熱電対とADT7410とをテープで一纏めにして、温度変化の少ないと思われる(※)物置部屋に放り込んだ。
※とは言え窓際に置いてしまったため多少の温度変化はある
thermocouple_vs_ADT7410.png
ADT7410と、熱電対+LM61CIZでは、後者のほうが約0.91℃程度低く出るようだ。
熱電対+LM61CIZの測定値に約0.91のゲタを履かせるという単純な補正だけで非常に良好なコリレーションが得られた。

LM61CIZの結果で興味深いのは、温度が上昇する局面では非常に良く追従しているが、逆に温度が下がっていく際は値が上下にばらついているのが分かる。そういう特性のセンサーということだろうか。

ADT7410と熱電対+LM61CIZの誤差

約0.9℃を中心としたほぼ定常的な誤差がある。LM61CIZのスペック上の誤差は±4℃なので、個体差の範囲内だろう。
thermocouple_vs_ADT7410_diff.png

ADT7410の値と補正後の値との誤差

単純な補正をかけるだけでそれぞれの誤差は±0.2℃にまで近づいた。
ADT7410の絶対値誤差は±0.5℃なので、熱電対+LM61CIZの絶対値誤差は±0.7℃と言える。
thermocouple_vs_ADT7410_diff_mod.png


LM61CIZの誤差が支配的

絶対温度を比較すると誤差があるが、熱電対というよりはLM61CIZの誤差が見えているだけのようだ。
室内に安置すると熱電対単体の起電力はゼロになった。
[pi@raspi1bp-01]% ./ads1115.sh
Thermocouple_raw_HEX : 0000
LM61CIZ_raw_HEX : 3006
Thermocouple_raw : 0
LM61CIZ_raw : 12294
Thermocouple_uV : 0 uV
LM61_uV : 768375.0 uV
Thermocouple_degC : 0 degC
LM61_degC : 16.837500000000 degC
RESULT : 16.837500000000 degC


よくわかるどうが




 
コメント












管理者にだけ表示を許可する
トラックバック
トラックバックURL:
http://wbbwbb.blog83.fc2.com/tb.php/283-a811fb1f
≪ トップページへこのページの先頭へ  ≫