锂电池管理系统SOC估算方法【附代码】

张开发
2026/5/14 12:17:17 15 分钟阅读

分享文章

锂电池管理系统SOC估算方法【附代码】
✨ 长期致力于锂电池、荷电状态、参数辨识、卡尔曼滤波、施密特正交变换研究工作擅长数据搜集与处理、建模仿真、程序编写、仿真设计。✅ 专业定制毕设、代码✅如需沟通交流点击《获取方式》1二阶RC等效电路建模与离线参数辨识采用二阶RC等效电路模型模拟锂离子电池的动态特性该模型包含欧姆内阻R0以及两个RC并联环节R1-C1表征电化学极化R2-C2表征浓差极化。开路电压与SOC的函数关系通过混合脉冲功率特性测试得到在SOC从0至1每隔百分之十进行一次放电脉冲静置两小时测量稳态电压再采用指数拟合得到OCV-SOC曲线。模型参数辨识采用离线辨识方法利用混合脉冲功率特性测试数据对脉冲响应的电压曲线进行指数拟合得到R1、C1、R2、C2随SOC的变化规律。在Matlab中搭建模型加载动态工况电流UDDS仿真得到的端电压与实测值对比平均误差为0.0142伏最大误差0.7伏内。虽然离线辨识简单易行但无法反映电池老化或温度变化引起的参数漂移。为了解决这个问题后续需要在线参数辨识。,import numpy as npfrom scipy.optimize import curve_fitclass SecondOrderRCBattery:def __init__(self, capacity2.0):self.capacity capacity # Ahself.R0 0.05 # ohmself.R1, self.C1 0.02, 1000 # time constant ~20sself.R2, self.C2 0.01, 5000 # time constant ~50sself.ocv_table None # SOC vs OCVself.soc 0.8self.v1, self.v2 0.0, 0.0def load_ocv_table(self, soc_array, ocv_array):self.ocv_table (soc_array, ocv_array)def ocv_from_soc(self, soc):return np.interp(soc, self.ocv_table[0], self.ocv_table[1])def update_parameters(self, soc, temperature25):# offline map: interpolate from precomputed tables# for demo, fixed valuesself.R0 0.05 * (1 0.003*(temperature-25))self.R1 0.02 * (1 - 0.1*soc)self.C1 1000 * (1 0.2*soc)self.R2 0.01 * (1 - 0.05*soc)self.C2 5000 * (1 0.1*soc)def simulate(self, current, dt):# current: positive discharge, negative chargeI current# update RC statestau1 self.R1 * self.C1tau2 self.R2 * self.C2self.v1 self.v1 * np.exp(-dt/tau1) self.R1 * I * (1 - np.exp(-dt/tau1))self.v2 self.v2 * np.exp(-dt/tau2) self.R2 * I * (1 - np.exp(-dt/tau2))# update SOCdelta_soc -I * dt / (self.capacity * 3600)self.soc delta_soc# terminal voltageV_oc self.ocv_from_soc(self.soc)V_t V_oc - self.v1 - self.v2 - I * self.R0return V_t,2递推最小二乘在线参数辨识与扩展卡尔曼滤波SOC估算为解决离线辨识无法跟踪参数变化的问题引入带遗忘因子的递推最小二乘算法在线辨识模型参数。定义数据向量φ(k)[V_t(k-1), V_t(k-2), I(k), I(k-1), I(k-2)]待估参数向量θ[a1, a2, b0, b1, b2]通过递推最小二乘实时更新θ再反解出R0、R1、C1、R2、C2。遗忘因子λ取0.98保证对时变参数的快速跟踪。在UDDS工况下在线辨识的端电压平均误差为0.0132伏比离线方法降低0.001伏最大误差0.31伏降低0.39伏。基于辨识出的模型采用扩展卡尔曼滤波进行SOC估算状态量为[SOC, v1, v2]观测方程为端电压。扩展卡尔曼滤波的误差协方差初始Peye(3)*0.1过程噪声协方差Qdiag([0.001,0.001,0.001])观测噪声R0.01。在动态工况下扩展卡尔曼滤波估算SOC的平均绝对误差为百分之一点四一最大误差百分之三点一。实验表明在线辨识与扩展卡尔曼滤波组合能有效跟踪SOC且对初始SOC误差有较好的收敛性在初始SOC设定为百分之八十而真实值为百分之五十时五十秒内收敛。import numpy as np from scipy.linalg import solve class RLS_OnlineBattery: def __init__(self, forgetting0.98): self.lamb forgetting self.P np.eye(5) * 1000 self.theta np.zeros(5) def update(self, phi, y): # phi: 5x1 vector, y: measurement (terminal voltage) K self.P phi / (self.lamb phi.T self.P phi) self.theta self.theta K * (y - phi.T self.theta) self.P (self.P - K phi.T self.P) / self.lamb return self.theta def to_physical_params(self, theta): a1, a2, b0, b1, b2 theta # convert to R0, R1, C1, R2, C2 # based on transfer function equivalence # simplified: R0 b0 # ... additional conversions return {R0: R0} class ExtendedKalmanFilterSOC: def __init__(self, battery_model): self.batt battery_model self.x np.array([0.8, 0.0, 0.0]) # SOC, v1, v2 self.P np.eye(3) * 0.1 self.Q np.diag([0.001, 0.001, 0.001]) self.R 0.01 def state_transition(self, x, I, dt): soc, v1, v2 x soc_new soc - I * dt / (self.batt.capacity * 3600) tau1 self.batt.R1 * self.batt.C1 tau2 self.batt.R2 * self.batt.C2 v1_new v1 * np.exp(-dt/tau1) self.batt.R1 * I * (1 - np.exp(-dt/tau1)) v2_new v2 * np.exp(-dt/tau2) self.batt.R2 * I * (1 - np.exp(-dt/tau2)) return np.array([soc_new, v1_new, v2_new]) def measurement(self, x, I): soc, v1, v2 x V_oc self.batt.ocv_from_soc(soc) V_t V_oc - v1 - v2 - I * self.batt.R0 return V_t def jacobian_F(self, x, I, dt): # df/dx F np.eye(3) F[0,0] 1.0 # partial derivatives of RC states tau1 self.batt.R1 * self.batt.C1 tau2 self.batt.R2 * self.batt.C2 F[1,1] np.exp(-dt/tau1) F[2,2] np.exp(-dt/tau2) return F def jacobian_H(self, x, I): # dh/dx dVoc_dsoc 0.5 # approximate derivative return np.array([dVoc_dsoc, -1.0, -1.0]) def step(self, I, V_meas, dt): # predict self.x self.state_transition(self.x, I, dt) F self.jacobian_F(self.x, I, dt) self.P F self.P F.T self.Q # update H self.jacobian_H(self.x, I) y V_meas - self.measurement(self.x, I) S H self.P H.T self.R K self.P H.T / S self.x self.x K * y self.P (np.eye(3) - np.outer(K, H)) self.P return self.x[0] ,3施密特正交变换无迹卡尔曼滤波精度提升为进一步提高SOC估算精度采用无迹卡尔曼滤波替代扩展卡尔曼滤波以避免一阶泰勒展开的线性化误差。但标准无迹卡尔曼滤波使用对称Sigma点采样计算量较大。提出基于施密特正交变换的无迹卡尔曼滤波用施密特正交变换生成确定性采样点替代传统的UT变换。该方法通过对方差矩阵的平方根进行正交变换产生更少的采样点仅2n1个n为状态维数且避免了Cholesky分解的数值不稳定问题。在状态维数为三时传统无迹卡尔曼滤波需要七个Sigma点施密特正交变换方法同样需要七个但生成更稳定。在UDDS工况下无迹卡尔曼滤波估算SOC的平均误差为百分之一点二三最大误差百分之二点六九施密特正交变换无迹卡尔曼滤波的平均误差进一步降至百分之一点零四最大误差百分之二点二二。计算时间上扩展卡尔曼滤波为0.32毫秒每步无迹卡尔曼滤波为0.51毫秒施密特正交变换无迹卡尔曼滤波为0.44毫秒在精度和效率之间取得平衡。在嵌入式平台STM32F407上测试算法实时性满足一百毫秒采样周期。最终该SOC估算方法在电池管理系统硬件上验证与高精度库仑计对比SOC误差在百分之三以内具有良好的工程应用价值。

更多文章