C2000 ePWM事件触发与数字比较模块:硬件级精准控制实战解析

发布时间:2026/7/20 11:56:54
C2000 ePWM事件触发与数字比较模块:硬件级精准控制实战解析 1. 项目概述与核心价值在电机驱动、数字电源或者任何需要精确时序控制的嵌入式系统里我们常常面临一个核心挑战如何在特定的、精确的时刻让CPU介入处理或者让ADC开始采样。比如你想在PWM波形的波峰或波谷瞬间采样电流或者在电流超过某个阈值时立即关断PWM输出以保护硬件。如果全靠软件轮询不仅CPU负担重响应延迟也充满不确定性这在高速开关系统中是致命的。这时硬件事件触发机制就成了工程师手中的“王牌”。它就像一位不知疲倦、反应极快的哨兵时刻监视着系统内的各种状态比如计数器值、外部比较器信号一旦预设的条件达成立刻自动发出“警报”中断或下达“行动指令”ADC启动转换完全绕过软件延迟。德州仪器TIC2000系列微控制器中的增强型脉宽调制器ePWM模块其事件触发ET和数字比较DC子模块就是将这一理念发挥到极致的典范。简单来说事件触发ET子模块负责“内部计时”它盯着ePWM自己的计数器TBCTR当计数器等于零、等于周期值、或者等于你设定的比较寄存器CMPA/B/C/D值时这些时刻就被定义为“事件”。它不仅能对每个事件做出反应还能通过预分频Prescaler功能做到“每N个事件才触发一次”这为周期性任务如每5个PWM周期更新一次控制算法提供了极大的灵活性。而数字比较DC子模块则负责“外部响应”它直接连接外部信号如模拟比较器CMPSS的输出将这些外部信号的高低电平变化也转化为ePWM内部可识别的事件进而触发动作。两者结合构成了一个从内部时序到外部信号、全方位、可精密配置的事件响应网络。本文我将结合手册内容和实际调试经验为你深入拆解ePWM的ET和DC子模块。我不会只复述寄存器位域而是重点讲清楚它们为什么这样设计在实际项目中如何配置以及我踩过哪些坑。目标是让你读完就能在下一个项目中自信地运用这些功能构建出响应快、确定性高的控制系统。2. 事件触发ET子模块精准的“内部时钟触发器”事件触发子模块是ePWM模块的“中枢神经”之一它不直接产生PWM波形但决定了CPU何时被中断、ADC何时启动转换这些关键动作的时机。它的核心工作流程可以概括为监控事件 - 可选分频 - 产生输出。2.1 核心工作原理与信号流从系统框图看ET子模块的输入源非常丰富主要来自三个地方时间基准TB子模块提供CTR0计数器归零和CTRPRD计数器达到周期值这两个最基础、最周期性的事件。计数比较CC子模块提供CTRCMPA,CTRCMPB,CTRCMPC,CTRCMPD事件。这里有一个关键细节它还能区分计数器是递增UP还是递减DOWN过程中发生的匹配。例如CTRUCMPA只在计数器增加时匹配CMPA才算作事件这在不对称PWM或中心对称PWM控制中非常有用可以实现更精细的触发点控制。数字比较DC子模块提供DCAEVT1.soc和DCBEVT1.soc这两个由外部信号触发的事件我们会在后面详细讨论。这些输入事件进入ET子模块后首先由ETSEL(Event-Trigger Selection) 寄存器进行“选秀”。你需要在这里指定到底用哪个事件来触发中断INTSEL以及用哪个事件来触发SOCA和SOCBSOCASEL,SOCBSEL。这就好比给不同的警报器分配不同的传感器。选中的事件并不会直接去拉中断或ADC的线而是先进入一个叫做预分频器Prescaler的逻辑。这是ET模块的精华所在由ETPS(Event-Trigger Prescale) 寄存器控制。预分频器本质上是一个计数器它可以被设置为INTPRD 0 禁用不产生中断。INTPRD 1 每个事件都触发中断。INTPRD 2 每2个事件触发一次中断即每隔一次。INTPRD 3 每3个事件触发一次中断。...INTPRD 15 每15个事件触发一次中断。SOCAPRD和SOCBPRD对ADC触发同理。寄存器中的INTCNT,SOCACNT,SOCBCNT则是当前的事件计数你可以读取它们来了解进度。实操心得预分频的妙用很多人一开始会忽略预分频觉得“每个事件都触发”最直接。但在高频PWM应用中例如100kHz如果每个周期都触发中断CPU将不堪重负。一个典型的用法是在电机FOC控制中我们通常在每个PWM周期的中点或特定点用ADC采样相电流。通过设置SOCAPRD 2并选择CTRCMPA作为事件源CMPA设置为周期中点就可以实现每隔一个PWM周期采样一次。这样既保证了采样与PWM同步又将ADC和中断处理的开销降低了一半CPU有更多时间执行复杂的控制算法如Clarke/Park变换、PI调节。当事件计数器INTCNT达到预设的周期值INTPRD时如果中断使能位ETSEL[INTEN]1且中断标志位ETFLG[INT]0表示没有未处理的中断那么硬件会自动产生一个中断脉冲到PIE外设中断扩展模块。将ETFLG[INT]标志位置1。将事件计数器INTCNT清零重新开始计数。2.2 关键寄存器详解与配置流程理解寄存器是配置的前提。下面我以中断生成为例梳理一下配置流程和关键点选择事件源 (ETSEL)INTSEL: 选择中断的事件源。是CTR0,CTRPRD,CTRCMPA还是其他这里的选择直接决定了中断发生的时刻。例如选择CTRPRD中断会在每个PWM周期结束时发生。INTSELCMP: 当INTSEL选择了CMPC或CMPD相关事件时此字段用于进一步选择具体的比较寄存器。这是一个容易被忽略的细节在需要使用CMPC/D做复杂事件时务必注意。配置预分频 (ETPS)INTPRD: 设置中断触发周期即“多少个事件产生一次中断”。设为1是每次设为2是隔一次以此类推。INTPSSEL: 这是一个增强功能选择位。当它为0时使用传统的INTCNT/INTPRD对分频范围是1-3。当它为1时启用增强的ETINTPS寄存器中的INTCNT2/INTPRD2对分频范围可以扩展到1-15。如果你的应用需要大于3的分频一定要将此位置1并使用ETINTPS寄存器。使能与清除 (ETSEL,ETFLG,ETCLR)INTEN: 总中断使能。必须置1事件分频逻辑的结果才会去申请中断。ETFLG[INT]: 中断标志位。硬件置1软件清零。这是一个关键点在中断服务程序ISR中必须手动清除此标志通过向ETCLR[INT]写1否则后续中断将被阻塞。ETFRC[INT]: 软件强制中断位。向此位写1可以手动让INTCNT加1模拟一个事件发生。这在调试和初始化时非常有用。初始化计数器 (ETCNTINIT,ETCNTINITCTL)这是用于INTCNT2/SOCACNT2/SOCBCNT2的增强功能。你可以通过ETCNTINIT[INTINIT]设置一个初始值并通过ETCNTINITCTL[INTINITEN]和[INTINITFRC]控制是在SYNC同步事件时还是软件强制时将计数器初始化为这个值。这在多ePWM模块同步且需要错相触发中断的场景下至关重要。例如三个桥臂的PWM模块同步运行但你希望它们的中断错开一定角度就可以用此功能设置不同的初始计数值。配置代码示例C语言伪代码// 假设我们配置 ePWM1希望在每个PWM周期的峰值点CTRPRD触发中断且每2个周期触发一次。 void EPWM1_ET_Config(void) { // 1. 选择事件源CTRPRD 触发中断 EPwm1Regs.ETSEL.bit.INTSEL ET_CTR_ZERO; // 假设我们改为在CTR0时触发作为例子 // 注意手册中常量可能不同需参考头文件。这里 ET_CTR_ZERO 代表选择 CTR0 事件。 // 2. 配置预分频每2个事件触发一次 EPwm1Regs.ETPS.bit.INTPRD ET_2ND; // 每2次事件 // ETPS.INTCNT 会从0开始硬件自动计数 // 3. 使能中断 EPwm1Regs.ETSEL.bit.INTEN 1; // 使能ET模块向CPU发出中断请求 // 4. 清除可能存在的挂起中断标志重要 EPwm1Regs.ETCLR.bit.INT 1; // 5. 可选如果需要配置SOCA触发例如在CTRCMPA时触发ADC每个事件都触发 EPwm1Regs.ETSEL.bit.SOCASEL ET_CTR_CMPA; // SOCA事件源为CTRCMPA EPwm1Regs.ETPS.bit.SOCAPRD ET_1ST; // 每个事件都触发SOCA EPwm1Regs.ETSEL.bit.SOCAEN 1; // 使能SOCA触发 }2.3 中断与ADC触发逻辑的异同虽然中断EPWMxINT和ADC启动转换EPWMxSOCA/B的触发路径类似但有一个重要区别中断INT是一种“服务请求”。当INTCNT达到INTPRD且中断使能时硬件发出一个脉冲并将ETFLG[INT]锁存为1。这个标志位会一直保持为1直到软件显式清除它。在标志位为1期间即使INTCNT再次达到INTPRD也不会发出新的中断脉冲。这确保了不会丢失中断但也要求ISR必须及时清除标志。ADC触发SOC是一种“动作命令”。当SOCACNT达到SOCAPRD时硬件会直接发出一个启动转换的脉冲给ADC模块。它没有像中断那样的“标志位锁存”机制来阻止连续触发。只要使能SOCAEN1事件条件满足脉冲就会持续产生。这意味着ADC可以被连续、周期性地触发而无需软件干预清除标志。这个区别决定了它们的应用场景中断用于通知CPU进行非实时性要求相对较低的计算或状态更新而SOC用于驱动ADC进行高实时性、周期性的数据采样通常配合DMA实现无人值守的数据搬运。3. 数字比较DC子模块灵活的“外部信号哨兵”如果说ET模块是盯着内部时钟的“计时员”那么DC模块就是盯着外部世界的“哨兵”。它的主要职责是将外部数字信号特别是来自模拟比较器CMPSS模块的跳变信号引入ePWM系统并转化为可以触发动作Trip中断ADC同步的事件。3.1 核心功能与信号通路DC模块的输入信号非常灵活可以通过输入X-BAR和ePWM X-BAR从多个源头选择最常见的是模拟比较器输出 (CMPSSx.TRIPH/L)这是DC模块最典型的输入用于实时监测电流、电压是否超过安全阈值。GPIO引脚任何GPIO都可以配置为Trip输入TZ1, TZ2, TZ3等。其他外设错误信号如CLKFAIL时钟失效、ECCDBLERRECC双比特错误等系统级错误信号也可以作为Trip源。这些输入信号被配置到DCAH/DCAL(Digital Compare A High/Low) 和DCBH/DCBL(Digital Compare B High/Low) 这四条逻辑线上。你可以通过DCAHTRIPSEL,DCALTRIPSEL等寄存器独立选择每个信号的来源。例如可以将CMPSS1的高电平输出表示过流连接到DCAH。DCAH/L和DCBH/L信号随后进入事件限定逻辑。这里你可以定义什么算作一个“事件”。例如可以配置为DCAH从低变高上升沿时产生DCAEVT1DCAL从高变低下降沿时产生DCAEVT2。DCBEVT1/2同理。这些事件DCAEVT1/2,DCBEVT1/2就是DC模块的输出它们被送到三个地方故障保护Trip-Zone子模块通过DCAEVT1.force等信号可以直接强制ePWM输出进入高阻、拉高或拉低状态实现硬件级、纳秒级的故障保护响应速度远超软件中断。事件触发ET子模块通过DCAEVT1.soc信号可以作为ADC触发SOC的事件源。这在需要外部信号触发采样的场景中非常有用比如在峰值电流模式控制中当电流达到设定值时立即触发ADC采样。时间基准TB子模块通过DCAEVT1.sync信号可以产生同步脉冲复位或同步多个ePWM模块的计数器实现复杂的多模块协同工作。3.2 事件滤波空白窗口功能详解外部信号尤其是来自模拟比较器的信号容易受到噪声干扰而产生毛刺。如果不加处理一个毛刺就可能引发误保护或误触发。DC模块的事件滤波Event Filtering通常称为空白窗口Blanking Window就是为解决这个问题而生。它的工作原理很像一个可编程的“屏蔽期”。你可以定义一个时间窗口在这个窗口内DC模块完全忽略输入信号的变化。窗口的起点和长度都可以精确配置。窗口起点 (DCFOFFSET)以某个基准事件如CTR0或CTRPRD脉冲为时间零点延迟OFFSET个TBCLK周期后窗口开始。窗口长度 (DCFWINDOW)窗口开启后持续WINDOW个TBCLK周期。基准事件选择 (DCFCTL[PULSESEL])选择以哪个事件作为时间基准来对齐空白窗口。通常是CTR0周期开始或CTRPRD周期结束。为什么需要这个功能在开关电源的MOSFET或IGBT刚开通的瞬间由于寄生参数和反向恢复电流电流采样信号上通常会有一个巨大的尖峰噪声。如果此时比较器动作会立刻触发错误的保护。通过设置一个从CTR0开始、持续几微秒的空白窗口可以安全地屏蔽掉这个开关噪声只在电流稳定后再开启保护监测。配置示例屏蔽Buck电路上管开通噪声假设PWM频率为500kHz周期2usTBCLK为100MHz10ns。上管在CTR0时开通。开通噪声大约持续200ns。// 配置DC事件滤波以DCAEVT1为例 EPwm1Regs.DCFCTL.bit.PULSESEL DC_PULSESEL_CTR_ZERO; // 以CTR0为基准对齐窗口 EPwm1Regs.DCFOFFSET 20; // 偏移20个TBCLK 200ns 后开始窗口如果需要也可以设为0立即开始 EPwm1Regs.DCFWINDOW 20; // 窗口持续20个TBCLK 200ns EPwm1Regs.DCFCTL.bit.BLANKE 1; // 使能DCAEVT1的空白窗口 EPwm1Regs.DCFCTL.bit.SRCSEL DC_SRCSEL_DCAEVT1; // 对DCAEVT1信号进行滤波这样在每个PWM周期开始后的前200ns内DCAEVT1信号被忽略200ns之后保护功能才正常生效。3.3 谷底开关Valley Switching功能解析谷底开关是数字比较子模块提供的一个高级且强大的功能主要用于谐振式或准谐振开关电源拓扑如LLC、QR反激旨在实现零电压开关ZVS或降低开关损耗。其核心思想是检测功率管寄生电容或谐振腔的振荡谷底并在那个精确时刻开通开关管从而实现最小的开通损耗或满足ZVS条件。传统上这需要复杂的模拟电路或高速软件检测算法。ePWM的DC模块通过硬件实现了这一过程信号选择与边沿过滤选择一个能反映振荡波形信号作为输入通常是来自辅助绕组的电压信号通过比较器整形为方波DCxEVTy。通过边沿选择逻辑EDGEMODE,EDGECOUNT可以配置为捕获第N个上升沿/下降沿以跳过初始的噪声或非理想边沿。振荡周期测量硬件内部有一个16位计数器TBCNT在选定的“开始边沿”STARTEDGE如第一个上升沿启动在“停止边沿”STOPEDGE如第二个上升沿停止。计数器捕获的值CNTVAL就是振荡的半个周期或一个周期时间。延迟生成与触发利用捕获到的CNTVAL值可以经过分频VDELAYDIV或加上软件偏移SWVDELVAL硬件自动计算出一个延迟时间。当下一次DCxEVTy事件的边沿到来时硬件会等待这个计算出的延迟时间然后再产生最终的DCEVTFILT输出信号。同步PWM这个DCEVTFILT信号可以连接到TB模块的同步输入EPWMxSYNCI用于复位或启动PWM计数器从而确保PWM的开通时刻精确地落在振荡的谷底。配置要点与避坑指南STOPEDGE必须大于STARTEDGE。例如STARTEDGE选第一个上升沿VCAP_CTR_ZEROSTOPEDGE选第二个上升沿VCAP_CTR_PRD这样捕获的就是一个完整周期。触发逻辑复位VCAPCTL[TRIGSEL]通常选择软件触发。在每次希望开始一次新的谷底检测时由软件写寄存器触发。使能谷底捕获VCAPCTL[VCAPE]1后硬件只执行一次捕获和延迟触发过程。完成后需要软件再次触发TRIGSEL才能进行下一次。这意味着它不适合连续、每个周期都进行的谷底开关而更适合用于启动或模式切换时的个别周期优化。务必结合事件滤波空白窗口使用以滤除振荡初期可能存在的非理想边沿。4. 实战配置构建一个过流保护与同步采样的系统让我们结合ET和DC模块设计一个在电机控制中常见的场景硬件过流保护 周期中点电流采样。系统目标当相电流超过设定阈值由CMPSS比较器检测硬件立即关断PWM输出Cycle-By-Cycle保护。在每个PWM周期的中点触发ADC采样相电流用于FOC算法反馈。每16个PWM周期触发一次CPU中断用于执行速度较慢的任务如速度环计算、通信。假设ePWM1 频率50kHz 采用增计数模式Up-Count CMPSS1输出高电平表示过流。配置步骤4.1 配置数字比较DC模块用于过流保护void EPWM1_DC_ConfigForOCP(void) { // 1. 选择Trip输入源将CMPSS1的高电平输出映射到DCAH EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL DC_TRIPSEL_CMPSS1; // CMPSS1作为DCAH的组合输入源 EPwm1Regs.DCTRIPSEL.bit.DCALCOMPSEL DC_TRIPSEL_DISABLE; // 不使用DCAL // 注意还需要通过InputX-BAR寄存器将CMPSS1输出实际连接到ePWM1的Trip输入 // 2. 配置事件限定DCAH高电平即过流产生DCAEVT1事件 EPwm1Regs.TZDCSEL.bit.DCAEVT1 TZ_DCAH_HIGH; // DCAH为高时触发DCAEVT1 // 3. 配置事件滤波可选但强烈推荐屏蔽开关噪声 EPwm1Regs.DCFCTL.bit.PULSESEL DC_PULSESEL_CTR_ZERO; EPwm1Regs.DCFOFFSET 15; // 假设1.5us的空白窗口TBCLK10ns, 150个周期 EPwm1Regs.DCFWINDOW 150; EPwm1Regs.DCFCTL.bit.BLANKE 1; EPwm1Regs.DCFCTL.bit.SRCSEL DC_SRCSEL_DCAEVT1; // 4. 配置Trip-Zone动作当DCAEVT1.force事件发生时对EPWMxA和B执行周期循环CBC保护将其驱动为低电平 EPwm1Regs.TZSEL.bit.DCAEVT1 TZ_EVENT_CBC; // 将DCAEVT1配置为CBC Trip源 EPwm1Regs.TZCTL.bit.TZA TZ_FORCE_LO; // Trip时EPWMxA输出强制低 EPwm1Regs.TZCTL.bit.TZB TZ_FORCE_LO; // Trip时EPWMxB输出强制低 // 使能CBC Trip EPwm1Regs.TZCTL.bit.DCAEVT1 TZ_FORCE_ENABLE; // 5. 可选使能Trip中断用于软件记录故障 EPwm1Regs.TZEINT.bit.DCAEVT1 1; }关键点这里我们使用了DCAEVT1.force路径到Trip-Zone模块实现了硬件自动保护。即使CPU卡死只要过流信号一来PWM输出会在几十纳秒内被拉低这是软件无法比拟的安全性。4.2 配置事件触发ET模块用于ADC采样和CPU中断void EPWM1_ET_ConfigForSamplingAndInt(void) { // 1. 配置时间基准和比较器假设PWM周期为1000 TBCLK计数中点即500 EPwm1Regs.TBPRD 1000; // 50kHz 100MHz TBCLK EPwm1Regs.CMPA.bit.CMPA 500; // 中点 // 2. 配置SOCAADC启动转换A // 事件源计数器等于CMPACTRCMPA // 预分频每个事件都触发每个PWM周期中点采样一次 EPwm1Regs.ETSEL.bit.SOCASEL ET_CTR_CMPA; EPwm1Regs.ETPS.bit.SOCAPRD ET_1ST; EPwm1Regs.ETSEL.bit.SOCAEN 1; // 3. 配置中断INT // 事件源计数器等于周期值CTRPRD即每个PWM周期结束 // 预分频每16个事件触发一次使用增强的INTCNT2/INTPRD2 EPwm1Regs.ETSEL.bit.INTSEL ET_CTR_PRD; EPwm1Regs.ETPS.bit.INTPSSEL ET_PSSEL_ETINTPS; // 使用增强分频器 EPwm1Regs.ETINTPS.bit.INTPRD2 16; // 每16个周期一次中断 EPwm1Regs.ETSEL.bit.INTEN 1; EPwm1Regs.ETCLR.bit.INT 1; // 清除初始标志 // 4. 高级用法如果需要将DC模块的事件作为SOCB的触发源 // 例如用DCAEVT1.soc过流事件触发紧急采样 // EPwm1Regs.ETSEL.bit.SOCBSEL ET_SOCB_DCAEVT1; // EPwm1Regs.ETPS.bit.SOCBPRD ET_1ST; // EPwm1Regs.ETSEL.bit.SOCBEN 1; }4.3 中断服务程序ISR处理interrupt void EPWM1_INT_ISR(void) { // 1. 执行低频任务如速度环计算、状态监控、通信等 UpdateSpeedControlLoop(); // 2. 必须清除中断标志位 EPwm1Regs.ETCLR.bit.INT 1; // 3. 如果需要清除Trip中断标志如果使能了的话 // if (EPwm1Regs.TZFLG.bit.DCAEVT1) { // EPwm1Regs.TZCLR.bit.DCAEVT1 1; // // 处理故障日志... // } // 4. 确认中断响应 PieCtrlRegs.PIEACK.all PIEACK_GROUP3; // 假设ePWM1 INT在PIE Group 3 }5. 常见问题与深度调试技巧在实际项目中配置ePWM的ET和DC模块时可能会遇到一些令人困惑的问题。以下是我总结的几个典型问题及其排查思路。5.1 中断不产生或只产生一次症状按照手册配置了事件和分频但中断一次都不进或者只进一次就不再进了。排查清单中断标志位未清除这是最常见的原因。检查你的ISR是否在最后清除了ETFLG[INT]标志通过写ETCLR[INT]1如果没有清除后续中断会被硬件阻塞。PIE和CPU级中断未使能ePWM模块级中断ETSEL.INTEN只是第一步。还需要在PIE外设中断扩展控制器中使能对应的PIE中断线并在CPU级别使能全局中断INTM位和对应的IER位。这是一个三层使能结构。预分频器配置错误检查ETPS.INTPRD或ETINTPS.INTPRD2的值。如果设为0中断是禁用的。如果设为2意味着每2个事件才触发一次你可能需要等待更长时间。事件源选择错误确认ETSEL.INTSEL选择的事件确实会在你的PWM模式下发生。例如在增计数模式下永远不会发生CTRDCMPA递减匹配事件。计数器未运行确保时间基准子模块的时钟使能且计数器正在计数TBCTL[CTRMODE]不是停止状态。5.2 ADC触发SOC信号不稳定或时序不对症状ADC采样时刻抖动或者不是在预期的时刻触发。排查清单检查SOC冲宽度ePWM产生的SOC脉冲宽度是固定的几个SYSCLK周期。确保你的ADC模块能够可靠地捕获到这个窄脉冲。有些ADC需要较长的触发脉冲可能需要外部逻辑展宽。验证事件时序使用仿真器或高端示波器同时观察EPWMxSOCA引脚如果映射到GPIO和PWM波形。确认SOC脉冲是否精确出现在CTRCMPA等事件时刻。注意从事件发生到SOC脉冲输出有几个时钟周期的硬件延迟。注意影子寄存器如果你在中断中更新了CMPA的值并且配置了影子寄存器加载模式CMPCTL[SHDWAMODE]那么新值可能要到下一个周期如CTRPRD才会生效。这会导致本周期SOC触发点仍是旧值。确保你理解影子寄存器的加载时机。5.3 数字比较DC保护不动作或误动作症状过流信号来了但PWM没有关断或者没有过流PWM却误关断。排查清单信号路径排查这是最复杂的部分。使用“信号流”法反向排查源头用示波器确认CMPSS输出或GPIO输入的Trip信号本身是否正确、干净。X-BAR映射检查INPUTxSELECT和DCTRIPSEL寄存器确认信号是否正确地路由到了DCAH/DCAL等内部网络。这是软件配置中最容易出错的一环。事件限定检查TZDCSEL寄存器确认你配置的事件极性高电平有效、低电平有效、边沿有效与实际信号匹配。滤波窗口如果使能了空白窗口计算窗口的起始点和长度是否合理是否因为窗口设置过长把真实的故障信号也屏蔽了或者窗口设置不当没能屏蔽掉开关噪声一个关键技巧可以暂时禁用空白窗口DCFCTL.BLANKE0看问题是否消失以判断是否是滤波设置问题。Trip动作配置确认TZSEL寄存器中你使用的DCAEVT1等事件源是否已使能为CBC或OST一次性Trip。然后检查TZCTL/TZCTLDCA寄存器配置的Trip动作高阻、高、低是否符合预期。异步Trip路径记住TZ1/TZ2/TZ3引脚和DCAEVT1.force/DCBEVT1.force信号是异步作用于输出驱动电路的响应最快。但这也意味着它们对毛刺极其敏感。务必确保硬件布线良好信号干净或者合理使用滤波。5.4 多模块同步与中断错相时的计数器初始化问题场景多个ePWM模块通过SYNC同步希望它们的中断错开一定相位。问题简单地设置不同的INTPRD可能无法实现精确错相因为它们的INTCNT在同步后都是从0开始计数。解决方案使用增强的计数器初始化功能ETCNTINIT。将所有模块的ETPS.INTPSSEL设为1使用INTCNT2/INTPRD2。为主模块设置ETINTPS.INTPRD2例如为4。为从模块1设置ETCNTINIT.INTINIT 1ETCNTINITCTL.INTINITEN 1使能初始化ETCNTINITCTL.INTINITFRC配置为在SYNC事件时初始化。为从模块2设置ETCNTINIT.INTINIT 2。这样当SYNC事件发生时主模块INTCNT2继续从模块1的INTCNT2被初始化为1从模块2的被初始化为2。它们将在不同的事件次数后达到INTPRD24从而实现中断的错相触发。调试ePWM的ET和DC模块最有效的工具是结合寄存器观察窗口、CCS的实时变量刷新以及示波器。在代码关键配置点后设置断点查看相关寄存器值是否与预期一致。同时将关键的内部信号如EPWMxSOCA,TZ1映射到GPIO输出用示波器观察其实际时序是验证硬件行为最直接的方法。