概要

在工业上,会有各种读取环境温度,或读取目标物体温度的需求,通常用到的方案有:传感器测温;热敏电阻测温等。本篇着重讲解使用热敏电阻测温的方法。

热敏电阻

何为热敏电阻?热敏电阻即为热电偶传感器,也称为NTC,自身的阻值会随着环境温度的改变而改变,且为非线性变化,某品牌的热敏电阻阻值表如下所示,可见该热敏电阻本身有一定的设计误差,在同一温度下,由于设计误差导致的温度读取差异可在25℃到30℃之间可达到±0.3℃左右。

该热敏电阻大致温度-电阻曲线如下图所示。
由图可见,想要精确获取温度值,应先获取电阻值,然后使用拟合法,对温度-电阻曲线进行拟合,根据拟合后的函数关系以及当前热敏电阻的电阻值,运算出相应的温度值。

电路设计

热敏电阻采样电路如图所示,使用电阻分压的形式,将热敏电阻的变化通过电压的变化表现出来,再经过电压跟随器进行稳定,并用低通滤波器进行滤波,此处也可用软件滤波进行滤波。

获取到电压值后,即可根据供电电压、采样到的电压,还有上拉的分压电阻的阻值三者的关系进行运算,即可获取到热敏电阻的阻值。
R热敏 / ( R热敏 + R10K ) = VTP / V12V

拟合算法

1、使用多元拟合算法精确度难以达到要求,且对微控制器的运算负担较重。故不适用。
2、使用线性拟合算法运算量小,但由于温度跨度较大,无法获取准确拟合。
3、使用分段线性拟合算法,可克服以上两种算法所存在的问题。
以下内容为笔者运算分析的结果,目的在于分析分段线性拟合算法的准确度以及实际应用的可行性。

拟合算法是将所选温度节点两端的温度值以及对应的电阻值在笛卡尔坐标系中进行连线,形成二元一次函数。以25℃到30℃之间为例。如图是以25℃到30℃之间线性拟合后的结果,函数为:y = -0.3406 * x + 18.52。

将25℃到30℃的源温度-电阻值曲线使用Matlab进行二次方拟合,可得如下图所示结果。由图可知,拟合结果为 y = 0.007411 * x^2 - 0.748 * x + 24.07,且残差小于0.005。即可认为已经完全等同于源曲线。

将25℃到30℃的实际曲线与线性拟合出来的直线重叠,可见二者是有一定误差的,且越靠近两个温度节点中心,误差越大。

以下找出误差最大的点的位置,
设二次方拟合曲线y1 = 0.007411 * x^2 - 0.748 * x + 24.07;
设线性拟合直线y2 = -0.3406 * x + 18.52;
令f(x) = y2-y1,x∈[25,30];
得f(x) = -0.007411x^2 + 0.4074x -5.57,x∈[25,30];
则f’(x) = -0.014822*x + 0.4074 = 0,x∈[25,30]时,即为函数f(x)的拐点,计算可得当x = 27.49 ≈ 27.5时,f’(x) = 0。
如图所示,当x∈[25,27.5)时,f’(x)>0;当x∈(27.5,30]时,f’(x)<0。即当当前温度位于两个取样点中间时,误差达到最大值。

f(27.5) = 0.029。即当前温度为27.5℃时,计算出的电阻值与实际电阻值误差最大,为0.029kΩ。查表可知,由算法计算出的温度误差最大仅为+0.1℃,已经远小于热敏电阻本身因为制作工艺而导致的误差(±0.3℃)。

同理可推算出取温度节点间隔为10的情况,取[20,30]之间的数据进行运算。使用matlab拟合曲线后则可得:f’(x) = 0时,x = 24.95 ≈ 25;x∈[20,25)时,f’(x)>0;当x∈(25,30]时,f’(x)<0。即当当前温度位于两个取样点中间时,误差达到最大值。f(25) = 0.397kΩ,即当取样间隔为10℃时,最大计算误差不超过1℃。

分段拟合

