找回密码
 立即注册
查看: 588|回复: 6

AI8051U ADC 精准估算电池容量

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-05-01 11:24:23

13

主题

95

回帖

294

积分

中级会员

积分
294
发表于 2024-9-24 19:01:06 | 显示全部楼层 |阅读模式
本帖最后由 哈哈哈哈 于 2024-9-24 22:54 编辑

AI8051U ADC 精确估算电池容量者,前作温湿度计,然无自动关机,常有忘却,致使电池亏电。
为保护电池,延续其寿命,故设计如下。

绘制其电压与容量的关系图:


3.6V以下仍能放电,但电压衰减迅速,保险起见,以此为0%
参考互联网数据,虽不必然精确,然则足以应用。
然后计算多项式

  1. % 电压和剩余容量的数据
  2. voltages = [4.20, 4.15, 4.14, 4.12, 4.10, 4.08, 4.05, 4.03, ...
  3.              3.97, 3.93, 3.90, 3.87, 3.84, 3.81, 3.79, 3.77, ...
  4.              3.76, 3.76, 3.76, 3.74, 3.73, 3.72, 3.71, 3.71, ...
  5.              3.69, 3.66, 3.65, 3.64, 3.63, 3.61, 3.59];
  6. capacities = [100, 99, 97, 95, 92, 90, 87, 85, ...
  7.                80, 75, 70, 65, 60, 55, 50, 45, ...
  8.                42, 40, 40, 35, 30, 25, 20, 20, ...
  9.                15, 12, 10, 8, 5, 3, 1];
  10. % 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];
  11. %
  12. % capacities = [100,90,80,70,60,50,40,30,20,10,5,0];
  13. % 拟合多项式(这里选择3次多项式)
  14. degree = 4;
  15. p = polyfit(voltages, capacities, degree);
  16. fprintf('%.6f', p(1));
  17. for i = 2:length(p)
  18.     fprintf(', %.6f', p(i)); % 其他系数
  19. end
  20. fprintf('\n');
  21. % 生成拟合值
  22. fitted_capacities = polyval(p, voltages);
  23. % 计算误差
  24. errors = capacities - fitted_capacities;
  25. percentage_errors = (errors ./ capacities) * 100; % 百分比误差
  26. % 输出误差
  27. disp('电压    实际容量    拟合容量    误差    百分比误差');
  28. for i = 1:length(voltages)
  29.     fprintf('%.2f   %.2f       %.2f       %.2f    %.2f%%\n', ...
  30.         voltages(i), capacities(i), fitted_capacities(i), errors(i), percentage_errors(i));
  31. end
  32. % 绘制图形
  33. figure;
  34. plot(voltages, capacities, 'o', 'DisplayName', '实际数据');
  35. hold on;
  36. plot(voltages, fitted_capacities, '-', 'DisplayName', '拟合曲线');
  37. xlabel('Voltage (V)');
  38. ylabel('Remaining Capacity (%)');
  39. title('Voltage vs Remaining Capacity');
  40. legend;
  41. grid on;
  42. hold off;
  43. % 定义多项式方程 p(x) - 100 = 0
  44. poly_eq = @(x) polyval(p, x) - 100;
  45. % 使用fzero求解x, 在某个范围内,例如电压范围3.5到4.3
  46. x_solution = fzero(poly_eq, [3.5, 4.3]);
  47. % 显示结果
  48. disp('对应y = 100时的x值:');
  49. disp(x_solution);
复制代码

如下
  1. 3167.602721, -49475.484108, 289283.548018, -750264.824664, 728131.911770
  2. 电压    实际容量    拟合容量    误差    百分比误差
  3. 4.20   100.00       103.44       -3.44    -3.44%
  4. 4.15   99.00       95.88       3.12    3.15%
  5. 4.14   97.00       94.83       2.17    2.23%
  6. 4.12   95.00       93.04       1.96    2.06%
  7. 4.10   92.00       91.56       0.44    0.48%
  8. 4.08   90.00       90.24       -0.24    -0.27%
  9. 4.05   87.00       88.37       -1.37    -1.57%
  10. 4.03   85.00       87.03       -2.03    -2.39%
  11. 3.97   80.00       81.77       -1.77    -2.21%
  12. 3.93   75.00       76.67       -1.67    -2.22%
  13. 3.90   70.00       71.82       -1.82    -2.60%
  14. 3.87   65.00       66.07       -1.07    -1.65%
  15. 3.84   60.00       59.46       0.54    0.90%
  16. 3.81   55.00       52.09       2.91    5.29%
  17. 3.79   50.00       46.84       3.16    6.33%
  18. 3.77   45.00       41.38       3.62    8.05%
  19. 3.76   42.00       38.60       3.40    8.11%
  20. 3.76   40.00       38.60       1.40    3.51%
  21. 3.76   40.00       38.60       1.40    3.51%
  22. 3.74   35.00       32.98       2.02    5.77%
  23. 3.73   30.00       30.17       -0.17    -0.56%
  24. 3.72   25.00       27.37       -2.37    -9.50%
  25. 3.71   20.00       24.61       -4.61    -23.04%
  26. 3.71   20.00       24.61       -4.61    -23.04%
  27. 3.69   15.00       19.22       -4.22    -28.14%
  28. 3.66   12.00       11.74       0.26    2.15%
  29. 3.65   10.00       9.48       0.52    5.21%
  30. 3.64   8.00       7.36       0.64    7.97%
  31. 3.63   5.00       5.41       -0.41    -8.22%
  32. 3.61   3.00       2.09       0.91    30.40%
  33. 3.59   1.00       -0.32       1.32    131.60%
  34. 对应y = 100时的x值:
  35.     4.1808
