トップページ     電子回路のページのトップ

 部品の温度を計る

 画像をクリックすると拡大表示されます。(全部ではありません。)
 拡大画像からはブラウザの「←戻る」ボタンで戻ってください。


 電気部品、電子部品の温度を知りたい

 充電器を何台か作ったのですが電力を扱う関係上、発熱する部品が出てきます。
 その際、指先で触って、これくらいなら大丈夫だろう程度の判断で済ましていました。
 部品の大体の温度が計れる温度計があったら便利だろうと思っていました。
 今回、部品の大凡の温度を計る温度計を製作したので紹介します。


 センサーの選定

計測用サーミスタ

 表面温度計と言っても非接触のものは作れないので、部品に接触させるセンサーを選定する必要があります。
 半導体温度センサーは温度に比例する電圧出力が得られるので簡単ですが、寸法が大きくて取り付けに難があります。
 ダイオードは小型のものもありますが、温度変換テーブルを作成して校正作業が必要です。
 特性のバラツキがあるので、センサーを交換するときは校正をやり直さなくてはなりません。
 熱電対は保護管に入っていない物は小型ですが、冷接点補償等、回路的に面倒で、校正も大変です。
 今回は手持ちの計測用サーミスタ(上の写真)を使用しました。
 サーミスタにも色々な形状、抵抗値のものがありますが、今回使用したものは写真中央の胡麻粒より小さいものです。
 名称は103ETと言い、103は25℃の抵抗値が10KΩであることを示します。
 下側のやや大きな形状のものは103ATといい、25℃の抵抗値は同じですが全体的な特性は異なります。
 形状が大きい分、時定数は大きくなっています。
 ただ、自己発熱に関しては有利で、相対的に高い電圧を加える事が出来るので、回路的な扱いは楽です。
 室温の計測等ではこちらの方が一般的だと思います。


 温度計測の原理

計測回路

 電圧源は基準電圧ICの1.235Vで一定、分圧抵抗の値も2.2KΩ一定です。
 サーミスタの抵抗値は温度によって変化するので、検出電圧は温度によって変化します。
 温度に対する抵抗値のテーブルはメーカーから公表されているので、検出電圧から逆に温度を計算で求めることが出来ます。
 検出電圧と温度の関係がリニアであれば簡単な計算で温度を求める事が出来ます。
 サーミスタの抵抗値は温度に対して直線的に変化しませんが、分圧抵抗の値を選定する事により、温度に対する検出電圧の関係を 直線に近づける事が出来ます。
 検出抵抗の値は測定する温度範囲の低温側のサーミスタの抵抗値と高温側の抵抗値の中間の値となりますが、最適値をエクセルで カットアンドトライします。


 仕様

 大雑把な値が判れば良いので温度は整数値で表示します。
 誤差は±2℃以内に収まれば良いと思います。
 温度表示範囲は35℃〜85℃としました。
 35℃以下なら全く問題無いし、85℃以上では何らかの変更を求められると考えたからです。
 もう一つの理由は温度範囲を50℃にすれば±1℃以内の誤差で直線化出来ることを経験しているからです。
 さらに103ETのデータが90℃までしかないことも理由の一つです。
 最高使用温度は90℃となっていますが、90℃で使えて90℃を越えたら直ぐ壊れるということも無いと思います。
 それでも、明らかにダメだと思われる場所は対策後に温度を計るようにします。
 35℃以下は”L”、85℃以上では”H”と表示します。


 エクセルで近似直線の方程式を求める