以上说明了线性拟合算法在不同温度间隔下的拟合精度,可知在不考虑电阻本身设计误差的情况下,温度分割间隔为5℃时,误差最大不超过+0.1℃;在温度分割间隔为10℃的情况下,误差最大不超过+1℃。在不需要精确测量的温度区间,可使用10℃间隔进行运算,增加运算速度;在需要精确测量的温度区间,可使用5℃间隔进行运算,增加测量精度。
于是设计出以下算法,
1、首先将温度区间进行划分,在不需要精确测量的地方,使用10℃为一分割;在需要精确测量的地方,使用5℃为一分割。使用二维数组存储对应温度下的标准电阻值。
2、然后根据测量到的电压值进行运算,获取当前的电阻值(若需要更为精确地获取到实际温度,可用标准仪器与热敏电阻测出的实际温度做对比,将温度差值写进代码中,对使用的热敏电阻进行校准)。
3、在代码中进行扫描,判断热敏电阻的阻值所处的温度范围,然后在此区间中进行拟合运算,将获取到的热敏电阻阻值输入到拟合出来的函数中,即可获得当前的温度值。

#define SUPPORT_VOLTAGE     3.3f     //供电电压
#define REFERENCE_VOLTAGE   3.3f     //参考电压
#define DIVIDE              4096     //ADC位数
#define PULL_UP_RES         10       //上拉电阻
#define TEMP_NUM            19       //温度总共的档位数//第一行代表温度,分割档位可根据需要随意设置
//第二行代表相应的热敏电阻的阻值
const float temp_table[2][TEMP_NUM] = {{   -30,    -20,    -10,      0,      5,     10,     15,     20,    25,   30,    35,    40,    45,    50,    60,    70,    80,    90,   100},{122.0f, 72.04f, 44.09f, 27.86f, 22.39f, 18.13f, 14.77f, 12.12f, 10.0f, 8.3f, 6.92f, 5.81f, 4.89f, 4.14f, 3.01f, 2.23f, 1.67f, 1.27f, 0.98f}
};//根据二维数组表计算温度
int Temp_Cnt(int temp)
{float resist  = 0;  //电阻值float voltage = 0;  //电压值float k = 0;        //k值float b = 0;        //b值//计算电压值voltage = (float)temp / DIVIDE * REFERENCE_VOLTAGE;//电压限幅voltage = LIMIT(voltage,0,SUPPORT_VOLTAGE - 0.01f);//计算电阻值resist  = (PULL_UP_RES * voltage) / (SUPPORT_VOLTAGE - voltage);//数组之外的数据if(resist <= temp_table[1][TEMP_NUM - 1])     //电阻值小于最小值,返回值100度return (int)(1000);else if(resist >= temp_table[1][0])           //电阻值大于最大值,返回值-30度return (int)(-300);else{//遍历二维数组for(uint8_t i = 0; i < TEMP_NUM - 1; i++){//判定是否在计算范围内if(Isinside(resist,temp_table[1][i+1],temp_table[1][i])){//计算k值与b值k = (temp_table[0][i] - temp_table[0][i+1])/(temp_table[1][i] - temp_table[1][i+1]);b = temp_table[0][i] - k * temp_table[1][i];//计算出来的是温度与热敏电阻的二元一次函数的k值与b值break;}}//返回温度值return (int)((k * resist + b) * 10);}
}

算法使用二维数组存储温度节点对应的电阻值,可根据工程师需要直接修改二维数组即可,可根据实际情况,随意增加或减少温度节点的数量,无需改动算法。同时使用了自动线性插值算法,无需工程师手动计算函数,代码可根据二维数组的参数直接匹配运算。增加了可移植性与可拓展性。
当然也可在代码运行之后就根据二维数组直接运算出每一段的k和b,或由工程师直接运算出每一段的k和b,放入代码中,每次只需要匹配温度区间即可直接运算温度,无需每次都进行拟合。

谢谢阅读,有任何问题或新思路,均可沟通交流。
欢迎转载,转载请注明出处:https://blog.csdn.net/qq_33751193/article/details/115268541

