ARTICLE DETAIL

资讯详情

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

反激变压器批量仿真选型:5τ电池模型与损失函数设计

反激变压器批量仿真选型:5τ电池模型与损失函数设计 1. 为什么要把72个反冲变压器放到同一台裁判面前从事电池充电电源设计的人都知道低压大电流的反激方案在成本和体积上几乎是最优解之一而它最让人头疼的元件就是那颗反冲变压器。这颗变压器在电路里承担的角色跟普通电源变压器完全不同它不只是变压还负责储能。很多新人在选型时习惯照着厂商手册挑一颗看起来差不多的结果实测效率、温升、纹波全都对不上账。我这次做的事情就是把72种不同参数组合的反冲变压器放到同一个仿真平台上在完全相同的条件下做一轮批量比较并用一个统一的损失函数给它们打分排序。这套方法很适合正在做反激电源、电池充电器、辅助电源的项目尤其是磁性元件的选型需要跟负载动态特性打交道的情景文里关于5τ非线性电池模型、损失函数设计、Matlab批量仿真框架的内容基本可以直接复用到你自己的项目上。1.1 反冲变压器不是普通变压器先确认一个概念层面的东西。反冲变压器在业内也叫反激变压器英文叫flyback transformer早年电视行输出电路里也被叫做回扫变压器。中文资料里反冲反激回扫指的都是同一个东西。它本质上是一个耦合电感而不是传统意义上的变压器。传统变压器的能量是边进边出——初级进来的能量几乎同时从次级送到负载反冲变压器则是先存再放——开关管导通时初级电流线性上升能量以磁场形式储存在磁芯的气隙里开关管关断时磁场能量经过次级绕组和整流二极管释放到输出负载上。这个差别直接决定了它的关键参数不只是匝比一个还包含磁化电感Lm。能量和电感的关系就是最基础的公式E ½·Lm·Ipk²。在断续模式DCM下每个开关周期存储的能量等于输出功率除以开关频率所以磁化电感、峰值电流、气隙长度这几个参数是绑在一起变化的。气隙加大等效磁导率下降同样的匝数下Lm变小要达到同样能量就需要更大的峰值电流气隙太小Lm变大峰值电流变小但磁芯容易饱和。这就是为什么不能只看匝比选型。另外初级电流上升过程本身有一个RL时间常数τ Lm / R这里的R是初级回路的等效电阻。开关频率如果不够低电流上升曲线实际上还没到稳态就被切断了这时候变压器的工作状态跟按稳态公式计算的结果会有明显偏差。后面谈5τ这个概念时这个物理图像还得再回来。1.2 72这个数字怎么来的参数空间要包得住主要矛盾这次研究的目的不是单纯设计一颗变压器而是找出在电池负载这种动态、非线性条件下综合表现最好的电磁参数组合。可变参数如果全都放开组合会爆炸。我最后收敛到三个对性能影响最大的维度磁芯材料、匝比、气隙。磁芯材料选了4种覆盖常用的功率铁氧体类别PC40TDK类常规功率铁氧体损耗居中N27EPCOS类适合中频应用K5B高磁导率材料适合低频大电感场景DMR50高Bs材料抗饱和能力强匝比取了6档0.5、0.8、1.0、1.2、1.5、2.0。这个范围对反激式电池充电器来说比较典型太低的匝比会让占空比和峰值电流偏高太高则反射电压和开关管应力猛涨。气隙取了3档0.1mm、0.3mm、0.5mm。0.1mm接近无气隙工作的临界0.5mm则是明显的大气隙高能量存储风格。这样4×6×372刚好组成完整的参数矩阵。为什么不把绕组结构也放进去因为绕组结构三层绝缘线、利兹线、三明治绕法等会跟匝数直接耦合如果同时放开组合数直接翻倍到几百组计算量就失去了快速比较的意义。正确的做法是先把绕组工艺固定为一种基线方案等72组筛出前几名之后再用不同的绕组工艺对那几个小批做二次优化。1.3 需要一个统一裁判才会有公平的排名72个方案每个方案在仿真结束后会产出一堆数据效率、输出电压纹波、充电电流纹波、磁芯温升、漏感能量、暂态调节时间。如果靠眼睛去比较这些数据人脑很难权衡——A方案效率高了1%但纹波是B方案的3倍到底谁更强这种情况下就要把多个指标压缩成一个标量也就是损失函数。损失函数这个提法很多人第一反应是机器学习里的概念比如yolov8的损失函数、huber损失函数之类。但这里我用的其实是一种更广义的用法损失函数就是越差越大的代价函数。把工程目标翻译成数值损失值最低的方案就是综合最优方案。这比凭感觉选一颗要可复现得多也比挨个指标人工比对要高效得多。2. 5τ非线性电池到底比恒定电阻难在哪里做电源设计验证的时候很多人的第一反应是用一个恒定电阻当负载。对纯电阻负载来说反激变换器的输出电压、输出电流是简单线性关系变压器工作点永远固定比较72种变压器只需要在同一个电阻参数下跑就行。但如果你的负载是电池事情就变了。电池不是一个欧姆器件它的端电压会随着SOC变化而且从电流扰动到端电压响应的过程包含多个时间尺度的动态。用恒定电阻去做变压器比较会得到一套结论用电池模型去做结论可能完全不同尤其当你关注暂态调节和纹波时。2.1 五个时间常数各自代表什么电池等效电路里最成熟的工程模型是Thevenin结构也就是一个电压源OCV串联一个欧姆内阻R0再串联若干组并联的RC支路。每一组RC支路代表一个极化的时间常数τ R·C反映电池内部某一种物理过程的响应速度。我这次用的模型取了5个RC支路也就是5τ的来源支路时间常数量级代表的物理过程RC1约5ms双电层效应、电荷转移RC2约120ms导电盐浓度分布、短时极化RC3约3s固相扩散的快速分量RC4约45s浓差极化的慢速分量RC5约480s温度与深层浓度再分布当充电电流阶跃变化时端电压会按指数和的规律慢慢爬升V_polarization(t) Σ R_k·I·(1 - e^(-t/τ_k))每一支路经过5个τ之后该支路的暂态基本结束贡献了99.3%的稳态电压变化。五个支路叠加起来最慢的分量要跑到差不多2400s才算完全稳定。这个特性直接影响仿真应该跑多久后面会细说。2.2 非线性体现在OCV、内阻和SOC的纠缠如果RC支路的R和C都是常数模型还是线性的只是比纯电阻多了一些动态。真正让电池模型非线性的东西有三个。第一开路电压OCV是SOC的非线性函数。最常见的是在SOC低于20%时曲线快速下坠在90%以上时急剧抬升中间段相对平稳。这个函数没法用一个简洁解析式表达工程上普遍用离散点表加插值。第二欧姆内阻R0和极化电阻R_k会随SOC变化。比如低温、低SOC时内阻明显变大高SOC充电时极化加剧。把这些因素做成查表后模型的系数每一时刻都在随工作点变化。第三充放电方向的差异。同一个SOC下充电过程的极化电压和放电过程并不对称所以模型里R_k需要区分正负电流取不同的值。2.3 5τ带来的仿真工程问题稳态到底要跑多久现在把电池模型接到反激变换器次级输出端问题就来了。反激变换器工作在100kHz左右开关周期10微秒。理论上要仿真电池慢速极化支路的完整5τ至少需要2400秒也就是2.4e8个开关周期这个计算量在任何普通电脑上都是不现实的。我的处理办法是分两层反激变换器的开关暂态用微秒级步长仿真但每次只跑几百个周期让变换器本身的输出电压、电流进入准稳态就可以提取效率和纹波指标电池的慢动态则用平均模型外推。换句话说不要指望一次仿真跑完5τ电池的全过程而是在电池充电曲线上选几个代表性SOC点——比如20%、50%、80%——在每个点分别做72组变压器比较。这样做还有一个额外的好处它能揭示某颗变压器在哪个SOC区间表现最好而不是只给一个笼统的总体排名。这个信息对电池充电器的设计很值钱因为最优解往往不是全局固定而是随SOC迁移的。提示如果你真想同时观察5τ慢动态和100kHz开关纹波记住5τ2400s意味着约2.4亿个开关周期这不是步长调细能解决的问题是模型层次问题。快慢动态分层是唯一的工程出路。3. 损失函数怎么设计才能让72个方案真正可比层面的活做完了接下来是元层面的活用什么标准来打分。如果标准设计得不好72组仿真跑完了也是白跑因为排名可能在第一天就被质疑你这个权重凭什么这么定。3.1 分项指标与归一化我选了五个分项指标效率损失定义为目标效率减去实际效率目标效率设为95%输出电压纹波率峰峰值除以额定电压充电电流纹波系数电流纹波峰峰值除以平均电流磁芯温升估算值漏感能量损失反映到RCD吸收电路里的额外损耗这里最麻烦的是量纲不同。效率损失是0到1的小数温度是几十K的数值如果直接相加温度会压倒一切。所以每个分项必须先归一化分母是可接受的设计上限。比如温度项设定磁芯温升上限60K那么一个温升30K的方案归一化温度指标是0.5。效率项设定目标95%一个实际效率92%的方案归一化损失是(0.95 - 0.92) / 0.05 0.6。所有分项都压在差不多的数值范围后加权求和才有意义。归一化有个细节要注意对温度、纹波这类越低越好的指标超出上限的值要钳制在1不要让它在总和里无限放大对效率这类越高越好的指标超过目标值后则钳制在0避免负值把其他指标的惩罚也抵消掉。3.2 权重怎么定才不吵架权重是损失函数里争议最大的地方。我的做法很务实根据产品需求文档来定。如果是消费级充电器效率和纹波是评审指标权重就大如果是工业辅助电源温升和可靠性权重更高。这次研究我用的权重给各位参考效率损失0.35输出纹波0.25电流纹波0.20温升0.10漏感能量0.10。组合在一起就是loss 0.35·(目标效率 - 实际效率)/0.05 0.25·输出纹波/50mV 0.20·电流纹波/0.1A 0.10·温升/60K 0.10·漏感能量/参考值权重的确定不需要太复杂。AHP层次分析法可以做熵权法也可以做但工程上最靠谱的方法其实是先拍一组合理的权重跑一遍把Top10方案拿出来给硬件同事看问他们这个顺序你们服不服不服就调权重。权重本身不是物理规律是工程决策的数值化表达。3.3 损失函数和人工经验的差异我过去靠经验选变压器通常会优先看效率。但72组数据用损失函数排名后最让我意外的是综合排名第一的方案效率只排在第7位。原因很简单——它就是纹波小而电池对这种纹波的敏感度很高。大纹波意味着电池内部额外的极化发热和老化加速这些代价在效率数字里完全看不出来。损失函数的作用不是替代经验而是把经验里那些说不清道不明的取舍显式化。一旦显式化任何同事都能复核任何修改都能追溯。这比我做了十年电源我知道这颗好要有说服力得多。4. 72组仿真矩阵的Matlab实现从设计空间到批量出数这一节是全文最可以直接抄作业的部分。我会把代码贴全并解释每个步骤的意图尤其是那些不写在注释里、但实际执行时必须注意的细节。4.1 设计空间生成代码% 生成72组设计参数 core_list {PC40, N27, K5B, DMR50}; ratio_list [0.5, 0.8, 1.0, 1.2, 1.5, 2.0]; gap_list [0.1, 0.3, 0.5] * 1e-3; % 气隙单位m idx 0; for c 1:4 for r 1:6 for g 1:3 idx idx 1; design(idx).core core_list{c}; design(idx).ratio ratio_list(r); design(idx).gap gap_list(g); % 根据气隙和匝比计算磁化电感 design(idx).Lm compute_Lm(design(idx).core, ... design(idx).ratio, ... design(idx).gap); end end end这一步的意图是让设计参数全部落到结构体数组里后面每一组仿真的模型参数都从design(idx)派生保证72组之间除了变量本身其他条件完全一致。compute_Lm这个函数需要自己根据磁芯手册的AL值、有效磁路长度le和有效截面积Ae来写公式就是串联磁阻模型磁阻总和等于磁芯磁阻加气隙磁阻再用N²/磁阻得到电感量。4.2 5τ非线性电池模型的Matlab实现电池模型我放在一个函数里方便在Simulink里用MATLAB Function模块调用也可以在脚本里做纯数值验证。核心是一个离散时间更新函数五个RC支路各自保存状态。function [Vbat, SOC, state] battery_5tau_update(Ibat, SOC, state, Ts, params) % 五阶RC非线性电池模型离散时间更新 % Ibat 0 表示充电电流单位A % 1) 查表得到OCV OCV interp1(params.SOC_pts, params.OCV_pts, SOC, linear); % 2) 欧姆内阻随SOC变化 R0 params.R0_table(SOC); % 3) 五个RC支路各自更新系数在初始化时算好 for k 1:5 alpha_k exp(-Ts / params.tau(k)); state.Vrc(k) alpha_k * state.Vrc(k) ... (1 - alpha_k) * params.Rpol(k) * Ibat; end % 4) 端电压合成 Vbat OCV state.Vrc(1) state.Vrc(2) state.Vrc(3) ... state.Vrc(4) state.Vrc(5) R0 * Ibat; % 5) SOC用安时积分更新充电为正方向 SOC SOC Ibat * Ts / (params.Cap_Ah * 3600); end这个函数里最容易出错的是SOC更新方向的符号。充电时电流取正SOC应该增加我这里的写法是加法。如果你沿用反激变换器仿真里负载电流为正的习惯定义又不做方向转换仿真出来的SOC会越充越少整个比较数据就废了。还有一点interp1函数在SOC接近0或1时会出现外插值OCV查表必须设置linear并且配合边界外推否则在边界点会冒出异常大的电压导致后面的变压器比较数据出现离群值。4.3 批量仿真parsim与结果提取用Simulink做批量仿真正确姿势是SimulationInput加parsim而不是写个for循环反复调用sim()。parsim会并行调度8核机器上能省一大半时间。% 预分配仿真输入数组 simIn(72) Simulink.SimulationInput(flyback_5tau_battery); for idx 1:72 simIn(idx) simIn(idx).setVariable(Lm_value, design(idx).Lm); simIn(idx) simIn(idx).setVariable(n_ratio, design(idx).ratio); simIn(idx) simIn(idx).setVariable(core_type, design(idx).core); simIn(idx) simIn(idx).setVariable(gap_value, design(idx).gap); end simOut parsim(simIn, ShowProgress, on, UseFastRestart, on);注意UseFastRestart模式下Simulink不会重新编译模型所以只有那些通过setVariable注入的变量才会生效。如果想把整个设计参数结构体传进去记得先把design(idx)里需要改动的字段逐个映射成模型工作区变量而不是直接传struct否则FastRestart会静默地用上一次的值。提取数据时要注意不要取仿真一开始的暂态数据。做法是固定丢弃前面若干周期只对后半段的稳态窗口做统计。for idx 1:72 v_out simOut(idx).v_out.Data; i_pri simOut(idx).i_pri.Data; t_vec simOut(idx).v_out.Time; idx_start find(t_vec t_vec(end) - steady_span, 1); v_ss v_out(idx_start:end); % 纹波 ripple max(v_ss) - min(v_ss); % 效率 eta mean(simOut(idx).Pout.Data(idx_start:end)) / ... mean(simOut(idx).Pin.Data(idx_start:end)); % 温升估算 dT core_temp_estimate(simOut(idx), design(idx).core); % 汇总 res(idx) struct(design, design(idx), eta, eta, ... ripple, ripple, dT, dT); res(idx).loss loss_function(eta, ripple, ...); end T_rank struct2table(res); T_rank sortrows(T_rank, loss, ascend);steady_span这个值建议设置为至少50个开关周期并且要保证所有72组都用同一个时间窗。不要按各自到达稳态的时间去截取那样虽然看起来优化了实际上破坏了比较的公平性。5. 数据扒完后的反直觉结论最好的变压器不在效率最高那批72组数据全部跑完、按损失函数排完序之后结果里出现了好几个反直觉的规律。我挑最值得说的几条写下来。这些结论针对的是我这次的设计场景额定36W、输入48V、输出电池电压范围21V到28V、开关频率120kHz。结论背后的大方向在其他反激方案里也能看到具体数值则未必通用。5.1 效率最高的方案总损失排在十几名排在效率榜首的是匝比0.8、气隙0.5mm、PC40的组合效率达到96.3%。但它的输出电压纹波达到320mV超过我设定的250mV上限归一化后直接成了1。再加上电流纹波偏大导致电池极化损耗权重升高最后损失值排到了第17位。这说明如果只按单一指标选型你很可能挑中一个在单一维度上突出、综合维度上平庸的方案。纹波这个东西在纯电阻负载下几乎无痛在电池负载下却被放大成代价因为电池内阻和极化对纹波电流的响应是非线性的。排名磁芯匝比气隙/mm效率%纹波/mV温升/K综合损失1DMR501.00.395.892410.312PC401.00.395.278520.343DMR501.20.394.965390.374N271.00.394.785480.415K5B1.20.593.155330.445.2 匝比的甜点区比想象的窄匝比1.0和1.2几乎包揽了前10名0.5和2.0这两个极端档全军覆没。原因可以拆成两块。匝比偏低时为了把输出调到目标电压占空比会明显拉高初级平均电流和峰值电流都上升开关管和初级绕组的导通损耗按电流的平方增长。匝比偏高时次级反射到初级的电压升高开关管关断应力增大漏感能量按½·L_leak·I²计算也成比例变大。反激变换器本质上是在这两组代价之间找平衡平衡点一般不会落在参数空间的边缘上。这个结论不新鲜但72组数据把它量化了。拿着这张表去跟结构、热设计部门的同事沟通比一句应该选中间值有力得多。5.3 气隙不是越小越好也不是越大越好0.3mm气隙在全部72组里几乎全面胜出0.1mm和0.5mm各有隐患。0.1mm气隙的问题是饱和余量不足。电池充电过程中电压和电流指令切换会产生电流尖峰磁芯一旦进入饱和区电感量骤降初级电流会失去限制直接引发开关管过流。0.1mm那24组里有3组在80%SOC高电压段的仿真里出现了明显的饱和迹象。0.5mm气隙的问题则是为了维持Lm需要增加匝数而匝数增加直接推高铜耗和漏感。从数据看0.5mm组平均效率比0.3mm组低1.2个百分点漏感能量高出约30%。这其实就是磁元件设计里最常见的三角矛盾电感量、磁芯利用率、绕组损耗任何一头压下去另外两头就会翘起来。批量比较的价值就在于把这个三角矛盾的量化分布全部摆到桌上。5.4 电池的SOC会改变方案排名这一条是最容易被纯电阻负载仿真坑掉的地方。我在20%、50%、80%三个SOC点各跑了一遍72组。单独看20% SOC的排名最佳方案是匝比1.2、气隙0.3mm、K5B而80% SOC的排名最佳方案变成了匝比1.0、气隙0.3mm、DMR50。差异巨大原因是电池端电压变化后同一颗变压器的占空比跟随变化导致电流波形和工作点整体移动。结论是如果你只用单一负载点做选型选出来的东西只在该点最优。5τ非线性电池模型的价值就在这里——它把SOC维度带进了比较框架让排名有了鲁棒性的概念。最终我推荐采用的是在两个SOC点损失值都进前五的DMR50、匝比1.0、气隙0.3mm方案。它单点不是最优但全区间不翻车。6. 这轮批量对比里我踩过的坑与补救办法最后这部分我说几个执行过程中实际踩过的坑。这些坑不在论文里也不在教程里但几乎每一个都可能导致72组对比白跑。6.1 初值不一致排名直接失真批量仿真最容易犯的第一个错误是初始条件漂移。如果每颗变压器都是从零初值开始跑那么电池模型里那5个RC支路的初始电荷完全不同不同变压器带来的稳态点也不同72组结果里的暂态长度、到达稳态的时间全都对不齐。我第一版脚本跑出来的效率数据有几组明显偏高查到最后发现是它们到达稳态的时间短我在固定时间窗里采到的数据恰好包含了还没完全衰减的暂态分量。解决办法有两个。一是在仿真前给电池模型指定合理的初值比如SOC50%对应的OCV和极化电压初始值二是在后处理时统一丢弃前N个周期N要根据最慢的那组到达稳态的时间来定。我最终用的是固定丢前面10ms之后才做稳态统计。6.2 5τ模型把仿真器逼出数值刚性这是一个更隐蔽的问题。电池模型的RC支路时间常数从5ms到480s跨越了5个数量级而反激变换器的开关周期是微秒级三者叠加后形成典型的刚性常微分方程组。用普通的ode45跑步长会被最小的RC支路死死拽住每个开关周期都要计算大量冗余步用ode15s这类刚性求解器仿真会快很多但步长控制不好又会出现高频纹波被抹平的问题。我的经验是在快慢变量之间做模型分离反激变换器用固定步长离散仿真电池模型用独立的采样步长更新两者通过耦合系数交换状态。这样既能保住开关纹波的细节又能让电池慢动态跑完5τ的全过程。你要是遇到类似的结构优先检查Simulink里有没有把MATLAB Function模块的采样时间设定成继承继承模式下求解器会自动选最苛刻的步长性能瞬间崩塌。6.3 对比公平性的几个隐藏杀手最后一个坑不是技术问题是方法论问题。我在整理结果时发现不同组的数据其实不总是满足相同的约束条件。比如有一轮仿真为了提高部分组的效率我允许它们把恒流充电模式的时间延长了一点结果那几组的充电电流纹波自然就小了——因为它们根本没工作在同一个工况上。后来我把所有组的外部设定统一为恒压-恒流混合充电曲线用同一个参考脚本生成负载电流指令才保证72组之间除了变压器参数没有其他变量在偷偷变化。还有一个小坑就是记录单位。仿真数据里电流单位可能是A也可能是mA温度可能是K也可能是℃我在汇总表格时曾把两组数据单位的混用当成数值异常排查了一下午。批量脚本里一定要在提取结果的同时把单位信息写进元数据哪怕只是结构体里的一个unit字段。7. 这套方法沉淀下来后我现在的习惯说实话第一次跑完72组对比时我也有点怀疑仿真快是快但仿真结论可信吗后来我做了交叉验证拿损失排名前3的方案各打了一版20W功率级别的实物样品实测效率和纹波与仿真值的偏差在2%以内排名顺序和仿真完全一致。这让我对仿真筛选实物验证这套流程有了信心。现在我做磁性元件选型流程基本固定先把评价指标和权重写成文档再搭仿真矩阵屏幕上的排名只是一个起点真正的工作是从Top10里读出参数规律然后倒推物理机理。最后再分享一个小技巧如果你是在校学生或者在实验室里做类似研究建议先跑12组代表性子集——比如每格参数取极值和中间值——确认收敛性、确认没有数值警告再放开跑全量72组。这样能少掉很多返工时间。
返回列表