エクセルシート
エクセルグラフ

 ここでは後述するファームウエアで使用する近似直線の傾きと切片を求めます。
 エクセルの表で基準電圧と直列抵抗の値は固定値ですが、手持ち部品の実測値を入力します。
 基準電圧は手持ちのLM385−1.2を実測して入力しました。
 基準電圧のバラツキは求める式には影響を与えますが、直線性には影響を与えません。
 直列抵抗の値は計算式にも直線性にも影響を与えますのでカットアンドトライで値を決めます。
 基準電圧、直列抵抗、求めた傾き(SLOPE)、切片(INTERCEPT)は特定の場所に配置し、絶対参照するように します。
 こうすれば直列抵抗の値を再入力した瞬間に、表の全ての数値、グラフも書き換えられます。
 まず35℃と85℃の中間の60℃の抵抗値に近い3.3KΩを選択します。
 次に3.6KΩと3KΩを選択してみます。
 この中では3KΩが実測値と近似値の差が少なかったので仮の候補とします。
 値が小さくなる方向が結果が良いようですので、2.7KΩ、2.2KΩ、2KΩと入力してみます。
 この中では2.2KΩが一番直線性が良かったです。
 カットアンドトライの結果、直列抵抗の値は2.2KΩが良いということで、回路図は2.2KΩ1%としてあります。
 手持ちの2.2KΩ1%の金属被膜抵抗の値が2190Ωでしたので、表には、この値が入力されています。
 表に置ける「抵抗値」はサーミスタの温度に対する抵抗値で、メーカー公表の値です。
 「検出電圧」は直列抵抗とサーミスタの抵抗値で基準電圧を分圧したもので、計算値です。
 温度と検出電圧の関係を直線近似する為にエクセルの関数を使用します。
 直線の傾きはSLOPEという関数、切片はINTERCEPTという関数を使い、別々に求めます。
 解は指定した場所に配置し、他のセルから絶対参照します。
 グラフは実際の検出電圧と直線近似の検出電圧を比較したものです。
 また、求められた直線の方程式に検出電圧を代入して温度を求めることも出来ます。
 求められた近似温度と実際の温度を比較すると±0.5℃以内に収まっていることが判ります。
 今回は35℃〜85℃の範囲で直線近似しました。
 この範囲外では直線性は急激に悪化します。


ハードウエア

 回路図をクリックすると拡大表示されます。
 拡大図から本文に戻るにはブラウザの←戻る釦を使用してください。

回路図

 CPUには新型のPIC16F1823を使用しました。
 安価で高機能ですが書き込み電圧が9Vですので注意が必要です。
 電源は単3電池2本としました。
 2V位になると表示が見えなくなります。(動作はしていますが)
 手持ちに緑の7seg表示器しかなく、VFが2V近くある為です。
 赤色LEDなら多少、有利だと思います。
 この表示器はアノードコモンですが、カソードコモンの場合は回路とプログラムの変更が必要です。
 センサーの基準電源はポートから駆動していますが、スリープ時の対策です。
 尚、A/Dの基準電圧は内蔵の1.024Vを使用しています。
 電源を入れたままにしても3分間経過するとスリープするようなソフトを組んだので、継続して動作させたい時は 電源スイッチを入れ直す必要があります。
 この際、3秒程度「切り」にしないと目覚めません。
 電源に入っているコンデンサが放電する時間が必要な為です。
 電源スイッチを省いてMCLEAR端子で起動する方法もありますが、電源を切れないのでスリープを待つことになります。
 もう少しポートの多いCPUであれば1個の押しボタンで電源をオンオフすることも出来ますが、自分が使うだけなので 我慢します。
 スリープ時の電源電流は実測で40uA程度でした。
 1Aの基板実装フューズと電池逆接続防止のFETが入っていますが、不要と思う人は省いてください。


製作した基板

製作した基板

ソフトウエア

 開発ソフトはMikroCの評価版を使用しました。
 今まで使用したMikroC PROVer 4.60では16F1823のコンフィギュレーションの設定が出来ない というトラブルがあったのでVer6.0.0をインストールしました。
 エディタでタブの動きが変だったのですが、完成後に他のエディタで清書することにし、とりあえず気にしないこ とにします。
 ソースファイルは短いので以下に表示します。

//////////////////////////////////////
//   表面温度計(TH35_85.C)          //
//   2013/09/02  PIC16F1823         //
//   MikroC Pro for PIC Ver 6.0.0   //
//////////////////////////////////////