复制代码

因为是拟合的,所以会有误差。
在电压最小值和最大值,计算的结果回小于或者超过实际值
解决办法也很简单,判断一下就行了
  1. double calculateCapacity(double voltage) {
  2.     double result = 1.0;
  3.     if(voltage>=4.17) {
  4.         return 100.0;
  5.     } else if(voltage<=3.6) {
  6.         return 0;
  7.     } else {
  8.         double coefficients[] = {3167.602721, -49475.484108, 289283.548018, -750264.824664, 728131.911770};
  9.         result = coefficients[0] * voltage * voltage * voltage * voltage + coefficients[1] * voltage * voltage * voltage + coefficients[2] * voltage * voltage + coefficients[3] * voltage + coefficients[4];
  10.         return result;
  11.     }
  12. }
复制代码
总结:
提供了一种计算电池容量的思路,实际项目中用不到。
但是,如果对电池进行容量标定,在一段时间内数据还是具有参考意义的。
如果要求非常精准,可以使用带有库仑计的高级电源管理芯片,比如AXP202.

截图202409242242092670.jpg
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:424
  • 最近打卡:2025-05-03 00:02:01
已绑定手机

19

主题

3191

回帖

4876

积分

论坛元老

积分
4876
发表于 2024-9-24 19:55:48 来自手机 | 显示全部楼层
软件是mathlab做的?

点评

一看就是matlab,17年研究过一阵直方图转化,有比较亲切的感觉。  详情 回复 发表于 2024-9-24 22:17
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:504
  • 最近打卡:2025-05-03 07:29:10
已绑定手机

1

主题

836

回帖

1455

积分

金牌会员

积分
1455
发表于 2024-9-24 20:21:23 | 显示全部楼层
这是个啥软件?
靡不有初,鲜克有终
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:215
  • 最近打卡:2025-05-03 00:37:12
已绑定手机

36

主题

561

回帖

1942

积分

荣誉版主

积分
1942
发表于 2024-9-24 22:17:05 | 显示全部楼层
so*** 发表于 2024-9-24 19:55
软件是mathlab做的?

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-05-01 11:24:23

13

主题

95

回帖

294

积分

中级会员

积分
294
发表于 2024-9-24 23:14:44 | 显示全部楼层
晓*** 发表于 2024-9-24 22:49
对于温湿度计之类的uA级轻负载来说,通过电压曲线推测电池电量是相对精准的,但负载电流到了几十到几百毫安 ...

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

点评

是的,很多产品就算用了库仑计,在电池老化内阻增大或者负载较重的时候都不能提供剩余电量的准确值,电池的端电压就更不靠谱了。所以,分场景分需求匹配合适的方案就好了,对于稳定的轻负载来说,你这个方法还是可行  详情 回复 发表于 2024-9-24 23:18
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:417
  • 最近打卡:2025-04-30 21:39:09
已绑定手机

34

主题

2096

回帖

2206

积分

荣誉版主

积分
2206
发表于 2024-9-24 23:18:20 | 显示全部楼层
哈哈*** 发表于 2024-9-24 23:14
这个测量方法确实存在较大局限性。我研究过电池保护电路,这些电路能够实现过充和过放的保护。相比于将 4 ...

是的,很多产品就算用了库仑计,在电池老化内阻增大或者负载较重的时候都不能提供剩余电量的准确值,电池的端电压就更不靠谱了。所以,分场景分需求匹配合适的方案就好了,对于稳定的轻负载来说,你这个方法还是可行的。
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-3 22:15 , Processed in 0.170795 second(s), 100 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表