« I2C大気圧センサーLPS331の分解能はほんとうに高いのか?(温度編) | トップページ | PICでI2C - MPL115A2の大気圧計算法 »

2014年9月12日 (金)

PICで作るお手軽サーミスタ温度計 (1)

実装の具体的な状態を新たに記事にしました。

  「PICで作るお手軽サーミスタ温度計 (2)

ソース一式もダウンロードできるようになっています。

(2014.09.22、2014.09.23)

サーミスタによる温度測定の考え方、より精度の高い計算方法、実測値の精度などについては以下の記事があります。

サーミスタで温度を測る - 温度と抵抗値の相互変換 - B定数について
サーミスタによる温度測定の精度 - 2 - B定数の温度特性
サーミスタで正確な温度を求める方法 - 抵抗値-温度変換計算の精度と誤差
サーミスタ温度測定の精度と誤差 - 熱放散定数と自己加熱
サーミスタ温度測定の精度と誤差 - 製品のばらつきによる不確かさ
氷点下のサーミスタの特性と測温抵抗体(白金薄膜抵抗)による温度測定」  

サーミスタにこだわらないのであれば
  「PICで作る温度計のセンサー比較(サーミスタ、熱電対、白金測温抵抗体、...)
  「温度センサ(サーミスタ・熱電対・(白金)測温抵抗体)の誤差

とくに測温抵抗体(白金薄膜抵抗)がおすすめです。
  「(白金)測温抵抗体(白金薄膜抵抗)の使い方 - 基礎編というか入門編というか....

(2015.06.23)
-------

以前書いたI2C大気圧・温度センサーの記事

  「PICでI2C - 大気圧・温度センサーLPS331APの使い方

をこの記事の内容で上書きしてしまったのに気づいたので元に戻しました。そこでサーミスタ温度計の話はこちらに引っ越しました。

------

何度か記事にした“各種温度計”の写真に“サーミスタの抵抗値から”というのがありました。
Imgp2549580

この温度をどうやって求めているのかを具体的に書きます。

------
サーミスタによる温度測定の特徴