//OSC=INTOSC, WDT=OFF, PowerUpTimer=ON, MCLR=ON, Code Protection=OFF, Data Protection=OFF
//Brown-out Reset=ON, Clock out=OFF, I/E Switch over=off, Fail-Safe Clock Monitor Enable=OFF
//Flash Memory Self Write Protection=OFF, PLL=OFF, Stack OF/UF Reset=OFF, Brown-out=LOW-Volt
//Incircuit Debug=OFF, LVP=OFF

#define SLOPE       851L        //傾き(100倍値)
#define INTERCEPT   1246L       //切片(mV)

const char SEG_DATA[13] = {
    0b01000000, //0
    0b01111001, //1
    0b00100100, //2
    0b00110000, //3
    0b00011001, //4
    0b00010010, //5
    0b00000010, //6
    0b01011000, //7
    0b00000000, //8
    0b00011000, //9
    0b00001001, //H
    0b01000111, //L
    0b01111111  //
};

volatile int Temp;              //計測温度
volatile unsigned char ADCnt;   //A/D interval
volatile unsigned char ADFlg;   //A/D Flag
volatile unsigned int TupCnt;   //Time Up counter
volatile unsigned char TupFlg;  //Time Up Flag
volatile unsigned char ULFlg;   //上位・下位

union{
    int adw;
    char adb[2];
}addata;

void write_seg_data(unsigned char num){
    LATA.B0 = num & 0x1; num = num >> 1;
    LATA.B1 = num & 0x1; num = num >> 1;
    LATA.B2 = num & 0x1; num = num >> 1;
    LATC.B0 = num & 0x1; num = num >> 1;
    LATC.B1 = num & 0x1; num = num >> 1;
    LATC.B2 = num & 0x1; num = num >> 1;
    LATC.B3 = num & 0x1;
}

void adconv(void){
    int i;
    int adbuff;
    long calcbuff;
    
    adbuff = 0;
    for(i=0; i<16; i++){
        ADCON0.GO = 1;
        while(ADCON0.GO);
        addata.adb[0] = ADRESL;
        addata.adb[1] = ADRESH;
        adbuff += addata.adw;
    }
    adbuff += 8;             //(/16)
    adbuff = adbuff >> 4;    // /16;
    calcbuff = (INTERCEPT - (long)adbuff)*100L + SLOPE/2L;
    //注)電圧の計算で基準電圧の1024mVを掛け、10bitの分母1024で割る事を相殺している。
    // + SLOPE/2L は四捨五入
    calcbuff = calcbuff/SLOPE;
    INTCON.GIE = 0;
    Temp = (int)calcbuff;
    INTCON.GIE = 1;
}

void main() {
    OSCCON = 0x70;      //内部 8MHz
    OPTION_REG = 0xc4;  //Timer0 Pre=1/32 → 4mS
    TMR0 = 0;
    INTCON.TMR0IE = 1;  //Timer0 interrupt
    ANSELA = 0x10;      //AN3
    FVRCON = 0x81;      //A/D REF=1.024V
    LATA = 0xff;
    TRISA = 0x18;
    LATC = 0xff;
    TRISC = 0;
    ADCON0 = 0x0d;      //AD ON  AN3
    ADCON1 = 0xd3;      //右詰め、Fosc/16
    INTCON.GIE = 1;
    TupCnt = 0;TupFlg = 0;
    while(1){
        if(TupFlg) break;
        if(ADFlg){
            ADFlg = 0;
            adconv();
        }
    }
    PORTA = 0xff;
    PORTA.B5 = 0;       //1.25V OFF
    PORTC = 0xff;
    asm SLEEP;          //スリープ
    asm NOP;
}

