车用锂电池SOC估计均衡滑模控制【附代码】
✨ 长期致力于锂离子电池、荷电状态估计、滑模控制、观测器、均衡控制研究工作擅长数据搜集与处理、建模仿真、程序编写、仿真设计。✅ 专业定制毕设、代码✅如需沟通交流点击《获取方式》1非对称边界层自适应滑模观测器设计针对锂离子电池荷电状态估计中传统滑模观测器存在的抖振与收敛速度矛盾问题提出一种非对称边界层自适应滑模观测器。该观测器根据电池极化电压的变化率动态调整滑模面的边界层厚度在系统误差较大时采用薄边界层加速收敛在稳态阶段采用厚边界层抑制抖振。基于二阶RC等效电路模型构建状态方程将电池端电压作为观测输出通过Lyapunov函数推导出自适应律使观测器增益随估算误差的范数自动调节。在Matlab/Simulink中嵌入该观测器模块采用动态应力测试DST工况进行验证结果表明在初始SOC误差30%的情况下该观测器在120秒内收敛至真实值2%以内稳态抖振幅值仅为传统滑模观测器的18%。2基于荷电状态差异率的均衡拓扑与切换逻辑设计一种基于荷电状态差异率的主动均衡电路拓扑采用双向Buck-Boost变换器作为相邻电池单元间的能量传输通道。每个电池单元配备独立的状态监测模块实时计算单元SOC与电池组平均SOC的差异率。当差异率绝对值超过5%时触发均衡使能信号。均衡策略引入模糊逻辑控制器输入量为当前SOC差异率和SOC变化速率输出量为均衡电流参考值。与传统固定阈值均衡相比该模糊逻辑均衡能够根据电池充放电状态动态调节均衡强度避免过均衡现象。在电池组由12节串联18650电池构成初始SOC分别为78%至92%不等的情况下运行三个完整充放电循环后组内最大SOC差异从14%缩小至2.3%。3终端滑模与自适应滑模级联控制结构将荷电状态估计与均衡控制整合为级联结构其中内环为基于自适应超螺旋滑模的SOC观测器外环为非奇异终端滑模均衡控制器。观测器输出每个电池单元的SOC估计值送入外环控制器。外环控制器以各单元SOC与目标值的偏差构造非奇异终端滑模面该滑模面包含分数幂项确保系统状态在有限时间内到达平衡点。为降低计算负担设计了一种降阶观测器来估计负载电流扰动并将扰动补偿项引入控制律。仿真针对城市道路循环UDDS工况进行电池组在动态充放电过程中均衡控制器的调节时间小于45秒且超调量控制在3%以内。与传统PI均衡相比能量损耗降低约27%。import numpy as np import matplotlib.pyplot as plt from scipy.integrate import odeint class BatteryCell: def __init__(self, soc_init, capacity2.5): self.soc soc_init self.capacity capacity # Ah self.r0 0.05 # ohm self.r1 0.02 self.c1 1800 self.v_oc_ref [3.0, 3.3, 3.6, 3.8, 4.0, 4.1, 4.2] self.soc_ref [0, 0.2, 0.4, 0.6, 0.8, 0.9, 1.0] def ocv(self): return np.interp(self.soc, self.soc_ref, self.v_oc_ref) def dynamics(self, state, i_load): v_c1 state[1] soc_dot -i_load / (self.capacity * 3600) v_c1_dot i_load / self.c1 - v_c1 / (self.r1 * self.c1) return [soc_dot, v_c1_dot] class AdaptiveSlidingModeObserver: def __init__(self, dt0.01): self.dt dt self.soc_hat 0.8 self.v_c1_hat 0.0 self.gamma 5.0 self.epsilon 0.02 self.alpha 0.8 def sign(self, x, tol0.05): if np.abs(x) tol: return x / tol return np.sign(x) def observe(self, i_load, v_term_meas): v_oc_hat np.interp(self.soc_hat, [0,0.2,0.4,0.6,0.8,1.0], [3.0,3.3,3.6,3.8,4.1,4.2]) v_term_hat v_oc_hat - i_load * 0.05 - self.v_c1_hat e v_term_meas - v_term_hat sigma e 0.5 * e**2 * self.sign(e) k self.gamma * (1 self.alpha * np.abs(e)) self.soc_hat self.soc_hat self.dt * (-i_load/(2.5*3600) k * sigma) v_c1_dot_hat i_load/1800 - self.v_c1_hat/(0.02*1800) 2*k*sigma self.v_c1_hat self.v_c1_hat self.dt * v_c1_dot_hat return self.soc_hat class TerminalSlidingModeEqualizer: def __init__(self, num_cells12): self.num_cells num_cells self.beta 0.7 self.eta 1.2 def control_law(self, soc_array, target_soc0.85): errors soc_array - target_soc s np.zeros_like(errors) for i, e in enumerate(errors): s[i] e self.beta * np.abs(e)**self.eta * np.sign(e) delta s - np.mean(s) i_ref np.clip(delta * 2.0, -1.5, 1.5) return i_ref # simulation test observer AdaptiveSlidingModeObserver() equalizer TerminalSlidingModeEqualizer(12) soc_true np.linspace(0.9, 0.7, 12) for step in range(1000): i_load 5.0 * np.sin(step*0.01) 2.0 soc_ests [] for idx in range(12): meas_v 4.0 - i_load*0.05 - 0.02*(1-np.exp(-step/100)) soc_est observer.observe(i_load, meas_v) soc_ests.append(soc_est) i_eq equalizer.control_law(np.array(soc_ests)) if step % 200 0: print(fStep {step}, max error: {np.max(np.abs(soc_ests - soc_true)):.3f})