PICの内部温度を測る

〔PICの動かせ方入門に戻る〕


PIC12F1822にはTEMPERATURE INDICATOR MODULE機能があってPICの内部を測定するセンサーが どうも付いている様な感じなので色々いじって見ました。

MCUtoTemp1

アナログ入力機能は図の様に、外に取付けた温度センサー等からPICのアナログ入力ピンに接続してPICのA/D変換機で 値を読み取る様にしていました。
PICの内部に温度センサーが有ってそれがA/D変換機に接続されている様です、
よって、アナログ関連レジスターの設定を変えるだけでアナログ入力と同じように扱えます。
ただ、ADRESH/ADRESLレジスターから読取ったデータを温度に変換する方法がよく分かりません。
こちらAN1333資料を見て色々計算をやって見たのですがぁ、 いま一つ納得行かなくて(納豆食ってもダメでぇ)、何せ英語だしぃ見たいなぁ、 *1)
で、計算の部分を記載するのはやめます、分かったら追記したいと思いますのでぇ......

下記がサンプルプログラムソースです
---------------------------------------------------------------------
#include <stdlib.h>
#include <pic.h>
#include <htc.h>              // delay用に必要

#define _XTAL_FREQ 8000000    // delay用に必要(クロック8MHzを指定)

// コンフィギュレーション1の設定
// CLKOUTピンをRA4ピンで使用する(CLKOUTEN_OFF):内部クロック使用する(INTIO)
// 外部クロック監視しない(FCMEN_OFF):外部・内部クロックの切替えでの起動はなし(IESO_OFF)
// 電源電圧降下常時監視機能ON(BOREN_ON):電源ONから64ms後にプログラムを開始する(PWRTEN_ON)
// ウオッチドッグタイマー無し(WDTE_OFF):
// 外部リセット信号は使用せずにデジタル入力(RA3)ピンとする(MCLRE_OFF)
// プログラムメモリーを保護しない(CP_OFF):データメモリーを保護しない(CPD_OFF)
__CONFIG(CLKOUTEN_OFF & FOSC_INTOSC & FCMEN_OFF & IESO_OFF & BOREN_ON &
         PWRTE_ON & WDTE_OFF & MCLRE_OFF & CP_OFF & CPD_OFF) ;
// コンフィギュレーション2の設定
// 動作クロックを32MHzでは動作させない(PLLEN_OFF)
// スタックがオーバフローやアンダーフローしたらリセットをする(STVREN_ON)
// 低電圧プログラミング機能使用しない(LVP_OFF)
// Flashメモリーを保護しない(WRT_OFF):電源電圧降下常時監視電圧(2.5V)設定(BORV_25)
__CONFIG(PLLEN_OFF & STVREN_ON & WRT_OFF & BORV_25 & LVP_OFF);

// 指定した時間(num x 10ms)だけウエイトを行う処理関数
void Wait(unsigned int num)
{
     int i ;

     // numで指定した回数だけ繰り返す
     for (i=0 ; i<num ; i++) {
          __delay_ms(10) ;     // 10msプログラムの一時停止
     }
}
// 内部温度センサー値の入力処理
unsigned int adconv()
{
     unsigned int temp;

     GO_nDONE = 1 ;          // PICに内部温度センサー値読取り開始を指示
     while(GO_nDONE) ;       // PICが読取り完了するまで待つ
     temp = ADRESH ;         // PICは読取った値をADRESHとADRESLのレジスターにセットする
     temp = ( temp << 8 ) | ADRESL ;  // 10ビットの分解能力です

     return temp ;
}
// メインの処理
void main()
{
     unsigned int  n , temp ;
     char s[8] ;
	
     OSCCON = 0b01110010 ;   // 内部クロックは8MHzとする
     ANSELA = 0b00000000 ;   // アナログは使用しない(すべてデジタルI/Oに割当てる)
     TRISA  = 0b00001000 ;   // ピンは全て出力に割当てる(RA3は入力のみとなる)
     PORTA  = 0b00000000 ;   // 出力ピンの初期化(全てLOWにする)

     FVRCON = 0b00100000 ;   // 内部温度センサーを使用する、VOUT=VDD-4VT (High Range)に設定
     ADCON1 = 0b11100000 ;   // 読取値は右寄せ、A/D変換クロックはFOSC/64、VDDをリファレンスとする
     ADCON0 = 0b01110101 ;   // アナログ変換情報設定(内部温度センサーから読込む)
     __delay_us(200) ;       // アナログ変換情報が設定されるまでとりあえず待つ

     while(1) {
          n = adconv() ;     // 内部温度センサー値を取り出す
          /****************************************************
           *  通常はここに温度変換処理を記述します (n→temp)  *
           ****************************************************/
          itoa(s,temp,10) ;  // 変換数値を文字列に変換する

          Wait(100) ;        // 1秒毎に処理を繰り返す
     }

}
---------------------------------------------------------------------
プログラムについて
HI-TECH C Compiler for PIC10/12/16 MCUs(Lite Mode)V9.80コンパイラを使用しています。

FVRCON = 0b00100000 ;
    赤数字部が1で温度インジケータONです。
    緑数字部でインジケータのレンジ選択です。
    1:VOUT = VDD - 2VT (Low Range) 0:VOUT = VDD - 4VT (High Range)
アナログ変換情報設定
 ADCON0 = 0b01110101 ;
     赤数字の部分"11101"で内部温度センサーから読込むように設定です
     赤数字の部分以外の設定は今回このまま使用して下さい。
     また、データシートに変換は200usかかるみたいなぁ事が書いて有るようなぁ
     感じなので取合えずディレイ入れときました。

 ADCON1 = 0b11100000 ;
     緑数字部分でA/D変換時のリファレンス電圧をどうするかの設定です。
     00:VDDのPIC電圧を使用する 10:6番ピン接続の外部VREFを使用する。
     11:PIC内蔵の固定電圧をしようする。
     赤数字部分でA/D変換を行う速度のクロックを設定します。
     000:FOSC/2 001:FOSC/8  010:FOSC/32
     100:FOSC/4 101:FOSC/16 110:FOSC/64
     また、それ以外の数字部分の設定は今回このまま使用して下さい。

その他

n = adconv()の値を別途作成したデバッグモニターにて表示させ、
PICをヘアドライヤーで温めて見ました(良い子は真似しない様にね!)。
値は大きくなって行きました、なので読み出し方はあっていると思われますがぁ
温度に変換する計算がぁ.............
まだ、書き掛けの記事ってことでぇ........
ってゆうかぁ、誰かの記事待ちぃ、みたいなぁ...

バァ〜ットォ、どうしても、PICをヘアドライヤーで温めて見たい人は、
あ、いや、n = adconv()の値をデバッグモニターにて表示させて見たい人はこちらをコッソリ見てね。



リンク切れ見直し(*1) 2020/03/22


【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.