NTC作为一种负温度系数热敏电阻,其阻值随温度升高而降低。利用热敏电阻的特性可以做温度传感器检测温度应用在单片机中。下面简单介绍下,在单片机中AD检测热敏电阻电压值,然后转换成电阻值,求出当前的实际温度。 一、热敏电阻公式 NTC 热敏电阻温度计算公式:Rt = R *EXP(B*(1/T1-1/T2)) 其中,T1和T2指的是K度,即开尔文温度。 Rt 是热敏电阻在T1温度下的阻值。 R是热敏电阻在T2常温下的标称阻值。100K的热敏电阻25℃的值为100K(即R=100K)。T2=(273.15+25) EXP是e的n次方 B值是热敏电阻的重要参数 通过转换可以得到温度T1与电阻Rt的关系T1=1/(ln(Rt/R)/B+1/T2) (所以对应只有一个Rt未知数即可求出T1实时温度) 对应的摄氏温度t=T1-273.15,同时+0.5的误差矫正。 二、硬件连接方式 单片机通过ADC检测热敏电阻电压值,或者相关分压值。一般在热敏电阻上串联与Rt阻值相同的分压电阻。因为计算T1公式中需要知道Rt/R的比值关系,所以在这样的串联分压电路时电阻比值即等于电压比值,不需要将测得电压值再换算成电阻值。具体电路图如下: 图中的检测电压是测分压电阻R3的,一般来说直接测RTC更为直观。R2由于单片机IO的高阻态等设置,R2上相当于开路,所以测得电压可以当作为R3上的电压。 三、程序实现 ADC获取过程就不再赘述了,相关程序可以在前一篇博客中查看,我这边直接将获取了相应温度后如何处理程序展示下: uint16_t TempValue_Calculate( float TempADCValue ) { float TempValue = 0; float res_proportion = (vdd_value-TempADCValue)/TempADCValue; //电阻比值相当于电压比值,根据电路图计算, TempValue = 1.0/( (log(res_proportion))/3950.0 + 1.0/(273.15+25.0) ) - 273.15; //JlinkPrintf("current temp is %.2f\r\n,", TempValue); return (uint16_t)TempValue; } // vdd_value为内部电压值,TempADCValue为对应AD检测的电压值(在这边是电路图中的R3电压) 补充下知识点: 数学中的公式和c语言中有小小的区别。 1、数学中 log是对数符号,右边写真数和底数(上面是真数,下面是底数) lg是以10为底数(例lg100=2)(lg为常用对数) ln是以e为底数(lne2=2)(ln为自然对数 e=2.7182818284590452353602874713527...) 2、c语言中 c语言里面只有两个函数log和log10 其中 函数 log(x) 表示是以e为底的自然对数,即 ln(x) 函数 log10(x) 以10为底的对数,即 lg(x) 以其它数为底的对数用换底公式来表示 函数如下: double logab(double a,double b) { return log(b)/log(a); } ———————————————— 版权声明:本文为CSDN博主「众缈之门」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_42660303/article/details/84145382 |