
1. 项目概述与核心价值在电机驱动、数字电源或者任何需要高可靠性功率控制的嵌入式系统里我们工程师最怕的是什么不是代码跑飞也不是算法算错而是硬件层面的“失控”。想象一下一个伺服驱动器正在全速运转电机电流因为负载突变或者短路瞬间飙升如果PWM输出不能在一两个时钟周期内做出正确反应轻则烧毁MOS管重则整个设备报废。这种场景下微控制器自带的普通PWM模块往往力不从心你需要的是一个能“硬连线”响应故障、具备独立保护逻辑的增强型外设。这就是ePWMEnhanced Pulse Width Modulator模块尤其是它的Trip-Zone故障保护区域和事件触发机制从单纯的信号发生器升级为了一个具备自主应急处理能力的智能安全卫士。我接触过不少从通用定时器切换过来的工程师初次面对ePWM那一大堆寄存器时都会有点发怵特别是TZCTL、TZFLG、ETPS这些名字看起来就复杂的寄存器。但一旦理清脉络你会发现这套机制设计得非常精妙和实用。它本质上构建了两条并行的处理路径一条是基于硬件的快速保护路径Trip-Zone另一条是基于事件的灵活控制路径Event Trigger。前者不经过CPU由专用逻辑直接控制PWM输出状态响应速度极快纳秒级后者则允许你基于PWM波形中的特定时刻比如计数器为零、等于比较值等来触发ADC采样或CPU中断实现精准的闭环控制时序。本文将以TI C2000系列微控制器中常见的ePWM模块寄存器为例抛开手册里冰冷的位域描述结合我在电机控制项目中实际踩过的坑带你深入理解TZCTL_TZEINT故障控制与中断使能、TZFLG_TZCLR故障标志与清除、TZFRC_ETSEL故障强制与事件选择以及ETPS_ETFLG事件分频与标志这几个关键寄存器的配置逻辑。你会明白如何配置才能在过流时让PWM输出立即进入高阻态保护桥臂又如何设置才能让ADC恰好在PWM波形的中点进行采样以消除开关噪声的影响。这些知识不仅是寄存器配置更是构建稳定、可靠电力电子系统的基石。2. 核心设计思路安全与精准的双轨制在深入每个寄存器之前我们必须先建立起ePWM事件与故障保护系统的整体框架。很多新手会孤立地看待每个寄存器导致配置前后矛盾保护功能不生效。我的经验是在动笔写代码之前先在纸上画出两条主线故障响应链和事件触发链。故障响应链Trip-Zone Path的核心目标是“快”和“准”。它的起点是外部的故障信号输入引脚如TZ1/TZ2/TZ3这些引脚通常连接到电流采样比较器的输出或电压监控电路。信号进入ePWM模块后其处理流程是信号选择与极性配置TZSEL DCTRIPSEL首先你需要决定哪个物理引脚对应哪种故障类型比如TZ1用于过流TZ2用于过温。这通过TZSEL寄存器配置。更灵活的是数字比较器模块DC可以将内部信号如与CMPA/CMPB比较的结果也作为故障源这需要在DCTRIPSEL寄存器中为DCAH/DCAL等选择输入源。动作模式定义One-Shot vs Cycle-By-Cycle这是最容易混淆的点。One-Shot (OST)模式好比保险丝熔断一旦故障发生PWM输出会立即被锁存在预设的安全状态如高阻态并且不会自动恢复除非软件手动清除故障标志。这用于处理致命的、需要人工干预的故障。Cycle-By-Cycle (CBC)模式则像自动断路器在每个PWM周期开始时如果故障条件仍然存在则输出保护动作如果故障消失则下一个周期自动恢复正常PWM输出。这适用于瞬时过流等可恢复故障。输出动作配置TZCTL当故障被触发时你希望PWM输出引脚EPWMxA/B变成什么状态是高电平、低电平还是高阻态TZCTL寄存器的TZCTL_TZA和TZCTL_TZB位域就是用来定义这个的。高阻态常用于驱动桥的上下管同时关断防止共通。中断使能与状态管理TZEINT, TZFLG, TZCLR硬件保护动作发生后通常需要通知CPU进行日志记录或系统级处理。TZEINT寄存器用于使能故障中断。TZFLG寄存器则像一组状态指示灯告诉你具体是哪种故障触发了。而TZCLR就是清除这些指示灯的开关对于OST故障必须在确认安全后手动清除标志才能解除输出锁定。事件触发链Event Trigger Path的核心目标是“同步”和“灵活”。它的目的是在PWM波形的精确时间点产生触发信号常用于触发ADC转换SOCA/SOCB在电机控制中为了准确采样相电流需要在PWM开关管导通的中间时刻进行采样以避开开关噪声。这可以通过配置ETSEL寄存器选择在计数器等于CMPA或CMPB时产生SOCStart of Conversion脉冲来实现。产生CPU中断EPWMx_INT用于在特定时刻如周期起点触发中断服务程序更新下一个周期的占空比实现电流环控制。事件分频ETPS不是每个PWM周期都需要触发ADC或中断。ETPS寄存器就像一个预分频器可以设定“每N个事件才产生一次触发”这对于降低CPU负载或实现特定谐波抑制算法非常有用。理解这两条链是独立又可能交织的例如数字比较事件既可触发保护也可触发ADC是进行正确配置的第一步。接下来我们逐一拆解关键寄存器。3. 关键寄存器深度解析与配置实战3.1 TZCTL_TZEINT故障行为与中断的指挥所这个寄存器是Trip-Zone Control和Trip-Zone Enable Interrupt的合体一个寄存器管两件事出事了怎么办控制以及要不要通知CPU中断。寄存器结构精讲 从手册的位域图可以看出它分为高16位主要与数字比较器和中断使能相关和低16位主要与直接Trip信号和输出控制相关。我们重点关注与基础故障保护直接相关的部分。低8位Bit 7-0 - 输出动作控制核心TZCTL_DCAEVT1/2(Bit 7-4): 控制数字比较器A事件1和2触发的动作。DCAEVT1通常关联于CMPA的比较事件DCAEVT2关联于CMPB。每个事件有4种动作可选00高阻态、01强制高、10强制低、11无动作。配置心得在过流保护中我常将电流采样值与一个安全阈值在数字比较器中比较当电流超过阈值DCAEVT1触发时配置为强制输出低电平或高阻态立即关闭驱动。TZCTL_TZB/TZCTL_TZA(Bit 3-0): 这是最直接的故障引脚动作控制。当配置在TZSEL中的TZx引脚出现有效电平时直接控制EPWMxB和EPWMxA的输出状态。选项同上。重要提示这里的配置优先级通常高于DCAEVTx且是真正的“硬保护”不经过任何逻辑延迟。高16位中的关键位Bit 22-17 - 中断使能开关TZEINT_DCAEVT1/2,TZEINT_DCBEVT1/2: 使能数字比较器事件的触发中断。TZEINT_OST: 使能One-Shot故障中断。TZEINT_CBC: 使能Cycle-By-Cycle故障中断。配置逻辑是否使能中断取决于你的系统需求。如果故障处理只需要硬件自动保护无需软件记录或复杂响应可以关闭中断以减少CPU负担。但如果需要记录故障类型、次数或进行复杂的系统状态切换如故障降额运行则必须使能相应中断并在中断服务程序ISR中读取TZFLG来判别故障源。实战配置示例假设场景TZ1引脚接硬件过流信号要求触发OST保护并产生中断// 第一步在TZSEL寄存器中配置TZ1为OST故障源假设TZSEL相应位配置已完成 // 第二步配置TZCTL_TZEINT寄存器 EALLOW; // 解除寄存器保护 // 当TZ1触发OST故障时将EPWMxA和B都设置为高阻态安全状态 EPwm1Regs.TZCTL.bit.TZA TZ_FORCE_HIZ; // 0 High-impedance EPwm1Regs.TZCTL.bit.TZB TZ_FORCE_HIZ; // 0 High-impedance // 使能OST故障的中断这样CPU才能知道故障发生了 EPwm1Regs.TZEINT.bit.OST 1; // Enable One-Shot interrupt // 注意TZEINT是TZCTL_TZEINT寄存器的高位部分在CCS的位域定义中常分开访问 EDIS; // 重新使能寄存器保护注意上述代码中的TZ_FORCE_HIZ等常量需要根据具体的头文件定义来替换可能是0也可能是TZ_HIZ这样的宏。务必查阅你所使用芯片的具体外设驱动库定义。3.2 TZFLG_TZCLR故障状态的眼睛与复位键这个寄存器是状态标志和清除控制的合体。TZFLG标志位告诉你“发生了什么”TZCLR清除位让你“收拾现场”。工作原理与注意事项标志位TZFLG当对应的故障事件发生时硬件会自动将该位置1。例如TZ1引脚出现OST故障TZFLG.bit.OST就会变成1。这个标志位会一直保持直到你手动通过TZCLR寄存器清除它。清除位TZCLR这是一个“写1清零”的机制。想清除TZFLG.bit.OST标志就向TZCLR.bit.OST位写1。关键点向TZCLR位写1只会清除对应的TZFLG标志位不会直接影响TZCTL配置的输出动作状态。对于OST故障输出动作是锁存的清除标志后输出是否恢复取决于TZCTL的配置和故障条件是否解除。对于CBC故障输出动作在每个周期开始时会重新评估。中断标志TZFLG.INT这是一个全局中断标志。只要任何使能了中断的故障事件发生该位就会被置1。同时ePWM模块会向CPU的VIM向量中断管理器发送一个EPWMx_TZINT中断请求。一个极其重要的细节手册中明确提到TZFLG.INT标志被清除前模块不会产生新的中断。即使其他故障标志如CBC仍处于置位状态也必须先清除TZFLG.INT才能让后续故障再次触发中断。这避免了中断风暴。实战操作流程在故障中断服务程序中__interrupt void epwm1TzIsr(void) { // 1. 读取标志位判断故障源这是诊断的关键 if (EPwm1Regs.TZFLG.bit.OST 1) { // 处理One-Shot故障可能是严重过流 SystemLogFault(FAULT_OVER_CURRENT_OS); } if (EPwm1Regs.TZFLG.bit.CBC 1) { // 处理Cycle-By-Cycle故障可能是瞬时过流 SystemLogFault(FAULT_OVER_CURRENT_CBC); } // 检查数字比较器事件标志... if (EPwm1Regs.TZFLG.bit.DCAEVT1 1) { // 处理数字比较器A事件1触发的故障 } // 2. 清除具体的故障标志位 EPwm1Regs.TZCLR.bit.OST 1; // 写1清除OST标志 EPwm1Regs.TZCLR.bit.CBC 1; // 写1清除CBC标志 EPwm1Regs.TZCLR.bit.DCAEVT1 1; // 清除数字比较器事件标志 // ... 清除其他已发生的标志 // 3. 最后必须清除全局中断标志TZFLG.INT否则无法接收新中断 EPwm1Regs.TZCLR.bit.INT 1; // 4. 清除PIE中断应答位 PieCtrlRegs.PIEACK.all PIEACK_GROUP2; // 假设ePWM1 TZ中断在Group 2 }避坑指南务必按照“先清具体标志再清全局INT标志”的顺序操作。如果先清了INT标志而具体故障标志如OST还置位着硬件可能会立即再次产生一个中断脉冲导致你的中断服务程序被重复调用。3.3 TZFRC_ETSEL软件强制与事件选择的混合体这个寄存器结构上有点特殊它把软件强制产生故障TZFRC和事件触发选择ETSEL合并在了一起。上半部分ETSEL用于配置ADC启动SOC和ePWM自身中断INT的触发源下半部分TZFRC允许你用软件“模拟”一个故障用于测试。ETSEL部分事件触发源选择ETSEL_SOCAEN/SOCBEN使能ADC开始转换A/B脉冲。ETSEL_SOCASEL/SOCBSEL选择什么事件能产生SOC脉冲。这是实现精准同步采样的核心。0: 由数字比较事件DCAEVT1.soc或DCBEVT1.soc触发。这提供了极高的灵活性你可以用内部比较结果来触发ADC。1h/2h/3h: 由时间基准计数器TBCTR等于0、等于周期值TBPRD、或等于0/周期时触发。这是最常用的方式例如在UP-DOWN计数模式下选择3h可以在PWM波形的波峰和波谷即计数器为0和TBPRD时各触发一次ADC采样非常适合空间矢量调制SVPWM的中点采样。4h/5h/6h/7h: 由计数器等于CMPA/CMPB并且在递增或递减计数时触发。这可以用于在PWM脉冲的中间时刻采样电流。ETSEL_INTENETSEL_INTSEL类似地用于配置ePWM模块自身中断的使能和触发源。中断常用于在PWM周期开始时TBCTR0运行控制算法更新下一个周期的比较值。TZFRC部分软件强制故障TZFRC_CBC/OST/DCAEVT1等向这些位写1会强制产生对应的故障事件并设置相应的TZFLG标志位。这个功能主要用于系统调试和自检。例如在系统启动时你可以通过软件强制一个CBC故障来验证你的故障保护中断服务程序是否能正确响应输出引脚是否能按TZCTL的配置正确动作。实战配置示例配置在PWM周期中点触发ADC采样// 目标在UP-DOWN计数模式下当TBCTR CMPA 且计数器正在递增时触发EPWM1SOCA EALLOW; // 选择触发源CMPA当递增时 (模式4) EPwm1Regs.ETSEL.bit.SOCASEL ET_CTR_EQ_CMPA_INC; // 通常定义为4 // 使能SOCA触发 EPwm1Regs.ETSEL.bit.SOCAEN 1; // 同时我们可能还想在周期开始时产生一个中断用于运行控制循环 EPwm1Regs.ETSEL.bit.INTSEL ET_CTR_ZERO; // 计数器为零时触发通常定义为1 EPwm1Regs.ETSEL.bit.INTEN 1; // 使能ePWM中断 EDIS; // 注意这里还需要配合ETPS寄存器设置分频见下一节。3.4 ETPS_ETFLG事件分频与状态监控如果说ETSEL决定了“何时”触发那么ETPS就决定了“隔多久”触发一次。ETPS是Event Trigger Pre-scale的缩写即事件预分频。ETFLG则是事件触发的状态标志。ETPS - 事件预分频寄存器 这是实现事件降频的关键。以中断事件EPWMx_INT为例ETPS_INTPRD中断周期选择。你可以设定为01第一个事件触发、10第二个事件触发、11第三个事件触发。00则禁用计数器不会产生中断。ETPS_INTCNT中断事件计数器。这是一个只读/硬件自清零的计数器它累加由ETSEL.INTSEL选择的事件发生次数。当INTCNT的值达到INTPRD设定的值时硬件就会产生一个中断脉冲同时将INTCNT自动清零然后重新开始计数。工作流程假设INTSEL选择为“TBCTR0”每个PWM周期开始INTPRD设置为10每2个事件触发一次。那么第一个PWM周期开始INTCNT从0变为1不触发中断。第二个PWM周期开始INTCNT变为2等于INTPRD触发中断同时INTCNT被清零。第三个周期又开始计数...如此循环。这有什么用在电机控制中如果你的电流环控制算法不需要每个PWM周期都更新比如PWM频率很高如20kHz而电流环带宽只需2kHz就可以通过ETPS将中断频率降低到10kHz或5kHz大大减轻CPU负担。ETFLG - 事件触发标志寄存器ETFLG_INT中断标志位。当中断事件被触发时该位置1。与TZFLG.INT类似此标志位被清除前不会产生新的中断。必须在中断服务程序中清除它。ETFLG_SOCA/SOCBSOC事件标志位。重要区别即使这个标志位为1SOC脉冲仍然会继续产生。它仅作为一个状态指示告诉你SOC事件已经发生过了。通常不需要在每次ADC转换后都去清除它除非你需要用软件查询的方式来确认SOC事件的发生。实战配置示例配置每2个PWM周期产生一次中断// 接上一节的ETSEL配置我们已经设置了在TBCTR0时产生中断事件 EALLOW; // 设置中断事件分频每发生2次“TBCTR0”事件才产生一次中断 EPwm1Regs.ETPS.bit.INTPRD ET_2ND; // 通常定义为2代表第二个事件 // 初始时计数器清零虽然硬件会自动管理但初始化时清零是好习惯 EPwm1Regs.ETPS.bit.INTCNT 0; EDIS; // 在ePWM周期中断的服务程序中必须清除中断标志 __interrupt void epwm1Isr(void) { // ... 执行控制算法 ... // 清除ePWM模块级的中断标志以允许下一次中断产生 EPwm1Regs.ETCLR.bit.INT 1; // 清除PIE中断应答位 PieCtrlRegs.PIEACK.all PIEACK_GROUP2; }3.5 数字比较器DC与DCTRIPSEL寄存器高级故障触发输入资料中提到了DCTRIPSEL_DCACTL寄存器这是连接Trip-Zone与ePWM内部数字比较器DC模块的桥梁。DC模块允许你将内部信号如经过滤波的ADC结果与CMPA/CMPB等参考值进行比较其输出DCAEVT1,DCAEVT2,DCBEVT1,DCBEVT2可以作为故障源输入到Trip-Zone子系统也可以作为事件源去触发SOC。核心配置逻辑输入源选择DCTRIPSELDCAHCOMPSEL和DCALCOMPSEL位域用于选择数字比较器A的高High和低Low输入信号来源。通常你可以选择外部的TZ1/TZ2/TZ3引脚也可以选择来自ADC结果寄存器的信号具体取决于芯片型号。高输入和低输入经过比较逻辑后可以产生DCAEVT1和DCAEVT2事件。事件映射产生的DCAEVT1等事件可以作为故障源通过配置TZSEL寄存器将其映射为CBC或OST故障源。然后在TZCTL中配置其触发时的输出动作在TZEINT中决定是否产生中断。作为SOC触发源通过配置ETSEL寄存器的SOCASEL等位选择DCAEVT1.soc作为ADC启动触发源。作为同步信号通过DCACTL.EVT1SYNCE等位可以将该事件输出给其他ePWM模块作为同步信号。应用场景实现基于软件阈值的过流保护。硬件比较器可能只有一个固定阈值而通过DC模块你可以将实时的电流采样值来自ADC与一个由软件动态调整的安全阈值存放在CMPA寄存器中进行比较。当电流值超过CMPA时DCAEVT1触发进而立即通过Trip-Zone关闭PWM输出实现了比单纯硬件比较器更灵活、更智能的保护。4. 完整配置流程与最佳实践理解了单个寄存器后我们需要一个系统性的配置流程。以下是一个针对电机驱动中过流保护的典型配置步骤涵盖了从故障输入到事件触发的完整链条步骤1全局与引脚配置初始化系统时钟、PIE向量表。配置GPIO复用将所需引脚设置为ePWM输出模式EPWMxA/B和Trip-Zone输入模式TZx。注意TZ引脚通常有异步路径确保其滤波和同步设置在TZSEL或相关GPIO寄存器中符合你的响应速度要求。对于需要极快响应的保护应使用异步路径。步骤2时基与比较模块配置配置TBCTL时基控制寄存器设置计数模式UP/DOWN、频率通过TBPRD和相位。配置CMPCTL和CMPA/CMPB寄存器生成初始PWM波形。同时CMPA的值也将作为数字比较器DC的软件阈值。步骤3Trip-Zone故障保护配置选择故障源配置TZSEL寄存器指定哪个TZ引脚或数字比较事件用于OST哪个用于CBC。例如TZSEL.bit.OSHT1 1TZ1作为OST源TZSEL.bit.CBC1 1TZ1也作为CBC源。配置数字比较器如需要配置DCTRIPSEL寄存器为DCAH/DCAL选择输入源例如选择ADC结果寄存器。配置DCACTL等寄存器设置比较逻辑大于、小于等和滤波参数。定义保护动作配置TZCTL寄存器。对于OST故障我通常设置为TZ_FORCE_HIZ高阻态。对于CBC故障可以设置为TZ_FORCE_LOW强制低来关闭下管或上管。使能中断配置TZEINT寄存器使能OST和/或CBC中断以便CPU记录故障。清除可能存在的残留标志在初始化最后向TZCLR寄存器的所有位写1清除所有故障标志。步骤4事件触发配置用于ADC采样选择触发事件配置ETSEL寄存器。例如ETSEL.SOCASEL ET_CTR_EQ_CMPA_INC在计数器递增到等于CMPA时触发SOCA。设置事件分频配置ETPS寄存器。如果每个PWM周期都需要采样则ETPS.SOCAPRD ET_1ST如果需要隔一个周期采样则设置为ET_2ND。使能触发将ETSEL.SOCAEN置1。配置ADC模块将ADC的启动触发源SOC配置为来自ePWM的EPWMxSOCA信号。步骤5中断服务程序ISR编写Trip-Zone故障ISR如前所述先读取TZFLG判断故障类型执行安全操作如关闭所有驱动、点亮故障灯然后清除具体的TZFLG位最后清除TZFLG.INT和PIE应答位。ePWM周期中断ISR执行控制算法如读取ADC电流值运行PID更新CMPA值然后清除ETCLR.INT标志和PIE应答位。ADC转换完成ISR读取ADC结果进行标定和处理为控制算法提供数据。5. 常见问题排查与调试技巧在实际项目中ePWM的Trip-Zone和事件触发配置不出问题几乎是不可能的。下面是我总结的几个最常见的问题和排查方法问题1配置了Trip-Zone保护但过流时PWM输出没有反应。检查1TZ引脚输入有效吗用示波器或逻辑分析仪确认故障发生时TZ引脚的电平是否发生了预期跳变例如从高变低。注意引脚的有效电平是高有效还是低有效这通常在TZSEL或GPIO配置中设置。检查2TZSEL寄存器配置正确吗确认你将正确的TZ引脚例如TZ1映射到了OST或CBC功能上。TZSEL.bit.OSHT1或TZSEL.bit.CBC1是否已置1检查3TZCTL输出动作配置了吗TZCTL.bit.TZA和TZCTL.bit.TZB是否被设置为非11Do nothing的值11意味着无动作。检查4TZ引脚是否被其他功能复用检查GPIO复用寄存器确保该引脚当前功能是TZ输入而不是普通GPIO或其他外设。检查5是否有同步SYNC问题如果TZ信号被配置为需要与系统时钟同步同步路径则会引入几个时钟周期的延迟。对于需要极快响应的保护考虑使用异步路径如果芯片支持。问题2ADC没有在预期的时刻被触发采样。检查1SOC触发信号产生了没有首先检查ETFLG.bit.SOCA标志位。在运行中这个标志应该周期性地被置1。如果没有说明触发事件没产生。检查2ETSEL配置对吗确认ETSEL.SOCASEL选择的事件是否真的会在你的PWM波形中发生。例如如果你选择CTR_EQ_CMPA_INC但在你的计数模式下CMPA的值设置得大于TBPRD那么这个事件永远不会发生。检查3ETPS分频设置是否过大如果ETPS.SOCAPRD设置为ET_3RD那么需要三个触发事件才会产生一个SOC脉冲。确认你的期望频率。检查4ADC模块配置正确吗ePWM的SOC信号只是给ADC的一个“敲门砖”。确保ADC模块的触发源已正确选择为对应的EPWMxSOCA并且ADC的SOC通道已使能。调试技巧可以将EPWMxSOCA引脚通过GPIO复用功能输出到某个测试脚用示波器直接观察这个触发脉冲是否生成以及其时间点是否准确。问题3故障中断或周期中断进不去或者只进一次。检查1中断使能了吗这是一个三层使能结构1) ePWM模块级TZEINT或ETSEL.INTEN2) PIE控制器级PIEIERx.y3) CPU级IER寄存器。缺一不可。务必在初始化代码中全部使能。检查2中断标志清除了吗这是最常见的原因。在中断服务程序ISR中你必须清除ePWM模块级的标志对于TZ中断是TZCLR.INT1对于周期中断是ETCLR.INT1。PIE级的中断应答位PieCtrlRegs.PIEACK.all PIEACK_GROUPx;x是对应的组号。如果只清除了PIEACK而没清模块标志中断只会发生一次。如果只清了模块标志没清PIEACK则同组其他中断会被阻塞。检查3中断向量表配置正确吗确认你的ISR函数地址已正确赋值给PIE向量表中对应的位置。检查4ETPS.INTPRD设置是否为0INTPRD0会禁用中断事件计数器导致永远不会计数到阈值自然不会产生中断。问题4使用数字比较器DC作为故障源但保护不动作。检查1DC模块使能并配置了吗除了DCTRIPSEL还需要配置DCCTL等寄存器来使能比较器、选择比较模式如大于、小于、配置滤波等。检查2输入信号路径正确吗确认你选择的DC输入源如DCAH确实连接到了你期望的信号例如某个ADC结果寄存器。这可能需要配置其他外设的交叉触发或输出路径。检查3TZSEL中映射正确吗你需要将DCAEVT1等事件在TZSEL寄存器中映射为OST或CBC的触发源。例如TZSEL.bit.DCAEVT1.bit.OST 1。检查4数字比较器的输出是电平还是脉冲有些DC模块配置为锁存模式一旦触发其输出事件会保持直到被软件清除。这可能会影响CBC模式的行为因为CBC需要每个周期重新评估故障条件。调试的终极武器软件强制TZFRC ETFRC当你怀疑是硬件信号问题还是配置问题时善用TZFRC和ETFRC寄存器。在代码中手动置位TZFRC.bit.CBC 1观察PWM输出是否按TZCTL的配置动作以及TZFLG标志是否置位中断是否能进入。这能迅速帮你定位问题是出在外部信号输入环节还是内部的配置与响应环节。同样手动置位ETFRC.bit.SOCA 1可以测试ADC触发链路是否通畅。