1. 项目概述与核心价值在电机驱动和数字电源这类对实时性要求极高的嵌入式系统中如何让PWM脉宽调制波形不仅仅是“输出”而是成为一个能够感知外部世界、自主决策并精确触发关键操作的“智能”控制器是提升系统性能的关键。德州仪器TIC2000系列DSP中的增强型PWMePWM模块其强大之处正在于此。它不仅仅是一个简单的波形发生器更是一个集成了精密定时、事件响应和复杂逻辑判断的控制引擎。其中事件触发Event-Trigger, ET和数字比较Digital Compare, DC这两个子模块是解锁ePWM高级功能、实现诸如逐周期电流保护、同步ADC采样、多模块相位同步等复杂控制策略的核心。很多工程师初次接触ePWM时可能只停留在配置TBPRD周期寄存器和CMPA比较寄存器来生成PWM波的层面。然而当系统需要根据PWM的特定时刻比如计数器过零或匹配比较值时来启动一次ADC转换以采样电流或者需要根据外部比较器的输出来立即关断PWM以保护功率管时ET和DC子模块就成为了不可或缺的利器。它们将PWM的时间基准与系统的中断、ADC以及外部故障信号紧密耦合形成了一个高度协同的闭环控制系统。本文将深入剖析C28x ePWM中事件触发与数字比较子模块的工作原理、寄存器配置细节以及实际应用技巧。无论你是正在设计伺服驱动器、光伏逆变器还是任何需要高可靠性实时控制的电源系统理解这两个模块如何将“时间事件”和“逻辑事件”转化为具体的控制动作都将使你从“会使用PWM”进阶到“能驾驭PWM系统”。2. 事件触发子模块从定时事件到系统动作的桥梁事件触发子模块的核心职责是充当ePWM内部时间基准与系统其他关键外设主要是ADC和CPU中断系统之间的“翻译官”和“调度员”。它持续监视着时间基准计数器TBCTR的运行状态等待特定“时刻”的到来然后按照预设的规则触发相应的系统动作。2.1 核心工作原理与事件源事件触发模块的输入是一系列由时间基准子模块产生的“原始事件”。这些事件本质上是TBCTR计数器值与特定寄存器值匹配时产生的脉冲信号。主要的事件源包括CTR Zero (TBCTR 0x0000)计数器下溢到零的时刻。在对称PWM模式下这对应着PWM周期的中心点在非对称模式下则是每个周期的起始点。CTR PRD (TBCTR TBPRD)计数器达到周期值的时刻。这是每个PWM周期的结束点上溢。CTR CMPA/CMPB/CMPC/CMPD计数器值与四个比较寄存器中任意一个相等的时刻。这是控制PWM占空比或特定相位点的关键事件。CTRU/CTRD CMPx这是一个更精细的事件它区分了计数器是递增Up还是递减Down过程中与CMPx匹配。这对于生成非常精确的、非对称的触发点至关重要。例如你可能希望在计数器递增到CMPA时触发一次ADC采样而在递减到CMPA时触发另一次以实现双采样。来自数字比较子模块的事件DCAEVT1.soc, DCBEVT1.soc这是事件触发模块与数字比较模块的接口允许外部信号如模拟比较器输出也能作为ADC触发的源头我们将在数字比较部分详细讨论。这些原始事件就像一个个分散的“火种”。事件触发模块的工作就是按照我们的指令选择哪些火种有用并以多大的“频率”去点燃“中断”或“ADC启动”这两堆“篝火”。2.2 中断与ADC触发信号的生成机制事件触发模块为中断EPWMxINT和两个ADC启动转换信号EPWMxSOCA, EPWMxSOCB分别设立了独立的处理通道。每个通道的逻辑是相似的都包含三个核心配置环节事件选择、事件预分频和计数器初始化。1. 事件选择ETSEL寄存器这是第一步决定我们关心哪个“时刻”。通过配置ETSEL[INTSEL]和ETSEL[INTSELCMP]对于中断或ETSEL[SOCASEL]和ETSEL[SOCASELCMP]对于SOCA我们可以从上述众多事件源中挑选一个作为触发源。例如可以设置为“当计数器递增到与CMPA相等时”CTRU CMPA产生事件。2. 事件预分频ETPS, ETINTPS, ETSOCPS寄存器这是事件触发模块最巧妙的设计之一。我们并不总是希望每一个匹配事件都立刻触发动作。比如在开关频率为100kHz的系统中如果我们想在每个PWM周期的中点采样电流那么每个周期都会发生一次CTRPRD事件。如果我们直接让每个事件都触发ADC那么ADC的采样率就是100kHz。但有时我们可能希望每2个、4个甚至15个PWM周期才采样一次以降低CPU处理负担或匹配更慢的控制环路。预分频逻辑通过一个计数器来实现这个功能。以中断生成为例ETPS[INTCNT]是一个4位计数器用于记录所选事件发生的次数。ETPS[INTPRD]是我们设定的“分频值”范围是1-3对于传统模式或通过ETINTPS[INTPRD2]扩展到1-15对于ePWM类型2的增强模式。工作流程每当选定的事件发生时INTCNT加1。当INTCNT计数达到INTPRD设定的值时如果中断使能ETSEL[INTEN]1且中断标志未置位ETFLG[INT]0则模块会产生一个中断脉冲同时将INTCNT清零并置位ETFLG[INT]标志。然后计数器重新开始计数。这就实现了“每N个事件触发一次中断”的功能。注意SOCA和SOCB的预分频逻辑与中断类似但有一个重要区别SOC脉冲是连续生成的。即使ETFLG[SOCA]标志位因为前一个脉冲而置位只要使能位打开预分频计数器在达到周期值并产生脉冲后会自动清零并继续计数等待下一个周期而不会像中断那样等待标志位被软件清除。这意味着ADC触发可以以固定的分频比持续进行不受软件响应速度的影响。3. 计数器初始化ETCNTINITCTL, ETCNTINIT寄存器这是一个高级功能用于在多模块同步系统中精确控制触发相位。想象一下你有三个ePWM模块以120度相位差运行一个三相逆变器。你希望每个模块都在其PWM周期的特定点比如过零后某个角度触发自己的ADC采样。如果简单地使能事件触发由于各模块计数器启动时间可能略有差异其内部的INTCNT/SOCACNT计数器状态是随机的导致首个触发点无法对齐。ETCNTINIT机制解决了这个问题。你可以将一个预设值比如2写入ETCNTINIT[INTINIT]。当使能ETCNTINITCTL[INTINITEN]并选择通过同步信号EPWMxSYNCI或软件强制初始化后在同步事件到来时INTCNT2计数器不会被清零而是被初始化为这个预设值2。这意味着该模块需要再等待INTPRD2 - 2个事件后才会首次触发中断。通过为不同模块设置不同的初始化值可以精确地将它们的首次触发点“错开”实现相位可控的触发序列。2.3 关键寄存器配置速查与避坑指南理解原理后配置寄存器就是按图索骥。以下是配置一个“在计数器等于CMPA时每2个事件触发一次ADC SOCA”的典型流程选择事件源配置ETSEL[SOCASEL] 101b选择CTRUCMPA事件。配置预分频配置ETPS[SOCAPRD] 1表示每2个事件触发一次因为计数器从0开始计到1时触发。同时ETPS[SOCACNT]会在每次事件发生时由硬件自动更新我们通常只需读取它来监控状态。使能SOCA设置ETSEL[SOCAEN] 1。可选配置ADC模块在ADC模块中需要将对应的SOC触发源选择为EPWMxSOCA。避坑要点事件与动作的映射关系务必清楚CTRCMPA和CTRUCMPA的区别。在递增-递减计数模式下一个PWM周期内计数器会两次经过CMPA的值一次递增一次递减。如果你希望只在递增过程中触发必须选择CTRUCMPA如果选择CTRCMPA则会在递增和递减过程中各触发一次导致ADC采样率翻倍这可能不是你想要的结果。预分频计数器的行为当INTPRD或SOCAPRD设置为0时预分频功能被禁用计数器不会工作因此永远不会触发对应的中断或SOC。这是一个常见的配置错误源。如果需要每个事件都触发应设置PRD 0不对这里需要更正对于传统模式INTPRD设置为0是禁用。若需要每个事件触发应设置为1表示计数值达到1时触发即第一个事件。对于增强模式需查阅具体手册。中断标志管理中断路径中当ETFLG[INT]标志位置1后即使后续条件再次满足也不会产生新的中断脉冲直到软件向ETCLR[INT]位写1清除该标志。这是为了防止中断嵌套过深。务必在中断服务程序ISR中及时清除标志位。而SOC标志位ETFLG[SOCA]则没有这个限制它仅作为一个状态指示不影响脉冲的持续产生。同步初始化的时机使用ETCNTINIT进行同步初始化时确保在使能模块和启动计数器之前完成相关配置。同步事件通常来自主模块或外部信号要确保从模块的相位寄存器TBPHS也已正确设置以实现时间基准和事件触发的完全同步。3. 数字比较子模块将外部世界引入PWM决策如果说事件触发子模块是ePWM的“内部时钟管家”那么数字比较子模块就是它的“外部哨兵”和“逻辑处理器”。它的核心功能是将外部数字信号如模拟比较器的输出、GPIO状态、甚至系统错误信号与ePWM的内部逻辑相结合产生更复杂的事件用于实现硬件级的快速保护、高级触发和同步。3.1 信号路径与事件生成数字比较子模块的输入信号来源极其丰富体现了其“比较”的灵活性外部Trip输入TZ1, TZ2, TZ3传统的故障保护引脚可配置为高有效或低有效。模拟比较器输出COMPxOUT经过芯片内部互联可以直接将模拟比较器的结果送入。GPIO引脚通过GPTRIP逻辑几乎任何GPIO都可以被映射为数字比较的输入源这极大地扩展了触发信号的来源。内部系统错误信号如时钟失效CLOCKFAIL、PIE错误PIEERR、存储器ECC双比特错误ECCDBLERR等。这些信号可以直接触发最高优先级的保护动作。这些输入信号首先被分为A、B两组每组又分为高H和低L事件即DCAH, DCAL, DCBH, DCBL。通过DCTRIPSEL和DCxHTRIPSEL/DCxLTRIPSEL等寄存器我们可以灵活地选择哪些输入信号影响哪个事件。例如可以将模拟比较器1的输出映射到DCAH将GPIO上的一个过流信号映射到DCAL。DCAH/L和DCBH/L信号随后进入事件限定Event Qualification逻辑。这里可以配置事件的触发极性上升沿、下降沿、双边沿。最终生成四个核心事件信号DCAEVT1, DCAEVT2, DCBEVT1, DCBEVT2。每个事件都可以独立地配置其后续动作。3.2 四大动作输出强制、中断、SOC与同步数字比较事件的力量在于它能驱动四种不同的动作这些动作直接连接到ePWM的其他子模块强制信号.force这是最高优先级的动作之一。DCAEVT1.force和DCAEVT2.force可以直接强制控制EPWMxA引脚的输出状态高、低、高阻DCBEVTx.force则控制EPWMxB。其优先级甚至高于传统的Trip-Zone动作。这在需要纳秒级响应的硬件保护中至关重要例如当模拟比较器检测到直通电流时无需CPU干预PWM输出可被立即拉低或置为高阻保护功率器件。中断信号.interDCAEVT1.inter等事件可以产生Trip-Zone中断EPWMxTZINT。与事件触发子模块产生的中断EPWMxINT不同TZ中断通常用于通知CPU发生了需要关注的故障或特殊外部事件。需要在TZEINT寄存器中使能对应事件的中断并在中断服务程序中通过TZCLR寄存器清除标志。ADC启动信号.socDCAEVT1.soc和DCBEVT1.soc可以直接作为事件触发子模块的输入源。这意味着一个外部信号如比较器输出跳变可以直接触发一次ADC转换。这在实现“峰值电流检测触发采样”或“过零点检测触发采样”等高级控制算法时非常有用。你需要在事件触发子模块的ETSEL[SOCASEL]中选择DCAEVT1.soc作为事件源。同步信号.syncDCAEVT1.sync和DCBEVT1.sync可以产生一个同步脉冲输出到EPWMxSYNCO或者用于同步本模块的时基计数器TBCTR。这允许一个外部事件来重新同步整个PWM系统的时钟例如利用电网电压的过零点信号来同步PLL和PWM载波。3.3 事件滤波与消隐窗口抗干扰的利器在功率电子环境中噪声无处不在。比较器输出或GPIO信号上可能存在的毛刺如果直接用于触发关键动作会导致误保护或错误的ADC采样。数字比较子模块内置的事件滤波Event Filtering功能特别是消隐窗口Blanking Window是解决此问题的硬件法宝。消隐窗口的逻辑非常直观在PWM周期内划出一段“安静时间”在这段时间内忽略所有数字比较事件。窗口的开启和关闭由ePWM的时基计数器TBCTR控制。窗口起点由DCFOFFSET寄存器设定一个偏移量。窗口在TBCTR等于0或等于TBPRD由DCFCTL[PULSESEL]选择之后的第OFFSET个TBCLK时钟周期开始。窗口宽度由DCFWINDOW寄存器设定窗口持续的TBCLK周期数。应用场景最典型的应用是在桥式电路的PWM驱动中。在上下管切换的死区时间附近功率管体的二极管反向恢复或寄生参数可能引起电压/电流振荡导致比较器产生误触发。通过设置消隐窗口覆盖这个易受干扰的时段可以完美滤除这些噪声确保只有稳定期的信号才能产生有效事件。配置示例滤除开关时刻附近的干扰假设PWM频率为100kHz周期10usTBCLK为100MHz10ns。死区时间为500ns。我们希望在每个PWM周期开始后的头600ns内忽略数字比较事件。设置DCFCTL[PULSESEL] 0使窗口对齐到CTR0事件周期开始。设置DCFOFFSET 0窗口紧接周期开始后启动。设置DCFWINDOW 60因为 600ns / 10ns 60个TBCLK周期。使能滤波DCFCTL[BLANKE] 1。 这样在每个PWM周期开始后的600ns内任何DCAEVT1等事件都会被忽略600ns之后的事件才能正常通过。3.4 数字比较配置实战与排错配置数字比较模块实现“当模拟比较器输出高电平时立即强制PWMxA输出低电平并触发一个中断”的功能信号映射假设模拟比较器1输出连接到COMP1OUT并通过芯片内部连接到GPTRIP1。配置DCTRIPSEL寄存器将GPTRIP1信号选择为DCAH事件的源。配置DCACTL[EVT1SRCSEL]选择DCAH作为DCAEVT1的事件源。配置DCACTL[EVT1FRCSYNCSEL]选择事件是同步还是异步方式传递到强制逻辑。对于保护通常选择异步1以实现最快响应。动作配置强制动作在TZCTL寄存器中设置DCAEVT1对应的动作例如TZCTL[DCAEVT1] TZ_FORCE_LO强制输出低。中断使能在TZEINT寄存器中使能DCAEVT1中断。可选使能滤波如果信号有噪声配置DCFCTL、DCFOFFSET和DCFWINDOW寄存器。常见问题排查强制动作不生效首先检查TZSEL寄存器确保DCAEVT1被使能为Cycle-by-Cycle (CBC) 或 One-Shot (OSHT) 跳变源。然后检查TZCTL寄存器的配置是否正确。最后用示波器测量COMP1OUT信号和PWM输出确认信号路径是否畅通。中断无法进入除了使能TZEINT还需在PIE控制器中使能对应的EPWMx_TZINT中断并在CPU级开启全局中断。在中断服务程序中务必读取TZFLG寄存器并写TZCLR寄存器清除标志位否则后续中断会被阻塞。消隐窗口效果不符合预期检查TBCLK时钟频率配置是否正确OFFSET和WINDOW的值计算是否准确。使用CCS的寄存器实时查看功能监控DCFOFFSETCNT和DCFWINDOWCNT寄存器的计数过程可以直观地验证窗口的起止位置。4. 协同应用案例构建一个带逐周期保护的同步采样系统现在我们将事件触发和数字比较模块组合起来设计一个在电机控制中常见的应用场景一个带有逐周期电流保护Cycle-By-Cycle Current Protection和同步ADC采样的三相逆变器系统。系统目标ePWM1/2/3分别驱动三相桥臂相位互差120度。在每个PWM周期的中点计数器从谷值到峰值的转折点对称模式下为CTR0同步触发ADC采样三相电流。当任意一相的电流超过硬件设定阈值由模拟比较器监测时立即关断对应桥臂的PWM输出强制低电平并在下一个PWM周期自动恢复CBC模式同时产生中断通知CPU。实现步骤时基与同步配置将ePWM1配置为主模块SYNCOSEL TB_SYNC_DISABLE或TB_CTR_ZERO输出同步脉冲。配置ePWM2和ePWM3为从模块SYNCOSEL TB_SYNC_IN并设置各自的相位寄存器TBPHS为合适的值如0,TBPRD/3,2*TBPRD/3实现120度相位差。使能从模块的相位加载TBCTL[PHSEN] TB_ENABLE。同步ADC采样配置使用事件触发模块在三个ePWM模块中均配置事件触发子模块。事件选择设置ETSEL[SOCASEL] 000b选择CTR Zero事件因为对称PWM下CTR0对应周期中点此时电流纹波通常较小采样更准确。预分频设置ETPS[SOCAPRD] 0这里需要更正若需每个周期触发应设置为1。设置ETPS[SOCAPRD] 1实现每个PWM周期触发一次SOCA。使能设置ETSEL[SOCAEN] 1。ADC配置在ADC模块中将三个SOC触发源例如SOC0, SOC1, SOC2分别配置为EPWM1SOCA,EPWM2SOCA,EPWM3SOCA。由于三个ePWM的CTR0时刻被相位寄存器错开因此ADC对三相电流的采样也将是同步且相位互差120度的。逐周期电流保护配置使用数字比较模块将三个模拟比较器的输出COMP1OUT,COMP2OUT,COMP3OUT分别通过GPTRIPSEL映射到ePWM1/2/3的DCAH事件输入。在每个ePWM模块的DC子模块中配置DCACTL将DCAH作为DCAEVT1的源。在TZSEL寄存器中使能DCAEVT1为Cycle-by-Cycle (CBC)跳变源。在TZCTL寄存器中配置DCAEVT1的动作为TZ_FORCE_LO强制输出低关断桥臂。在TZEINT寄存器中使能DCAEVT1中断以便在保护发生时通知CPU进行记录或更高级的处理。关键点CBC模式下当DCAEVT1事件发生时硬件会立即强制动作但仅持续当前PWM周期。在下个PWM周期开始时输出会自动恢复为正常由AQ模块控制的波形除非故障信号依然存在。这实现了“逐周期”的限流保护。系统调试与验证首先在不接功率电路的情况下用示波器观察三个ePWMxA的输出验证120度相位关系。然后使用信号发生器模拟比较器输出一个与PWM同步的短脉冲观察当模拟“过流”信号来临时对应的PWM输出是否立即被拉低并在下一个周期恢复。同时在CCS中设置断点验证TZ中断是否能被触发。最后连接ADC观察ADC的采样保持信号是否精确地在每个PWM的CTR0时刻被触发。通过这个案例我们可以看到事件触发模块确保了控制环路的时序精确性而数字比较模块提供了硬件级的安全性与快速响应。两者的结合使得ePWM从一个简单的波形发生器蜕变为一个能够自主处理复杂实时事件、构成控制系统坚实底层的智能外设。在实际项目中深刻理解并熟练运用这两个模块是设计出高性能、高可靠性电机与电源产品的关键。