1. NTCサーミスタのように温度検知用のサーミスタだとデータシートにある基準抵抗とB係数を使ってもそこそこ正確な温度が求められます。
上の写真の例だと白金薄膜抵抗の特性を検討した結果正しい温度は27.0度くらいと思われます。とするとAM2321と同じくらいの精度が出ています。
摂氏0度では誤差が大きくなりましたがそれでも1度以下でした。LPS331APより精度が良かったです (^^;;

2. 以下に書くように簡単な回路+PIC内蔵の10ビットのADコンバータでも0.1度近い分解能が得られます。0.01度の分解能の実現も容易です。まだ記事にしていないのですが熱電対では0.1度の分解能の実現に四苦八苦しています。

3. 安上がりです。この記事に使ったNTCサーミスタは秋月で5個200円で買えます。
白金薄膜抵抗や熱電対は秋月でもセンサー自体数百円しますし、それ以外に高精度のADコンバータ、(熱電対だと)低オフセット、低ドリフトのオペアンプが必要になります。

4. お手軽です。この記事にあるように作っても1度誤差が出るということはないと思います。

5. PICにAD変換用のピンがあるだけ温度計が作れます。何箇所もの温度を同時に監視することができます。

ただ精度を上げるは面倒です。
白金(薄膜)抵抗や熱電対は最初は面倒なのですが、きちんと作りあげればそれなりの精度が期待できます。

------

温度計のために準備するものは抵抗とサーミスタそれぞれ一個だけです。
温度を表示するための仕組みは必要ですがそれはLEDなりLCDなりあるものとします。
RS232Cを使ってPCにデータを送るということでもいいでしょう。

まず次のように接続します。AN0はPICの(AD変換用の)アナログ入力端子です。AN0にかぎらずどこでもいいです。16F1938なんかだといくらでもサーミスタ=温度計を増やせます。
Thermistor
V(AN0)  / Vss = Rthermistor / ( R1 + Rthermisor )

という関係からサーミスタの抵抗値Rthermisorを求め、これから温度を求めます。
“Rthermistor”というのは上の図の“Thermis”のことです。


サーミスタ(Thermisor)は基準となる抵抗値(25度Cのときの抵抗値)が10kΩか47kΩあたりが使いやすいでしょう。別になんでもいいんですがB係数とか熱拡散係数がわかっているものにします。
抵抗はサーミスタと同じくらいの抵抗値のものがいいと思います。抵抗値はカラーコードを鵜呑みにせずちゃんと測っておきます。

上の図のR1は実測する必要があるのでテスター(DMM)のフルスケールに近いところで測れるようなものを選択するというのもアリだと思います。

※ あとで気づいたのですが上図のR1と下のソースにあるR1は別のものです。
  下のソースではRsというのが上図のR1です

この二つを直列にして抵抗の方をVDD、サーミスタ側をグランド(VSS)に接続します。上の図ではVDDが3.3Vになっていますが、これも違ってもかまいませんしそもそもVDDの電圧をちゃんと測る必要もないです。

サーミスタと抵抗の接続点をPICのADコンバータのピンにつなぎます。

------

プログラムはXC8コンパイラ、PICが16F1938での例です。16F1938でなくてもADコンバータがあればどれでもいいのですが、Cコンパイラは使わないとなかなかにたいへんなことになります。


// サーミスタと直列にしてある抵抗の実測値
// できるだけ温度係数が小さい金属皮膜抵抗を使いましょう
float Rs=9860;

// サーミスタの25度での抵抗値(データシートにあります)
float Rr=10000;

// サーミスタのB係数(データシートにあります)
float Rr=3380;
float B=3380;

// サーミスタの熱拡散係数(データシートにあります)
float Rr=0.0015;
float Cs=0.0015;

// Vddの電圧
// 使うのは自己発熱の計算だけなので適当でいいです二桁もあれば十分です。
float Vdd=3.3;

// サーミスタ両端の電圧のAD変換値です。
// Th_T/フルスケール(0x3FF)が分圧比になります。
// Th/フルスケール(0x3FF)が分圧比になります。
float Th;

// 測定時のサーミスタの抵抗値
float R1;

// 温度
float Th_T;

// 読み取り値
unsigned int ip_Th[2];

// AN0をアナログ入力にします。
// いつもどおり事故防止のため使わないピンは入力ピンにしています。
TRISA  = 0b11111111 ;
ANSELA = 0b00000001 ;

// 変換結果右づめ (bit7=1)
// 変換クロック FRC (bit6-4=111)
// Vref-: VSS (bit2=0)
// Vref+: VDD (bit1-0=00)
ADCON1 = 0b11110000 ;

以下が繰り返しになります。

// AD変換を開始します
ADCON0 = 0b00000011 ; 

// AD変換終了を待ちます         
while(ADCON0 & 0b00000010) ;

// 結果を取得します
ip_Th[0] = ADRESH;
ip_Th[1] = ADRESL;

// 変換値を求めます。
Th = ip_Th[0] * 256.0 + ip_Th[1];

// サーミスタの抵抗値を求めます。
R1 = Th / ( 0x03 * 256.0 + 0xFF - Th) * Rs;

// 抵抗値を温度に変換します(logは自然対数です)
// 計算式の左側の方は熱力学温度での計算なので273.15を足したり(298.15=25+273.15)引いたりします。
Th_T = 1/(log(R1/Rr) / B + 1/298.15) - 273.15;

// 自己発熱の影響を取り除きます。
// サーミスタの消費電力を熱拡散係数で割ったものが自己発熱による温度上昇です。
Th_T = Th_T - ((Vdd/(R1+Rs))*(Vdd/(R1+Rs))*R1) / Ch;

LCD_SetCursor(0,1);
sprintf(buf,"%5.1f   ",Th_T);
LCD_Puts(buf);

------

関連

記事一覧(測定、電子工作、天文計算
  「PIC+SPI+I2C 自記温湿度計+気圧計+8ch電圧計+周波数カウンタ(技術要素一覧)

“温度”について
  「正確な温度を求めて (1)

温度センサについて
  「PICで作る温度計のセンサー比較(I2C/SPI温度センサ、サーミスタ、熱電対、白金測温抵抗体、pn接合など)
  「温度センサ(サーミスタ・熱電対・(白金)測温抵抗体)の誤差

サーミスタについて
  「サーミスタで温度を測る - 温度と抵抗値の相互変換 - 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大気圧センサーLPS331の分解能はほんとうに高いのか?(温度編) | トップページ | PICでI2C - MPL115A2の大気圧計算法 »

趣味の電子工作」カテゴリの記事

コメント

 こんばんは。参考にさせていただいております。
この記事の中ですが変数Rrが下の式と合っていません。
少し考えればわかることなのですが、せっかくなのであわせていただきたく。
あと厚かましいのですが、できましたら
全ソースを載せていただけるととてもうれしいです。

ではでは。

ご指摘ありがとうございます m(._.)m
わかりやすいようにと思って記事にするとき変数名を変えたのですが、それでめちゃくちゃにしてしまいました。余計なことはしないほうがいいですね (^^;;
変数名の件は記事を修正済みです。
じつは今サーミスタの(B係数が温度に依存しないと仮定したときの)精度について細かいチェックを行っています。
“サーミスタ温度計”の全ソースと新しい記事へのリンクは明日にはご覧いただけるようにしておきます。
これからもよろしくお願いします m(._.)m

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1994983/57351904

この記事へのトラックバック一覧です: PICで作るお手軽サーミスタ温度計 (1):

« I2C大気圧センサーLPS331の分解能はほんとうに高いのか?(温度編) | トップページ | PICでI2C - MPL115A2の大気圧計算法 »

フォト

サイト内検索

  • 記事を探されるんでしたらこれがいちばん早くて確実です。私も使ってます (^^;; 検索窓が表示されるのにちょっと時間がかかるのはどうにかしてほしいです。

新着記事

リンク元別アクセス数

  • (アクセス元≒リンク元、原則PCのみ・ドメイン別、サイト内等除く)

人気記事ランキング

  • (原則PCのみ、直近2週間)
無料ブログはココログ