本帖最后由 哈哈哈哈 于 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.