kakas
一人一鏡走天涯

一提到温度测量,我们通常往往都会想到AD采样,但是在一些对测量精度要求不是很高的场合,

我们是不是可以换一种思路,抛弃AD,用其他的方式来实现呢,呵呵,正好接触到一个项目,所

以打算挑战一下,没错,就是RC充放电来实现温度测量。

先看一下基本的电路连接:

RC0

图O:cpu拿出三个GPIO管脚,分别连接热敏电阻、100K高精电阻R1、泄流电阻R2,然后

通过一只电容器连接到GND。在这里电容器可以理解成一只小电池,而且还是一只可

充电电池。

RC1

图1:将RT设置成高阻太(输入),这样热敏电阻相当于断开(虚线),R1设置成输出,泄流电阻R2

设置成输出,如果cpu内部有上拉的话,最好打开,或者配置成强推挽,具体情况根据所选则的cpu而定。

这样R2给电容器充电,程序中一直检测R1管脚,直到R1管脚为高 while(R1 == 1);其实电容器被不一定被充满

电,只要满足R1管脚处的电平对于cpu来说是个高电平就足以。

RC2

图2:保持RT继续高阻(断开),将R1设置成输出,输出0(低电平),R2设置成输入,此时电容通过100K

高精度电阻进行放电,程序中一直检测R2管脚,直到R2管脚为低电平 while(R2 == 0);记录时间T1,T1就是

电容器通过100k电阻放电所需要的时间。

图3:过程跟图一是一模一样的,给电容器充电(不一定充满),原因你懂的;

RC3

RC4

图4:将R1设置成高阻(断开),RT设置成输出,并且输出低电平,将R2设置成输出;此时电容器通过RT进行放电,程序中一直检测R2管脚,直到R2管脚为低电平 while(R2 == 0);记录时间T2,T2就是电容器通过100k电阻放电所需要的时间。

到此,我们就可以算出热敏电阻RT的阻值了:

RT = (T2 / T1) * R1;

然后通过查表找到跟该组织相对应的温度,呵呵,大功告成。。

/**
 *青岛昊阳智能微控技术有限公司
 *
 * 温度采集
 * 参考电阻为100 K
 * @param  
 *              unsigned char channel:采集哪个通道的温度     
 *              NTP_OUTSIDE: 温控器外部温度探头 
 *              NTP_INSIDE: 温控器内部探头
 *@return 
 *              ERROR_NTP_PARA_ERROR:参数错误
 *              ERROR_NTP_LOST_ERROR:温度探头丢失
 *              非负:采集到的温度值
 *
 * @brief  
 *              by kaka,2011,2,20          
 */

 
#define NTP_CHECK (1)
short ntp_100k_get_temperature(unsigned char channel){
    double x, y, z;
    unsigned long temperature_cnt_a, temperature_cnt_b;
    unsigned char tmp;

    if(channel == NTP_INSIDE){
        SET_P2(7, IO_PORT_TRI_IN); //参考电阻 输入
        SET_P2(6, IO_PORT_PULL_OUT); // 泄流电阻输出
        SET_P4(4, IO_PORT_TRI_IN); // 热敏电阻输入

        RFL0 = 0; //泄流电阻输出0
        while(RE0);	  // 一直等到电容空
        
        RFL0 = 1; //泄流电阻输出1
        while(!RE0);	  // 一直等到电容满

        SET_P2(7, IO_PORT_NO_PULL_IO); //参考电阻 输出
        SET_P2(6, IO_PORT_TRI_IN); // 泄流电阻输入
        SET_P4(4, IO_PORT_TRI_IN);// 热敏电阻输入
	
        RE0 = 0; //参考电阻输出0, 给电容放电
        temperature_cnt_a = 1;
        while(RFL0){ // 等到电容电量放空
            temperature_cnt_a ++;
            if(temperature_cnt_a > NTP_MAX_COUNTER){
                return ERROR_NTP_LOST_ERROR;
            }
        }

        SET_P2(7, IO_PORT_TRI_IN); //参考电阻 输入
        SET_P2(6, IO_PORT_PULL_OUT); // 泄流电阻输出
        SET_P4(4, IO_PORT_TRI_IN); // 热敏电阻输入

        RFL0 = 0; //泄流电阻输出0
        while(RE0);	  // 一直等到电容空

        RFL0 = 1; //泄流电阻输出1
        while(!RE0);	  // 一直等到电容满
        
        SET_P2(7, IO_PORT_TRI_IN); //参考电阻 输入
        SET_P2(6, IO_PORT_TRI_IN); // 泄流电阻输入
        SET_P4(4, IO_PORT_NO_PULL_IO);// 热敏电阻输出
        RT0 = 0; //通过热敏电阻给电容充电
        temperature_cnt_b = 1;
        while(RFL0){
            temperature_cnt_b ++;
            if(temperature_cnt_b > NTP_MAX_COUNTER){
                return ERROR_NTP_LOST_ERROR;
            }
        }
    }else if(channel == NTP_OUTSIDE){
        SET_P2(4, IO_PORT_TRI_IN); //参考电阻 输入
        SET_P2(3, IO_PORT_PULL_OUT); // 泄流电阻输出
        SET_P2(5, IO_PORT_TRI_IN); // 热敏电阻输入
	
        RFL1 = 1; //泄流电阻输出1
        while(!RE1);	  // 一直等到电容放满

        SET_P2(4, IO_PORT_NO_PULL_IO); //参考电阻 输出
        SET_P2(3, IO_PORT_TRI_IN); // 泄流电阻输入
        SET_P2(5, IO_PORT_TRI_IN);// 热敏电阻输入
	
        RE1 = 0; //参考电阻输出0, 给电容放电
        temperature_cnt_a = 1;
        while((RFL1)){ // 等到电容电量充满
            temperature_cnt_a ++;
            if(temperature_cnt_a > NTP_MAX_COUNTER){
                return ERROR_NTP_LOST_ERROR;
            }
        }
        SET_P2(4, IO_PORT_TRI_IN); //参考电阻 输入
        SET_P2(3, IO_PORT_PULL_OUT); // 泄流电阻输出
        SET_P2(5, IO_PORT_TRI_IN); // 热敏电阻输入
	
        RFL1 = 1; //泄流电阻输出1
        while(!RE1);	  // 一直等到电容满
        
        SET_P2(4, IO_PORT_TRI_IN); //参考电阻 输入
        SET_P2(3, IO_PORT_TRI_IN); // 泄流电阻输入
        SET_P2(5, IO_PORT_NO_PULL_IO);// 热敏电阻输出
        RT1 = 0; //通过热敏电阻给电容放电
        temperature_cnt_b = 1;
        while(RFL1){
            temperature_cnt_b ++;
            if(temperature_cnt_b > NTP_MAX_COUNTER){
                return ERROR_NTP_LOST_ERROR;
            }
        }
    }else{
        return ERROR_NTP_PARA_ERROR;
    }

    x = 0;
    y = temperature_cnt_a; 
    z = temperature_cnt_b*100000;
    x = z / y;  //热敏电阻除以参考电阻
    tmp = ntp_100k_conversion(x);

    return tmp;
}
posted on 2011-03-28 23:10  kakas  阅读(2029)  评论(0)    收藏  举报