RC充放电实现温度测量

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

RC充放电实现温度测量作者:宋海平中国海洋大学2013年3月一提到温度测量,我们通常往往都会想到AD采样,但是在一些对测量精度要求不是很高的场合,我们是不是可以换一种思路,抛弃AD,用其他的方式来实现呢,呵呵,正好接触到一个项目,所以打算挑战一下,没错,就是RC充放电来实现温度测量。先看一下基本的电路连接:0(原文件名:RC0.PNG)图O:cpu拿出三个GPIO管脚,分别连接热敏电阻、100K高精电阻R1、泄流电阻R2,然后通过一只电容器连接到GND。在这里电容器可以理解成一只小电池,而且还是一只可充电电池。1(原文件名:RC1.PNG)图1:将RT设置成高阻太(输入),这样热敏电阻相当于断开(虚线),R1设置成输出,泄流电阻R2设置成输出,如果cpu内部有上拉的话,最好打开,或者配置成强推挽,具体情况根据所选则的cpu而定。这样R2给电容器充电,程序中一直检测R1管脚,直到R1管脚为高while(R1==1);其实电容器被不一定被充满电,只要满足R1管脚处的电平对于cpu来说是个高电平就足以。2(原文件名:RC2.PNG)图2:保持RT继续高阻(断开),将R1设置成输出,输出0(低电平),R2设置成输入,此时电容通过100K高精度电阻进行放电,程序中一直检测R2管脚,直到R2管脚为低电平while(R2==0);记录时间T1,T1就是电容器通过100k电阻放电所需要的时间。图3:过程跟图一是一模一样的,给电容器充电(不一定充满),原因你懂的;3(原文件名:RC3.PNG)4(原文件名:RC4.PNG)图4:将R1设置成高阻(断开),RT设置成输出,并且输出低电平,将R2设置成输出;此时电容器通过RT进行放电,程序中一直检测R2管脚,直到R2管脚为低电平while(R2==0);记录时间T2,T2就是电容器通过100k电阻放电所需要的时间。到此,我们就可以算出热敏电阻RT的阻值了:6(原文件名:RC6.PNG)001/**002*中国海洋大学003*宋海平004*温度采集005*参考电阻为100K006*@param007*unsignedcharchannel:采集哪个通道的温度008*NTP_OUTSIDE:温控器外部温度探头009*NTP_INSIDE:温控器内部探头010*@return011*ERROR_NTP_PARA_ERROR:参数错误012*ERROR_NTP_LOST_ERROR:温度探头丢失013*非负:采集到的温度值014*015*@brief016*中国海洋大学宋海平017*/018019020#defineNTP_CHECK(1)021shortntp_100k_get_temperature(unsignedcharchannel){022doublex,y,z;023unsignedlongtemperature_cnt_a,temperature_cnt_b;024unsignedchartmp;025026if(channel==NTP_INSIDE){027SET_P2(7,IO_PORT_TRI_IN);//参考电阻输入028SET_P2(6,IO_PORT_PULL_OUT);//泄流电阻输出029SET_P4(4,IO_PORT_TRI_IN);//热敏电阻输入030031RFL0=0;//泄流电阻输出0032while(RE0);//一直等到电容空033034RFL0=1;//泄流电阻输出1035while(!RE0);//一直等到电容满036037SET_P2(7,IO_PORT_NO_PULL_IO);//参考电阻输出038SET_P2(6,IO_PORT_TRI_IN);//泄流电阻输入039SET_P4(4,IO_PORT_TRI_IN);//热敏电阻输入040041RE0=0;//参考电阻输出0,给电容放电042temperature_cnt_a=1;043while(RFL0){//等到电容电量放空044temperature_cnt_a++;045if(temperature_cnt_aNTP_MAX_COUNTER){046returnERROR_NTP_LOST_ERROR;047}048}049050SET_P2(7,IO_PORT_TRI_IN);//参考电阻输入051SET_P2(6,IO_PORT_PULL_OUT);//泄流电阻输出052SET_P4(4,IO_PORT_TRI_IN);//热敏电阻输入053054RFL0=0;//泄流电阻输出0055while(RE0);//一直等到电容空056057RFL0=1;//泄流电阻输出1058while(!RE0);//一直等到电容满059060SET_P2(7,IO_PORT_TRI_IN);//参考电阻输入061SET_P2(6,IO_PORT_TRI_IN);//泄流电阻输入062SET_P4(4,IO_PORT_NO_PULL_IO);//热敏电阻输出063RT0=0;//通过热敏电阻给电容充电064temperature_cnt_b=1;065while(RFL0){066temperature_cnt_b++;067if(temperature_cnt_bNTP_MAX_COUNTER){068returnERROR_NTP_LOST_ERROR;069}070}071}elseif(channel==NTP_OUTSIDE){072SET_P2(4,IO_PORT_TRI_IN);//参考电阻输入073SET_P2(3,IO_PORT_PULL_OUT);//泄流电阻输出074SET_P2(5,IO_PORT_TRI_IN);//热敏电阻输入075076RFL1=1;//泄流电阻输出1077while(!RE1);//一直等到电容放满078079SET_P2(4,IO_PORT_NO_PULL_IO);//参考电阻输出080SET_P2(3,IO_PORT_TRI_IN);//泄流电阻输入081SET_P2(5,IO_PORT_TRI_IN);//热敏电阻输入082083RE1=0;//参考电阻输出0,给电容放电084temperature_cnt_a=1;085while((RFL1)){//等到电容电量充满086temperature_cnt_a++;087if(temperature_cnt_aNTP_MAX_COUNTER){088returnERROR_NTP_LOST_ERROR;089}090}091SET_P2(4,IO_PORT_TRI_IN);//参考电阻输入092SET_P2(3,IO_PORT_PULL_OUT);//泄流电阻输出093SET_P2(5,IO_PORT_TRI_IN);//热敏电阻输入094095RFL1=1;//泄流电阻输出1096while(!RE1);//一直等到电容满097098SET_P2(4,IO_PORT_TRI_IN);//参考电阻输入099SET_P2(3,IO_PORT_TRI_IN);//泄流电阻输入100SET_P2(5,IO_PORT_NO_PULL_IO);//热敏电阻输出101RT1=0;//通过热敏电阻给电容放电102temperature_cnt_b=1;103while(RFL1){104temperature_cnt_b++;105if(temperature_cnt_bNTP_MAX_COUNTER){106returnERROR_NTP_LOST_ERROR;107}108}109}else{110returnERROR_NTP_PARA_ERROR;111}112113x=0;114y=temperature_cnt_a;115z=temperature_cnt_b*100000;116x=z/y;//热敏电阻除以参考电阻117tmp=ntp_100k_conversion(x);118119returntmp;120}

1 / 8
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功