首页 / 资讯中心 / 文章详情

蓄电池充放电仿真:PI双环控制在Buck/Boost系统中的建模与实现

蓄电池充放电仿真:PI双环控制在Buck/Boost系统中的建模与实现 ★ FEATURED ARTICLE
做蓄电池充放电仿真的同学或者工程师应该都经历过这种场景手头有一个电池系统方案想验证控制逻辑靠不靠谱但直接上硬件台架成本高、周期长参数调起来还容易炸管子。仿真就成了最划算的验证手段。我这次要分享的项目正好是这类需求的标准样本——蓄电池充放电系统的仿真模型核心控制用的是PI电压电流双环工作模式拆成三个恒流充电、恒压充电、恒压放电。做这类仿真本质上是在回答三个问题怎么让充电电流稳定可控怎么让电压不过充怎么让放电输出压得住。把这套逻辑吃透了换成其他电池类型或者其他拓扑思路都能直接复用。这个仿真模型适合谁如果你是刚接触电力电子控制的研究生或者在做电池管理系统BMS前期算法验证的工程师又或者想搞明白双环PI到底怎么配合的硬件爱好者这套东西都能给你一个完整的参考框架。下面我把整个设计思路、核心原理、建模过程和踩过的坑一次讲清楚。1. 整条仿真链路怎么设计从Buck变换器到三种充放电模式1.1 为什么选Buck/Boost拓扑作为充放电主电路蓄电池充放电系统的主电路拓扑基本绕不开Buck降压和Boost升压这两类非隔离变换器。充电场景下如果直流母线电压高于电池最高电压就用Buck把电压降下来限流给电池充电放电场景下如果负载需要的电压高于电池端电压就用Boost升压输出。我这套仿真做了个简化处理——充电用Buck放电用Boost两者通过开关逻辑切换集中在同一套模型里。这么做的好处是控制策略的验证逻辑不受拓扑干扰先把电流环和电压环的配合关系跑通后面再移植到双向DC-DC比如Buck-Boost或者半桥结构时就非常顺手了。拓扑参数我选了一个典型的小功率级别直流母线电压48V蓄电池额定电压24V满充约28.8V额定容量20Ah最大充电电流5A。电感选150μH开关频率定在20kHz输出电容用470μF。这套参数在Simulink里仿真速度合适数值稳定性也比较好。你可以根据手头实际系统换参数但开关频率和电感的选择最好保持一个合理的量级关系不然电流纹波会异常大。1.2 三种工作模式的设计逻辑与切换思路标题里说的三个模式对应的其实是电池充放电管理里最经典的策略恒流充电CC阶段电池电压低的时候用恒定电流往里充电流环单独闭环电压环不参与或者处于限幅饱和状态。这个过程对应充电前期的“大电流灌入”。恒压充电CV阶段电池电压抬到设定值比如24V电池组设定28.2V以后不能继续用恒流硬冲否则会过充此时电压环接管把端电压稳定在目标值电流自然下降。对应的是“涓流收尾”。恒压放电阶段电池往外供电Boost把端电压稳住在一个额定值比如24V不管电池SOC怎么下降负载看到的是一个稳定的母线电压。模式之间的切换逻辑是这套控制的核心难点。我的做法是做一个Mode信号取值为1、2、3通过一个状态判断模块决定当前启用的控制环路。切换条件看图1这里不贴图文字描述当电池端电压低于电压阈值比如27.6V且处于充电状态时Mode1端电压达到阈值后切到Mode2放电模式下Mode3。模式切换时最怕的就是占空比突变后面我会专门讲怎么处理。1.3 仿真平台的选型Simulink为主附带对比方案如果你问我用什么平台做这套仿真我的第一推荐肯定是MATLAB/Simulink尤其是Simscape Electrical工具库里面自带MOSFET、二极管、蓄电池模型搭起来效率高得多。蓄电池直接用Simscape里的Battery模块它考虑了SOC、内阻、极化效应比我自己搭受控电压源内阻的Thevenin模型省事而且精度足够了。再用Simulink的Control System Toolbox做PI控制器PWM信号可以用PWM Generator针对Simscape或者自己拿三角波比较器搭自由度更高。除了Simulink你也可以用PLECS、PSIM或者LTspice。PLECS的开关损耗建模好适合做热验证PSIM的PWM控制块对电力电子控制仿真的支持非常友好尤其是做数字控制的同学会很顺手。不过既然标题核心是“PI双环控制”的逻辑验证Simulink通用性最好社区资料也多出了问题找答案方便。下面我的实操演示就以Simulink为主但你理解了原理之后换平台不费劲。2. 双环PI控制的核心原理与参数整定实操2.1 电流内环和电压外环为什么这样搭双环控制的逻辑一句话就能讲明白电压环是“决策者”电流环是“执行者”。电压外环采样输出电压或者电池端电压跟电压给定做误差计算PI运算以后输出一个电流指令值这个指令值不是直接给PWM的而是作为电流内环的给定电流内环采样电感电流或者电池电流跟这个电流指令做误差运算再经过PI输出控制量最后生成PWM占空比。为什么要绕这一圈因为电池充电对电流很敏感直接用电压环输出占空比电流一波动就容易失控。有了电流内环电压环发出的指令电流被电流环精准跟踪系统的动态响应快抗扰动能力强而且天然具备过流保护的能力——电流指令不可能超过设定上限。如果你直接把单环电压控制接到PWM上输出短路或者电池突变时电流可能瞬间飙升非常危险。说句大白话双环就是给电压环配了一个“听话且快手”的下属。这里还有个小细节。恒流充电的时候严格来说电压环处于开环状态电流环单独工作电流指令直接由外部给定比如设定5A恒压充电的时候电压环接管电流指令由电压环输出而且必须做限幅——上限设为最大充电电流5A。这样从恒流转恒压的过程中电流指令会自然地从5A往下滑不会出现指令跳变。这个限幅处理非常关键后面讲积分饱和时还要提。2.2 PI参数整定的实操方法临界比例度法与凑试法结合PI参数整定应该是这套仿真里最劝退新手的环节。我之前用过Ziegler-Nichols整定公式但实际在Simulink里更高效的是“内环先整定外环再整定”的顺序配合凑试法。电流内环整定思路把电压环断开电流给定设成阶跃比如从0A跳到5A观察电流响应。只加比例项从小到大试探直到电流出现轻微振荡此时的比例增益记为K_crit振荡周期记为T_crit然后按Z-N公式计算初始PI参数。不过我的经验是Z-N参数往往偏激进用在仿真里容易超调所以我一般会在算出来的基础上乘0.5~0.7的折扣系数。电流内环的响应要快但没必要无限快带宽大概是开关频率的1/20到1/10。20kHz开关频率对应内环带宽1kHz~2kHz转换成时间常数大概0.1ms~0.5msPI参数在这个数量级附近调节。电压外环整定思路把电流内环带上电压给定额定值观察电压响应。电压外环的带宽要远小于电流内环一般是电流环带宽的1/5到1/10否则两个环之间会打架整个系统可能振荡。我实际用的电压环PI参数比例增益比电流环小很多积分时间常数则大很多。这背后的逻辑是让电压环“看着大局慢慢调”让电流环“快速跟踪不出错”。参数整定的一个实用技巧把PI控制器的比例和积分初始值都设为0然后逐步加比例等到电压或者电流响应出现临界振荡时记录参数再加积分项消除稳态误差。在Simulink里你甚至可以写个简单的脚本自动扫参数但我更推荐手动调几轮找感觉因为参数整定本身就是在帮你理解系统的时间尺度关系。2.3 PWM与驱动信号的生成细节PWM生成这部分看似简单但有很多容易踩的坑。如果你用的是Simscape Electrical的MOSFET桥臂可以直接用PWM Generator模块输入调制波占空比信号0~1自动生成栅极驱动信号。如果想更贴近数字控制的实现可以自己搭把PI输出的控制量限幅到0~1之间作为“调制波”然后用一个频率20kHz的三角波幅值0~1做比较器调制波大于三角波时输出高电平。我的建议是PI输出的控制量不要直接当占空比而是先做饱和限幅比如0.05~0.95再进入PWM比较器。这么做的原因很简单MOSFET的占空比不能到0或者1否则电感电流会不连续控制线性度会变差而且极端占空比下电压冲击大容易让开关管应力过高。在实际建模里我习惯用离散化的PWM生成方式把三角波用Discrete Pulse Generator生成采样时间设成PWM周期1/20000秒50μs的整数分之一保证PWM分辨率够用。如果你直接用连续三角波模块后续跟离散控制器配合时会出现时间步长不匹配的问题仿真速度也会拖慢。下面第3章里我会给出具体的建模步骤。3. Simulink建模一步步实录从电路搭到模式切换3.1 第一步搭建Buck/Boost主电路与蓄电池模型打开Simulink新建一个模型先把主电路拖出来。我这里给你一个可直接抄作业的模块清单DC Voltage Source48V直流母线。MOSFET或IGBT Diode构成Buck/Boost的可控开关管和续流二极管。注意方向Buck时MOSFET在上管电感接开关节点二极管做续流Boost时MOSFET在下管电感接输入端。我这里做的是充电和放电分开的两套开关管用“充电回路”和“放电回路”两个子系统分开。Inductor150μH串联在开关节点和电池之间。Capacitor470μF并联在电池端或者负载端做滤波。BatterySimscape Electrical库额定电压24V容量20Ah初始SOC设为60%。Current Sensor和Voltage Sensor分别测电感电流和电池端电压。Load Resistor放电模式下模拟负载阻值按功率要求选比如恒压24V输出负载电阻取12Ω对应2A放电电流。主电路搭好以后先把电池模型参数填进去。这里有个细节Simscape的Battery模块需要你指定SOC初始值和端电压初始值而且仿真开始瞬间可能因为初始条件不一致产生一个大的瞬态冲击。我习惯先把电池端电压的初值设置成和电容初始电压一致比如24V这样上电不会瞬态过压。3.2 第二步搭建电压环、电流环和PWM生成链路这一步是核心。我这里把充电模式和放电模式的控制链路分开讲但思路完全一致。充电模式控制链路电压给定28.2V和电压反馈电池端电压做差进电压PI控制器1输出限幅0到5A作为电流给定电流给定和电流反馈电感电流做差进电流PI控制器2输出限幅0到0.95作为Buck的占空比调制波调制波进入PWM比较器产生MOSFET驱动信号。恒流充电时电压环没有起作用直接把外部常值比如5A当成电流给定跳过电压PI的限幅输出。这个模式选择我用一个Switch模块实现——Mode等于1时选外部电流给定源Mode等于2时选电压环输出。放电模式控制链路电压给定24V和负载端电压反馈做差进电压PI控制器3输出限幅0到5A作为Boost的电感电流给定电流环结构和充电时一样只是输出占空比要经过1-D处理才能驱动Boost下管因为Boost的占空比和电压增益是D1-D的关系。如果你忽略这一层输出电压可能完全不按照你的计算来。控制器参数我建议在MATLAB工作空间里用变量定义比如kp_i0.5; ki_i200; kp_v0.1; ki_v20;Simulink里直接输入变量名。这样做的好处是后面调参数不用打开模型界面在命令行改一下值重新运行就行扫参效率高得多。3.3 第三步模式切换逻辑与平滑过渡处理模式切换逻辑我用一个MATLAB Function模块或者Stateflow写状态机。用Stateflow的原因是可以把状态转移条件写得很直观State1恒流充电→ 条件电池电压27.6V转移至State2恒压充电State2 → 条件收到放电指令转移至State3恒压放电State3 → 条件收到充电指令回到State1。充电状态和放电状态的切换本质上是把PWM驱动切换到不同的MOSFET上所以需要一个DualMode开关来决定哪个回路的驱动信号有效。平滑过渡是模式切换里最容易出问题的地方。如果恒流充电切到恒压充电时电压环PI积分器里的值是从0开始累积的那切换瞬间电流给定会突然跳变可能造成电流尖峰。解决办法有两个一个是切换时给电压PI的积分器赋初值赋成当前实际的电流值保证切换前后的电流指令连续另一个是切换前让电压环一直在跟踪一个“虚拟电压指令”比如当前电池电压加一个很小的偏移让积分器处于预激活状态真正切换时只需要微调。第二种方法实现简单我推荐新手先用这个。放电模式启动时也有类似的问题。Boost刚开始工作时如果占空比从0突然跳变电感电流冲击会很大容易导致波形毛刺甚至仿真报错。我的做法是给放电电流给定加一个斜坡上升从0A在0.5秒内升到目标值相当于软启动实测效果非常稳。3.4 第四步仿真参数设置与运行验证仿真参数里有几个关键项必须注意求解器选ode23t或者ode15s这类刚性求解器处理电力电子开关切换比较稳。不要用默认的ode45开关管动作会让步长变得非常小仿真速度慢到你怀疑人生。最大步长设成PWM周期的1/10以下也就是小于5μs。这个值决定了PWM波形的分辨率。如果你设的步长太大PWM占空比会出现量化误差电流波形会奇怪地抖动。仿真时长我设成5秒。充电过程完整跑完5秒电池SOC变化不大20Ah容量5A充电的话5秒只充了0.07%所以你观察的重点是电流电压波形是否平滑、切换是否平顺而不是SOC变化。如果你想看完整的恒流转恒压过程可以把电池容量缩小比如0.1Ah来加速等效时间但注意这样电池的等效动态也会变化只适合看控制逻辑不适合做精确的SOC研究。运行完以后重点看三个波形电池电流应平滑跟踪指令、电池电压恒压模式下应稳定在28.2V、占空比充电和放电模式下应该分别稳定在一个常值附近没有剧烈抖动。我用这套参数跑出来的结果恒流充电时电流超调小于5%恒压充电时电压稳态误差小于0.2%响应时间大约0.3秒整体效果比较理想。4. 仿真翻车合集常见问题与排查心得4.1 积分饱和导致的超调与控制失效双环PI里最经典的问题就是积分饱和。电压环输出限幅到5A如果电池电压离目标值很远电压PI的积分项会一直增加等到电压接近目标值时积分值已经非常高导致系统继续以最大电流充电电压过冲严重然后积分值又要花很长时间退回来表现为电压波形“过了头还不回来”。解决办法是给PI控制器加抗积分饱和功能。Simulink的PID Controller模块自带Anti-windup Method选项选back-calculation同时把限幅设成和输出限幅一致。如果你自己搭积分器就加一个条件当输出饱和时停止积分积累。这个坑我在第一次做恒压充电时踩得很深电压超调直接到了35%加上抗饱和以后基本控制在2%以内。还有一个小细节电压环的积分器限幅不能只做在输出还要考虑在模式切换时清零或者保持。恒流充电阶段电压环虽然不工作但积分器可能因为输入误差一直在积累等切到恒压充电时就会产生很大的初始积分值。我的做法是在模式为CC时直接把电压环积分器冻结保持过去值或者清零只有进入CV模式后积分器才工作。4.2 模式切换瞬间的电流尖峰与电压凹陷模式切换引起冲击的根源我在前面已经提到过一部分。但还有个容易被忽视的坑切换时占空比输出不连续。比如恒流充电时Buck的占空比是0.35恒压充电启动瞬间电压环输出的电流给定还要经过电流环的暂态调节如果此时电流环PI的积分器里存着之前的值输出占空比会有个跳变。解决思路有两个方向。第一是“初值对齐”切换瞬间把电流环PI积分器更新成当前真实占空比对应的值让PWM占空比连续。第二是“限速切换”在模式切换信号上加一个速率限制器Rate Limiter让切换动作不是一个阶跃而是在50ms内线性过渡。我的做法是两者结合先做初值对齐再给模式切换信号加50ms斜坡。实测下来切换瞬间电流冲击从原来的8A降到5.5A以内最大允许6A基本不影响系统稳定。放电模式启动的电压凹陷也是常事。Boost刚投入时电容电压会先被电池拉低一下如果负载比较重电压凹陷可能超过10%。这时可以给电压外环加一个前馈项根据当前电池电压和母线目标电压估算一个基础占空比D_ff 1 - V_bat / V_out加到PI输出上。这样PI只需要在基准附近微调启动瞬间的调节压力小很多电压凹陷能控制在3%以内。这个前馈思路在很多电力电子控制里都适用建议你直接记下来。4.3 仿真不收敛、步长过小和波形毛刺的排查技巧Simulink电力电子仿真最常见的报错就是“步长降至最小值无法收敛”原因多半是开关管的管压降变化太陡或者电流出现数值振荡。我的排查顺序是这样的先检查二极管和MOSFET是否保留导通电阻参数默认是0改成0.01Ω能显著改善数值收敛再检查是否有代数环比如电流传感器直接串联在电源和开关之间容易产生代数环解决办法是在反馈链路里加一个小的延迟或低通滤波最后检查求解器设置把最大步长和相对容差放宽一点看能不能绕过收敛问题。波形毛刺问题一般是两种原因一种是我的PWM三角波和采样时钟不同步导致调制的占空比波形出现低频抖动解决办法是把整个控制回路放在同一个采样时间比如20kHz的控制器采样周期里保持统一离散化另一种是电感值偏小电流纹波过大那种毛刺有固定频率就是开关频率这不是故障但如果纹波大到影响控制稳定性就加大电感值或者降低开关频率。另外你观察电流波形时建议通过一个均值模块Mean看平均电流不然满屏纹波会干扰你对控制效果的判断。4.4 常见问题速查表现象可能原因快速排查方法恒流充电电流超调大电流环PI比例过大积分饱和减小kp_i增加抗积分饱和恒压充电电压过冲电压环积分饱和切换前积分器未冻结加Anti-windup切换时冻结/重置积分器模式切换瞬间电流尖峰占空比不连续切换信号是阶跃PI积分器赋初值切换信号加Rate Limiter放电电压凹陷严重Boost启动占空比突跳无前馈加前馈占空比电流给定加软启动斜坡仿真不收敛开关管无导通电阻代数环给管子加0.01Ω电阻反馈链路加延迟电流波形毛刺明显PWM分辨率低电感偏小减小最大步长适当增大电感电压环PI系数怎么调都振荡内外环带宽没有拉开把电压环响应速度再放慢2~5倍5. 这套仿真还能怎么扩展我的实操体会仿真跑顺以后我建议你别急着关掉模型有几个方向很值得继续折腾。第一个方向是给电池模型加入温度影响和老化因素。Simscape的Battery模块支持设置SOC初始值但如果你要研究低温充电策略或者老化后的内阻变化需要把电池模型换成更精细的等效电路比如二阶RC网络同时把端电压和温度的关系做成查表模块。控制策略不用大改双环PI依然适用但你会发现同一个PI参数在不同温度下表现差异很大这时候就轮到自适应PI或者模糊PI出场了。第二个方向是把恒压放电改成恒流放电或者加一个放电截止条件。比如设定电池电压降到21V时停止放电这个条件在Stateflow里加一个guard状态转移就能实现。你还可以研究放电过程中的母线负载突变比如负载从12Ω突然并一个24Ω观察电压环和电流环的抗扰动能力这是检验双环控制性能的绝佳实验。第三个方向是做数字控制器的代码生成。Simulink模型调好以后可以利用Embedded Coder把控制逻辑转换成C代码烧到DSP或MCU里做快速原型验证。我之前做过的某个项目就是用这套方式先仿真PI参数再直接生成代码跑硬件在环HIL省了很大一笔调试时间。如果你有这个计划建模时就要注意所有控制器都用离散模块采样时间统一避免用连续积分器。最后说点个人感觉比较深的体会。做双环PI仿真最大的价值不是把波形调好看而是通过这个过程理解两个控制回路的时间尺度关系。很多人上来就调参数调半天不收敛其实是因为内环外环的带宽没有拉开两个环在互相较劲。你先把电流环做快再把电压环放慢很多问题不用调参就自然消失了。这也是我想通过这篇记录传达给你的核心经验——先懂原理再动手调参比盲目扫参高效得多。希望这套仿真记录能让你少走几个弯路。
阅读完成 · 觉得有帮助?
咨询建站