热敏电阻-温度换算算法(分段线性拟合法)相关推荐

  1. 分段线性拟合经典案例:计算多年气温最低值和最高值的分段线性变化趋势(附分段线性拟合工具下载)

    分段线性回归:是用虚拟变量估计不同数量水平的解释变量对被解释变量的影响.在经济关系中,当解释变量X的值达到某一水平X′之前,与被解释变量之间存在某种线性关系:当解释变量X的值达到或者超过X′以后,与被 ...

  2. 算法与数据结构(第一周)——线性查找法

    目录 线性查找法介绍 实现线性查找法 使用泛型 使用自定义类测试算法 循环不变量 简单的复杂度分析 常见的时间复杂度 测试算法性能 线性查找法介绍 线性查找法是一个非常简单的算法,比如说现在有一打试卷 ...

  3. 算法与数据结构基础<一>----线性查找法

    开篇: 对于数据结构及算法的学习在17年时就已经在博客中开了专栏: 但是!!!感觉学得有点零散,有c版本的,也有java版本的,没成体系,当然其效果也并没达到自己满意的效果,基于此,这里准备重新开个专 ...

  4. origin中文版散点图拟合曲线_「测试狗」Origin入门教程:如何进行单段及多段线性拟合...

    在进行数据处理时,如果需要对绘制的散点图进行线性拟合,应该怎么操作呢?针对更为复杂的情况,按照不同需要进行分段线性拟合时,怎么样才能够实现多段拟合呢? 一.单段线性拟合 1.首先,把数据导入origi ...

  5. Origin如何进行单段和多段的线性拟合

    在进行数据处理时,如果需要对绘制的散点图进行线性拟合,应该怎么操作呢?针对更为复杂的情况,按照不同需要进行分段线性拟合时,怎么样才能够实现多段拟合呢? 一.单段线性拟合 1.首先,把数据导入origi ...

  6. 贝叶斯方法---分段线性插值函数画图

    一.贝叶斯方法介绍 1.不确定表示 在主观贝叶斯方法中,知识是用产生式表示的,其形式为: IF    E   THEN  (LS,LN)   H 其中(LS,LN)用来表示该知识的知识强度,LS(充分 ...

  7. 图像分段线性变化_暗光也清晰的图像增强算法

    个人学习笔记:像素反转.伽马矫正.对数变换.线性变换.分段变换. 某天跑完步以后拍出了这样一张照片,由于晚上开闪光不太好,所以想自己处理一下(为了更好的看出处理效果,所以采用尺寸较大的原图像,没有进行 ...

  8. 【04】拟合算法:01-拟合算法模型讲解

    第四讲:拟合算法 插值和拟合的区别 一个小例子 确定拟合曲线 最小二乘法的几何解释 求解最小二乘法 Matlab求解最小二乘 如何评价拟合的好坏 证明SST=SSE+SSR "线性函数&qu ...

  9. excel线性拟合的斜率_协方差分析:方差分析与线性回归的统一

    转自个人微信公众号[Memo_Cleon]的统计学习笔记:协方差分析:方差分析与线性回归的统一. 在进行数据分析时,有时候我们会遇到数据基线不平的情况,比如两样本的t检验的示例,比较Labe和Meto ...

最新文章

  1. Linux日志系统-01:什么是rsyslog?
  2. 使用 SAP UI5 系统测试工具 UIVeri5 的一个具体例子
  3. 利用Java流进行类的整型字段求和的例子
  4. 怎样从php转向java_Github标星10.8K!Java 实战博客项目分享
  5. 重塑APM标杆,博睿数据战略升级助力企业数字化转型
  6. 图标圆角角度_UI设计中图标的规范及原则【附全套视频】
  7. 基于MeanShift的目标跟踪算法及实现(转载)
  8. 数据分析数据挖掘(三)
  9. eclipse如何添加Memory Analyzer
  10. java代码转python代码(需要手动调整)
  11. 功能测试分析和测试用例编写模板
  12. 留言板php数据库_php实现留言板功能(连接数据库)的实例讲解
  13. 完美掌握MySQL登录方法]MySQL登录教程
  14. 计算机软件类自然科学基金标书,国家自然科学基金标书撰写——体会6(转发仅供参考)...
  15. ddns的搭建(动态域名解析DDNS)
  16. mysql怎么创建外表_MYSQL数据去重与外表填充
  17. 怎么做革命性创新产品
  18. 简单几步轻松获取WiFi密码
  19. Win_XP_SP3系统下成功安装WinccV6.0_SP3a 经验分享
  20. ACM各OJ网站简介

热门文章

  1. 安卓嵌入式开发教程!Android开发热门前沿知识,2年以上经验必看
  2. 鸿蒙系统如何恢复安卓系统
  3. P2P平台方案——亿网软通“互联网+”金融解决方案
  4. Codeforces - Trips
  5. android 進度條_Android ProgressBar 反向進度條/進度條從右到左走
  6. matlab 距平,MATLAB及其在地学中地应用.PDF
  7. 关于surface laptop3 无法连接显示器问题解决方案
  8. python中rect用法_HTML DOM rect() 方法
  9. Dubbo剖析-粘包与半包问题(一)
  10. 又有人因为买考研资料被骗!4种常见骗局曝光,第三种最可恶!