zoukankan      html  css  js  c++  java
  • 外设驱动库开发笔记36:NTC负温度系数热电阻测温驱动

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

    1、功能概述

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

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

      对于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是一种随温度上升时,电阻值呈指数关系减小的热敏电阻。而这种指数关系就是我们前面提到的电阻与温度的关系表达式。于是我们就可以根据这一表达式推导出有电阻计算温度的公式:

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

    /*公式法计算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电阻,以测量当前的温度。电路图如下:

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

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

    4、应用总结

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

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

    欢迎关注:

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

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

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

  • 相关阅读:
    《刀塔传奇》
    SSH端口转发
    objective-c与c++的差异
    mysql 远程连接速度慢的解决方案
    maven
    automapper 自动映射 集成asp.net Core2.1
    swagger 集成asp.net Core2.1
    asp.net Core 跨域配置
    处理程序“PageHandlerFactory-Integrated”在其模块列表中有一个错误模块“ManagedPipelineHandler”
    SharedPreferences
  • 原文地址:https://www.cnblogs.com/foxclever/p/15733811.html
Copyright © 2011-2022 走看看