在嵌入式产品中,温度检测非常常见。在成本比较敏感而精度要求较低时,NTC电阻是个不错的选择。在这一篇中,我们将讨论如何和设计并实现一个通用的NTC驱动,以便在后续的项目中更方便的复用。
NTC是指随温度上升电阻呈指数关系减小、具有负温度系数的热敏电阻现象和材料。NTC热敏电阻是以锰、铜、硅、鈷、铁、镍、锌等金属氧化物为主要材料,采用陶瓷工艺制造而成的,其电阻率和材料常数随材料成分比例、烧结气氛,烧结温度和结构状态不同而变化。现在还出现了以碳化硅、硒化锡、氮化钽等为代表的非氧化物系NTC热敏电阻材料。因此,在实现小型化的同时,还具有电阻值、温度特性波动小、对各种温度变化响应快的特点,可进行高灵敏度、高精度的检测。
NTC 热敏电阻是一种典型具有温度敏感性的半导体电阻。根据标准IEC 60539-1的规定,NTC的电阻与温度存在如下关系曲线:
对于NTC的这种电阻与温度的关系也可以使用近似的舒徐公式来表示:
其中,R是在绝对温度T时,NTC的零功率电阻。Ra是在绝对温度Ta时,NTC的零功率电阻。
B值是负温度系数热敏电阻器的热敏常数,每种既定的材料都只有一个B值。B值可以通过测量在25摄氏度和50摄氏度(或85摄氏度)时的电阻值后进行计算。B值与产品电阻温度系数正相关,也就是说B值越大,其电阻温度系数也就越大。
NTC作为测温元件的原理我们已经明白了,在此基础上我们就可以来实现其测温的驱动程序。
我们依然是将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;
}
在我们实现了对象的定义和初始化之后,我们就可以操作对象来得到温度值。那么如何操作对象得到温度值呢?我们前面已经提到过,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;
}
接下来使用我们前面开发的驱动来实现NTC检测温度。首先需要使用NTCObjectType对象类型声明NTC对象变量。
NTCObjectType ntc;
这个对象变量必须初始化才能使用。所以我们采用初始化函数对这个变量进行初始化:
NTCInitialization(&ntc,bValue,nt,nr);
如果是有多个NTC对象可以使用数组等方式来处理。初始化完成后我们就可以操作该对象了。我们通常会采用一个电桥电路来检测NTC电阻,以测量当前的温度。电路图如下:
上图中我们通过一个电桥来采集NTC电阻的变化,因为电阻的变化会引起C17两端电压的变化。温度越高NTC电阻越小,C17两端电压差就越大,反之越小。我们采用了25摄氏度时,阻值为10K的NTC。不难推断出输出电压与NTC电阻值的关系。当输出电压为0V时,电阻约25K,查表可知温度为5摄氏度左右。当输出电压为5V时,电阻值接近0,查表可知在100摄氏度以上。这也便是这个电路的理论测量范围。
我们检测到当前的电阻后,调用NTCTemperature(NTCObjectType *ntc,float resistance);函数来计算对应的温度值。
使用NTC作为测温和控温的元件所得到的结果基本与预期的一致。但在控温的精度和响应速度上略有不足,对于一般的应用是完全足够的。在要求较高的场合我们也可以通过软件提高控温精度。
使用NTC作为测温元件需要注意,由于阻值与温度的非线性,而我们解非线性方程可能会造成较大误差,所以测温有时候会有较大的误差。而且NTC的测温范围很有限,所以使用是需要考虑这个问题。同时NTC存在较大的个体差异。当然作为一般的应用这些都不是问题。