zoukankan      html  css  js  c++  java
  • 高精度NTC测温的硬件电路以及软件设计

    什么是NTC

    NTC是热敏电阻,其电阻值对温度变化敏感,在不同的温度下,可以呈现不同的电阻值。

    热敏电阻有两类,一类是负温度系数电阻(NTC),温度增加时,电阻值降低,另一类是正温度系数电阻(PTC),温度增加时,电阻值增加。

    热敏电阻的电阻值计算

    NTC的电阻值R与温度的关系可以近似表示为:

    高精度NTC测温的硬件电路以及软件设计

    公式1,电阻与温度函数关系式

    其中T是绝对温度,数值为摄氏温度+273.15,单位为K(开尔文)。

    R0一般取温度25℃即298.15K时的电阻值,对应的T0取25℃,即298.15K。

    B为材料常数.不同的村料或者生产工艺都能导致B的数值发生变化,甚至在热敏电阻的工作范围内,B的数值都可能发生变化,而不是严格的常数;

    因为NTC的电阻与温度呈非线性的关系,而且存着温度的增加,温度随着温度变化的变化率越小。

    所以随着温度的增加,NTC测温的精度变化;

    所以比较适合于温度变化范围小的使用场景,比如环境温度(约为-20℃-50℃)或者是水温的检测(0℃-100℃)。

    下图是在淘宝上搜索到的一款NTC,按照温度为25℃的电阻取值,可有5KΩ,10 KΩ等不同的规格,而材料系数B值固定为3950。

    高精度NTC测温的硬件电路以及软件设计

    从淘宝搜索到的一款NTC

    我们选择10K的规格,根据公式1,可以得到这款NTC的电阻与温度的关系为:

    高精度NTC测温的硬件电路以及软件设计

    公式2,电阻与温度的函数关系式

    通过excel表格的公式,在excel工作薄的第一列输入温度,第二列输入公式可以得到不同温度下的电阻值,比如0℃为33.6 KΩ

    高精度NTC测温的硬件电路以及软件设计

    采用excel计算AD值

    NTC测温电路的设计

    NTC测温核心在于具有ADC功能的MCU,电路比较简单,只需要将固定的电压经过另一个高精度的电阻分压接到NTC电阻,然后将分压值连接到MCU的ADC输入口。

    如下图:

    高精度NTC测温的硬件电路以及软件设计

    NTC测温电路

    R1为1%精度的电阻,R2为NTC,

    0.1uF的电容C1除了可以滤除从电源引入或者从电路板感应来的高频干扰信号,另外当ADC有多路AD输入在转换时,MCU的AD模块需要通过模拟开关切换不同的通道,再进行采样转换,电容C1可以在ADC切换通道之后,迅速向采样电容充电,从而可以提到转换速度,避免因采样时间太短而导致测量不准确。

    R1上拉的电源应该和MCU的ADC的参考电源共用一个电源(在一般的设计中,MCU的供电电源和ADC的参考电源共用一个电源)。

    这是因为:

    输入ADC的AD值为(假设为12位的ADC):

    高精度NTC测温的硬件电路以及软件设计

    AD值计算公式

    如果上拉的电源ADC的参考电源共用一个电源,可以得到和上位电源无关的一个公式:

    高精度NTC测温的硬件电路以及软件设计

    AD值计算公式

    所以可以消除电源精度对测试的影响,同时减少了计算的复杂性;

    NTC测温软件的设计

    我看到在一个网友的程序设计中,他直接将公式1取对数,通过复杂的对数运算和倒数运算得到温度值,这是不合适的,

    主要是:

    1. 普通的单片机不一定提供这样的数学函数库。
    2. 普通的单片机没有浮点数运算,浮点数都是转成整弄运算的,不可避免会有舍入误差。
    3. 单片机做对数,倒数的运算,只能是近似算法,而且会耗费大量的运算时间,可能会到几百ms级,影响了对其它功能处理的实时性。
    4. 公式1只是一个近似公式,B值也并不是一个常数,用这样具体的解析公式计算,没有办法根据实际测量值对计算值进行标定,从而提高测量精度。

    我在实际的项目中,采用的是分段线性化的方法,步骤如下:

    高精度NTC测温的硬件电路以及软件设计

    采用excel表格自动生成C语言中包含AD与温度的二维数组

    1. 将测温范围分若干个区间,比如在0-100度的范围内,分100个区间,每个区间范围为1℃
    2. 计算或者实测每一个区间下限和区间上限的温度值; 比如区间30℃-31℃,根据公式1计算或者实际测试出30℃以及31℃的AD值。
    3. 将这些区间表示为2维数组(这个2维数组也可以通过实际测试形成);
    4. 取出将AD转换并多次平均之后数值,编历分段的区间,与这些区间的AD上、下限进行比较,判断落在哪一个区间,
    5. 根据一次函数的公式进行区间内的插值修正:

    测试温度值=区间温度下限+(区间温度上限-区间温度下限)/(区间AD上限-区间AD下限)*(AD测量值-区间AD下限)

    最后奉上本人使用的分段线性化的程序:

    高精度NTC测温的硬件电路以及软件设计

    分段线性化程序

  • 相关阅读:
    idea的tomcat配置
    idea设置类文件的头部信息
    设置idea注释颜色
    Idea设置字体
    python 全栈开发,Day11(函数名应用,闭包,装饰器初识,带参数以及带返回值的装饰器)
    python 全栈开发,Day10(动态参数,命名空间,作用域,函数嵌套)
    python 全栈开发,Day9(函数的初始,返回值,传参,三元运算)
    python 全栈开发,Day8(文件操作)
    python 全栈开发,Day7(元组转换,列表以及字典的坑,集合,关系测试,深浅copy,编码补充)
    python 全栈开发,Day6补充(is,小数据池,编码转换)
  • 原文地址:https://www.cnblogs.com/ct20150811/p/11276595.html
Copyright © 2011-2022 走看看