哈哈哈哈 发表于 2024-9-24 19:01:06

AI8051U ADC 精准估算电池容量

本帖最后由 哈哈哈哈 于 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 = ;
%
% capacities = ;

% 拟合多项式(这里选择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, );

% 显示结果
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 * voltage * voltage * voltage * voltage + coefficients * voltage * voltage * voltage + coefficients * voltage * voltage + coefficients * voltage + coefficients;
      return result;
    }
}总结:
提供了一种计算电池容量的思路,实际项目中用不到。
但是,如果对电池进行容量标定,在一段时间内数据还是具有参考意义的。
如果要求非常精准,可以使用带有库仑计的高级电源管理芯片,比如AXP202.

soma 发表于 2024-9-24 19:55:48

软件是mathlab做的?

小涵子爸爸 发表于 2024-9-24 20:21:23

这是个啥软件?

Yim_Hom 发表于 2024-9-24 22:17:05

soma 发表于 2024-9-24 19:55
软件是mathlab做的?

一看就是matlab,17年研究过一阵直方图转化,有比较亲切的感觉。

晓飛飛 发表于 2024-9-24 22:49:08

对于温湿度计之类的uA级轻负载来说,通过电压曲线推测电池电量是相对精准的,但负载电流到了几十到几百毫安以上时,就需要考虑输出电流和电池内阻对电池容量以及输出电压造成的影响
因此,“精准”和“估算”有时候是矛盾的,因为,ADC采到的电池电压受电池内阻、放电电流、电池温度等因素综合影响的,如果负载电流动态变化的情况下,采集到的电压可能跳动较大,如带蓝牙功能的情况下,这时候电池电压就需要结合电池温度和放电电流综合补偿计算剩余电量。必要的情况下还需要在电池充电过程中学习充电曲线获得准确的电池参数。
总之,为了保护电池,延续其寿命,推荐您研究一下电池保护方案,而电池电量的估算是另外一个范畴,这两个技术同源但不同支。

哈哈哈哈 发表于 2024-9-24 23:14:44

晓飛飛 发表于 2024-9-24 22:49
对于温湿度计之类的uA级轻负载来说,通过电压曲线推测电池电量是相对精准的,但负载电流到了几十到几百毫安 ...

这个测量方法确实存在较大局限性。我研究过电池保护电路,这些电路能够实现过充和过放的保护。相比于将 4.2V 分成三档,以高中低来指示电池电量,采用拟合的方法可以提供更精确的估计,但仍然是一个估算值。仅依靠电压来计算电池容量的局限性较为明显。例如,智能手机的电池通常配备库仑计,可以通过充放电学习获取准确的电池参数,包括电量、电流和寿命等。

晓飛飛 发表于 2024-9-24 23:18:20

哈哈哈哈 发表于 2024-9-24 23:14
这个测量方法确实存在较大局限性。我研究过电池保护电路,这些电路能够实现过充和过放的保护。相比于将 4 ...

是的,很多产品就算用了库仑计,在电池老化内阻增大或者负载较重的时候都不能提供剩余电量的准确值,电池的端电压就更不靠谱了。所以,分场景分需求匹配合适的方案就好了,对于稳定的轻负载来说,你这个方法还是可行的。
页: [1]
查看完整版本: AI8051U ADC 精准估算电池容量