void interrupt(){       //T0割り込み
    INTCON.TMR0IF = 0;                      
    if(ULFlg){
        ULFlg = 0;
        LATC.B5 = 0;                        //上位ON
        LATC.B4 = 1;                        //下位OFF
        write_seg_data(SEG_DATA[12]);       //消去
        asm NOP;
        if(Temp < 35) write_seg_data(SEG_DATA[12]);         //消去
        else if(Temp > 85) write_seg_data(SEG_DATA[10]);    //H表示
        else write_seg_data(SEG_DATA[Temp/10]);             //上位表示
    }
    else {
        ULFlg = 1;
        LATC.B4 = 0;                        //下位ON
        LATC.B5 = 1;                        //上位OFF
        write_seg_data(SEG_DATA[12]);       //消去
        asm NOP;
        if(Temp < 35) write_seg_data(SEG_DATA[11]);         //L表示
        else if(Temp > 85) write_seg_data(SEG_DATA[12]);    //消去
        else write_seg_data(SEG_DATA[Temp%10]);             //下位表示
    }
    ADCnt++;
    if(ADCnt > 122){                        //約0.5秒で計測値更新
        ADFlg = 1;
        ADCnt = 0;
    }
    TupCnt++;
    if(TupCnt > 44000) TupFlg = 1;          //約3分で終了
}

 1台しか作らないので、前述のエクセルで求めた傾きと切片の値を直接、書き込んでいます。
 新規に作成される場合は使用部品の定数を入力して傾きと切片を求めて修正する必要があります。
 割り込みルーチンで4mSに1回、上位桁と下位桁の切り替えを行います。
 0.5秒に1回温度値の更新を行います。
 3分間動作したらスリープするので継続したい場合は電源スイッチを入れ直します。
 四捨五入は割る数の半分を加えてから割り、結果を切り捨てます。
 簡単なプログラムですがデバッガーを使える環境が無いため、多少、手こずりました。


動作確認

完成した温度計

 上の写真は完成した温度計です。
 サーミスタの抵抗値は1%の精度で公表されているので校正の必要はありません。
 破損して交換した場合でも、そのまま使えます。
 動作確認としてはセンサーを外した状態で”L”が表示されることを確認します。
35℃以下を表示
 これは35℃以下を表します。

 次にセンサー端子を短絡して”H”が表示されることを確認します。
85℃以上を表示
 これは85℃以上を表します。

 次センサーを外して、代わりに適当な抵抗を接続してみます。
 1%3KΩの抵抗を接続してみました。
63℃を表示
 63℃を表示しています。
 上記エクセルの表で60℃の抵抗値が3217Ω、65℃で2781Ωですので、3KΩで63℃というのは妥当な値です。


抵抗の発熱を計ってみる

抵抗の発熱を計測 抵抗の発熱を計測

 手元にあった酸化金属被膜抵抗の発熱を計ってみました。
 旧タイプの図体の大きいもので、径6mm、長さ18.5mmの1Wのものと思われます。
 センサーをアルミテープで抵抗に固定しました。
 テーブルは鉄板ですので直接抵抗を置くと熱が逃げてしまうのでプラスチックケースの上に置いてあります。
 空中に吊した場合とプラスチックケースに置いた場合では温度に差は出ませんでした。
 室温26.4℃の時0.5Wの電力を加えたところ73℃まで温度が上昇しました。
 指先は以外と温度に強く、2〜3秒程度は摘んでいられます。(摘みかたにも依りますが)
 ただし、指が熱を吸収し温度が60℃程度まで下がりました。(これも摘みかたに依ります)
 温度が下がらなかったら、もっと熱く感じたと思います。
 次に0.33Wの電力を加えた場合、温度は58℃まで上昇しました。
 指で摘んだ場合、温度が45℃まで下がり、ずっと摘んでいられました。
 最近の抵抗は寸法が小さくなっていますが、発熱しなくなった訳ではありません。
 同じ発熱量があるのに寸法が小さくなっているので放熱量が小さく、温度は、さらに上がるはずです。
 要は材料が進歩して高温に耐えられるようになったというだけの話です。
 抵抗に加える電力は定格の1/3以下にしておいたほうが良さそうです。
 寸法が小さくなった分、大きなW数の抵抗が使えると思います。
 もっと良い方法は回路を見直して抵抗に加わる電力を減らすことです。
 例えば電源電圧を下げられないか検討してみます。


トップページ  「電子回路」のトップ