ARTICLE DETAIL

资讯详情

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

四相交错并联Buck变换器仿真:平均电流模式控制与C语言实现

四相交错并联Buck变换器仿真:平均电流模式控制与C语言实现 最近在做一个低压大电流的电源项目客户要求输出电流要稳纹波要小动态响应还得快。一开始想着用传统的单相Buck结果一算电感电流纹波和输出电容的RMS电流都超标了散热和体积都成了大问题。这时候一个很自然的想法就冒出来了为什么不把几个Buck并联起来让它们轮流工作呢这就是“交错并联”的思路。但想法简单实现起来坑可不少。四个Buck交错并联相位怎么分配电流怎么保证平均环路怎么稳定尤其是当负载从满载突然掉到轻载甚至进入断续导通模式DCM时采样和补偿算法还能不能正常工作这些问题光靠理论计算和手画波形心里实在没底。仿真就成了验证想法、优化参数、避免硬件“炸机”的必经之路。我选择了Plecs作为仿真平台。它擅长电力电子和控制系统混合仿真模型库丰富而且支持用C语言编写自定义的控制算法这正好契合我的需求——我想用C语言实现一个完整的数字控制器包括平均电流模式的双闭环PI控制、DCM下的采样补偿以及安全的电压软起动。这篇文章我就来详细拆解这个基于Plecs的四相交错并联Buck仿真模型的搭建过程并分享用C语言编写核心控制算法的思路与代码。你会发现从单环电压控制到平均电流模式从连续模式到断续模式的平滑过渡以及如何让四相电流“步调一致”这里面每一步都有值得深究的细节。1. 为什么是四相交错并联Buck从单相的困境到多相的破局当我们面对低压大电流的应用场景比如为高性能CPU、GPU或AI加速卡供电传统的单相Buck变换器会显得力不从心。问题主要体现在三个方面首先是电流应力。单相结构下所有的输出电流都由一个电感和一个下管在同步Buck中或续流二极管承担。这意味着电感需要承受巨大的直流偏置和纹波电流导致电感体积庞大、损耗高。功率MOSFET的导通损耗和开关损耗也集中在单个器件上散热设计挑战巨大。其次是输出纹波。Buck电路的输出纹波电压主要由电感电流纹波在输出电容的等效串联电阻ESR上产生。大电流下即使很小的ESR也会导致可观的纹波电压。同时流经输出电容的RMS电流也很大这会缩短电容寿命增加发热。最后是动态响应。单相变换器的控制带宽受限于开关频率。在负载发生阶跃变化时有限的带宽可能导致输出电压出现较大的过冲或下冲无法满足现代处理器快速变化的负载需求。交错并联技术正是为了解决这些问题而生。它的核心思想是将多个相同的Buck变换器称为“相”并联但让它们的开关管驱动信号在时间上依次错开。对于N相并联每相的驱动信号相位相差360°/N。以四相为例相位差就是90°。这样做带来了几个关键好处电流纹波抵消效应各相电感电流的纹波在输出端叠加时由于相位错开会相互抵消一部分。理想情况下N相交错并联可以使输出电流纹波的频率提高到N倍开关频率幅值显著降低。这意味着我们可以使用更小、更便宜的输出电容来达到同样的纹波要求。电流应力分摊总输出电流被平均分配到N相上每相电感、MOSFET承受的电流应力降低为原来的1/N。这允许我们使用更小尺寸的电感和更低电流等级的MOSFET从而优化成本和体积。等效开关频率提升对于控制系统而言输出纹波频率的提高相当于等效开关频率提升了N倍。这为拓宽控制带宽提供了可能从而改善动态响应速度。然而引入多相交错也带来了新的复杂性均流问题。如果各相电流不均衡那么承受电流最大的一相就会成为系统的短板可能提前过热损坏也无法充分发挥多相并联的优势。因此一个稳健的控制系统必须包含精确的均流机制。平均电流模式控制正是实现这一目标的经典且有效的方法。2. 控制核心平均电流模式双闭环与C语言实现在电压模式控制中PI调节器的输出直接作为占空比。这种方法简单但对电感电流的变化没有直接控制动态响应较慢且需要额外的斜率补偿来防止次谐波振荡在占空比50%时。而平均电流模式控制则增加了一个内环——电流环。它的结构更清晰性能也更优越。2.1 双闭环结构解析我们的控制目标是稳定的输出电压和均分的相电流。因此控制系统采用经典的电压外环、电流内环的双闭环结构。电压外环采样输出电压Vout与电压参考值Vref通常由软起动算法产生进行比较得到电压误差V_err。电压环PI调节器根据V_err计算出总的电流指令I_ref_total。这个指令代表了负载在当前时刻需要的总平均电感电流。// 伪代码示例电压环PI计算 float V_err Vref - Vout_sampled; // PI运算注意积分抗饱和处理 I_ref_total voltage_pi_calculate(V_err); // 限制总电流指令在合理范围内 I_ref_total limit(I_ref_total, I_min, I_max);电流内环与均流这是关键所在。总电流指令I_ref_total需要分配给每一相。最简单的均流策略就是平均分配I_ref_per_phase I_ref_total / NUM_PHASES; // 假设为4相然后对每一相独立进行电流环控制。采样该相的电感电流I_Lx与它的电流指令I_ref_per_phase比较得到电流误差I_err_x。电流环PI调节器根据I_err_x计算出该相的占空比Duty_x。// 伪代码示例单相电流环PI计算 for (int phase 0; phase NUM_PHASES; phase) { float I_err I_ref_per_phase - I_L_sampled[phase]; duty[phase] current_pi_calculate(phase, I_err); // 每个相有独立的PI状态变量 duty[phase] limit(duty[phase], DUTY_MIN, DUTY_MAX); }通过这种方式每一相都独立地努力将自己的平均电流跟踪到I_ref_per_phase。只要各相的电流采样、PI参数一致理论上就能实现自动均流。电压环负责“要多少”电流环负责“怎么给”并保证“分得匀”。2.2 C语言PI调节器实现要点在Plecs中我们可以用C-Script模块编写离散时间的数字PI控制器。需要注意以下几个工程细节离散化需要将连续的PI传递函数如Kp Ki/s转换为离散形式。常用方法有前向欧拉、后向欧拉和双线性变换Tustin。后向欧拉和双线性变换在数值上更稳定。// 示例后向欧拉法实现的增量式PI更常用抗积分饱和方便 typedef struct { float Kp; float Ki; float Ts; // 采样周期 float integral; float out_max; float out_min; float prev_err; } PI_Controller; float pi_calculate_incremental(PI_Controller *pi, float error) { float proportional pi-Kp * (error - pi-prev_err); float integral pi-Ki * pi-Ts * error; pi-integral integral; // 积分抗饱和仅在输出未饱和时积分或使用 clamping 方法 float output proportional pi-integral; // 限制输出并处理积分饱和 if (output pi-out_max) { output pi-out_max; // 可选停止积分或采用积分钳位 } else if (output pi-out_min) { output pi-out_min; } else { // 输出未饱和保持积分项 } pi-prev_err error; return output; }采样同步电流采样必须在开关管导通的中间时刻或特定时刻进行以避免开关噪声和电流尖峰的影响。在仿真中我们可以用Plecs的采样保持模块或在自己的C代码里判断仿真时间来实现同步采样。抗饱和处理Anti-windup当调节器输出达到限幅值如占空比0~1时积分项会继续累积导致系统退出饱和时产生大的超调。必须实现抗饱和逻辑常见的有积分分离、积分钳位等。3. 不可忽视的细节DCM采样补偿与电压软起动3.1 DCM下的电流采样困境在轻载或空载时Buck变换器会进入断续导通模式。此时电感电流在一个开关周期内有一段时间为零。如果我们仍然在开关管导通中点采样电流采到的值可能为零或一个很小的值。这会给平均电流模式控制带来严重问题电流环失控电流采样值远低于电流指令导致电流环PI输出占空比持续增大试图拉高电流。但由于电路已进入DCM增大占空比对提升平均电流的效果非常有限。输出电压失调电压环看到输出电压偏低也会不断抬高电流指令。两个环路互相“助推”可能导致占空比饱和在最大值输出电压失控上升对于Buck占空比饱和会导致输出电压接近输入电压可能超压。解决方案DCM采样补偿。思路是当检测到电路进入DCM时我们不再使用真实的采样电流值而是计算出一个“虚拟的”或“补偿后的”电流值送给电流环PI。这个补偿值应该能反映在DCM下要维持当前输出电压所需的平均输入电流对于Buck平均电感电流等于平均输入电流。一种实用的方法是在DCM时根据输入电压Vin、输出电压Vout、电感量L、开关频率Fsw和当前占空比D计算出理论的DCM平均电感电流I_avg_dcm。I_avg_dcm (Vin - Vout) * D^2 * Ts / (2 * L) * (Vout / Vin)然后用这个计算值I_avg_dcm替代实际的采样值I_L_sampled参与电流环PI运算。同时需要限制电流环的最大输出占空比防止其无限制增长。在C代码中我们需要一个状态机来检测DCM// 伪代码DCM检测与补偿 float get_compensated_current(float sampled_current, float duty, float Vin, float Vout, float L, float Ts) { // 检测DCM采样电流接近零且占空比小于某个临界值 (Vout/Vin) float critical_duty Vout / Vin; if (sampled_current I_DCM_THRESHOLD duty critical_duty * 0.9) { // 0.9为裕量 // 进入DCM补偿模式 float I_avg_dcm (Vin - Vout) * duty * duty * Ts / (2.0 * L) * (Vout / Vin); return I_avg_dcm; } else { // CCM模式使用采样值 return sampled_current; } }3.2 电压软起动平缓上电的关键对于一个空载的Buck电路如果一上电就给出全占空比输入电压会直接加在输出LC滤波器上导致巨大的浪涌电流可能损坏MOSFET或电容。软起动算法通过在启动阶段让电压参考值Vref从0缓慢线性或指数上升至目标值从而限制启动电流。在双闭环控制中软起动作用于电压环的给定值Vref。// 伪代码线性软起动 #define SOFT_START_TIME_MS 10.0 // 软起动时间例如10ms #define CONTROL_PERIOD_US 100 // 控制周期例如100us (10kHz) float Vref_target 12.0; // 目标电压 float Vref_current 0.0; int soft_start_steps (SOFT_START_TIME_MS * 1000) / CONTROL_PERIOD_US; float step_increment Vref_target / soft_start_steps; void soft_start_step() { if (Vref_current Vref_target) { Vref_current step_increment; if (Vref_current Vref_target) { Vref_current Vref_target; } } } // 在每个控制周期调用 soft_start_step()并使用 Vref_current 作为电压环的给定软起动期间电流环的限幅值也应相应降低以进一步限制冲击电流。软起动完成后再放开电流限幅。4. 在Plecs中搭建完整仿真模型有了清晰的算法思路我们就可以在Plecs中将其具象化。搭建过程遵循“从部分到整体”的原则。4.1 功率级建模单相Buck单元首先搭建一个标准的同步Buck电路模块。包含输入电压源、上管和下管MOSFET用理想开关或带寄生参数的模型、电感、输出电容、负载电阻。为电感串联一个小电阻以方便测量电流。四相复制与交错复制出四个相同的Buck单元它们的输入并联输出并联。关键一步是创建交错驱动信号。使用Plecs的PWM发生器模块设置四路PWM开关频率相同如200kHz但相位依次偏移90°即1/(4*Fsw) 的时间间隔。测量与传感为每一相电感的电流和总输出电压添加传感器。电流传感器最好放置在电感的下端开关节点侧或上管源极以测量电感电流。输出电压传感器需要放在输出电容两端。4.2 控制级建模C-Script核心这是仿真的灵魂所在。我们创建一个Plecs C-Script模块。输入/输出定义在C-Script模块的接口中定义输入Vout输出电压IL1,IL2,IL3,IL4四相电感电流soft_start_enable软起动使能。输出PWM1,PWM2,PWM3,PWM4四路占空比信号连接PWM发生器的占空比输入。参数可以在模块属性中设置如Kp_v,Ki_v,Kp_i,Ki_i,Vref,I_max,soft_start_time_ms,L,Fs等。C代码结构在C-Script的代码区实现一个完整的离散时间控制器。// 全局或静态变量用于保存控制器状态 static PI_Controller pi_voltage; static PI_Controller pi_current[4]; static float Vref_ramp 0.0; static int soft_start_complete 0; void plecs_init(PlecsInterface *pl) { // 初始化PI控制器参数积分项清零 pi_voltage.Kp pl-Kp_v; pi_voltage.Ki pl-Ki_v; pi_voltage.Ts pl-Ts; // 从参数获取采样周期 pi_voltage.integral 0; pi_voltage.out_max pl-I_max; pi_voltage.out_min 0; // 初始化四个电流环PI... for(int i0; i4; i) { pi_current[i].Kp pl-Kp_i; pi_current[i].Ki pl-Ki_i; pi_current[i].Ts pl-Ts; pi_current[i].integral 0; pi_current[i].out_max 0.95; // 占空比上限留裕量 pi_current[i].out_min 0.05; // 占空比下限 } } void plecs_output(PlecsInterface *pl) { // 1. 读取输入 float Vout pl-Vout; float IL[4] {pl-IL1, pl-IL2, pl-IL3, pl-IL4}; // 2. 软起动逻辑 if (pl-soft_start_enable 0.5 !soft_start_complete) { Vref_ramp pl-Vref / (pl-soft_start_time_ms / pl-Ts * 1000); if (Vref_ramp pl-Vref) { Vref_ramp pl-Vref; soft_start_complete 1; } } else { Vref_ramp pl-Vref; } // 3. 电压外环 float V_err Vref_ramp - Vout; float I_ref_total pi_calculate(pi_voltage, V_err); // 使用位置式或增量式PI I_ref_total limit(I_ref_total, 0, pl-I_max); // 4. 均流与电流内环 float I_ref_per_phase I_ref_total / 4.0; for (int i 0; i 4; i) { // DCM补偿可选根据3.1节逻辑 float IL_compensated get_compensated_current(IL[i], duty_prev[i], pl-Vin, Vout, pl-L, pl-Ts); float I_err I_ref_per_phase - IL_compensated; float duty pi_calculate(pi_current[i], I_err); duty limit(duty, 0.05, 0.95); pl-PWM1 duty; // 实际输出到对应的端口此处简写 duty_prev[i] duty; // 保存用于DCM判断 } // 实际代码中需分别赋值给 pl-PWM1, pl-PWM2... }连接与闭环将C-Script模块的输出四路占空比连接到四个PWM发生器的占空比控制端。将PWM发生器的输出连接到四个Buck单元的上管门极。下管门极信号通常由上管信号取反得到需加入死区时间可在PWM模块或MOSFET驱动模型中设置。将传感器信号输入到C-Script模块。4.3 仿真、调试与观察设置仿真参数选择适当的仿真算法如Trapezoidal/梯形法设置合理的仿真步长通常小于开关周期的1/100。设置总仿真时间要能覆盖启动、稳态和负载跳变。添加观测点在示波器上观察总输出电压Vout及其纹波。四相电感电流IL1~IL4观察它们的相位交错和幅度均衡。四路占空比信号。电压环输出I_ref_total。软起动过程中的Vref_ramp。调试流程先开环验证功率级固定一个小的占空比如0.2检查四相电流是否交错功率级工作是否正常。再分步闭环a.仅电流环将电压环断开直接给定一个固定的I_ref_total。观察各相电流是否能快速、准确地跟踪其分配值。调整电流环PI参数Kp_i,Ki_i追求快速的动态响应和较小的稳态误差。 b.加入电压环连接电压环给定目标电压。先空载或轻载启动观察软起动过程是否平滑输出电压是否稳定。调整电压环PI参数Kp_v,Ki_v其带宽通常应设计为开关频率的1/10到1/5且远低于电流环带宽。测试动态性能在仿真中途改变负载电阻模拟负载阶跃观察输出电压的跌落/过冲和恢复时间。这是检验双闭环性能的关键。测试DCM工况将负载设置为极轻载或空载观察系统是否能平稳进入DCM而不振荡输出电压是否稳定。检查DCM补偿逻辑是否被正确触发。通过这一系列的建模、编码、连接和调试你最终会得到一个行为高度可控、性能可预测的四相交错并联Buck数字控制器仿真模型。这个模型的价值不仅在于验证了理论更在于它提供了一个安全的“沙盒”让你可以大胆尝试各种控制策略、优化PI参数、测试极端工况而无需担心硬件损坏。当仿真波形与理论分析完美契合时那份信心才是推进真实硬件设计最坚实的底气。
返回列表