做一个干电池的电量检测器03:数值拟合与电路仿真
首先在表格中进行详细的计算,整理出所需的数据。接着,我们运用MATLAB的强大功能对这些数据进行插值处理,生成了一个离散的数值数组。这个数组的每个数值都精确地对应着模数转换器(ADC)采样到的信号。通过这些数值,我们进一步分析电池的电压,最终得出残余电量的准确数值。
% 数据输入
RES = [12.54941694, 19.41596793, 26.28251891, 33.1490699, 40.01562089, 46.88217187, ...
53.74872286, 60.61527385, 67.48182484, 74.34837582, 81.21492681, 88.0814778, ...
94.68793215, 101.8145798, 108.3450059, 115.5476817, 122.4142327, 129.2807837, ...
136.1473347, 141.7029987, 147.4528681, 152.8065237, 156.1227558, 160.11784, ...
162.9893067, 167.6526863, 171.4944665, 174.582185, 178.6731334, 182.9647278, ...
187.1002642, 190.6115687, 193.6658462, 197.8214472, 200.2871632, 204.8128446, ...
210.4309317, 214.0098613, 219.4822944, 224.8576247, 230.4063528, 237.2729038, ...
244.1394548, 251.0060058, 257.8725567, 264.7391077, 271.6056587, 278.0400492, ...
285.3387607, 292.2053117, 299.0718627];
capacity = [2.770610162, 3.128649151, 4.023746622, 4.907655375, 6.116036962, 7.055889307, ...
8.28664833, 9.282444268, 10.43488226, 11.62088641, 12.58311619, 13.76912034, ...
14.67727132, 16.44546178, 17.54746448, 19.45298929, 21.15367448, 23.34666329, ...
25.98720083, 27.75613721, 30.99850348, 33.78993332, 36.72837049, 39.6083466, ...
42.58986034, 46.3934487, 49.52826433, 52.14802282, 55.18975584, 58.59979403, ...
61.82047008, 64.75890725, 67.65558652, 70.38962978, 72.64602132, 76.09507696, ...
79.04410345, 81.19706151, 83.92797903, 86.24590853, 88.46500434, 90.79225777, ...
92.89573683, 94.49572356, 96.00220457, 96.80059955, 97.71136122, 97.98466719, ...
98.6579268, 98.80338014, 99.206174];
% 创建新的RES数据,间隔为1
new_RES = 0:1:300;
% 进行插值计算
new_capacity = interp1(RES, capacity, new_RES, 'spline', 'extrap');
% 保留小数点后一位
new_capacity = round(new_capacity, 1);
% 结果输出到同名的txt文件
fileID = fopen('插值结果.txt', 'w');
fprintf(fileID, 'RES\t容量百分比\n');
for i = 1:length(new_RES)
fprintf(fileID, '%d\t%.1f\n', new_RES(i), new_capacity(i));
end
fclose(fileID);
% 可视化插值结果
figure;
plot(RES, capacity, 'o', 'MarkerFaceColor', 'b'); % 原始数据点
hold on;
plot(new_RES, new_capacity, '-r'); % 插值结果
xlabel('RES');
ylabel('容量百分比');
title('RES vs 容量百分比插值结果');
legend('原始数据', '插值数据');
grid on;
matlab运行后拟合的曲线如下:
在MPLAB IDE中定义静态数组:
在Proteus中,建立仿真电路,显示电压和电量,如图:
增加使用led光排分级显示剩余电量如图:
基本到此就告以段落了,这是一个很小的题目,主要还是借此来熟悉单片机的开发环境,一个实用的电量计肯定不会是图中的电路来实现,因为受限于成本的原因,肯定采用廉价的国产8位单片机+灰度液晶显示表头+单只电池升压电路,但大致的思路是一样的。精度不是关键,关键是低成本和低功耗。
有朋友告诉我说,碱性干电池是可以小电流充电来恢复部分电量的,有机会做实际的电路实验下,所以对此感兴趣是因为几年前垃圾分类的宣传中,听说一节干电池可以污染6平米的土地,所以印象深刻。好的,先这样吧!