请教下高手用单片机的AD+NTC热敏电阻做温度计,能不能用单片机计算出取样到的温度值来显示
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请教下高手用单片机的AD+NTC热敏电阻做温度计,能不能用单片机计算出取样到的温度值来显示相关的知识,希望对你有一定的参考价值。
我看过网上有些说NTC非线性会出现误差的,所以用查表。但NTC也有线性的呀,用线性的应该不用查表吧?我做得只是一般整数温度计,不用显示小数的。相差一两度也没问题的。
非线性的就不能用公式直接计算了,只能使用查表得办法,先预先测量NTC在不同温度时输出的电压值(即ADC转换得到的数据)是多少,做点修正后作为表格存储在单片机中,这样在测量未知温度的时候,根据查表数据推算出测量温度的真实值。追问现在也有线性NTC的吧,能不能用线性的NTC来计算,查表占储存空间呀!谢谢
追答线性的就非常好办了!只要得到温度和电压之间的公式即可,不用查表,哈哈!我喜欢线性的。
追问请问下具体公式是怎么样的呢,?还有如果是零下的,负数的应该要怎么写好呢?
追答这就不清楚了,不同型号的,计算方法就不一样吧,比如有的是1Ω/1℃,有的是10Ω/℃,根据实际情况来计算了。
对于零下温度的,我想处理方法是一样吧,比如器件在0℃时电阻是100Ω,10℃时是120Ω,-10℃时是80Ω。所以将100欧姆作为0℃时的数值,小于100的就是零下的了。
3.00V=59.5度 AD值=0FFH
假如某次读取的A/D值是:5FH
温度=(5FH*59.5)/FFH追问
如果是零下的,就是负的也能算出来吧,谢谢你超快的解答。
参考资料:百度一下
调试备忘录-NTC电阻的使用(教程 + 代码)
软件环境:CodeWarrior 11.1
硬件环境:NXP S9KEAZ64A
传感器参数:NTC热敏电阻(R25 = 50k,B25-50 3950)
写在前面
最近做小项目需要用到NTC电阻,因此写一个调试备忘录记录下。
什么是NTC电阻?
NTC热敏电阻就是负温度系数的电阻,当温度升高时,电阻降低(反之则为PTC电阻)。NTC电阻灵敏度高,温度分辨率高,但
是测量温度范围较窄,通常低于100摄氏度。
NTC电阻与温度之间的关系
NTC热敏电阻温度和电阻关系最常见的公式就是如下图基于参数“β”的指数公式,公式比较简单,也是非常常用的公式。(其中的
β,有些资料也称为B)
其中,
因此,如果知道了RT2 、T2和B的值,就可以计算出任意温度下NTC热敏电阻的阻值,或者计算出任意NTC热敏电阻阻值对应的温
度值。常规应用中,厂家一般会给出T=298.15k下的阻值和B值,不同型号的NTC热敏电阻其参数也是不同。
NTC电阻的实际应用
在购买使用NTC电阻之前,我们需要先确认NTC电阻在25℃的阻值,然后设计温度采样电路。可以先和商家确认热敏电阻的阻值表。
例如:下表部分阻值表的截图,其中的R25=15KΩ就是热敏电阻在25℃时候的阻值,B25/50就是25℃-50℃时候的B值。
因此如果我想检测温度的话,直接将检测到的电阻值带入上面的公式,就可以得到当前的温度了。
当然,如果你检测区间不在25℃-50℃,你也可以自己将阻值表里面的数据,带入公式中,得出你目标区间的B值,进而在一定区间内比较精准的检测温度。
对于NTC热敏电阻的检测电路,直接使用最简单的分压电路就可以了。如下图:
RT1阻值的计算方法为:R = (adc_value * 20 * 1.0 / (adc_all - adc_value)) ;
其中,adc_all 为你的ADC采样精度,例如8位精度就是0xFF,adc_value为你的ADC实际采样值,20为电路中的分压电阻,20K。1.0是为了确保有小数结果。
所以最终的温度为:
ADC_Channel_Vlaue = ADC_Read(ch); //Read ADC value from channel n R = (20 * ADC_Channel_Vlaue * 1.0 /(255 - ADC_Channel_Vlaue)); //8位精度 Temperature1_Value = 1/ (log( R / R25 ) / B + 1 / (273.15 + 25)); Temperature1_Value = Temperature1_Value - 273.15;
Temperature1_Value 为最终的温度。
附上函数的全部代码
float Temperature_Measurement(UINT8 ch) { UINT8 Temperature_Counter = 0; UINT8 ADC_Channel_Vlaue = 0; float Temperature1_Value; float Temperature1_Sum_Value = 0; float Temperature1_Average_Value = 0; float R25 = 50; float R = 0; float B = 3950; while(Temperature_Counter<100) { Temperature_Counter++; ADC_Channel_Vlaue = ADC_Read(ch); //Read ADC value from channel n R = (20 * ADC_Channel_Vlaue * 1.0 /(255 - ADC_Channel_Vlaue)); // Temperature1_Value = 1/ (log( R / R25 ) / B + 1 / (273.15 + 25)); Temperature1_Value = Temperature1_Value - 273.15; Temperature1_Sum_Value = Temperature1_Sum_Value + Temperature1_Value; ADC_SC1 = 0 ; } Temperature1_Average_Value = Temperature1_Sum_Value / Temperature_Counter; return (Temperature1_Average_Value); }
以上是关于请教下高手用单片机的AD+NTC热敏电阻做温度计,能不能用单片机计算出取样到的温度值来显示的主要内容,如果未能解决你的问题,请参考以下文章