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

概要

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

热敏电阻

何为热敏电阻?热敏电阻即为热电偶传感器,也称为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'(x)
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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1382422.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

摄氏温度和华氏温度换算(vb源码)

【实例简介】初步涉及VB 【实例截图】 文件&#xff1a;590m.com/f/25127180-493490306-f0ccf8&#xff08;访问密码&#xff1a;551685&#xff09; 以下内容无关&#xff1a; -------------------------------------------分割线----------------------------------------…

DS18b20温度值换算

DS18B20 处理正负温度值。 寄存器格式 例子 //计算温度值 //参数 高字节&#xff0c;低字节 double CaculateTemp(uint8_t tmh, uint8_t tml) {uint8_t th;uint8_t tl;double temp 0;tl tml & 0x0F;//取低字节后四位th (tmh << 4) (tml >> 4);//取高字节后…

用Python制作温度换算模块

&#xff08;注&#xff1a;这里通用摄氏度&#xff0c;Python版本为3.8.5&#xff09; 今天教大家做一个温度换算模块&#xff0c;非常简单实用。 这张图是最终效果&#xff1a; &#xff08;CK指将摄氏度转换为开氏度&#xff0c;CRe指将摄氏度转换为列氏度&#xff09; …

c语言——统计分类

我们将一个班的成绩进行分类&#xff0c; 成绩60分以下的为c、成绩61-89分的为b&#xff0c;90分以上的为A //统计分类 /*我们将一个班的成绩进行分类&#xff0c; 成绩60分以下的为c、成绩61-89分的为b&#xff0c;90分以上的为A */ #include<stdio.h> int main() …

如何将Excel中的一列内容合并到一起显示?

最近在工作过程中遇到要将excel中一列内容合并到一个格里显示&#xff0c;经过查询可以通过如下实现&#xff0c;记录下来方便使用。 步骤&#xff1a; 打开excel&#xff0c;复制要整合的内容到excel的一列&#xff0c;在下面一个格里执行下面语句&#xff1a; CONCATENATE(TR…

Excel表格合并两列数据且保留全部内容

Excel表格如何能将两列数据合并成一列&#xff0c;保留两列的内容&#xff0c;且插入你需要的分隔符&#xff0c;看这里&#xff01; 方法超级简单&#xff0c;我还找了半个小时&#xff08;泪目&#xff09; 第一步&#xff1a;新建一个空白列 在需要合并列的位置上新建一个…

如何把Excel两列内容合并成一列内容

今天跟大家分享一下如何把俩列内容合并成一列内容 1.如下图表格中含有两列数据&#xff0c;现在我们先要将这两列数据合并到一个单元格中。 2.第一步我们选中全部单元格区域 3.然后我们点击下图选项&#xff08;Excel工具箱&#xff0c;百度即可了解详细下载安装信息&#xff0…

excel表格内容合并的技巧?

今天跟大家分享一下excel表格内容合并的技巧&#xff1f; 1.打开演示文件&#xff0c;如下图要求将多个表格合并到一起。 2.首先我们点击下图选项 3.点击【汇总拆分】-【合并多表】 4.勾选要合并的工作表 5.然后根据表格设置表头行数 6.最后我们点击【确定】即可完成 7.完成效果…

如何将Excel表格中的多列内容合并到一列

目录 方法一&#xff1a;对于数据量不大的情况&#xff0c;可以考虑如下方法&#xff1a; 方法二&#xff1a;当数据量过大或存在多张需要填充的表格时 方法一&#xff1a;对于数据量不大的情况&#xff0c;可以考虑如下方法&#xff1a; 步骤一&#xff1a;在第一列的最下方…

Excel快速合并,简单方法,轻松搞定!

想要高效完成工作&#xff0c;就必须掌握一些实用的工作技巧&#xff0c;来帮助我们更好更快的完成任务。 分享6个使用效率高达95%的Excel实用技巧&#xff0c;工作中经常被用到&#xff01; 1.多行数据合并&#xff1a; 制作表格时&#xff0c;如果我们需要将多行数据合并为…

