温度の自動測定

  1. 温度の自動測定

    1. 温度測定

      温度センサーとAD変換機能を用いて温度を測定するのが目的です。電子的に温度を自動測定することで、温度に関する制御をすることができます。

    2. 温度センサ(LM35DZ/60)


      1. LM35DZ

         LM35DZは、1度当り10mVを出力する温度センサです。下図は足の方から見た端子で、Vsに5V、GNDに電源ー、Voutから出力が出ます。この出力をオペアンプで7倍程度増幅すると0〜40度の範囲を精度よく測定できます。増幅なし、校正なしの場合、誤差は±2度くらいあります。増幅/校正すると、±0.2度 くらいまで精度を上げることができます。



      2. オペアンプ回路

        下図は非反転型増幅回路です。増幅度は (1 + R3/R4) 、入力抵抗はOPアンプの入力抵抗になります。右はopアンプの端子表です。このオプアンプは2.5V以上の単電源でも動作します。
         下図で7倍にするには、R4を1k、R3を6Kにします。
         
    3. 校正

       温度センサーの出力電圧もセンサーによりバラツキます。また、増幅度や差をとる1Vの値も正確ではありません。ただし、AD変換した値:Val と温度は、線形の関係があります。
            T = a * Val + b
      となります。ここで、二つの温度の水と標準となる温度計を用意します。温度T1のとき AD 変換した値を val1、温度T2 のとき AD 変換した値を val2 とします。
           T1 = a * Val1 + b
        T2  = a * Val2 + b
      T1,T2、Val1、Val2 がわかれば、a,b をとくことができます。a,b を計算すれば、val から T への変換式が定まります。
    4. AD変換

       1,0 の2値でなく、電圧値などの物理量がそのまま値となるような信号をアナログ信号といいます。アナログ信号を入力として、それを、ディジタル値に変換する機能を A/D (アナログディジタル)変換といいます。16F873にはこのAD変換機能が組み込まれています。
       AD変換を行うには、setup_adc_ports(AN0)でアナログ信号を入力する端子(A0)と、setup_adc(ADC_clock_div_32);で変換用クロックを指定します。ここでは、Aポート0ビットをアナログ入力端子とします。
       setup_adc_ports(AN0);//A0端子をアナログ入力AN0として利用する
       setup_adc(ADC_clock_div_32);//クロックは内部クロックの1/32 
       16F873は6本のアナログ信号端子があります。まず、まず 、set_adc_channel(0) で読み込む端子(チャンネル)を指定し、少し時間を置いてから read_adc() で変換値を読み込みます。PICは10bitで読み込むことができますが、この場合、先頭で
       #device ADC=10 
      の指定が必要です。読み込む値は10bitの場合、変数は long 型で宣言します。指定なし、または、ADC=8 の場合、8bitで読み込みます。
          set_adc_channel(0);//チャンネル0切り替え
      delay_us(60);//60μ秒待つ aval = read_adc();

  2. 回路

    1. 温度測定回路

       温度測定回路は次のようになります。この他に、温度の表示、測定時の時刻を知るためのRTC回路、測定値を記憶するためのメモリ回路、PCとの接続回路があれば、温度データの長期自動測定回路が完成します。図では明示していませんが、OPアンプの電源接続が必要です。4ピンをグランド、8ピンを5Vに接続します。
       温度センサーの出力(3ピン)にコンデンサ 0.1 μF を接続しましたが、これは、変換時のノイズを吸収するためです。また、AD変換をするときが電源のノイズに注意する必要があります。
       変換した値がばらつく場合、9Vの電源を利用し、3端子レギュレータで5Vに落として使用すると、電源のノイズを軽減できます。簡単に測定する場合、オペアンプを省略して、温度センサーの出力を直接PICのA0端子(2ピン)に接続します。


    2. 測定部プログラム

      温度測定のプログラムは、普通のアナログ変換と同じです。校正をする前は、AD変換値 aval のみを表示します。二つの温度で、比例定数 a,b を求めたら、変換式を追加します。ここでは、
       tmp = 2*aval ; LM25DZの場合
       tmp=3*aval-67;LM60の場合
      としています。

      //温度センサーをAD変換で読み込む
      //センサーはLM35DZまたはLM60
      //AD変換は8bit
      //変換式はセンサーで異なる
      //A0にセンサーの出力Voutを接続
      //センサーは 左からVCC,Vout,GND
      //printfで結果を表示する
      
      #include "16f873A.h"
      #device ADC=8
      #fuses HS,NOWDT,NOLVP,put,brownout //内部クロック、WDT,LVPなし
      #use delay(CLOCK=20000000)
      #use RS232(BAUD=9600,xmit=PIN_C6,rcv=PIN_C7)//use delayの後に配置する
      
      int count;
      long aval;
      float tmp;
      
      main()
      {
        printf("nstart log\n");
        setup_adc_ports(RA0_ANALOG);//アナログ入力設定
        //setup_adc_ports(PIN_A0);//エラーになる場合
        setup_adc(ADC_CLOCK_DIV_32);//クロック設定
      
        set_adc_channel(0);//チャンネル0切り替え
        delay_us(60);//60μ秒待つ
      
        while(1){
          aval = read_adc();
          printf("AD input : %ld\n\r",aval);  
          tmp = 2 * aval;//LM35DZ
          //tmp=3*aval-67;//LM60
          printf("now temperature : %3.1f\n\r",tmp);
      
          output_toggle(PIN_B0);
          delay_ms(500);//500mS待つ
      
        }//while
        return 0;
      }

  3. 温度センサ(S8100-B)


    1. 温度センサ

      温度センサとして、s8100-B も利用できます。これは、下図のように、-60〜100 の間で出力電圧が直線的に変化します。電圧は5Vで利用できます。

      ただし、電圧の変化は小さく、0度から30度の範囲では 0.5V 程度しか変化しません。これをそのまま、AD変換すると、ディジタル値で 100 程度しか変化しません。これでは、正確な計測はできません。そこで、AD変換する前に、センサーの信号をアナログ処理し、変化する範囲を広げます。
       ただし、そのまま増幅すると、センサーからの信号が2Vありますから、2倍が限度です。(AD変換の最大値は4.5V程度です)。そこで、サンサーの最小電圧である約1Vを引いてから、4倍程度の増幅します。
       センサーの電圧を VS とすると、
            VT=4.0*(VS-1.0)
      と変換するわけです。これで、VSが2VのときVTは4V、VSが1Vのとき、VSは0Vになります。VSが1Vいかになると、VTが負になりますが、気温が90度を超える心配はないでしょう。
    2. 端子

       センサーの端子は以下のようです。2ピンをグランド、1ピンを5Vの電源に接続します。3ピンにセンサー出力が得られます。

       逆方向に接続すると、発熱して壊れますから、注意してください。

    3. アナログ回路

       下図は 二つに信号の差 (IN+ - IN-) を計算し、(R2/R1) 倍するOPアンプ回路です。二つのR2とR1は同じ値にする必要があります。

      IN- に1V を設定し、 R2/R1 を 4程度 に設定すれば、目的の回路になります。しかし、IN+ にセンサの信号を接続すると、センサの電圧が変化してしまいます。そこで、次のように、バッファー回路をセンサーとOP差分回路の中間に入れます。1Vの電圧は、5Vの電源電圧を二つの抵抗で分圧して作ります。

    4. 校正

       温度センサーの出力電圧もセンサーによりバラツキます。また、増幅度や差をとる1Vの値も正確ではありません。ただし、AD変換した値:Val と温度は、線形の関係があります。

        T = a * Val + b

      となります。ここで、二つの温度の水と標準となる温度計を用意します。温度T1のとき AD 変換した値を val1、温度T2 のとき AD 変換した値を val2 とします。

       T1 = a * Val1 + b
        T2  = a * Val2 + b

      T1,T2、Val1、Val2 がわかれば、a,b をとくことができます。a,b を計算すれば、val から T への変換式が定まります。