十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

增量电流HPPC与AFFRLS实现锂电二阶RC参数辨识

增量电流HPPC与AFFRLS实现锂电二阶RC参数辨识 简介面向电池建模与参数辨识方向的科研与毕设场景这份资料围绕18650增量电流HPPC测试数据提供基于AFFRLS算法的MATLAB完整实现。压缩包内共6个文件包含可运行的.m脚本、Simulink仿真模型(.slx)、马里兰大学HPPC原始数据(.xlsx)、辨识结果PDF与配套说明文档总大小671KB结构紧凑便于直接对照学习或二次开发。项目源码已经过运行验证答辩评审分达95分尤其适合新能源、自动化、电子信息等专业的课程设计或毕业设计使用。目前已有182人学习下载。凭借完整的数据输入、辨识算法和结果可视化读者可快速掌握基于AFFRLS的在线参数辨识流程理解不同电流增量下电池内阻、极化效应的变化规律也可在其基础上进行改进或扩展节省从零搭建的精力。1. 增量电流HPPC数据与AFFRLS先解释为什么这个组合能解决SOC估计漂移同一条18650电芯用传统HPPC做参数辨识SOC从30%落到5%时端电压拟合误差会从毫伏级跳到几十毫伏问题不在算法而在激励设计。增量电流HPPC用小电流步进和充分静置把OCV标定误差压住AFFRLS再用自适应遗忘因子克服固定遗忘因子在SOC两端“跟得上噪声”或“追不上趋势”的矛盾。这套流程按数据侧、模型侧、算法侧、MATLAB落地的顺序把18650电芯从增量电流HPPC原始数据到二阶RC参数R0、R1、C1、R2、C2辨识的完整链路讲清楚。适合做BMS算法、电池建模、SOC/SOH估计或者拿这份项目的源码做复现和毕设验证的工程师。2. 增量电流HPPC工况设计与数据预处理2.1 标准HPPC在OCV标定上的系统性偏差标准HPPC的做法是按10%SOC步长每个点先以1C放电10s静置40s再以0.75C充电10s然后直接把脉冲结束瞬间的端电压当成该SOC点的OCV。这个近似在SOC中段问题不大但在SOC两端会带来10mV甚至30mV以上的误差。原因是静置40s不足以让极化电压完全恢复二阶RC中时间常数大的那一支还在缓慢回弹而低SOC区扩散极化更严重回弹时间更长。这个OCV误差落入辨识环节后会直接污染参数。RLS回归方程里的常数项如果不加约束会把OCV偏差吸收掉但代价是差分方程的动态系数被压缩反解出来的R0偏大、RC时间常数失真。如果强制常数项为零OCV偏差又会全部压到d0上R0同样被抬高。这就是为什么增量电流HPPC要先解决OCV标定精度再谈参数辨识算法。2.2 增量电流HPPC测试工况参数设计增量电流HPPC的核心是用小幅值电流和长静置换取准稳态OCV。常见做法是把SOC步长从10%缩小到5%在SOC两端0~10%和90%~100%加密到2%步长脉冲电流从1C降到0.25C和0.5C两档静置时间从40s拉长到15min以上。脉冲幅值小电池在窗口内的工作点变化小端电压与OCV之间近似线性正好满足后面RLS差分方程的局部线性假设。工况项目标准HPPC增量电流HPPC方案SOC步长10%5%两端加密到2%放电脉冲1C持续10s0.5C持续20s回充脉冲0.75C持续10s0.25C持续20s脉冲后静置40s15minOCV标定回充后静置40s30min温度控制室温25±1℃恒温箱电流方向约定放电为正放电为正测试从满充状态开始每到一个SOC点先静置15min取OCV再施加放电脉冲静置20s后施加小幅回充脉冲然后继续静置。回充的目的是把SOC拉回窗口起点避免SOC漂移累积。增量电流HPPC得到的数据特点是每个静置段尾部电压已经稳定到1mV/min以内OCV取值可直接用静置段最后1s的平均值。2.3 MATLAB数据预处理单位统一与滤波拿到原始CSV后先做三件事统一单位、剔除电压跳变、重采样到1Hz。18650电芯容量在2.2~2.6Ah之间测试数据里的电流常常是倍率形式要先换算成安培。电压跳变多来自采集卡毛刺或接触电阻突变阈值设为0.5V即可超过的置NaN后用插值补回。% 原始CSV列顺序: time(s), I(A), V(V), T(°C) hppc readmatrix(hppc_incremental_25C.csv); t hppc(:,1); I hppc(:,2); V hppc(:,3); T hppc(:,4); % SOC参考值用安时积分容量用1C放电实测值 Q_capacity 2.48; % Ah25℃下实测容量 SOC_init 1.0; % 测试从满充开始 SOC SOC_init - cumtrapz(t, I) / 3600 / Q_capacity; % 剔除电压跳变毛刺并插值 dV [0; diff(V)]; V(abs(dV) 0.5) NaN; V fillmissing(V, pchip); % 重采样到1Hz电流外推填0表示静置无电流 ts (t(1):1:t(end)); V interp1(t, V, ts, linear); I interp1(t, I, ts, linear, 0); SOC interp1(t, SOC, ts, linear, 0); % Savitzky-Golay平滑窗口控制在15点以内 V sgolayfilt(V, 3, 15);逻辑说明cumtrapz做电流积分时放电为正、充电为负SOC单调递减。fillmissing用pchip插值而不是线性插值因为脉冲段的电压曲线是凹的线性插值会压低峰值响应。interp1把时间轴对齐到整秒后面构造差分方程时采样周期Ts才能固定为1s避免变采样导致的系数映射误差。sgolayfilt用3阶多项式、15点窗口这个窗口长度对18650的RC瞬态是安全的窗口再大比如31点会把放电开始那一两个样本的瞬态削平导致R0辨识偏低。3. 二阶RC模型与AFFRLS递推从差分方程到RC参数反解3.1 为什么选择二阶RC而不是一阶或三阶一阶RC模型在恒流放电结束后的回弹阶段误差明显因为它只用一个时间常数描述极化过程无法兼顾扩散极化和电化学极化两个时间尺度。三阶RC理论上更精确但参数可辨识性变差在高频段R0主导低频段总内阻主导中间两个时间常数如果太接近辨识算法无法稳定区分。二阶RC是HPPC参数辨识里平衡精度和可辨识性的常用选择。二阶RC的连续域阻抗表达式为Z(s) R0 R1/(1 τ1s) R2/(1 τ2s)其中τ1R1C1、τ2R2C2。辨识的目标就是把这五个参数从端电压和电流的时间序列里估计出来。直接对连续传递函数做拟合不是最小二乘的标准形式所以先通过双线性变换把连续模型离散化得到差分方程用递推最小二乘辨识差分系数再反解RC参数。3.2 差分回归方程与AFFRLS可辨识的参数向量在SOC窗口内OCV近似恒定令y(k) V(k) - OCV。二阶RC离散化后得到ARX结构y(k) c0 c1·y(k-1) c2·y(k-2) d0·I(k) d1·I(k-1) d2·I(k-2)其中c0是常数项修正用来吸收窗口内OCV的微小漂移。回归向量为φ(k) [1, y(k-1), y(k-2), I(k), I(k-1), I(k-2)]。这里必须保留常数项否则OCV残差会和d0混叠把R0辨识值抬高。递推最小二乘估计的是θ [c0, c1, c2, d0, d1, d2]这个向量是线性回归形式可以直接用RLS类算法处理。辨识出的d0、d1、d2因为电流方向约定放电为正、端电压低于OCV通常为负反解RC参数前要取负号还原成阻抗系数。已知采样周期Ts时反解公式如下连续域符号反解表达式den1 - c1 - c2R_dc(d0 d1 d2) / denτ1τ2Ts·(1 c2) / denτ1·τ2Ts²·(1 c1 - c2) / (4·den)b1_cTs·(d0 - d2) / denb2_cTs²·(d0 - d1 d2) / (4·den)计算出S τ1τ2、P τ1·τ2后判别式S² - 4P必须大于等于0。τ1取大根、τ2取小根然后按R0 b2_c/P、R1 (b1_c - R0·S - (R_dc-R0)·τ1)/(τ2-τ1)、R2 R_dc - R0 - R1回代最后C1 τ1/R1、C2 τ2/R2。这个反解过程对采样周期的准确性很敏感Ts差10%会把时间常数整体偏移10%所以数据重采样到1Hz后Ts要统一用median(diff(t))计算不要写死。3.3 AFFRLS自适应遗忘因子公式标准RLS的遗忘因子λ是固定值比如0.98。λ越大记忆越长参数越平稳但跟踪SOC快速变化的能力越差λ越小跟踪越快但对噪声越敏感。18650在SOC两端极化变化剧烈固定λ很难同时兼顾两端和中段。AFFRLS在标准RLS四步递推里增加一个遗忘因子自适应环节。先按标准RLS计算新息e再用e的平方调节λλ(k) λ_min (1 - λ_min)·exp(-ρ·e(k)²)当e很小说明模型和当前数据一致λ趋向1保持长期记忆当e突然变大说明参数可能正在变化λ降向λ_min加快对新数据的响应。ρ控制这个切换的敏感度ρ越大对误差的响应越剧烈。推荐参数范围如下参数推荐值说明λ_min0.95再低会出现参数抖动ρ0.05~0.2先试0.1看残差波形调P01e6·eye(6)初始协方差保证首轮增益大θ0zeros(6,1)初始参数给零即可整个递推流程是初始化θ和P进入每个样本循环计算回归向量求新息e按e更新λ然后按标准RLS增益公式更新P和θ。这套流程在MATLAB里用循环实现最直观不需要矩阵化加速因为单条数据量通常只有几万行。3.4 参数可辨识性与持续激励条件RLS能正常工作依赖持续激励条件回归向量必须在线性空间里充分张满。增量电流HPPC的脉冲段电流有激励但静置段电流恒为0回归向量里只有常数项和y的历史值信息量不足。如果让静置段参与递推P矩阵会不断膨胀回到脉冲段时产生一次很大的参数修正辨识曲线出现锯齿。常见的处理是每个SOC窗口内只拿abs(I) 0.01A的脉冲段样本做递推静置段只用于提取OCV。窗口也不能太小2%SOC窗口在低SOC区可能只有几十个有效样本加上差分方程需要2个历史样本实际可用样本会更少。窗口内样本数少于20时要合并到相邻窗口或者把步长放宽到5%。4. MATLAB实现18650增量电流HPPC的AFFRLS参数辨识4.1 数据装载与OCV插值预处理后的数据保存为hppc_preprocessed.mat包含t、I、V、SOC四个1Hz对齐变量。OCV-SOC表从每个静置段尾部提取用静置末1s的电压平均值代表该SOC点的OCV。整体SOC按2%分窗口时每个窗口的OCV用插值得到避免直接取窗口内电压均值——那会把动态电压也混进去。% 载入预处理后的数据 load(hppc_preprocessed.mat); % t, I, V, SOC 全部1Hz Ts median(diff(t)); % 采样周期单位秒 N length(t);在真实工程里静置段位置可以从SOC变化率或电流绝对值判断。这里假定已经通过脚本提取出ocv_soc和ocv_val两个向量分别是静置段的SOC点和对应的OCV值。插值函数如下% OCV-SOC插值extrap确保SOC超出表范围时不产生NaN ocv_all interp1(ocv_soc, ocv_val, SOC, linear, extrap); y_all V - ocv_all; % 构造全序列ARX回归矩阵 phi_all [ones(N,1), ... [0; y_all(1:end-1)], [0; 0; y_all(1:end-2)], ... I, [0; I(1:end-1)], [0; 0; I(1:end-2)]];逻辑说明回归矩阵的前两行因为缺历史样本在后面的窗口选取里要排除。interp1用线性插值即可OCV-SOC曲线在增量电流HPPC下已经比较平滑不需要高阶拟合引入过拟合。插值得到的ocv_all会伴随SOC缓慢下降正好把OCV随SOC变化的大趋势扣除剩下的小幅度波动由ARX回归方程里的常数项c0吸收。4.2 AFFRLS主循环代码按2%SOC窗口滑动每个窗口内只取电流绝对值大于0.01A的行。窗口样本数少于20就跳过。AFFRLS的核心递推写成一个独立函数方便对比不同λ_min和ρ参数。%% 按2%SOC窗口滑动辨识 soc_edges 0:0.02:1; results []; for k 1:length(soc_edges)-1 idx_win find(SOC soc_edges(k) SOC soc_edges(k1)); idx_act idx_win(abs(I(idx_win)) 0.01 idx_win 2); % 排除静置段和前两行 if length(idx_act) 20 continue; end y y_all(idx_act); phi phi_all(idx_act, :); % AFFRLS递推 theta affrls(y, phi, 0.95, 0.1, 1e6); % 反解RC参数 [R0, R1, R2, C1, C2] rcFromTheta(theta, Ts); results [results; struct(SOC, soc_edges(k), ... R0, R0, R1, R1, R2, R2, C1, C1, C2, C2)]; endidx_win 2这个条件保证每行回归向量里的y(k-1)和y(k-2)都来自窗口内而不是跨窗口的历史。如果跨窗口拼接上一次SOC点的OCV残差会进入本次回归造成参数突变。每个窗口独立初始化θ和P不把上一个窗口的末端参数作为初值这样可以避免误差在窗口间累积。4.3 AFFRLS递推函数与RC反解函数function th affrls(y, phi, lam_min, rho, P0) [nRow, nCol] size(phi); th zeros(nCol, 1); P P0 * eye(nCol); for k 1:nRow pk phi(k,:); e y(k) - th * pk; lam lam_min (1 - lam_min) * exp(-rho * e^2); g P * pk / (lam pk * P * pk); P (P - g * pk * P) / lam; th th g * e; end end函数说明lam在当前新息e较大时趋近lam_mine接近0时趋近1。g是RLS增益向量分子是P与回归向量的乘积分母是标量这一步是O(n²)复杂度6维参数下可以忽略性能。P矩阵更新后用/ lam缩放这个缩放就是遗忘因子起作用的地方——λ越小P放大越多下一步增益越大。function [R0, R1, R2, C1, C2] rcFromTheta(th, Ts) c1 th(2); c2 th(3); d0 -th(4); d1 -th(5); d2 -th(6); % 取负还原阻抗系数 den 1 - c1 - c2; Rdc (d0 d1 d2) / den; S Ts * (1 c2) / den; P Ts^2 * (1 c1 - c2) / (4 * den); b1c Ts * (d0 - d2) / den; b2c Ts^2 * (d0 - d1 d2) / (4 * den); disc S^2 - 4 * P; if disc 0 || den 0 R0 NaN; R1 NaN; R2 NaN; C1 NaN; C2 NaN; return; end tau1 (S sqrt(disc)) / 2; tau2 (S - sqrt(disc)) / 2; R0 b2c / P; R1 (b1c - R0 * S - (Rdc - R0) * tau1) / (tau2 - tau1); R2 Rdc - R0 - R1; C1 tau1 / R1; C2 tau2 / R2; end参数说明disc 0时τ变成复数意味着当前窗口内二阶RC模型的假设不成立应该丢弃该窗口而不是硬算。den 0表明离散模型不稳定常见于OCV插值错误或窗口内脉冲段数据太短。这两个检查项必须在循环里保留否则会出现负电容、负电阻等明显违反物理意义的结果。4.4 端电压重构与响应曲线验证每个窗口辨识完成后用该窗口的θ对窗口内所有样本做一次预测拼接起来就是全SOC范围的模型端电压。预测电压与实测电压的残差是判断参数好坏的第一道关口。% 全序列预测用分窗口参数拼接 V_pred zeros(N, 1); for k 1:length(results) soc_lo results(k).SOC; idx_ok find(SOC soc_lo SOC soc_lo 0.02 abs(I) 0.01 idx_win 2); if isempty(idx_ok), continue; end th_k [results(k).cl? ]; % 需要保存每窗口theta见说明 V_pred(idx_ok) ocv_all(idx_ok) phi_all(idx_ok, :) * th_k; end这里results结构体里没有保存完整的theta实际工程中应在循环里用results(k).theta theta;保存。预测时用ocv_all而不是窗口OCV常数因为插值OCV已经跟随SOC变化残差里剩下的是动态误差。5. 辨识结果验证与三个实战坑5.1 先用统计量验证再谈参数曲线参数辨识完不要直接看R0曲线先看端电压残差。计算每个SOC窗口的RMSE和最大绝对误差和固定遗忘因子RLS的结果对比。AFFRLS在SOC两端通常能比固定λ0.98的RLS少20%~40%的RMSE在中段两者接近。一个可参考的验收标准是中段电压RMSE小于3mVSOC两端小于5mV最大尖峰残差不超过10mV。SOC窗口固定λ0.98的RMSEAFFRLS的RMSE5%~10%4.8mV3.1mV40%~50%1.9mV1.8mV90%~95%5.2mV3.4mV表格里的数值是量级参考具体以你自己采集的数据为准。如果某个窗口AFFRLS比固定λ差很多优先检查该窗口内脉冲段样本数是否足够以及OCV插值在SOC陡变段是否失真。5.2 三个最常见的辨识错误第一个错误是ARX回归里去掉常数项。去掉c0后OCV残差没有去处只能挤进d0R0辨识结果会整体偏大低SOC窗口尤其严重。第二个错误是让静置段参与递推。静置期电流为0回归向量线性相关P矩阵膨胀后回到脉冲段会产生一次大修正参数曲线出现锯齿结构。第三个错误是反解出负电容或负电阻。遇到disc 0时先别急着调λ检查这个窗口的有效样本数和OCV是否合理样本太少就用5%窗口重试OCV不光滑就先对OCV-SOC表做三次样条平滑。5.3 应对SOC两端P矩阵病态的小技巧在SOC两端极化电压变化快回归向量里y的历史项相关性变强P矩阵容易病态。可以在RLS每次更新P之后加一个奇异值截断。思路是让P的最小奇异值不低于最大奇异值的千分之一防止数值噪声在低激励段被放大。% 放在P更新之后限制P矩阵条件数 [U, S, V] svd(P); s diag(S); s(s 1e-3 * max(s)) 1e-3 * max(s); P U * diag(s) * V;svd计算对6×6矩阵的开销可以忽略放在递推循环里也不会拖慢整体速度。这个技巧对SOC两端样本少且噪声大的窗口特别有效代价是参数跟踪速度略微下降。如果你发现截断后残差反而变大把阈值从1e-3放宽到1e-4让P矩阵保留更多自由度。本文还有配套的精品资源点击获取
返回列表