曲线拟合在单片机中的应用

一、简介。

在单片机开发中,可能会用热敏电阻来测量温度:如PT100、MF58等。

但是直接测量热敏电阻就只能得到阻值,测阻值有很多方法,如:恒流源、电桥等。

那么测出来的阻值,该如何计算出温度?

有两种方法:查表法、曲线拟合。

查表法适用于实时性要求高,单片机容量大的场合(FPGA也常常使用查表法)。

曲线拟合适用于实时性要求低,单片机容量小的场合。

本文以热敏电阻MF58为例,介绍如何使用曲线拟合来计算出温度。

曲线拟合在单片机中的应用_第1张图片

玻封型热敏电阻 MF58 10K 50K 100K 5%精度 B值:3950。MF58 103J3950手册。

MF58的测量范围在-55度~+250度之间,这里只介绍0度~+100度之间的曲线拟合,掌握了方法就可以举一反三。

二、制表。

曲线拟合在单片机中的应用_第2张图片

取0~100度对应的中心值,得到以下表(把PDF的数据复制到sublime上,删掉不需要的东西,利用列编辑会很好处理)。

第一列为温度,第二列为阻值(下图只是其中的一部分),将其保存为temp.txt。

曲线拟合在单片机中的应用_第3张图片

三、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)
%}

运行该脚本,可以得到阻值-温度曲线图。如下图所示。

曲线拟合在单片机中的应用_第4张图片

四、曲线拟合工具。

此外,该脚本还打开了曲线拟合工具(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,代表拟合效果越好。

曲线拟合在单片机中的应用_第5张图片

把公式复制到ResToTemp.m上,并修改为下图所示(可以直接删掉上面代码上的%{和%})。

曲线拟合在单片机中的应用_第6张图片

可以看出,阻值为3欧时,计算到的温度为+54.2876度,和手册上的表格很接近。

曲线拟合在单片机中的应用_第7张图片

但是,当阻值为25欧时,计算到的温度为+8度,和手册上相差较大。

这里可以选择其它拟合方式,如下图所示,选择了Rational,分子阶数为3,分母阶数为1。

曲线拟合在单片机中的应用_第8张图片

把公式复制到ResToTemp.m上,并修改为下图所示(可以直接删掉上面代码上的%{和%})。

曲线拟合在单片机中的应用_第9张图片

当阻值为25欧时,计算到的温度为+4.8147度,和手册上的值很接近。

曲线拟合在单片机中的应用_第10张图片

当阻值为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均为制表时的范围,超出范围,得到的结果可能不准确。

 

你可能感兴趣的:(单片机,算法,MATLAB)