前面几章已经把 Buck 数字电源里几条主控制链路补起来了。第四章讲离散 PI 电压环第五章讲 duty 限幅和 anti-windup第六章讲软启动参考值怎么进入电压环。做到这里正常启动和正常闭环已经能跑出比较干净的波形。但是电源软件不能只关心“正常时怎么调”。真正上硬件前还必须回答另一个问题什么时候允许 PWM 输出 什么时候必须立刻关断 PWM 故障发生后故障码由谁保存什么时候允许清除这就是本章要讲的保护状态机。配套 GitHub 仓库digital-power-buck-sim-lab本章提供 Simulink 保护状态机结构截图、MATLAB 故障注入脚本、状态迁移 CSV、故障优先级 CSV 和正文波形图。正文波形来自 MATLAB R2024b 脚本导出结果。本章先回答什么问题本章只做一件事把“保护检测、故障锁存、PWM 关断”拆成三个清晰职责并用故障注入数据验证状态机行为。本章会讲清楚为什么保护阈值判断不应该散落在 PI、PWM、软启动和状态分支里protection_check()应该输出唯一故障码而不是直接改 duty状态机为什么要锁存故障而不是故障信号消失后立刻恢复FAULT_LATCH下为什么必须统一关断 PWMCLEAR_FAULT为什么只有在故障检测已经消失后才有意义多个故障同时出现时为什么需要固定优先级本章暂时不处理负载阶跃动态指标ADC 噪声、采样毛刺和去抖硬件比较器、逐周期限流和驱动器故障脚自动重启、打嗝保护和重试计数C 代码完整单元测试框架MOSFET SOA、二极管反向恢复和开关尖峰这些内容放到后续章节。本章先把软件保护状态机的职责边界讲清楚。为什么不能把保护判断写得到处都是很多初学者写电源控制程序时会很自然地在各处加判断PI 里面看到电压过高duty 0 PWM 更新前看到过流duty 0 软启动时看到欠压退出启动 主循环里看到故障再设置 fault flag这些判断单独看都像是在“更安全”但调试时会出现一个严重问题你很难判断到底是谁关掉了 PWM。更好的分层方式是protection_check() 只检测故障输出一个 fault code power_state_machine_step() 只消费命令和 fault code决定状态和故障锁存 PWM gate 只根据状态决定 duty 是否允许输出 telemetry 只记录状态、故障码、PWM 使能和 duty保护层负责“发生了什么故障”状态机负责“系统处于什么状态”执行层负责“PWM 是否输出”。这三个职责不要互相越界。本章使用的状态机结构本章生成了一个 Simulink 结构模型用来展示数据流和职责边界这张图按从左到右的顺序看模块输入输出职责protection_check()Vin、Vout、Iout、Tempfault_code比较阈值并输出唯一故障码command and fault muxenable、clear、fault命令/故障输入汇总状态机输入power_state_machine_step()命令和故障码当前状态锁存故障并决定状态迁移soft_start_reference()状态Vref_cmd只在软启动阶段生成参考斜坡voltage_loop_PI()Vref_cmd、反馈量duty 候选值正常闭环控制PWM gate状态和 dutyPWM 输出非运行态统一关断 PWMtelemetry log状态、故障、PWM调试量记录可观测变量这个结构里最关键的一点是保护检测层不直接改 duty状态机不重复比较电压电流阈值PWM gate 不判断 OCP/OVP/UVLO/OTP 的业务含义。状态怎么定义本章用 6 个状态表达第一版电源软件状态机状态含义PWMINIT上电初始化关闭IDLE等待 enable 命令关闭SOFT_START软启动参考值爬坡允许RUN正常闭环运行允许FAULT_LATCH故障锁存关闭RECOVERY清故障后的恢复过渡态关闭基本迁移关系是INIT - IDLE IDLE ENABLE - SOFT_START SOFT_START done - RUN SOFT_START/RUN fault - FAULT_LATCH FAULT_LATCH CLEAR_FAULT no active fault - RECOVERY - IDLE这里故意没有加自动恢复、重试次数和打嗝周期。第一版状态机先保证可观察、可解释、可复现。保护检测只输出一个故障码本章的保护检测优先级是OCP - OVP - UVLO - OTP对应阈值如下保护项条件本章阈值OCPIout Iout_limit6.5AOVPVout Vout_ovp13.2VUVLOVin Vin_uvlo18VOTPTemp Temp_otp95°C为什么要有优先级因为实际系统可能同时出现多个异常。比如短路时输出电流过高输入电压也可能被拉低。如果保护层同时把 OCP 和 UVLO 都往外抛状态机和日志就会变得不确定。第一版更清晰的做法是让保护层集中决定优先级只输出一个故障码。本章用 MATLAB 对保护优先级做了静态故障注入从图里可以看到注入工况触发条件输出故障码normal无异常NONEuvlo onlyVin 低于 18VUVLOovp onlyVout 高于 13.2VOVPocp onlyIout 高于 6.5AOCPotp only温度高于 95°COTPocp ovp uvloOCP、OVP、UVLO 同时存在OCPovp uvloOVP、UVLO 同时存在OVPuvlo otpUVLO、OTP 同时存在UVLO这说明优先级没有散落在多个模块里而是集中在保护检测层。RUN 状态发生 OCP 时会发生什么下面是第一组动态故障注入。工况设计如下时间事件0.5msenable 命令有效0.5ms - 5.5ms进入软启动5.55ms进入 RUN8ms - 9ms注入 OCPIout 7.2A12ms清故障命令14ms再次 enable19.05ms重新进入 RUN仿真波形如下这张图重点看三件事。第一8ms 出现 OCP 后状态从RUN进入FAULT_LATCH。检测到的故障只持续到 9ms但锁存故障保持到 12ms 清故障命令到来。第二进入FAULT_LATCH的同一个采样周期PWM enable 变成 0duty cmd 也被压到 0。这个路径不是 PI 自己决定的而是状态层统一关断。第三12ms 清故障后系统没有直接跳回 RUN而是走RECOVERY - IDLE。后续需要再次 enable才会重新进入SOFT_START最后回到RUN。本章导出的关键指标指标结果首次 OCP 检测时间8msPWM 关断延迟0us锁存故障码OCP清故障进入恢复时间12ms重新进入 RUN 时间19.05ms这里的0us表示在本章离散状态机模型中故障检测和 PWM gate 更新发生在同一次状态机采样里。真实 MCU 上还要继续分析 ADC 采样、任务调度、PWM 更新影子寄存器和硬件关断路径。为什么故障消失后不能自动恢复很多人第一次写保护逻辑会把逻辑写成if fault: pwm 0 else: pwm controller_output这在仿真里看起来简单但在硬件上很危险。因为故障信号可能是间歇的。比如过流只持续几个采样点或者过压刚好掉回阈值以下。如果故障一消失就自动恢复电源可能在异常边界附近反复开关现场也很难保留。状态机锁存故障的目的不是“让系统更复杂”而是为了保留事故现场变量为什么要保留latched_fault知道最终触发的是 OCP、OVP、UVLO 还是 OTPstate知道故障发生在启动阶段还是运行阶段Vout/Iout/Vin/Temp定位是负载问题、输入问题还是控制问题PWM enable/duty确认执行层是否真的关断故障还存在时CLEAR FAULT 为什么不能解除锁存第二组动态注入验证的是清故障边界。工况设计如下时间事件6ms - 11ms注入 OVPVout 14V8ms第一次 CLEAR FAULT11msOVP 注入结束12ms第二次 CLEAR FAULT结果如下8ms 的清故障命令没有让系统退出FAULT_LATCH因为此时detected fault仍然是 OVP。12ms 再次清故障时Vout 已经回到阈值以下detected fault为 NONE状态机才进入RECOVERY。这个边界很重要。CLEAR_FAULT不是“强行恢复运行”的按钮它只能表达“用户或上层系统请求清除已消失的故障锁存”。如果故障检测仍然有效状态机应该继续留在故障锁存态。软件实现时每层做什么把本章逻辑整理成软件结构可以写成measurements adc_sample() detected_fault protection_check(measurements) power_state_machine_step(command, detected_fault) if state in SOFT_START/RUN: duty voltage_loop(...) else: duty 0 pwm_update(duty) telemetry_log(state, detected_fault, latched_fault, duty)职责边界如下层可以做不应该做ADC/测量层提供 Vin、Vout、Iout、Temp决定故障锁存保护检测层比较阈值输出唯一故障码直接改 duty状态机层状态迁移、故障锁存、清故障边界重复比较电压电流阈值电压环根据Vref_cmd和Vout算 duty判断 OCP/OVP/UVLO/OTPPWM gate根据状态允许或关断 duty决定故障优先级telemetry记录关键变量参与控制决策这样写的好处是调试时可以沿着唯一链路排查测量值是否越阈值 protection_check() 输出什么 fault code state machine 是否进入 FAULT_LATCH latched_fault 是否保存 PWM gate 是否把 duty 关成 0 telemetry 是否记录到了同一件事本章工程边界本章完成的是软件状态机级别的保护行为验证不是完整硬件保护验证。本章能证明检查项本章证据工程判断故障检测有唯一输出优先级注入图和 CSV多故障同时出现时行为确定RUN 状态 OCP 能进入锁存8ms OCP 注入波形状态机能从运行态进入故障锁存FAULT_LATCH 会关断 PWMPWM enable 和 duty cmd 变为 0执行层有统一关断出口故障消失不会自动恢复OCP 消失后仍保持锁存到 12ms故障现场可以保留故障仍存在时不能清除8ms CLEAR FAULT 被忽略清故障有边界条件本章不能证明不覆盖内容原因硬件逐周期过流安全本章没有建硬件比较器和驱动器关断链路MOSFET 应力安全本章不是开关级器件应力仿真ADC 毛刺不会误触发本章没有加入噪声、滤波和去抖自动重启策略合理本章采用手动 CLEAR FAULT不做 hiccup可以直接上硬件还需要硬件保护、采样链路、PWM 影子寄存器和实机联调这个边界不是缺点而是工程分层。第七章只证明“软件状态机的责任链是清楚的”不把硬件保护和噪声处理提前混进来。本章常见误区1. 有了 OCP 判断就等于有了保护状态机OCP 判断只说明检测层看到了过流还没有覆盖故障锁存、恢复边界、故障码记录和 PWM 统一关断路径。状态机要解决的是这些后续动作由谁负责。2. 故障信号消失后应该自动恢复第一版不建议这样做。电源故障经常不是稳定信号。自动恢复策略需要重试次数、冷却时间、输入条件、负载条件和安全策略支持。没有这些边界时手动清故障更容易调试。3. CLEAR FAULT 就是重新启动CLEAR_FAULT只清除已经不存在的故障锁存不代表重新启动。清完故障后进入IDLE是否重新启动由 enable 命令决定。4. 状态机里再判断一遍电压电流会更安全不一定。如果保护检测层已经负责阈值比较状态机再判断一遍会产生双重职责。后续改阈值、改优先级、加滤波时容易出现两处逻辑不一致。第一版更清晰的做法是状态机只消费fault_code。本章总结第七章把保护状态机补上了。本章最重要的结论是保护软件不要写成到处if fault then duty0而要拆成检测、锁存、关断三层。本章仿真结果表明OCP 在 8ms 被检测后状态机进入FAULT_LATCHPWM 在同一状态机采样周期关断模型中关断延迟为 0usOCP 注入结束后锁存故障仍保持到 12ms 清故障命令OVP 仍然存在时8ms 的CLEAR_FAULT不解除锁存OCP、OVP、UVLO、OTP 同时或组合出现时保护层按固定优先级输出唯一故障码下一篇继续做负载突变测试。负载突变要回答的是另一个问题电源在已经正常运行时负载从轻载跳到重载或者从重载跳回轻载Vout 会下陷多少、过冲多少、多久能恢复。那是动态性能问题不和本章的故障锁存职责混在一起。本章配套文件仓库入口https://github.com/Old-Ding/digital-power-buck-sim-lab类型文件作用教程正文blog/07-protection-state-machine.md本章文章复现说明docs/07-protection-state-machine-reproduce.md运行步骤和结果解释MATLAB 故障注入脚本scripts/export_matlab_protection_state_machine_waveforms.m生成状态机波形、故障优先级表和 summarySimulink 结构截图脚本scripts/export_simulink_protection_state_machine_snapshot.m生成保护状态机结构模型和截图Simulink 结构模型models/simulink/buck_protection_state_machine_logic.slx展示保护状态机数据流Simulink 结构截图assets/screenshots/07-simulink-protection-state-machine-logic.png正文结构图动态故障注入数据waveforms/07-matlab-protection-state-machine-trace.csvRUN 状态 OCP 注入采样点清故障边界数据waveforms/07-matlab-protection-clear-while-fault-trace.csvOVP 仍存在时清故障采样点故障优先级数据waveforms/07-matlab-protection-priority-cases.csv多故障组合的唯一故障码指标汇总waveforms/07-matlab-protection-state-machine-summary.csv本章关键指标正文波形waveforms/07-matlab-protection-*.png本章使用的 MATLAB 图表运行方式matlab-batchrun(scripts/export_simulink_protection_state_machine_snapshot.m); exitmatlab-batchrun(scripts/export_matlab_protection_state_machine_waveforms.m); exit如果 MATLAB 没有加入系统 PATH可以把matlab换成本机 MATLAB 的完整路径。技术交流如果你在复现模型、运行脚本或判断保护状态机波形时遇到问题可以加入技术交流群交流。仓库中的模型、脚本、数据和图表可以直接使用交流群主要用于复现答疑和后续技术讨论。渠道信息QQ 群嵌入式交流群加群链接https://qm.qq.com/q/rygrSD2Ddu微信交流微信入口会不定期更新可在 QQ 群内获取提问时建议附上 Simulink 结构截图、summary CSV、状态机波形和你自己的故障注入工况。这样更容易定位问题也更容易形成有效交流。
【数字电源/MATLAB+PLECS】如何进行 Buck 数字电源仿真(七)保护状态机怎么锁存故障并关断 PWM
前面几章已经把 Buck 数字电源里几条主控制链路补起来了。第四章讲离散 PI 电压环第五章讲 duty 限幅和 anti-windup第六章讲软启动参考值怎么进入电压环。做到这里正常启动和正常闭环已经能跑出比较干净的波形。但是电源软件不能只关心“正常时怎么调”。真正上硬件前还必须回答另一个问题什么时候允许 PWM 输出 什么时候必须立刻关断 PWM 故障发生后故障码由谁保存什么时候允许清除这就是本章要讲的保护状态机。配套 GitHub 仓库digital-power-buck-sim-lab本章提供 Simulink 保护状态机结构截图、MATLAB 故障注入脚本、状态迁移 CSV、故障优先级 CSV 和正文波形图。正文波形来自 MATLAB R2024b 脚本导出结果。本章先回答什么问题本章只做一件事把“保护检测、故障锁存、PWM 关断”拆成三个清晰职责并用故障注入数据验证状态机行为。本章会讲清楚为什么保护阈值判断不应该散落在 PI、PWM、软启动和状态分支里protection_check()应该输出唯一故障码而不是直接改 duty状态机为什么要锁存故障而不是故障信号消失后立刻恢复FAULT_LATCH下为什么必须统一关断 PWMCLEAR_FAULT为什么只有在故障检测已经消失后才有意义多个故障同时出现时为什么需要固定优先级本章暂时不处理负载阶跃动态指标ADC 噪声、采样毛刺和去抖硬件比较器、逐周期限流和驱动器故障脚自动重启、打嗝保护和重试计数C 代码完整单元测试框架MOSFET SOA、二极管反向恢复和开关尖峰这些内容放到后续章节。本章先把软件保护状态机的职责边界讲清楚。为什么不能把保护判断写得到处都是很多初学者写电源控制程序时会很自然地在各处加判断PI 里面看到电压过高duty 0 PWM 更新前看到过流duty 0 软启动时看到欠压退出启动 主循环里看到故障再设置 fault flag这些判断单独看都像是在“更安全”但调试时会出现一个严重问题你很难判断到底是谁关掉了 PWM。更好的分层方式是protection_check() 只检测故障输出一个 fault code power_state_machine_step() 只消费命令和 fault code决定状态和故障锁存 PWM gate 只根据状态决定 duty 是否允许输出 telemetry 只记录状态、故障码、PWM 使能和 duty保护层负责“发生了什么故障”状态机负责“系统处于什么状态”执行层负责“PWM 是否输出”。这三个职责不要互相越界。本章使用的状态机结构本章生成了一个 Simulink 结构模型用来展示数据流和职责边界这张图按从左到右的顺序看模块输入输出职责protection_check()Vin、Vout、Iout、Tempfault_code比较阈值并输出唯一故障码command and fault muxenable、clear、fault命令/故障输入汇总状态机输入power_state_machine_step()命令和故障码当前状态锁存故障并决定状态迁移soft_start_reference()状态Vref_cmd只在软启动阶段生成参考斜坡voltage_loop_PI()Vref_cmd、反馈量duty 候选值正常闭环控制PWM gate状态和 dutyPWM 输出非运行态统一关断 PWMtelemetry log状态、故障、PWM调试量记录可观测变量这个结构里最关键的一点是保护检测层不直接改 duty状态机不重复比较电压电流阈值PWM gate 不判断 OCP/OVP/UVLO/OTP 的业务含义。状态怎么定义本章用 6 个状态表达第一版电源软件状态机状态含义PWMINIT上电初始化关闭IDLE等待 enable 命令关闭SOFT_START软启动参考值爬坡允许RUN正常闭环运行允许FAULT_LATCH故障锁存关闭RECOVERY清故障后的恢复过渡态关闭基本迁移关系是INIT - IDLE IDLE ENABLE - SOFT_START SOFT_START done - RUN SOFT_START/RUN fault - FAULT_LATCH FAULT_LATCH CLEAR_FAULT no active fault - RECOVERY - IDLE这里故意没有加自动恢复、重试次数和打嗝周期。第一版状态机先保证可观察、可解释、可复现。保护检测只输出一个故障码本章的保护检测优先级是OCP - OVP - UVLO - OTP对应阈值如下保护项条件本章阈值OCPIout Iout_limit6.5AOVPVout Vout_ovp13.2VUVLOVin Vin_uvlo18VOTPTemp Temp_otp95°C为什么要有优先级因为实际系统可能同时出现多个异常。比如短路时输出电流过高输入电压也可能被拉低。如果保护层同时把 OCP 和 UVLO 都往外抛状态机和日志就会变得不确定。第一版更清晰的做法是让保护层集中决定优先级只输出一个故障码。本章用 MATLAB 对保护优先级做了静态故障注入从图里可以看到注入工况触发条件输出故障码normal无异常NONEuvlo onlyVin 低于 18VUVLOovp onlyVout 高于 13.2VOVPocp onlyIout 高于 6.5AOCPotp only温度高于 95°COTPocp ovp uvloOCP、OVP、UVLO 同时存在OCPovp uvloOVP、UVLO 同时存在OVPuvlo otpUVLO、OTP 同时存在UVLO这说明优先级没有散落在多个模块里而是集中在保护检测层。RUN 状态发生 OCP 时会发生什么下面是第一组动态故障注入。工况设计如下时间事件0.5msenable 命令有效0.5ms - 5.5ms进入软启动5.55ms进入 RUN8ms - 9ms注入 OCPIout 7.2A12ms清故障命令14ms再次 enable19.05ms重新进入 RUN仿真波形如下这张图重点看三件事。第一8ms 出现 OCP 后状态从RUN进入FAULT_LATCH。检测到的故障只持续到 9ms但锁存故障保持到 12ms 清故障命令到来。第二进入FAULT_LATCH的同一个采样周期PWM enable 变成 0duty cmd 也被压到 0。这个路径不是 PI 自己决定的而是状态层统一关断。第三12ms 清故障后系统没有直接跳回 RUN而是走RECOVERY - IDLE。后续需要再次 enable才会重新进入SOFT_START最后回到RUN。本章导出的关键指标指标结果首次 OCP 检测时间8msPWM 关断延迟0us锁存故障码OCP清故障进入恢复时间12ms重新进入 RUN 时间19.05ms这里的0us表示在本章离散状态机模型中故障检测和 PWM gate 更新发生在同一次状态机采样里。真实 MCU 上还要继续分析 ADC 采样、任务调度、PWM 更新影子寄存器和硬件关断路径。为什么故障消失后不能自动恢复很多人第一次写保护逻辑会把逻辑写成if fault: pwm 0 else: pwm controller_output这在仿真里看起来简单但在硬件上很危险。因为故障信号可能是间歇的。比如过流只持续几个采样点或者过压刚好掉回阈值以下。如果故障一消失就自动恢复电源可能在异常边界附近反复开关现场也很难保留。状态机锁存故障的目的不是“让系统更复杂”而是为了保留事故现场变量为什么要保留latched_fault知道最终触发的是 OCP、OVP、UVLO 还是 OTPstate知道故障发生在启动阶段还是运行阶段Vout/Iout/Vin/Temp定位是负载问题、输入问题还是控制问题PWM enable/duty确认执行层是否真的关断故障还存在时CLEAR FAULT 为什么不能解除锁存第二组动态注入验证的是清故障边界。工况设计如下时间事件6ms - 11ms注入 OVPVout 14V8ms第一次 CLEAR FAULT11msOVP 注入结束12ms第二次 CLEAR FAULT结果如下8ms 的清故障命令没有让系统退出FAULT_LATCH因为此时detected fault仍然是 OVP。12ms 再次清故障时Vout 已经回到阈值以下detected fault为 NONE状态机才进入RECOVERY。这个边界很重要。CLEAR_FAULT不是“强行恢复运行”的按钮它只能表达“用户或上层系统请求清除已消失的故障锁存”。如果故障检测仍然有效状态机应该继续留在故障锁存态。软件实现时每层做什么把本章逻辑整理成软件结构可以写成measurements adc_sample() detected_fault protection_check(measurements) power_state_machine_step(command, detected_fault) if state in SOFT_START/RUN: duty voltage_loop(...) else: duty 0 pwm_update(duty) telemetry_log(state, detected_fault, latched_fault, duty)职责边界如下层可以做不应该做ADC/测量层提供 Vin、Vout、Iout、Temp决定故障锁存保护检测层比较阈值输出唯一故障码直接改 duty状态机层状态迁移、故障锁存、清故障边界重复比较电压电流阈值电压环根据Vref_cmd和Vout算 duty判断 OCP/OVP/UVLO/OTPPWM gate根据状态允许或关断 duty决定故障优先级telemetry记录关键变量参与控制决策这样写的好处是调试时可以沿着唯一链路排查测量值是否越阈值 protection_check() 输出什么 fault code state machine 是否进入 FAULT_LATCH latched_fault 是否保存 PWM gate 是否把 duty 关成 0 telemetry 是否记录到了同一件事本章工程边界本章完成的是软件状态机级别的保护行为验证不是完整硬件保护验证。本章能证明检查项本章证据工程判断故障检测有唯一输出优先级注入图和 CSV多故障同时出现时行为确定RUN 状态 OCP 能进入锁存8ms OCP 注入波形状态机能从运行态进入故障锁存FAULT_LATCH 会关断 PWMPWM enable 和 duty cmd 变为 0执行层有统一关断出口故障消失不会自动恢复OCP 消失后仍保持锁存到 12ms故障现场可以保留故障仍存在时不能清除8ms CLEAR FAULT 被忽略清故障有边界条件本章不能证明不覆盖内容原因硬件逐周期过流安全本章没有建硬件比较器和驱动器关断链路MOSFET 应力安全本章不是开关级器件应力仿真ADC 毛刺不会误触发本章没有加入噪声、滤波和去抖自动重启策略合理本章采用手动 CLEAR FAULT不做 hiccup可以直接上硬件还需要硬件保护、采样链路、PWM 影子寄存器和实机联调这个边界不是缺点而是工程分层。第七章只证明“软件状态机的责任链是清楚的”不把硬件保护和噪声处理提前混进来。本章常见误区1. 有了 OCP 判断就等于有了保护状态机OCP 判断只说明检测层看到了过流还没有覆盖故障锁存、恢复边界、故障码记录和 PWM 统一关断路径。状态机要解决的是这些后续动作由谁负责。2. 故障信号消失后应该自动恢复第一版不建议这样做。电源故障经常不是稳定信号。自动恢复策略需要重试次数、冷却时间、输入条件、负载条件和安全策略支持。没有这些边界时手动清故障更容易调试。3. CLEAR FAULT 就是重新启动CLEAR_FAULT只清除已经不存在的故障锁存不代表重新启动。清完故障后进入IDLE是否重新启动由 enable 命令决定。4. 状态机里再判断一遍电压电流会更安全不一定。如果保护检测层已经负责阈值比较状态机再判断一遍会产生双重职责。后续改阈值、改优先级、加滤波时容易出现两处逻辑不一致。第一版更清晰的做法是状态机只消费fault_code。本章总结第七章把保护状态机补上了。本章最重要的结论是保护软件不要写成到处if fault then duty0而要拆成检测、锁存、关断三层。本章仿真结果表明OCP 在 8ms 被检测后状态机进入FAULT_LATCHPWM 在同一状态机采样周期关断模型中关断延迟为 0usOCP 注入结束后锁存故障仍保持到 12ms 清故障命令OVP 仍然存在时8ms 的CLEAR_FAULT不解除锁存OCP、OVP、UVLO、OTP 同时或组合出现时保护层按固定优先级输出唯一故障码下一篇继续做负载突变测试。负载突变要回答的是另一个问题电源在已经正常运行时负载从轻载跳到重载或者从重载跳回轻载Vout 会下陷多少、过冲多少、多久能恢复。那是动态性能问题不和本章的故障锁存职责混在一起。本章配套文件仓库入口https://github.com/Old-Ding/digital-power-buck-sim-lab类型文件作用教程正文blog/07-protection-state-machine.md本章文章复现说明docs/07-protection-state-machine-reproduce.md运行步骤和结果解释MATLAB 故障注入脚本scripts/export_matlab_protection_state_machine_waveforms.m生成状态机波形、故障优先级表和 summarySimulink 结构截图脚本scripts/export_simulink_protection_state_machine_snapshot.m生成保护状态机结构模型和截图Simulink 结构模型models/simulink/buck_protection_state_machine_logic.slx展示保护状态机数据流Simulink 结构截图assets/screenshots/07-simulink-protection-state-machine-logic.png正文结构图动态故障注入数据waveforms/07-matlab-protection-state-machine-trace.csvRUN 状态 OCP 注入采样点清故障边界数据waveforms/07-matlab-protection-clear-while-fault-trace.csvOVP 仍存在时清故障采样点故障优先级数据waveforms/07-matlab-protection-priority-cases.csv多故障组合的唯一故障码指标汇总waveforms/07-matlab-protection-state-machine-summary.csv本章关键指标正文波形waveforms/07-matlab-protection-*.png本章使用的 MATLAB 图表运行方式matlab-batchrun(scripts/export_simulink_protection_state_machine_snapshot.m); exitmatlab-batchrun(scripts/export_matlab_protection_state_machine_waveforms.m); exit如果 MATLAB 没有加入系统 PATH可以把matlab换成本机 MATLAB 的完整路径。技术交流如果你在复现模型、运行脚本或判断保护状态机波形时遇到问题可以加入技术交流群交流。仓库中的模型、脚本、数据和图表可以直接使用交流群主要用于复现答疑和后续技术讨论。渠道信息QQ 群嵌入式交流群加群链接https://qm.qq.com/q/rygrSD2Ddu微信交流微信入口会不定期更新可在 QQ 群内获取提问时建议附上 Simulink 结构截图、summary CSV、状态机波形和你自己的故障注入工况。这样更容易定位问题也更容易形成有效交流。