三电平BUCK变换器仿真:电压闭环控制与带中点平衡控制
三电平BUCK变换器仿真电压闭环控制带中点平衡控制三电平BUCK玩起来确实比传统拓扑有意思尤其是中点平衡那部分特别容易翻车。今天撸了个带电压闭环的仿真模型实测中点电压能稳定在目标值附近顺手把核心代码逻辑和调试经验整理下。先看主拓扑结构伪代码表示% 三电平BUCK主电路参数 Vin 100; % 输入电压 Vref 48; % 目标输出电压 C1 470e-6; % 上电容 C2 470e-6; % 下电容 fsw 20e3; % 开关频率重点在占空比生成部分传统BUCK只需要一路PWM三电平得搞两路互补带死区的信号。这里用载波层叠法实现// 基于STM32的PWM生成逻辑简化版 void generate_PWM(float duty) { float carrier get_carrier(); // 获取三角载波 float upper_compare duty * 0.5f 0.25f; float lower_compare duty * 0.5f - 0.25f; if(carrier upper_compare) { set_switch(S1, OFF); set_switch(S2, ON); } else if(carrier lower_compare) { set_switch(S1, ON); set_switch(S2, OFF); } else { set_switch(S1, OFF); set_switch(S2, OFF); } }这段代码的关键在于把单路占空比拆分成两个比较值中间区域让两个开关管都关断形成三电平的中间状态。实际调试时发现死区时间设置不合理会导致上下管直通烧了好几个仿真模型里的虚拟MOS管...电压闭环用了个改进型PID主要加了抗积分饱和class PID: def __init__(self, Kp, Ki, Kd, limit): self.Kp Kp self.Ki Ki self.Kd Kd self.integral 0 self.prev_error 0 self.limit limit def update(self, error, dt): if abs(self.integral) self.limit: self.integral * 0.95 # 泄露积分 prop self.Kp * error integ self.Ki * self.integral * dt deriv self.Kd * (error - self.prev_error) / dt output prop integ deriv self.prev_error error return output这个PID在负载突变时表现稳如老狗特别是满载切轻载时输出电压过冲明显减小。参数整定建议从Kp0.05开始慢慢往上调积分时间常数别设太小否则中点平衡会抖得亲妈都不认识。三电平BUCK变换器仿真电压闭环控制带中点平衡控制说到中点平衡核心是检测上下电容电压差然后动态调整占空比分配% 中点平衡控制算法 function duty balance_control(Vc1, Vc2) delta (Vc1 - Vc2) / (Vc1 Vc2); k 0.02; % 平衡系数 duty_adjust k * delta; duty_main pid_output; % 来自电压环 duty_upper duty_main duty_adjust; duty_lower duty_main - duty_adjust; % 限幅处理 duty_upper min(max(duty_upper, 0.1), 0.9); duty_lower min(max(duty_lower, 0.1), 0.9); duty [duty_upper, duty_lower]; end实测这个算法在输入电压波动±20%时中点电压偏差能控制在1%以内。有个坑要注意平衡系数k不能太大否则会和电压环产生耦合震荡之前设k0.1直接导致系统发散。仿真时发现个有趣现象当负载电流大于某个临界值时中点会自动平衡这时候其实可以关闭平衡控制节省运算资源。这个特性跟输出电感电流连续模式有关具体原理还在研究有懂的兄弟欢迎评论区交流。最后说下仿真步长的选择用变步长算法虽然快但容易错过开关瞬间的细节。建议在开关动作前后用固定1us步长其他时间段用20us这样既能保证精度又不至于跑得太慢。别问我怎么知道的——连续跑了三天三夜的服务器冒烟换来的经验。