天天看点

外设驱动库开发笔记36:NTC负温度系数热电阻测温驱动

  在嵌入式产品中,温度检测非常常见。在成本比较敏感而精度要求较低时,NTC电阻是个不错的选择。在这一篇中,我们将讨论如何和设计并实现一个通用的NTC驱动,以便在后续的项目中更方便的复用。

1、功能概述

  NTC是指随温度上升电阻呈指数关系减小、具有负温度系数的热敏电阻现象和材料。NTC热敏电阻是以锰、铜、硅、鈷、铁、镍、锌等金属氧化物为主要材料,采用陶瓷工艺制造而成的,其电阻率和材料常数随材料成分比例、烧结气氛,烧结温度和结构状态不同而变化。现在还出现了以碳化硅、硒化锡、氮化钽等为代表的非氧化物系NTC热敏电阻材料。因此,在实现小型化的同时,还具有电阻值、温度特性波动小、对各种温度变化响应快的特点,可进行高灵敏度、高精度的检测。

  NTC 热敏电阻是一种典型具有温度敏感性的半导体电阻。根据标准IEC 60539-1的规定,NTC的电阻与温度存在如下关系曲线:

外设驱动库开发笔记36:NTC负温度系数热电阻测温驱动

  对于NTC的这种电阻与温度的关系也可以使用近似的舒徐公式来表示:

外设驱动库开发笔记36:NTC负温度系数热电阻测温驱动

  其中,R是在绝对温度T时,NTC的零功率电阻。Ra是在绝对温度Ta时,NTC的零功率电阻。

  B值是负温度系数热敏电阻器的热敏常数,每种既定的材料都只有一个B值。B值可以通过测量在25摄氏度和50摄氏度(或85摄氏度)时的电阻值后进行计算。B值与产品电阻温度系数正相关,也就是说B值越大,其电阻温度系数也就越大。

2、驱动设计与实现

  NTC作为测温元件的原理我们已经明白了,在此基础上我们就可以来实现其测温的驱动程序。

2.1、对象定义

  我们依然是将NTC当作一个对象,首先定义其对象类型。对于不同的NTC有三个参数是与其自身紧密相关的,或者说一旦制造就不会更改的。那就是B值、标称温度与标称电阻。B值与材质有关,标称温度通常定为25摄氏度,标称电阻则为标称温度下的电阻。所以我们定义NTC对象类型为:

/* 定义NTC电阻测温对象 */
typedef struct NTCObject{
     float BValue;       //NTC的B常数
     float nominalT;     //NTC标称温度(摄氏度)
     float nominalR;     //NTC标称电阻
}NTCObjectType;
           

  在一个对象使用之前必须对其实现初始化配置。主要是对指针进行检查及对属性变量和操作指针进行赋值。

/* NTC对象初始化函数 */
void NTCInitialization(NTCObjectType *ntc,float bValue,float nt,float nr)
{
     if(ntc==NULL)
     {
        return;
     }
     
     ntc->BValue=bValue;
     ntc->nominalT=nt;
     ntc->nominalR=nr;
}
           

2.2、对象操作

  在我们实现了对象的定义和初始化之后,我们就可以操作对象来得到温度值。那么如何操作对象得到温度值呢?我们前面已经提到过,NTC是一种随温度上升时,电阻值呈指数关系减小的热敏电阻。而这种指数关系就是我们前面提到的电阻与温度的关系表达式。于是我们就可以根据这一表达式推导出有电阻计算温度的公式:

外设驱动库开发笔记36:NTC负温度系数热电阻测温驱动

  根据以上公式我们可以通过检测电阻来计算温度:

/*公式法计算NTC温度值*/
float NTCTemperature(NTCObjectType *ntc,float resistance)
{
 float temp;
 float result=0.0;
 
 result=resistance/ntc->nominalR;
 result=(log(result)/ntc->nominalR)+(1/(ntc->nominalT+KELVIN_CONSTANT));
 temp=1/result-KELVIN_CONSTANT;
 
 return temp;
}
           

3、驱动的使用

  接下来使用我们前面开发的驱动来实现NTC检测温度。首先需要使用NTCObjectType对象类型声明NTC对象变量。

  NTCObjectType ntc;

  这个对象变量必须初始化才能使用。所以我们采用初始化函数对这个变量进行初始化:

  NTCInitialization(&ntc,bValue,nt,nr);

  如果是有多个NTC对象可以使用数组等方式来处理。初始化完成后我们就可以操作该对象了。我们通常会采用一个电桥电路来检测NTC电阻,以测量当前的温度。电路图如下:

外设驱动库开发笔记36:NTC负温度系数热电阻测温驱动

  上图中我们通过一个电桥来采集NTC电阻的变化,因为电阻的变化会引起C17两端电压的变化。温度越高NTC电阻越小,C17两端电压差就越大,反之越小。我们采用了25摄氏度时,阻值为10K的NTC。不难推断出输出电压与NTC电阻值的关系。当输出电压为0V时,电阻约25K,查表可知温度为5摄氏度左右。当输出电压为5V时,电阻值接近0,查表可知在100摄氏度以上。这也便是这个电路的理论测量范围。

  我们检测到当前的电阻后,调用NTCTemperature(NTCObjectType *ntc,float resistance);函数来计算对应的温度值。

4、应用总结

  使用NTC作为测温和控温的元件所得到的结果基本与预期的一致。但在控温的精度和响应速度上略有不足,对于一般的应用是完全足够的。在要求较高的场合我们也可以通过软件提高控温精度。

  使用NTC作为测温元件需要注意,由于阻值与温度的非线性,而我们解非线性方程可能会造成较大误差,所以测温有时候会有较大的误差。而且NTC的测温范围很有限,所以使用是需要考虑这个问题。同时NTC存在较大的个体差异。当然作为一般的应用这些都不是问题。

欢迎关注:

外设驱动库开发笔记36:NTC负温度系数热电阻测温驱动

如果阅读这篇文章让您略有所得,还请点击下方的【好文要顶】按钮。

当然,如果您想及时了解我的博客更新,不妨点击下方的【关注我】按钮。

如果您希望更方便且及时的阅读相关文章,也可以扫描上方二维码关注我的微信公众号【木南创智】

继续阅读