NTC负温度系数的热敏电阻——通过ADC检测计算出相应温度值

      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的比值关系,所以在这样的串联分压电路时电阻比值即等于电压比值,不需要将测得电压值再换算成电阻值。具体电路图如下:

       NTC负温度系数的热敏电阻——通过ADC检测计算出相应温度值_第1张图片

       图中的检测电压是测分压电阻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)


以其它数为底的对数用换底公式来表示

NTC负温度系数的热敏电阻——通过ADC检测计算出相应温度值_第2张图片

函数如下:

double logab(double a,double b)
{
return log(b)/log(a);
}

 

你可能感兴趣的:(NTC负温度系数的热敏电阻——通过ADC检测计算出相应温度值)