Excel数据合并

1、字段合并 字段合并是指将某几个字段合并成一个新的字段。 我们可以使用CONCATENATE&#xff0c;&&#xff0c;DATE函数进行字段合并。 1.1、CONCATENATE CONCATENATE函数能够把它的所有参数连接起来。 我们选中D2单元格&#xff0c;点击插入函数&#xff0c;查找到CO…

新版火狐右键关闭标签

最好用firefox57版本&#xff0c;打开ini有多个功能&#xff0c;

火狐浏览器中设置打开新地址时,不会覆盖原页面的方法

近期使用火狐浏览器发现打开新标签页时总是会覆盖原页面&#xff0c;百度了好多方法都是在选项中-设置标签页&#xff0c; 然而&#xff0c;在我用的浏览器版本里均无此项可设置&#xff0c;一直百度总算找到一种办法&#xff0c;亲试绝对有效&#xff01; 1、本人用的是火狐浏…

火狐浏览器(69版)修改起始页,主页和新标签页

火狐浏览器的优点 火狐浏览器&#xff08;我使用的是68版&#xff09;的资源占用比chrome浏览器&#xff08;如谷歌&#xff0c;微软最新的Edge&#xff09;要小很多而且集成了两者的优点&#xff1a; 可以使用火狐账号登录 &#xff0c;这样各种信息都可以选择保留&#xff…

让新手不再彷徨:Firefox7(火狐7)浏览器完美配置简明教程

好像我还没有写过类似的文章。这次依然是百忙之中抽空写篇文章。 我一直是IE浏览器的忠实用户&#xff0c;但是最近由于开发ASP.NET程序&#xff0c;不得不使用火狐浏览器。早就耳闻火狐浏览器非常强大&#xff0c;尤其是强大的扩展功能&#xff0c;但是我一直没有考虑过&#…

火狐浏览器没有右键菜单_通过Firefox中的右键菜单防止烦人的网站引起混乱

火狐浏览器没有右键菜单 If you’ve spent any amount of time online, you’ve already run into a website that uses javascript to disable the right-click menu on the page… which can be really, really irritating for those of us that like to use the “back” fe…

IE,火狐,OPERA等浏览器CSS Hack和向后兼容

人一旦习惯了某些东西就很难去改&#xff0c;以及各种各样的原因&#xff0c;新的浏览器越来越多&#xff0c;而老的总淘汰不了。增长总是快于消亡导致了浏览器兼容是成了谈不完的话题。说 到浏览器兼容&#xff0c;CSS HACK自然而然地被我们想起。今天&#xff0c;我们通常都有…

Firefox 修复 21 年前的老 bug

2000 年时&#xff0c;一个名叫 Matthew T 的开发者向 Mozila 提交了一个 Bug。 bug 描述如下&#xff1a; Mozilla 在 MacOS 上使用本机主菜单时&#xff0c;XUL菜单项会转换为本地菜单结构&#xff0c;导致 Mozilla 能直接使用 Mac 的主菜单栏。Matthew T 提到&#xff0c;为…

firefox浏览器需要新建窗口时以新建标签页代替

今天修改了一下firefox的配置&#xff0c;然后不知道修改错哪里了&#xff0c;每次新跳转一个连接&#xff0c;就会新打开一个页面&#xff0c;无奈至极啊。于是查了一下怎么解决&#xff0c;记录一下解决方法。 1.firefox浏览器的右上角&#xff0c;打开 》 选项 》 标签页 》…

Firefox 差点就赢了第二次浏览器大战!

作为 IE 的挑战者&#xff0c;Firefox 浏览器引入了标签、弹窗拦截器、扩展和主题等功能&#xff0c;并将速度、可用性、以及最终的隐私和用户定位完美地结合在了一起——在它发布后的五年内&#xff0c;迅速占领了全部网页浏览量的近三分之一。但尽管如此&#xff0c;在它与微…