目次

温度センサー(サーミスタ)利用

 サーミスタは、温度により抵抗値が変わるデバイスです。

 温度が上昇したときに、抵抗値が下がるNTCタイプと
 温度が上昇したときに、抵抗値が上がるPTCタイプが
 あります。

 どちらのサーミスタも、温度に比例して線形な変化をする
 のではなく、指数関数の曲線を描きます。



 サーミスタの抵抗値は、ケルビンで測定しますが、計算式は

  R = R0exp{B(1/T - 1/T0)}
     R0 : 温度T0における抵抗値
     R  : 温度T における抵抗値
     B  : サーミスタのB定数

 となります。
 B定数は、サーミスタ毎に決まっていて、AT103のように
 型番の中に含まれていることが多いです。

 103だと、10x(10の3乗)で10kΩになります。
 25℃で規定されているので、この温度で10kΩです。
 B定数は、3435という具合にデータシートに記載されます。

 サーミスタは、温度により抵抗値が変化することを利用し
 自動車水温計、プリンタヘッドの温度管理等に活用されて
 います。

 身の回りで利用されているサーミスタは、NTCタイプが
 圧倒的に多いです。

 正確な抵抗値を利用しないなら、次の回路でキャパシタの
 充放電を利用して、時間に換算して値を利用します。



 放電時間を測定し、値表示する回路は以下。



 ポートAの0ビットで、キャパシタの充電と放電をさせます。
 充電後、放電させて時間測定用カウンタをインクリメント。
 カウント値を、LEDで表示します。

#define OFF 0
#define ON  OFF+1

#define DCNT 10
#define XDIV 10

typedef unsigned char UBYTE ;

/* prototype */
void  usr_init(void);
void  vcharge(void);
UBYTE vdischarge(void);

void main(void)
{
  UBYTE cnt ;
  /* initialize */
  usr_init();
  /* endless loop */
  while (ON) {
    /* charge */
    vcharge();
    /* discharge */
    cnt = vdischarge();
    /* show value */
    PORTB = cnt / XDIV ;
  }
}

void usr_init(void)
{
  /* don't charge */
  PORTA = 0x00 ;
  /* turn off all LEDs */
  PORTB = 0x00 ;
  /* disable analog comparator */
  CMCON = 0x07 ;
  /* set directions */
  TRISA = 0xf0 ;
  TRISB = 0xff ;
}

void vcharge(void)
{
  /* RA0 : output */
  TRISA.F0 = OFF ;
  /* charge */
  PORTA.F0 = 1 ;
  /* wait */
  Delay_ms(DCNT);
  /* RA0 : input */
  TRISA.F0 = ON ;
}

UBYTE vdischarge(void)
{
  UBYTE result ;
  /* clear */
  result = 0 ;
  /* discharge */
  while ( PORTA.F0 == ON ) {
    result++;
  }

  return result ;
}

 積分回路の利用で使ったプログラムと同じです。

 温度がどの程度なのかを、8個LEDの点灯個数と
 位置を変えて表示できます。

 カウント値を、特定の範囲で区切って、ビットごとの
 1、0を決めていきます。

#define OFF 0
#define ON  OFF+1

#define DCNT 10
#define XDIV 10

typedef unsigned char UBYTE ;

/* prototype */
void  usr_init(void);
void  vcharge(void);
UBYTE vdischarge(void);

void main(void)
{
  UBYTE cnt ;
  /* initialize */
  usr_init();
  /* endless loop */
  while (ON) {
    /* charge */
    vcharge();
    /* discharge */
    cnt = vdischarge();
    /* show value */
    PORTB.F7 = (cnt < 56) ;
    PORTB.F6 = (cnt < 58) ;
    PORTB.F5 = (cnt < 60) ;
    PORTB.F4 = (cnt < 62) ;
    PORTB.F3 = (cnt < 64) ;
    PORTB.F2 = (cnt < 66) ;
    PORTB.F1 = (cnt < 68) ;
    PORTB.F0 = (cnt < 70) ;
  }
}

void usr_init(void)
{
  /* don't charge */
  PORTA = 0x00 ;
  /* turn off all LEDs */
  PORTB = 0x00 ;
  /* disable analog comparator */
  CMCON = 0x07 ;
  /* set directions */
  TRISA = 0xf0 ;
  TRISB = 0xff ;
}

void vcharge(void)
{
  /* RA0 : output */
  TRISA.F0 = OFF ;
  /* charge */
  PORTA.F0 = 1 ;
  /* wait */
  Delay_ms(DCNT);
  /* RA0 : input */
  TRISA.F0 = ON ;
}

UBYTE vdischarge(void)
{
  UBYTE result ;
  /* clear */
  result = 0 ;
  /* discharge */
  while ( PORTA.F0 == ON ) {
    result++;
  }

  return(result / XDIV);
}

 判定結果は0か1で返ってくるので、論理値として
 ビットの印加値にしています。

 NTCタイプのサーミスタを利用しているので、温度が
 高いとカウント値が小さいことを使います。

 温度が指定値よりも高いか低いかで警報することも
 可能です。それに利用する回路は、以下。



 判定比較をループの中に入れるだけで、簡単です。

#define OFF 0
#define ON  OFF+1

#define DCNT 10
#define XDIV 10

typedef unsigned char UBYTE ;

/* prototype */
void  usr_init(void);
void  vcharge(void);
UBYTE vdischarge(void);

void main(void)
{
  UBYTE cnt ;
  /* initialize */
  usr_init();
  /* endless loop */
  while (ON) {
    /* charge */
    vcharge();
    /* discharge */
    cnt = vdischarge();
    /* default */
    PORTB.F0 = OFF ;
    /* judge and show */
    if ( cnt < 56 ) {
      PORTB.F0 = ON ;
    }
  }
}

void usr_init(void)
{
  /* don't charge */
  PORTA = 0x00 ;
  /* turn off all LEDs */
  PORTB = 0x00 ;
  /* disable analog comparator */
  CMCON = 0x07 ;
  /* set directions */
  TRISA = 0xf0 ;
  TRISB = 0xff ;
}

void vcharge(void)
{
  /* RA0 : output */
  TRISA.F0 = OFF ;
  /* charge */
  PORTA.F0 = 1 ;
  /* wait */
  Delay_ms(DCNT);
  /* RA0 : input */
  TRISA.F0 = ON ;
}

UBYTE vdischarge(void)
{
  UBYTE result ;
  /* clear */
  result = 0 ;
  /* discharge */
  while ( PORTA.F0 == ON ) {
    result++;
  }

  return(result / XDIV);
}


目次

inserted by FC2 system