本帖最后由 哈哈哈哈 于 2024-9-24 22:54 编辑
AI8051U ADC 精确估算电池容量者,前作温湿度计,然无自动关机,常有忘却,致使电池亏电。
为保护电池,延续其寿命,故设计如下。
先 绘制其电压与容量的关系图:
3.6V以下仍能放电,但电压衰减迅速,保险起见,以此为0%
参考互联网数据,虽不必然精确,然则足以应用。
然后 计算多项式
% 电压和剩余容量的数据
voltages = [4.20, 4.15, 4.14, 4.12, 4.10, 4.08, 4.05, 4.03, ...
3.97, 3.93, 3.90, 3.87, 3.84, 3.81, 3.79, 3.77, ...
3.76, 3.76, 3.76, 3.74, 3.73, 3.72, 3.71, 3.71, ...
3.69, 3.66, 3.65, 3.64, 3.63, 3.61, 3.59];
capacities = [100, 99, 97, 95, 92, 90, 87, 85, ...
80, 75, 70, 65, 60, 55, 50, 45, ...
42, 40, 40, 35, 30, 25, 20, 20, ...
15, 12, 10, 8, 5, 3, 1];
% voltages = [4.2,4.06,3.98,3.92,3.87,3.82,3.79,3.77,3.74,3.68,3.45,3.00];
%
% capacities = [100,90,80,70,60,50,40,30,20,10,5,0];
% 拟合多项式(这里选择3次多项式)
degree = 4;
p = polyfit(voltages, capacities, degree);
fprintf('%.6f', p(1));
for i = 2:length(p)
fprintf(', %.6f', p(i)); % 其他系数
end
fprintf('\n');
% 生成拟合值
fitted_capacities = polyval(p, voltages);
% 计算误差
errors = capacities - fitted_capacities;
percentage_errors = (errors ./ capacities) * 100; % 百分比误差
% 输出误差
disp('电压 实际容量 拟合容量 误差 百分比误差');
for i = 1:length(voltages)
fprintf('%.2f %.2f %.2f %.2f %.2f%%\n', ...
voltages(i), capacities(i), fitted_capacities(i), errors(i), percentage_errors(i));
end
% 绘制图形
figure;
plot(voltages, capacities, 'o', 'DisplayName', '实际数据');
hold on;
plot(voltages, fitted_capacities, '-', 'DisplayName', '拟合曲线');
xlabel('Voltage (V)');
ylabel('Remaining Capacity (%)');
title('Voltage vs Remaining Capacity');
legend;
grid on;
hold off;
% 定义多项式方程 p(x) - 100 = 0
poly_eq = @(x) polyval(p, x) - 100;
% 使用fzero求解x, 在某个范围内,例如电压范围3.5到4.3
x_solution = fzero(poly_eq, [3.5, 4.3]);
% 显示结果
disp('对应y = 100时的x值:');
disp(x_solution);
复制代码
得 如下
3167.602721, -49475.484108, 289283.548018, -750264.824664, 728131.911770
电压 实际容量 拟合容量 误差 百分比误差
4.20 100.00 103.44 -3.44 -3.44%
4.15 99.00 95.88 3.12 3.15%
4.14 97.00 94.83 2.17 2.23%
4.12 95.00 93.04 1.96 2.06%
4.10 92.00 91.56 0.44 0.48%
4.08 90.00 90.24 -0.24 -0.27%
4.05 87.00 88.37 -1.37 -1.57%
4.03 85.00 87.03 -2.03 -2.39%
3.97 80.00 81.77 -1.77 -2.21%
3.93 75.00 76.67 -1.67 -2.22%
3.90 70.00 71.82 -1.82 -2.60%
3.87 65.00 66.07 -1.07 -1.65%
3.84 60.00 59.46 0.54 0.90%
3.81 55.00 52.09 2.91 5.29%
3.79 50.00 46.84 3.16 6.33%
3.77 45.00 41.38 3.62 8.05%
3.76 42.00 38.60 3.40 8.11%
3.76 40.00 38.60 1.40 3.51%
3.76 40.00 38.60 1.40 3.51%
3.74 35.00 32.98 2.02 5.77%
3.73 30.00 30.17 -0.17 -0.56%
3.72 25.00 27.37 -2.37 -9.50%
3.71 20.00 24.61 -4.61 -23.04%
3.71 20.00 24.61 -4.61 -23.04%
3.69 15.00 19.22 -4.22 -28.14%
3.66 12.00 11.74 0.26 2.15%
3.65 10.00 9.48 0.52 5.21%
3.64 8.00 7.36 0.64 7.97%
3.63 5.00 5.41 -0.41 -8.22%
3.61 3.00 2.09 0.91 30.40%
3.59 1.00 -0.32 1.32 131.60%
对应y = 100时的x值:
4.1808 复制代码
因为是拟合的,所以会有误差。
在电压最小值和最大值,计算的结果回小于或者超过实际值
解决办法也很简单,判断一下就行了
double calculateCapacity(double voltage) {
double result = 1.0;
if(voltage>=4.17) {
return 100.0;
} else if(voltage<=3.6) {
return 0;
} else {
double coefficients[] = {3167.602721, -49475.484108, 289283.548018, -750264.824664, 728131.911770};
result = coefficients[0] * voltage * voltage * voltage * voltage + coefficients[1] * voltage * voltage * voltage + coefficients[2] * voltage * voltage + coefficients[3] * voltage + coefficients[4];
return result;
}
} 复制代码
总结:
提供了一种计算电池容量的思路,实际项目中用不到。
但是,如果对电池进行容量标定,在一段时间内数据还是具有参考意义的。
如果要求非常精准,可以使用带有库仑计的高级电源管理芯片,比如AXP202.