目次
前
次
温度センサー(サーミスタ)利用
サーミスタは、温度により抵抗値が変わるデバイスです。
温度が上昇したときに、抵抗値が下がる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);
}
目次
前
次