目录
一、前言
车载嵌入式应用产品往往对电压高低监测有需求,以免高低压情况对产品不利。外部6-32V电压一般通过电阻分压再通过AD采样获得,由于电阻的非线性,以往电压采集一般采用工厂标定的方式实现,但由于一致性和分线性导致效果不好,所以这里直接matlab内置函数polyfit通过多项式拟合其非线性函数直接计算外部电压。
二、实现过程
三、polyfit多项式拟合
%date:
%author:
%email:
%func:
clc
clear
close all
n = 4; %拟合次数
x = 'radar';%radar , scope
vol_data = xlsread('./AD采集V02.xls','采样');
vol_scope = vol_data(:,1);
vol_radar = vol_data(:,end-1);
%vol_radar = vol_data(:,2);
if strcmp(x ,'radar')
p=polyfit(vol_radar,vol_scope,n);
fit_adc = polyval(p,vol_radar);
max_error = max(abs(fit_adc - vol_scope));
min_error = min(abs(fit_adc - vol_scope));
rmse=sqrt(sum((fit_adc-vol_scope).^2)/length(fit_adc));
else
p=polyfit(vol_scope,vol_radar,n);
fit_adc = polyval(p,vol_scope);
max_error = max(abs(fit_adc - vol_radar));
min_error = min(abs(fit_adc - vol_radar));
rmse=sqrt(sum((fit_adc-vol_radar).^2)/length(fit_adc));
end
if n ==2
fprintf('拟合系数:p2 = %f, p1 = %f, p0 = %f\n',p(1),p(2),p(3));
fprintf('表达式:voltage = %f *a^2 +%f *b +%f\n',p(1),p(2),p(3));
elseif n ==3
fprintf('拟合系数:p3 = %f, p2 = %f, p1 = %f, p0 = %f\n',p(1),p(2),p(3),p(4));
fprintf('表达式:voltage = %f *a^3 +%f *b^2 +%f *c + %f\n',p(1),p(2),p(3),p(4));
elseif n ==4
fprintf('拟合系数:p4 = %f,p3 = %f, p2 = %f, p1 = %f, p0 = %f\n',p(1),p(2),p(3),p(4),p(5));
fprintf('表达式:voltage = %f *a^4 +%f *b^3 +%f *c^2 + %f *d + %f\n',p(1),p(2),p(3),p(4),p(5));
else
fprintf('Error!\n');
end
fprintf('最大误差:%f.\n',max_error);
fprintf('最小误差:%f.\n',min_error);
fprintf('均方根误差:%f.\n',rmse);
if strcmp(x ,'radar')
plot(vol_radar,vol_scope,'.')
hold on
plot(vol_radar,fit_adc,'--o')
xlabel('radar')
ylabel('scope')
legend('Real','Fit')
else
plot(vol_scope,vol_radar,'.')
hold on
plot(vol_scope,fit_adc,'--o')
end