一、简介。
在单片机开发中,可能会用热敏电阻来测量温度:如PT100、MF58等。
但是直接测量热敏电阻就只能得到阻值,测阻值有很多方法,如:恒流源、电桥等。
那么测出来的阻值,该如何计算出温度?
有两种方法:查表法、曲线拟合。
查表法适用于实时性要求高,单片机容量大的场合(FPGA也常常使用查表法)。
曲线拟合适用于实时性要求低,单片机容量小的场合。
本文以热敏电阻MF58为例,介绍如何使用曲线拟合来计算出温度。
玻封型热敏电阻 MF58 10K 50K 100K 5%精度 B值:3950。MF58 103J3950手册。
MF58的测量范围在-55度~+250度之间,这里只介绍0度~+100度之间的曲线拟合,掌握了方法就可以举一反三。
二、制表。
取0~100度对应的中心值,得到以下表(把PDF的数据复制到sublime上,删掉不需要的东西,利用列编辑会很好处理)。
第一列为温度,第二列为阻值(下图只是其中的一部分),将其保存为temp.txt。
三、matlab脚本。
新建一个matlab脚本ResToTemp.m(代码如下),和上面的表放在同一目录下。
clear;
close all;
clc;
X = load('temp.txt');
temp =X(:,1); % temp
res =X(:,2); % res
figure;
plot(res,temp);
xlabel('res');ylabel('temp');
title('Origin');
cftool
%{
x = 3; %Polynomial
p1 = 6.088e-06;
p2 = -0.0006461;
p3 = 0.02678;
p4 = -0.55;
p5 = 5.919;
p6 = -34.05;
p7 = 116;
y = p1*x^6 + p2*x^5 + p3*x^4 + p4*x^3 + p5*x^2 + p6*x + p7
%}
%{
x = 25; %Rational
p1 = 0.024;
p2 = -1.772;
p3 = 28.41;
p4 = 147.4;
q1 = 0.9933;
y= (p1*x^3 + p2*x^2 + p3*x + p4) / (x + q1)
%}
运行该脚本,可以得到阻值-温度曲线图。如下图所示。
四、曲线拟合工具。
此外,该脚本还打开了曲线拟合工具(Curve Fitting Tool)。
这里要从阻值计算出温度,所以阻值为自变量X,温度为因变量Y。
所以X data设为阻值res,Ydata设为温度temp。
右侧拟合方法设为Polynomial,阶数设为6,阶数越高,则公式越复杂。
可以看到Results中显示拟合公式f(x),拟合系数p1~p7,R-square为0.9971。
R-square为R的平方,即拟合优度,越接近于1,代表拟合效果越好。
把公式复制到ResToTemp.m上,并修改为下图所示(可以直接删掉上面代码上的%{和%})。
可以看出,阻值为3欧时,计算到的温度为+54.2876度,和手册上的表格很接近。
但是,当阻值为25欧时,计算到的温度为+8度,和手册上相差较大。
这里可以选择其它拟合方式,如下图所示,选择了Rational,分子阶数为3,分母阶数为1。
把公式复制到ResToTemp.m上,并修改为下图所示(可以直接删掉上面代码上的%{和%})。
当阻值为25欧时,计算到的温度为+4.8147度,和手册上的值很接近。
当阻值为3欧时,计算到的温度为+54.4237度,和手册上的值很接近。
综上所述,MF58的阻值-温度曲线,使用Rational方法,拟合效果更好。
五、将拟合公式转换为C语言。
接下来,把拟合公式,写成C语言,供单片机使用即可。
#include "math.h"
float ResToTemp(float x) {
float y = 0.0F;
const float p1 = 0.024F;
const float p2 = -1.772F;
const float p3 = 28.41F;
const float p4 = 147.4F;
const float q1 = 0.9933F;
if(x>=0.677F && x<=32.371F) {
y = (p1*powf(x,3) + p2*powf(x,2) + p3*x + p4) / (x+q1);
}
return y;
}
六、其它问题。
1、如果拟合效果不好,可以分段拟合,如:0~+50度拟合一个公式,+50度~+100度再拟合一个公式,根据阻值来区分使用哪个公式。
2、该方法也适用于电池的电量检测,测量电池电压,然后利用曲线拟合计算出电量。
3、每次运行拟合,结果可能有细微差异,因为拟合系数是在一个范围内,而不是固定值。
4、修改temp.txt中的值,即可用于拟合其它数据。
5、要注意拟合公式的取值范围,公式中的x,y均为制表时的范围,超出范围,得到的结果可能不准确。