PICで作るお手軽サーミスタ温度計 (2) - ソース付き
この記事を書いて2年近くサーミスタでの温度測定の方法とその精度や誤差について書いてきたのですが、今この記事を読み返すと精度に不満があります。この記事にあるソースを利用される方は計算式の部分だけ
にあるものを利用していただければと思います。
「サーミスタで正確な温度を求める方法 - 抵抗値-温度変換計算の精度と誤差」
(2015.06.23)
--------
「PICで作るお手軽サーミスタ温度計」で概要と言うか理論というかそういうのを書きましたが、せっかくですのでもう少し具体的に紹介しておきます。
なおこの方法で作った温度計の精度をチェックした結果が
「温度センサー3種の精度比較(摂氏0度~40度編)」
にあります。
-------
まず構成はこんなことになっています。
A: PIC16F1938のAN0ピン/サーミスタ端子の電圧を測ります。
B: 〃 AN4ピン/これもサーミスタ端子の電圧を測ります。
ANピンはたくさんあるのでサーミスタの増設も容易です。
C: /MCLRのプルアップ抵抗です。10kΩ
D: TXピンに接続されたLED/シリアル出力を確認するためです。Lowで点灯するようにします。
E: サーミスタに直列に接続される抵抗(サーミスタのR0と同じくらいの抵抗を使います)
F: サーミスタ(この写真ではサーミスタの代わりに10kΩの抵抗がついています)
G: I2Cバスのプルアップ抵抗です。
H: パスコン
I: シャントLDOレギュレータ(5V ==> 3.3V)
J: レギュレータの発振防止のコンデンサー
K: I2C接続キャラクタLCDモジュール 16x2行 白色バックライト付(ACM1602NI-FLW-FBW-M01)
L: コントラスト調整用の半固定抵抗
M: パスコン
O: バックライト用LEDの(追加の)電流制限抵抗(300Ω)
P: プログラム書き込み用/PICKit3に接続されています。
Q: 電源(5V)へ接続されています。
この写真ではサーミスタが出払っていたので代わりに抵抗を使っています。
AN0とAN1はもちろん二箇所の温度を測るためですが、ここではテストの意味もあっておなじサーミスタの電圧を測っています。
それなのに温度(右側の表示)が違うのはヘンだと思われるかもしれませんが、電圧(左側の表示)は一致しています。温度が違うのは下にあるようにサーミスタと直列に入った抵抗の抵抗値が違うものとして計算しているからです。
測定結果は(電圧だけですが)シリアルに出力しています。ここではLEDで出力されていることを確かめているだけですが、背景にあるICL3232などを使えばPCと接続することが可能でExcelで取り込んで温度の時間的な変化を分析するというようなことができます。
本題と離れますがLCDのバックライトがとても明るかったので追加の電流制限抵抗を入れました。
ソースは一式ダウンロードできるようにしました。
ソースはmain.cのコメントにもありますが
PIC 16F1938
MPLAB X IDE v2.15
MPLAB(R) XC8 C Compiler Version 1.32
で実際に動作を確認したものです。他の機種やコンパイラでもほとんど修正せずに
使えるのではないかと思います(他のPICのI2Cの操作については「I2Cのソース - PIC12F1822/16F1705/16F1938/18F26K22 - LCD(ACM1602)を例にして」が参考になると思います)
「ダウンロード Thermistor.zip (8.2K)」
ソースの次の部分は実際に使うサーミスタや直列に入れる抵抗の抵抗値、Vddに合わせて変更した上で使用していただければと思います。
float Rs[2]={9860,9970}; // サーミスタと直列に入れた抵抗の抵抗値
// [0] 金属皮膜抵抗 1%
// [1] 金属皮膜抵抗 0.5%
float Rr[2]={10000,10000}; // +/-1% サーミスタのT=25deg.Cでの抵抗値
float B[2]={3380,3380}; // +/-1% サーミスタのT=25deg.CでのB係数
float Ch[2] ={0.0015, 0.0015} ; // 熱拡散係数
float Vdd[2] = {3.3,3.3}; // Rref. = Vdd
温度を算出する関数getTmpThermistor()の中で自己発熱の影響を除くための補正を行っています。
計算に使用している熱拡散係数はサーミスタを無風の空気中におくという前提です。
気温を測るといった目的であれば自己加熱補正の計算はそのまま使っていただいて差し支えないのですが、放熱がいい状態つまり液体にひたすとか金属製のものに接触する面積が大きいとか強制空冷状態で使うとかいうことであれば補正はしないほうがいいでしょう。
計算式を修正しなくても上のChを0.0にすれば補正なしになります。
main.c
毎秒一回温度を測りその結果をLCDに表示しシリアルに出力します。
データの16進表示やシリアル出力の関数なども含まれています。
温度を算出する方法やその背景については次の記事にあります。
「サーミスタで温度を測る - 温度と抵抗値の相互変換 - B定数について」
「サーミスタによる温度測定の精度」
「サーミスタ温度計の精度を調べる - 1」
「PICで作るお手軽サーミスタ温度計」
skI2Clib.c/skI2Clib.h
I2Cのライブラリーです。これは
「きむ茶工房ガレージハウス - 気圧センサーで大気圧と標高を測定して見ます(MPL115A1)(MPL115A2)」
にあるものをつかわせていただきました。
skI2CACM1602lib.c/skI2CACM1602lib.h
LCDのライブラリーです。こちらは
「秋月電子I2C接続小型LCDモジュールに表示を行う」
を元にしたのですが、LCDが別物なので実際に使う
ACM1602NI-FLW-FBW-M01
に合わせて修正しました。
またリンク先の記事にあるソースはI2Cの初期化をLCD_Init()の中でやって
あるのですが、これはmain()で行うようにしました。
測定方法
R1の抵抗がソースにあるRsに相当します。
サーミスタの抵抗値10kΩは摂氏25度でのものです。摂氏0度では27kΩくらいにもなります。
------
関連
「記事一覧(測定、電子工作、天文計算)」
「PIC+SPI+I2C 自記温湿度計+気圧計+8ch電圧計+周波数カウンタ(技術要素一覧)」
“温度”について
「正確な温度を求めて (1)」
温度センサについて
「PICで作る温度計のセンサー比較(I2C/SPI温度センサ、サーミスタ、熱電対、白金測温抵抗体、pn接合など)」
「温度センサ(サーミスタ・熱電対・(白金)測温抵抗体)の誤差」
サーミスタについて
「サーミスタで温度を測る - 温度と抵抗値の相互変換 - B定数について」
「サーミスタによる温度測定の精度 - 2 - B定数の温度特性」
「サーミスタ温度測定の精度と誤差 - 熱放散定数と自己加熱」
「サーミスタ温度測定の精度と誤差 - 製品のばらつきによる不確かさ」
「氷点下のサーミスタの特性と測温抵抗体(白金薄膜抵抗)による温度測定」
「PICで作るお手軽サーミスタ温度計 (2) - ソース付き」
「サーミスタで正確な温度を測るコツ - 基準抵抗(R0)、B定数、熱拡散係数、...」
「続・サーミスタで正確な温度を測るコツ - 基準抵抗(R0)、B定数、熱拡散係数、...」
“素人”でもできる校正について
「氷点 - 摂氏0度の作り方」
「体温計と魔法瓶で校正する白金測温抵抗体 - 36.5度編」
「脇の下恒温槽と体温計で白金抵抗温度計を校正してみた」
恒温槽について
「恒温槽 - 温度を一定に保つアルゴリズム - 1」
「データシートを読んで考えたPIC/PWMの使い方 - 恒温槽のヒータを作る」
“測定装置”について
「PIC+SPI+I2C 自記温湿度計+気圧計+8ch電圧計+周波数カウンタ(技術要素一覧)」
「PIC+SPI+I2C 自記温湿度計+気圧計+8ch電圧計のソース - main()」
電圧の測定について
「PICでI2C - ADコンバーター・MCP3425の使い方」
「PIC18F26K22でSPI - 8ch/ADコンバータ MCP3208の使い方(ソース付き)」
「22ビット(20.6bit)ADコンバータMCP3553の使い方」
抵抗比を測定するための抵抗器について
「精密抵抗のお値段 - 抵抗器の精度と価格の関係」
「金属皮膜抵抗と炭素皮膜抵抗の温度係数を測ってみた - まとめ」
「100Ω±0.1%の精密抵抗の抵抗値を測ってみた - 定電流回路と20.6bitADコンバータMCP353を使う」
定電流回路(電圧電流変換回路)について
「思わぬところで見つけた負性抵抗 - 定電流回路(バイラテラル回路)」
「RS232CインターフェスIC/MAX232Nで作るオペアンプ用正負電源 - 定電圧機能つき」
測定した結果を表示することについて(いずれもI2Cデバイスです)
「I2Cのソース - PIC12F1822/16F1705/16F1938/18F26K22 - LCD(ACM1602)を例にして」
「I2C薄型液晶ディスプレイ(LCD)・AQM1602XAの使い方」
測定した結果を保存することについて
「PICでSPI SDカードを読み書きする」
自己発熱について
「サーミスタや白金抵抗温度計の自己発熱の影響を補正する方法」
白金測温抵抗体(白金薄膜抵抗)について
「(趣味の)白金抵抗温度計の製作 - 準備編
「16bitADコンバータMCP3425とPICで作る白金抵抗温度計 - 1」
「Pt100(白金測温抵抗体)の校正状況 - 氷点=0.0℃編」
「(白金)測温抵抗体の氷点での抵抗値を測ってみた」
熱電対について
「熱電対起電力を直接測定できる22bit(20.6bit)ADコンバータMCP3553」
「ADコンバータMCP3425と計装アンプLT1167で作るK熱電対温度計 - オフセットの自動補正」
「熱電対による温度測定の課題 - K型+インスツルメンテーション(計装)アンプ編」
「熱電対の起電力の近似式 - 起電力と温度の相互変換」 (-20℃~120℃編)
「熱電対の起電力の近似式 - 起電力と温度の相互変換 (250℃~1300℃編)」
pn接合について
電流-電圧の関係について
「ログアンプ - ベース電流(IB)とベース電圧(VBE)の関係」
「pn接合の理想係数を測る」
温度係数
「pn接合順方向電圧(VBE)の温度係数を測ってみた(高精度版)」
「pn接合の順方向電圧(VBE)と温度の関係 -1」
「pn接合の順方向電圧(VBE)と温度の関係 -2 測定方法」
放射温度計
熱力学温度計
「記事一覧(測定、電子工作、天文計算)」の表に参考となる資料へのリンクがあります。
« 意外に正確そうなI2C大気圧センサーMPL115A2の測定値 | トップページ | 正確な温度を求めて (1) »
「趣味の電子工作」カテゴリの記事
- PICで作る100MHz周波数カウンタ検証用XOR(エクスクルーシブオア)逓倍器(2016.03.08)
- 150MHz(~200MHz?)周波数カウンター用プリスケーラー(1/4分周器)(2016.03.06)
- 測温抵抗体(Pt100、白金薄膜温度センサー)の抵抗値を温度に変換する(平方根を使わない)計算式(2016.03.01)
- GPS/JJY(標準電波)を基準周波数源とするためのPLLの詳細(2016.02.27)
- GPS受信モジュール1PPS対決 - GE-612T vs GM-5157A(2016.02.21)
コメント
この記事へのコメントは終了しました。
ここでも発振防止にコンデンサが使われているのですね(≧∇≦)
少しずつでも分かってきて嬉しいです\(^o^)/
投稿: 惑 | 2014年9月22日 (月) 21時18分
はい、これけっこう発振しやすいもののようで秋月でもコンデンサー同梱で売ってました (^^;;
最近電子回路というのはたいていのものは基本を積み重ねていけばそんなに難しいものではないような気がしてきました。
お互い腕を磨いて競いあいましょう (^^)
投稿: セッピーナ | 2014年9月22日 (月) 21時51分