篇章内容第 1 篇Buck 电路介绍与项目准备第 2 篇PLECS 搭建开环 Buck 功率级第 3 篇Buck 电感、电容和开关频率初步计算第 4 篇MATLAB/Simulink 搭建离散 PI 控制器第 5 篇占空比限幅与抗积分饱和第 6 篇软启动功能设计第 7 篇保护状态机怎么锁存故障并关断 PWM第 8 篇负载突变测试与波形分析第 9 篇ADC 噪声、采样延迟和 duty 抖动第 10 篇将仿真控制逻辑整理为 C 风格代码前面几篇已经完成了 Buck 项目准备、开环功率级搭建和参数初选24V 输入、12V/5A 输出、22uH 电感、100uF 输出电容、200kHz 开关频率。到这里开环占空比D 0.5时输出可以回到 12V 附近。很多人会自然产生一个疑问既然开环已经能输出 12V为什么还要加 PI答案是开环只能在“条件刚好不变”时成立。一旦输入电压变了、负载变了、器件有压降、采样有误差固定 duty 就不能自动修正输出。数字电源软件真正要做的事情是不断采样输出电压根据误差调整 PWM 占空比让输出在扰动后回到目标值。配套 GitHub 仓库digital-power-buck-sim-lab本章提供 Simulink 离散 PI 平均模型、Simulink 仿真波形导出脚本、CSV 原始数据和 Python 对照脚本。正文中的主波形来自 Simulink 模型运行后的导出结果。本章先回答什么问题本文只做一件事把 Buck 输出电压反馈到离散 PI 控制器并观察 PI 如何调整 duty让 Vout 在输入和负载扰动后回到 12V。本章会讲清楚P-only 为什么会留下稳态误差PI 中的比例项和积分项分别在做什么MCU 里的控制器为什么是按采样周期更新而不是连续时间更新Vin 从 24V 掉到 20V 时PI 如何把 duty 从约 0.5 推高负载从 5A 增加到 7.5A 时输出为什么会先下陷再恢复调试 PI 时为什么必须同时看 error、integrator 和 duty本章暂时不处理duty 上下限抗积分饱和软启动过压、过流、欠压保护状态机C 代码落地这些内容不是不重要而是职责边界要清楚。第四章只验证“离散 PI 电压环”的基本数据流第五章再专门处理 duty 限幅和抗积分饱和。为什么不能只靠固定 duty理想 Buck 的关系很简单Vout D * Vin在 24V 输入、目标 12V 输出时D 12V / 24V 0.5如果 Vin 永远等于 24V负载也不变开环固定 duty 可以看起来正常。但是输入电压掉到 20V 后如果 duty 还保持 0.5Vout 0.5 * 20V 10V这时输出就不可能继续稳定在 12V。控制器必须把 duty 提高到接近D 12V / 20V 0.6这就是闭环控制的价值不是让 24V 转 12V 这个静态计算更好看而是在输入、负载和模型参数变化后仍然自动修正输出。本章使用的模型本章使用 Simulink 搭建离散 PI Buck 平均功率级模型这张图建议按下面顺序看位置作用Vref 12V输出电压参考值Vout feedback从 Buck 平均功率级反馈回来的输出电压Discrete PI voltage controller离散 PI 控制器输入 Vref/Vout输出 dutyVin step 24V to 20V3ms 时输入电压从 24V 阶跃到 20VRload step 2.4ohm to 1.6ohm7ms 时负载从 5A 增加到 7.5AAveraged Buck plantBuck 平均功率级保留 L/C 动态但不展开开关级细节Scope mux同时观察 Vout、duty、error、integrator、IL、Iout这里先明确模型层级本章关注的是离散 PI 控制器的数据流不是 200kHz 开关节点的器件应力。因此本章使用 Simulink 平均模型。平均模型把开关动作等效为duty * Vin对 Buck 功率级的输入同时保留电感电流和输出电容电压的动态变化。这样可以把注意力集中在下面几件事上观察量这一章用来判断什么Vout输出是否能回到 12Verror反馈误差是否按预期变化integrator积分项是否持续消除稳态误差duty控制器是否把占空比推到新的平衡点IL / Iout功率级电流是否跟随负载变化本章正文波形的数据链路如下步骤说明1运行models/simulink/buck_discrete_pi_voltage_loop.slx2通过模型中的Scope mux汇总 Vout、duty、error、integrator、IL、Iout3由scripts/export_simulink_discrete_pi_waveforms.m导出 CSV 原始数据和高清波形图4文章使用waveforms/04-simulink-*.png作为正文主波形Python 脚本scripts/export_discrete_pi_control.py仍然保留在仓库里用来快速复算平均模型趋势。它适合做算法对照但正文主结论以 Simulink 模型导出的波形和 CSV 为准。平均模型的边界如下它适合验证控制逻辑和动态趋势它不用于评估 MOSFET Vds、二极管电流、开关损耗和尖峰振铃开关级波形仍然要回到 PLECS 中验证后续需要检查 MOSFET Vds、二极管电流、开关损耗、电感纹波和尖峰振铃时再回到 PLECS 开关级模型。离散 PI 的基本形式真实 MCU 里的 PI 不是连续时间公式直接运行。控制器通常在固定采样周期Ts到来时执行一次采样 Vout计算误差 e[k]更新积分项 xI[k]计算 duty[k]等下一个 PWM 周期更新输出本章使用的离散 PI 写成下面这种形式e[k] Vref[k] - Vout[k] xI[k] xI[k-1] Ki * Ts * e[k] duty[k] Dff Kp * e[k] xI[k]其中变量含义e[k]第 k 次采样时的输出电压误差Kp比例增益Ki积分增益Ts控制周期本章取 5usxI[k]积分状态Dff前馈占空比本章取 0.5duty[k]输出给 PWM 的占空比指令本章参数如下参数数值说明Vin 标称值24V输入扰动前Vref12V输出电压目标负载初值2.4Ω对应 12V/5A负载阶跃后1.6Ω对应约 12V/7.5AL22uH延续第三章基准值C100uF延续第三章基准值fsw200kHzPWM 开关频率Ts5us控制周期等于一个 PWM 周期Dff0.524V 到 12V 的开环前馈 dutyKp0.05本章教学用初始值Ki200本章教学用初始值这里的Kp 0.05、Ki 200不是量产参数也不是最终调参结果。它们只是为了让本章能清楚观察 P-only 和 PI 的差异并让输入扰动、负载扰动后的恢复过程足够明显。模型里还加入了 0.02Ω 的串联电阻来模拟一点非理想压降所以初始积分项不是 0而是initial_integrator_trim ≈ 0.00417它的作用是补偿标称 5A 负载下的微小压降。这样仿真一开始就处在接近 12V 的工作点后面更容易看清输入阶跃和负载阶跃对控制器的影响。先看 P-only 和 PI 的差异先只做一个输入扰动3ms 时 Vin 从 24V 掉到 20V。如果只用 P 控制输出电压会被拉回一部分但通常会留下稳态误差。因为比例项只根据当前误差给 duty 增量误差越小修正量也越小最后会停在一个“误差不为 0 但力也不够继续推”的位置。实际仿真结果如下这张图重点看两个结论控制方式Vin 掉到 20V 后的结果读法P-onlyVout 最终约 11.00V有修正但留下约 1V 稳态误差PIVout 最终约 12.00V积分项继续累加把稳态误差推回接近 0这里不要把 PI 理解成“更大的 P”。PI 真正多出来的是积分状态xI。当 Vout 低于 12V 时误差e[k]为正积分项会逐步增加duty 也会继续增加。只要误差还没有消失积分项就不会停在原地。最终 duty 被推到新的平衡点输出回到 12V 附近。输入扰动和负载扰动一起看接下来加入两个扰动时间扰动含义3msVin: 24V - 20V输入电压下跌7msRload: 2.4Ω - 1.6Ω负载从 5A 增加到约 7.5API 控制下的整体响应如下先看 3ms 的输入扰动。Vin 从 24V 掉到 20V 后原来的 duty 不够了Vout 先下跌。控制器检测到Vref - Vout变大于是 P 项立即给出修正I 项继续累加duty 从约 0.5 提高到约 0.6 以上输出重新回到 12V。再看 7ms 的负载扰动。负载从 5A 增加到 7.5A 时输出电容先被多拉了一部分电流Vout 下陷。随后 PI 提高 duty电感电流重新建立输出回到 12V 附近。本章脚本导出的关键指标如下指标仿真结果工程读法控制周期5us对应 200kHz PWM 周期Vin 阶跃24V - 20V模拟输入跌落负载阶跃5A - 7.5A模拟负载加重P-only 输入阶跃后 Vout约 11.00V比例控制留下稳态误差PI 输入阶跃后 Vout约 12.00V积分项消除稳态误差PI 负载阶跃后 Vout约 12.00V负载扰动后可以恢复输入阶跃后 Vout 最低/最高约 10.25V / 12.27V这组参数有明显欠阻尼不是最终调参负载阶跃后 Vout 最低/最高约 11.26V / 12.64V恢复可见但仍需后续优化duty 范围约 0.504 - 0.646未触及 1但本章还没加限幅输入阶跃 1% 恢复时间约 2.22ms从 3ms 扰动点开始计算负载阶跃 1% 恢复时间约 0.91ms从 7ms 扰动点开始计算这组结果说明 PI 已经能完成基本闭环恢复。但也要看到问题波形有过冲duty 没有限幅积分项也没有边界。所以本章不能得出“这个控制器可以直接上硬件”的结论。正确结论应该是离散 PI 数据流成立输出能在扰动后恢复到 12V但 duty 限幅、抗积分饱和、软启动和保护逻辑还没有完成。为什么要看 error 和 integrator很多人调 PI 时只看 Vout。这样很容易误判。Vout 是结果不是根因。真正能解释控制器行为的变量是errorintegratorduty本章把误差和积分项单独画出来这张图要读出两个动作Vin 下降后error 先变大integrator 随后抬升duty 被推高负载加重后error 再次变化integrator 做二次修正如果 Vout 已经回到 12V但 integrator 还在很高的位置就要警惕后面可能出现积分饱和或恢复慢的问题。如果 duty 已经打到上限Vout 还上不来那就不是继续调 Ki 能解决的问题而是要检查输入电压、负载、电感电流能力、限流状态和功率级设计。这也是后续第五章要处理抗积分饱和的原因积分项是有状态变量不是一个可以无限累加的普通中间值。采样点不是连续时间每一刻数字控制器还有一个容易被忽略的事实它不是连续时间每一刻都计算。本章控制周期为Ts 1 / 200kHz 5us也就是说控制器每 5us 执行一次 PI更新一次 duty。两次更新之间PWM 指令保持不变。下面这张图放大到输入阶跃附近只标出控制器采样点看这张图时要把连续平均模型响应和离散控制器采样点分开灰色曲线表示平均模型的连续响应蓝色点表示控制器真正采样和更新的位置这就是数字电源和纯模拟控制的一个关键差异。后面如果继续讨论采样延迟、ADC 噪声、PWM 更新时刻和 duty 抖动都要建立在这个离散时间概念上。这组 PI 参数的工程边界这一章的 PI 参数先作为一组可复现实验参数使用而不是最终量产参数。它要证明的是控制链路是否跑通以及关键变量是否能解释波形变化。本章已经能看到三个结论P-only 会留下稳态误差PI 可以把输出重新拉回 12V 附近。输入电压和负载扰动发生后duty 会跟着调整说明控制方向是对的。只看 Vout 不够error、integrator、duty 必须一起记录才能判断控制器为什么这样动作。但从电源软件工程角度看这还只是最小闭环验证检查项本章证据工程判断输出恢复Vin 和负载阶跃后Vout 能回到 12V 附近闭环方向和积分路径成立输出过冲阶跃后仍能看到过冲参数还需要测试矩阵继续优化duty 边界波形中 duty 最大约 0.646但控制器还没有上下限不能直接作为硬件代码积分项边界integrator 会随误差持续累加后面必须加入抗积分饱和启动过程参考值直接给到 12V后面必须加入软启动异常工况目前没有故障判断和关断路径后面必须加入保护状态机所以本章的结论应该收在这里离散 PI 电压环已经完成最小闭环验证但还没有完成可上硬件的电源软件。下一章继续补 duty 限幅和抗积分饱和把“能闭环”推进到“边界可控”。本章常见误区1. 输出回到 12V 就说明 PI 调好了不对。输出回到 12V 只能说明闭环方向基本正确。还要继续看过冲、恢复时间、duty 范围、积分项是否合理、负载阶跃是否稳定以及异常工况下是否会打满 duty。2. 积分项越大恢复越快不一定。Ki 太小稳态误差消除慢Ki 太大输出容易过冲和振荡。积分项还会带来状态记忆一旦 duty 被限幅积分项可能继续累加导致解除限幅后恢复很慢。3. 平均模型能替代 PLECS 开关模型不能。平均模型适合看控制趋势PLECS 开关模型适合看开关节点、电感纹波、器件应力和功率级细节。两者应该配合使用不应该互相替代。4. 第四章应该顺手把限幅也加上不建议。如果这一章同时加入 PI、duty 限幅、抗积分饱和和软启动读者看到波形变化时很难判断是哪一个模块在起作用。分层讲清楚比一次堆完整更重要。本篇总结本文完成了 Buck 数字电源的第一版离散 PI 电压环。本章最重要的结论不是某个Kp、Ki数值而是下面这条数据流Vout 采样- e[k] Vref - Vout- PI 更新积分项- 计算 duty- PWM 按 5us 周期更新- Buck 平均功率级响应- Vout 再次反馈仿真结果表明P-only 在 Vin 从 24V 掉到 20V 后会留下约 1V 稳态误差PI 可以把输出重新推回 12V 附近负载从 5A 增加到 7.5A 后PI 也能让输出恢复error、integrator 和 duty 是 PI 调试时必须观察的变量下一篇继续处理一个更接近工程的问题duty 不能无限大积分项也不能无限累加。也就是占空比限幅和抗积分饱和。本章配套文件本章对应的文件如下仓库入口https://github.com/Old-Ding/digital-power-buck-sim-lab类型文件作用教程文章blog/04-discrete-pi-control.md本章正文复现说明docs/04-discrete-pi-control-reproduce.md运行步骤和结果说明Simulink 模型models/simulink/buck_discrete_pi_voltage_loop.slx离散 PI Buck 平均功率级模型Simulink 截图脚本scripts/export_simulink_discrete_pi_snapshot.m生成模型和模型截图Simulink 波形脚本scripts/export_simulink_discrete_pi_waveforms.m运行 Simulink 模型并导出主波形Python 对照脚本scripts/export_discrete_pi_control.py快速复算平均模型作为对照Simulink 原始数据waveforms/04-simulink-discrete-pi-control-trace.csvSimulink 仿真时序数据Simulink 指标汇总waveforms/04-simulink-discrete-pi-control-summary.csv本章表格中的关键指标Simulink 控制波形waveforms/04-simulink-*.png本章使用的主波形Python 对照波形waveforms/04-p-only-vs-pi-vin-step.png、waveforms/04-pi-*.pngPython 快速复算得到的可选对照波形模型截图assets/screenshots/04-simulink-discrete-pi-control.png本章使用的 Simulink 模型截图运行方式matlab-batchrun(scripts/export_simulink_discrete_pi_snapshot.m); exitmatlab-batchrun(scripts/export_simulink_discrete_pi_waveforms.m); exitpython scripts\export_discrete_pi_control.py如果 MATLAB 没有加入系统 PATH可以把前两条命令里的matlab替换成你本机 MATLAB 的完整路径。Python 脚本是对照复算不是正文主波形来源。技术交流如果你在复现模型、运行脚本或判断 PI 波形时遇到问题可以加入技术交流群交流。本仓库中的模型、脚本、数据和图表可以直接使用交流群主要用于复现答疑和后续技术交流。渠道信息QQ 群嵌入式交流群1056095456加群链接https://qm.qq.com/q/rygrSD2Ddu微信交流微信入口会不定期更新可在 QQ 群内获取提问时建议附上 Simulink 模型截图、参数表、运行输出、Vout/duty/error/integrator 波形和你自己的判断过程。这样更容易定位问题也更容易形成有效交流。