资讯动态

C2000三层硬件保护链路:CMPSS、DCEVT与Trip-Zone实战解析

发布时间:2026/10/6 6:31:48 来源:尧图企业网站定制
做了几年电机控制和数字电源的工程师大概率都经历过类似的场面实验室里正调着板子突然“啪”一声IGBT炸了或者MOS管冒烟了。排查下来多数情况不是算法算错了而是保护没来得及动作——等CPU的中断跑到功率器件早就凉了。在TI C2000系列DSP上解决这个问题的核心就是CMPSS比较器子系统、DCEVT数字比较事件和Trip-Zone跳闸区这三层硬件保护链路。这篇文章我就把这套机制从原理到配置完整拆开讲包括寄存器怎么配、阈值怎么算、哪些坑最容易踩以及怎么验证保护链路是真的“快”。如果你用过STM32的刹车功能Break Input再看C2000这套东西会发现它的思路是把“刹车”拆成了三个独立又互相咬合的层级CMPSS负责把模拟信号快速变成数字事件DCEVT负责对这个事件做源选择和滤波整形最后一层的Trip-Zone才真正去强制PWM引脚输出安全电平。每一层都能独立配置组合起来就能实现纳秒级响应的硬件保护完全不依赖软件中断。下面我按这条链路从前到后、再从原理到实战一层层讲清楚。1. 为什么要用三层硬件链路纯软件保护的响应速度根本不够1.1 一个让人肉疼的真实场景先说一个我早年的教训。第一次做BLDC电机控制器时我用的是最“朴素”的方案电流采样通过运放放大后送进ADC然后ADC转换完成中断里判断电流是否超限超了就软件拉低PWM输出。程序写起来非常直观调起来也顺利直到有一天做堵转测试——电机堵住电流迅速飙升当我看到波形上电流已经超过IGBT额定值而PWM还在正常输出时就知道这个方案要出事。后来改了思路把过流信号引到MCU的GPIO外部中断里情况好了一些但外部中断从触发到进入ISR、再执行PWM寄存器清零中间隔了十几个时钟周期加上中断响应本身的延迟和GPIO去抖时间整体下来也要几百纳秒到几微秒。对功率器件来说几百纳秒的短路电流已经足够让它进入危险区。这就是纯软件保护的先天缺陷它走的是“模拟采样→ADC/比较器→中断→CPU执行指令→改寄存器”这条路每一步都有不可控的延迟。而功率器件烧毁往往就在几十到几百纳秒之间。1.2 硬件保护链路的精妙分工CMPSS、DCEVT和Trip-Zone的组合本质上把“检测→决策→执行”全部从CPU手上拿走了。CMPSS里有一个模拟比较器它实时比较外部输入电压和内部DAC设定的阈值电压只要输入超过阈值比较器输出翻转。注意这一步是纯硬件的延迟只有几十纳秒比任何ADC都要快得多。DCEVT在EPWM模块内部负责对CMPSS送过来的数字信号做源选择、极性处理、滤波整形、blanking窗口管理最终生成一个可控的数字比较事件。这个事件可以直接触发Trip-Zone。Trip-Zone收到触发后立即将PWM输出强制为预先设定的安全电平比如强制低或高阻完成保护动作的“最后一跳”。这套链路中软件CPU完全不需要参与触发过程整个过程都在硬件内部完成。软件要做的事是提前配置好阈值、滤波参数和强制动作以及在故障中断里记录事件、判定故障类型、决定后续恢复策略。理解了这个分工后面看每一层寄存器的功能就有目标了。2. CMPSS比较器子系统从模拟信号到数字事件的“哨兵”2.1 CMPSS的基本架构和工作模式CMPSS全称是Comparator Subsystem在F28004x、F2837x这些较新的C2000型号上是标配。每个CMPSS模块内部有两个独立的模拟比较器一个叫高端比较器CTRIPH一个叫低端比较器CTRIPL外加两个12位的DAC和对应的输出滤波器。CTRIPH用于检测输入信号是否高于某个阈值CTRIPL用于检测是否低于某个阈值所以我通常会拿一组CMPSS同时做“过流保护”和“母线欠压保护”比如用CTRIPH监视相电流上桥臂并设定过流阈值用CTRIPL监视母线电压并设定欠压阈值。比较器的输入引脚固定连接到CMPINx可接受的电压范围和ADC输入一样一般是0~3.3V。如果你要检测的是大电流信号外部必须有对应的电流传感器和调理电路把电流信号线性映射到这个电压范围内。具体选什么采样电阻、运放电路留到后面实战部分再说这里先明确一点CMPSS的输入信号必须是电压而且必须在0~3.3V范围内否则内置ESD保护二极管都不一定能救得了你的引脚。2.2 DAC阈值电压的计算CMPSS内部DAC是12位参考电压一般是VDAC通常是3.3V。计算非常简单最终DAC输出电压是[ V_{DAC} \frac{DACVAL}{4096} \times V_{DAC_REF} ]反过来给定一个需要的阈值电压 ( V_{TH} )需要的寄存器值是[ DACVAL \frac{V_{TH}}{V_{DAC_REF}} \times 4096 ]举个例子我的电流检测电路里传感器输出0.5V代表无电流满量程3.0V对应100A我想在85A时触发过流保护那么85A对应的电压就是 ( 0.5 (85/100) \times (3.0-0.5) 2.625V )。算下来 DACVAL ( 2.625 / 3.3 \times 4096 \approx 3258 )取整后写成3258就可以了。这个值可以在运行中随时修改因为它支持shadow加载模式配合PWM同步信号可以在周期起始点更新实现动态过流点。注意CMPSS的DAC寄存器默认工作在shadow模式修改CMPSSDACVAL寄存器后需要等待特定同步事件到来才会真正生效到比较器的参考端。如果你第一次配置完发现比较器总是没反应多半是忘了等shadow加载完成或者没有触发同步。2.3 输出极性、滤波与锁存CMPSS比较器原始的异步输出既可以直连给后级模块使用也可以先经过数字滤波再输出。在CMPSSCTL1寄存器里可以通过COMPDACE位使能DAC通过COMPHSOURCE选择输入源通过INVHSOURCE选择比较器输入是否反相。CMPSSCTL2寄存器则是滤波配置的核心CTRIPHFILCLK是滤波时钟分频CTRIPHFILTHRESH是滤波采样阈值CTRIPHFILEN打开滤波使能CTRIPHINV控制输出极性。滤波的本质是在一个采样周期窗口内需要连续采样到N次高电平输出才判定为高。这就把尖峰干扰过滤掉了。这里要做一个很重要的权衡。滤波强度越高抗干扰能力越强但引入的延迟也越大。虽然滤波器都在硬件里延迟也就几百纳秒级别可对短路保护来说每多一百纳秒IGBT承受的短路能量就多一分。我一般建议除非你的应用存在明显的开关振铃干扰否则过流保护这条路径上不要开太强的滤波。滤波器的配置值可以先从一个较低的门槛开始比如连续采样4次通过测试时再看误触发的频率。CMPSS还有一个锁存功能在CMPSSCTL1里配置TRIPHLATCH置1后比较器输出一旦有效就会锁存住即使输入信号恢复输出也保持有效状态必须软件写1到对应锁存清除位才能解锁。这个特性很适合做“故障记忆”因为对电机控制来说过流之后无论电流是否恢复系统都需要停机检查让故障状态保持住软件才能可靠地记录发生过的事。但要注意锁存后的清除操作是有顺序的必须先消除触发条件比如把DAC阈值调到安全范围或等输入电压回到正常区间再清锁存否则锁存会立刻再次置位。3. DCEVT数字比较事件把比较结果变成PWM可控事件的桥梁3.1 DCEVT在EPWM中的位置CMPSS输出的CTRIPH/CTRIPL信号并不会直接跳到Trip-Zone而是先进到EPWM模块内部的DCEVT。EPWM模块里有两组数字比较事件输入一组叫DCADigital Compare A与EPWMxA关联一组叫DCBDigital Compare B与EPWMxB关联。每组内部又有EVT1和EVT2两个事件。整个DCEVT的作用就是把各种源信号通过一个可编程的多路选择器和滤波网络整理成事件信号再送给Trip-Zone和ADC触发等下游模块。为什么要多这一层中转直接接不是更快吗从延迟角度直连确实快TI的数据手册里CMPSS的异步输出直连Trip-Zone路径延迟可以压到非常低。但问题是直接直连你就失去了所有灵活性没办法切换信号源、没办法加blanking窗口屏蔽开关噪声、没办法做多个信号的组合逻辑。DCEVT这层虽然增加了一点传递延迟但换来了工程上极其重要的灵活性。实际项目中我几乎总是让CMPSS信号先经过DCEVT再触发TZ只有某些对延迟极其敏感的短路保护场景才会额外走一条CMPSS直连TZ的旁路。3.2 DCTRIPSEL源选择与事件组合DCTRIPSEL寄存器负责选择DCAH、DCAL、DCBH、DCBL这四个输入源分别接到哪个CMPSS通道、哪个外部引脚。比如我想让DCA的H通道对应CMPSS1的CTRIPH输出那么EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL 0; // 选择CMPSS1 CTRIPH每个源也可以关闭或者选择来自INPUTXBAR的外部信号这样GPIO上的外部故障信号、紧急停止信号也能进入同一个DCEVT逻辑统一管理。DCACTL和DCBCTL寄存器则定义EVT1和EVT2的触发源是滤波前的输入还是滤波后的输入以及是否需要同步到某个时钟域。我习惯使用滤波后的信号因为在电机驱动中开关瞬间的振铃太常见了完全不用滤波等于把误触发风险全部抛给后级。事件组合的逻辑也很有用。比如DCAEVT1可以用DCAH触发也可以用DCAL触发甚至可以通过DCACTL里的SRCSEL位选择是否用另一个事件的异或组合。实质上让你两个比较器、四路信号通过配置就能构成简单的与或逻辑。工程上最常见的用法是DCAEVT1选择DCAH即只当过流信号有效时才触发DCAEVT2选择DCAL用于检测母线欠压。3.3 Blanking窗口消除PWM开关噪声的利器DCFCTL寄存器控制滤波和blanking。滤波前面已经说过原理blanking是另一个非常实用的功能它可以设置一个时间窗口在这个窗口内屏蔽DCEVT输入防止PWM开关瞬间的电流尖峰引起误触发。电机驱动的电流波形在MOSFET开关动作时会有明显的振铃如果CMPSS阈值设置得离正常工作点太近每次开关都可能误报过流。blanking窗口的触发源通常选择为PWM时基的周期事件或比较事件窗口的起点和宽度由BLANKE选择、BLANKINV决定窗口在事件之前或之后BLANKPULSE设置脉冲宽度。以一个20kHz、周期50微秒的PWM为例PWM周期开始时上管开通电流瞬态尖峰可能持续几百纳秒。我可以在PWM周期事件也就是计数归零的时刻产生一个blanking窗口窗口长度设置为几百纳秒到一微秒。在这个窗口内即使CMPSS比较器输出翻转DCEVT事件也不会生成自然就不会误触发Trip-Zone。窗口结束后比较器的输出实时性完全恢复。这里的关键是窗口不能太长太长了等于把故障屏蔽掉一部分我有一次为了消除误触发把blanking窗口拉到5微秒结果真的过流时保护慢了一拍差点出事。经验值blanking窗口长度不超过PWM周期的1%到2%或者不超过开关振铃持续时间的1.5倍。DCFCTL还有一个PUSHSRC位和PULSESEL位可以控制DCEVT事件是否会被一个短脉冲扩展。因为比较器事件可能持续的时间极短后级模块如果来不及采样就可能错过脉冲扩展可以把它拉长到一个确定的宽度保证下游一定能识别到。对Trip-Zone这种边沿触发敏感的模块合理使用脉冲扩展能避免漏保护。4. Trip-Zone的强制动作机制从事件到引脚安全电平的最后一跳4.1 TZSEL把事件路由到正确的触发源Trip-Zone直译叫“跳闸区”它本质上是一个强制输出控制模块。每个EPWM模块有多路Trip-Zone源可以是来自外部引脚的TZ1、TZ2、TZ3信号也可以是内部DCEVT的事件信号以及一些CMPSS的直连信号。TZSEL寄存器决定哪些信号源有效以及是以one-shot模式还是cycle-by-cycle模式触发。One-shot模式适合真正的故障保护一旦触发PWM输出立即被强制到预设的安全状态并一直保持直到软件明确清除标志。Cycle-by-cycle模式俗称“过流限流”模式每个PWM周期都会检查故障信号如果在周期内故障消失PWM会在下一个周期自动恢复。它很适合那种不希望彻底停机、想要折叠限流继续运行的应用比如电机启动瞬间的大电流限制。TZSEL寄存器的底层实现是每个源对应一个位写1表示使能该源并选择one-shot还是CBC写0表示禁用。拿我们最常用的配置来说// DCAEVT1触发one-shotDCAEVT2触发CBC EPwm1Regs.TZSEL.bit.DCAEVT1 1; // OST用于过流故障一次跳闸 EPwm1Regs.TZSEL.bit.DCAEVT2 3; // CBC用于逐周期限流TZSEL位域的具体编码不同型号略有差异但大的逻辑一致。我会以F28004x为例读者在其他型号上需要对照对应技术参考手册TRM的寄存器描述确认编码。4.2 TZCTL配置PWM引脚的强制输出状态Trip-Zone触发后EPWMxA和EPWMxB引脚输出什么状态由TZCTL寄存器决定。每个PWM输出通道可以单独配置选项有强制高、强制低、强制高阻、不做改变。对于电机控制的桥式电路我习惯把上下管对应的EPWMxA和EPWMxB都强制为低这样无论之前占空比是多少故障时两个管子都关断避免直通烧毁对于某些需要外部硬件上拉到安全电平的场景也可以配置为高阻让外部电路决定最终状态。关键点来了TZCTL只是定义了触发后的输出状态它不会管你是否配置了PWM动作限定AQ的优先级。当TZ生效时它的优先级高于所有正常的PWM动作比如比较器匹配、周期匹配所以无论之前PWM输出的是什么都会被立刻覆盖到安全状态。这也是Trip-Zone可靠的底气所在。还需要注意F28004x的TZCTL里还有个TZCTL2寄存器用于配置DCAEVT1和DCAEVT2信号本身作为强制源时的状态。在一些更复杂的拓扑比如T型三电平逆变器里故障时A相和B相需要不同的安全状态TZCTL2能让每个DCEVT事件对应不同的输出动作这点设计工具往往没注意实际上是三电平项目里的关键寄存器。4.3 中断、标志位和清除时序每次TZ触发后事件会记录在TZFLG寄存器中。OST标志位记录one-shot触发CBC标志位记录cycle-by-cycle触发INT标志位表示TZ中断是否发生。这些标志需要软件确认后写TZCLR清除而且清除顺序有讲究必须先清除触发源造成的标志再清除中断标志。如果故障源本身没有被消除比如CMPSS输入信号仍然超过阈值即使你把TZCLR清零了Trip-Zone也会立刻再次强制PWM到安全状态。所以软件上的处理顺序应该是进入TZ中断后先读取故障状态例如CMPSS比较器输出寄存器、TZFLG判断是哪一路触发的然后关闭PWM或者封锁驱动使能防止重新开启接着把CMPSS阈值调整到安全范围或者确认输入信号已经回落最后才清除TZ标志并重新使能PWM。TZFRC寄存器是一个用于软件强制触发Trip-Zone的测试位可用于调试。在刚焊接好新板子、还没有实际电流时我经常用TZFRC把TZ强制触发验证PWM波形是否会在故障时正确落到低电平。这是保护机制验证的关键手段后面实战部分会细说。5. 实战从零搭建一条完整过流保护链路5.1 系统需求分析与方案选型假设我要做一个电机驱动母线电压48V额定相电流20AIGBT规格按37A选取电流传感器用霍尔型输出0~3.3V线性对应-50A到50A。项目要求过流保护点设定在30A并且一旦过流就永远停机直到人工复位。同时希望在正常运行电流超过25A时PWM自动折叠限流电流降下来后能自动恢复。根据这个需求我选择用CMPSS1的CTRIPH做30A短路保护走DCAEVT1触发one-shot Trip-Zone用CMPSS2的CTRIPH做25A的逐周期限流走DCAEVT2触发CBC Trip-Zone。两个CMPSS的阈值换算一下30A对应的电压是 ( (30/50) \times 3.3 / 2 1.65 ? )我这里假设传感器中点1.65V对应0A那么30A对应2.64V25A对应2.475V。DACVAL分别算好写入。有人会奇怪为什么不用一个CMPSS的两个比较器主要是我还想留一路L比较器做母线欠压用两个模块更清晰。5.2 CMPSS初始化代码与说明F28004x的CMPSS1寄存器初始化如下void CMPSS_Init(void) { EALLOW; // CMPSS130A过流保护one-shot Cmpss1Regs.CMPSSDACCTL.bit.DACSOURCE 0; // 使用DACLOOP源 Cmpss1Regs.CMPSSDACVAL.bit.DACVAL 2.64 / 3.3 * 4096; // 约3277 Cmpss1Regs.CMPSSCTL1.bit.COMPDACE 1; // DAC输出使能 Cmpss1Regs.CMPSSCTL1.bit.COMPHSOURCE 0; // 比较器H输入选择CMPIN1 Cmpss1Regs.CMPSSCTL1.bit.INVHSOURCE 0; // 不反相输入 Cmpss1Regs.CMPSSCTL2.bit.CTRIPHSEL 0; // 滤波采样配置 Cmpss1Regs.CMPSSCTL2.bit.CTRIPHFILEN 1; // 使能滤波 Cmpss1Regs.CMPSSCTL2.bit.CTRIPHFILCLK 0; // 滤波时钟不额外分频 Cmpss1Regs.CMPSSCTL2.bit.CTRIPHFILTHRESH 4; // 连续采样4个周期为高才判定为高 Cmpss1Regs.CMPSSCTL2.bit.CTRIPHINV 0; // 输出极性不反转 Cmpss1Regs.CMPSSCTL1.bit.CTRIPHLATCH 1; // 锁存故障 // CMPSS225A限流CBC Cmpss2Regs.CMPSSDACCTL.bit.DACSOURCE 0; Cmpss2Regs.CMPSSDACVAL.bit.DACVAL 2.475 / 3.3 * 4096; // 约3072 Cmpss2Regs.CMPSSCTL1.bit.COMPDACE 1; Cmpss2Regs.CMPSSCTL1.bit.COMPHSOURCE 0; Cmpss2Regs.CMPSSCTL1.bit.INVHSOURCE 0; Cmpss2Regs.CMPSSCTL2.bit.CTRIPHSEL 0; Cmpss2Regs.CMPSSCTL2.bit.CTRIPHFILEN 1; Cmpss2Regs.CMPSSCTL2.bit.CTRIPHFILCLK 0; Cmpss2Regs.CMPSSCTL2.bit.CTRIPHFILTHRESH 4; Cmpss2Regs.CMPSSCTL2.bit.CTRIPHINV 0; Cmpss2Regs.CMPSSCTL1.bit.CTRIPHLATCH 0; // CBC不需要锁存故障消失可自动恢复 EDIS; }这段代码里有两处值得单独解释。一是滤波CMPSS1是30A短路保护按理说延迟越小越好但开关振铃也是客观存在的所以我开了连续4次采样滤波这个配置在SYSCLK为120MHz时大约会带来几十纳秒的延迟对IGBT保护仍然够快。二是故意不给CMPSS1开锁存以外的复杂配置因为30A是一次性故障触发后就应该锁死等待人工复位。5.3 DCEVT和Trip-Zone配置代码接下来把两个CMPSS事件接到EPWM1的Trip-Zone上void EPWM_TripZone_Init(void) { EALLOW; // DCEVT源选择DCAH接CMPSS1 CTRIPHDCAL不接 EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL 0; // CMPSS1 CTRIPH EPwm1Regs.DCTRIPSEL.bit.DCALCOMPSEL 1; // CMPSS2 CTRIPH // DCFCTL使能blanking用PWM周期事件产生blanking窗口 EPwm1Regs.DCFCTL.bit.PUSHSRC 0; // 输入源为DCTRIPSEL选择后的信号 EPwm1Regs.DCFCTL.bit.BLANKEN 1; EPwm1Regs.DCFCTL.bit.BLANKE 0; // 使用T2周期事件作为blanking参考 EPwm1Regs.DCFCTL.bit.BLANKINV 0; // 窗口在参考事件之后 EPwm1Regs.DCFCTL.bit.BLANKPULSE 100; // 1us窗口需要根据PWM周期换算 // DCAEVT1使用滤波后的输入作为one-shot触发 EPwm1Regs.DCACTL.bit.EVT1SRCSEL 1; // 使用滤波后的输入信号 EPwm1Regs.DCACTL.bit.EVT1FRCSYNCSEL 0; EPwm1Regs.DCACTL.bit.EVT1SOCE 0; // 不触发ADC SOC // DCAEVT2同样使用滤波后输入用于CBC限流 EPwm1Regs.DCACTL.bit.EVT2SRCSEL 1; EPwm1Regs.DCACTL.bit.EVT2FRCSYNCSEL 0; EPwm1Regs.DCACTL.bit.EVT2SOCE 1; // 限流事件同时触发ADC采样记录电流值 // TZSELDCAEVT1 - OSTDCAEVT2 - CBC EPwm1Regs.TZSEL.bit.DCAEVT1 1; // one-shot EPwm1Regs.TZSEL.bit.DCAEVT2 3; // CBC // TZCTL故障时EPWMxA和EPWMxB都强制低 EPwm1Regs.TZCTL.bit.TZA 2; // 2 force low EPwm1Regs.TZCTL.bit.TZB 2; // 2 force low // 使能TZ中断OST和CBC都进中断 EPwm1Regs.TZEINT.bit.OST 1; EPwm1Regs.TZEINT.bit.CBC 1; EDIS; }这段代码有几个容易踩的细节。第一DCACTL的EVT2SRCSEL是EVT2的源选择位需要看数据手册的位域定义它和EVT1不完全一样。第二BLANKPULSE的单位不是纳秒而是由PWM时基时钟决定的计数值所以要计算好。第三CBC模式下即使故障信号消失TZFLG的CBC标志也必须由软件清除否则PWM不会恢复——这一点经常被当成“CBC坏了”来排查其实只是没清标志。5.4 中断服务程序与故障恢复逻辑TZ中断ISR中读取TZFLG和CMPSS状态寄存器判断是过流OST还是限流CBC__interrupt void epwm1_tz_isr(void) { uint16_t tzflg EPwm1Regs.TZFLG.all; if (tzflg TZFLG_OST_MASK) { // 过流故障锁死PWM输出点亮故障灯记录错误码 fault_code FAULT_OVERCURRENT; EPwm1Regs.TZCLR.bit.OST 1; // 清除OST标志 // 注意此时PWM输出仍处于强制低状态必须重新初始化才能恢复 // 因此这里什么都不做等待人工复位 } if (tzflg TZFLG_CBC_MASK) { // 逐周期限流事件清除标志即可PWM会自动恢复 EPwm1Regs.TZCLR.bit.CBC 1; } EPwm1Regs.TZCLR.bit.INT 1; // 最后清除中断标志 PieCtrlRegs.PIEACK.all PIEACK_GROUP3; }注意ISR里清除顺序先清TZFLG的OST/CBC再清INT。如果你的代码里反过来很可能中断反复进入因为中断标志一直被置位。还有一个细节OST触发后PWM输出会被强制到安全状态但这并不意味着EPWM时基停止了——时基仍然在跑只是输出通道被强制住。所以在人工复位时你不光要清TZ标志还要检查是否需要重新执行一遍EPWM初始化把输出重新使能。CBC恢复时则不需要它会在下个周期自动恢复正常调制度。5.5 上板实测用TZFRC模拟故障验证保护链路写代码只是第一步上板验证才是关键。我的习惯是先做“无电流强制触发测试”给系统上电PWM正常输出然后用一行代码软件强制触发TZEALLOW; EPwm1Regs.TZFRC.bit.OST 1; // 模拟过流 EDIS;用示波器同时观察EPWM1A和EPWM1B引脚以及CMPSS1输入信号。正常情况下PWM波形会立刻变为低电平而且不会再恢复。从TZFRC置位到引脚真正变低的延迟在示波器上几乎是同一个时刻这正是硬件保护链路的意义。接下来做真实过流测试。用小电流测试平台把电流慢慢加到25A先观察CBC限流是否在正常运作——PWM会被限制在一个较低的有效占空比电流不会继续上升同时每次限流发生时CBC中断标志会周期性置位。然后继续加大电流到30A一旦超过PWM立刻被锁定为低电机停转故障指示灯亮。这个流程走通之后这条保护链路才算真正可靠。6. 工程实用经验滤波脉宽、误触发规避与调试技巧6.1 滤波参数和blanking窗口怎么权衡我在第一部分提到过滤波和blanking都是抗干扰的手段但它们都会“偷走”一部分保护速度。实际调参时我建议遵循以下顺序找出最优参数。先不开放任何滤波和blanking让系统在额定工况下运行观察有没有偶发的TZ触发。如果有用示波器捕捉CMPSS输入信号看触发时刻的波形特征。通常你会发现触发点正好在某个开关动作的上升沿或下降沿附近这就明确指向开关振铃。此时再精确测量振铃持续时间把blanking窗口设置为振铃窗口结束后的1.2倍而不是随手填一个大数。如果blanking窗口覆盖完以后仍然有零星误触发才考虑增加CMPSS的滤波采样次数。有一点容易被忽略blanking窗口的起点是PWM时基的周期或比较事件所以如果你把PWM占空比调到很大开关沿位置会发生变化原本的blanking窗口可能不再和实际振铃位置对齐。因此参数定下来之后最好在几个极端占空比下都跑一下确保全范围内没有误触发漏洞。6.2 排查“保护不动作”和“莫名其妙触发”的思路“保护不动作”比“误触发”更危险。遇到PWM该降不降的情况我有一套固定排查顺序。先用TZFRC强制触发看Trip-Zone链路是不是好的如果强制触发都没反应那大概率是TZCTL的被强制状态配置错了或者EPWM输出被其他模块比如GPIO MUX接管了。如果强制触发PWM能正确变低那问题就出在CMPSS/DCEVT这层比如CMPSS的DAC其实还没加载新值shadow模式的问题或者DCTRIPSEL的源选择落在了通道0上又或者比较器输入引脚被MUX配置成了其他功能芯片引脚根本没有把信号送进比较器。误触发则集中在几个原因CMPSS输入信号本身偏置太大正常工作电流已经接近阈值滤波参数太弱blanking窗口没生效或者TZSEL里本不该使能的源被使能了比如外部TZ引脚悬空被干扰拉低了。排查时我通常会把TZSEL里的所有源全部清掉再一个一个使能用二分法定位出哪条路径是凶手。6.3 一个被很多人忽视的“软恢复”细节关于CBC模式清标志和PWM恢复之间还有一个坑。CBC模式中PWM是否恢复不仅取决于TZCLR的CBC标志是否清除还取决于触发源信号在PWM周期边界时是否仍然有效。如果在清除CBC标志的瞬间故障源还在比如电流仍然超过25APWM不会恢复。只有当下一个PWM周期开始时检测到故障源已经消失并且CBC标志已被清除PWM才会真正恢复。所以软件想要实现“电流回落后自动恢复”需要保证两件事一是及时清除CBC标志二是不要在故障源仍存在时去清标志否则会出现“清了又马上触发”的假象。6.4 这套机制能扩展的玩法CMPSS和DCEVT不只是用来做过流保护它还能做很多事情。比如用DCEVT事件触发ADC的SOC在过流发生的那个周期立即启动采样记录故障瞬间的电流值这对事后分析非常有价值。再比如DCEVT的输出可以通过TRIPOUT信号引出到外部接到下一级功率器件的驱动封锁引脚。还有一些电源项目里会用CMPSS做输入电压的快速前馈在母线电压突然跌落时用CBC模式逐周期降低占空比防止电感电流失控。玩法非常多但底层都是这套架构。我个人的体会是做C2000项目一定要舍得花时间先把保护链路焊死在“不依赖软件”的基础上再回头调控制环。因为功率电路出问题往往是毫秒级甚至微秒级的事软件再聪明也扛不住这种速度。CMPSS、DCEVT、Trip-Zone这套三层架构你把它吃透了它不仅能救你的功率器件还能大幅缩短整机调试时间——很多故障从“烧管子”变成了“记录故障码”这种事情多经历几次你就知道它的价值了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