C2000 ePWM事件触发与数字比较子模块:硬件化实时控制与保护
1. 项目概述与核心价值在电机驱动和数字电源这类对实时性要求极高的嵌入式系统中PWM信号的生成早已不是简单的“开”和“关”。我们常常需要在特定的、精确的时刻点去触发一些关键操作比如在PWM周期的中点采样电流或者在过流信号出现的瞬间立即关断输出以保护硬件。这些需求如果全部交给CPU软件轮询或中断来处理不仅会消耗大量宝贵的CPU资源更会引入难以预测的延迟成为系统稳定性的“阿喀琉斯之踵”。德州仪器TIC2000系列DSP中的增强型脉宽调制器ePWM模块其强大之处就在于将这些关键的、时间敏感的任务硬件化。今天我们就来深入拆解ePWM模块中两个极具威力的“瑞士军刀”——事件触发Event-Trigger, ET子模块和数字比较Digital Compare, DC子模块。它们不是孤立的逻辑单元而是与时间基准、动作限定、死区、错误联防等子模块紧密耦合共同构成了一个响应迅速、配置灵活的硬件事件处理引擎。理解它们你就能从“会配置PWM”进阶到“能驾驭PWM事件”从而设计出响应更快、更可靠、CPU负担更轻的嵌入式控制系统。2. 事件触发ET子模块精准的硬件“定时器”事件触发子模块的核心职责是充当一个高度可配置的硬件“事件过滤器”和“动作分发器”。它持续监视着PWM时基计数器TBCTR的状态以及来自数字比较子模块的外部事件并能在这些事件发生时精确地产生中断EPWMxINT或启动ADC转换EPWMxSOCA/B的脉冲信号。其设计哲学是将确定性的、周期性的任务从CPU中卸载由硬件自动完成。2.1 核心工作原理与信号流从系统框图看ET子模块的输入源非常丰富时基事件这是最基础也是最常用的事件源包括CTR0、CTRPRD周期值、CTRCMPA、CTRCMPB等。在增/减计数模式下还可以区分计数器递增CTRUCMPx或递减CTRDCMPx时匹配的事件这为实现更复杂的对称PWM或相移控制提供了可能。数字比较事件来自DC子模块的DCAEVT1.soc和DCBEVT1.soc信号。这直接将外部模拟比较器或GPIO的跳变事件与ADC采样触发硬件关联是实现逐周期限流或峰值电流控制的基石。外部同步事件EPWMxSYNCI输入可用于在多个ePWM模块间同步事件计数器。这些原始事件首先进入事件选择器由ETSEL寄存器配置我们可以从中为中断INT和两个SOC通道SOCA, SOCB分别选择一个特定的事件作为触发源。选中的事件并不会直接输出而是先进入一个可编程预分频器由ETPS和ETINTPS/ETSOCPS寄存器配置。这是ET子模块的精髓之一。预分频器允许我们设定“每N次事件才触发一次动作”。例如在ETPS[INTPRD] 3时意味着只有每第3次CTRCMPA事件发生时才会产生一个中断脉冲。这极大地减轻了CPU的中断负担特别适用于高频PWM下只需要低频处理的场景如电压环计算。预分频器本质上是一个计数器。当事件发生时计数器INTCNT递增直到其值等于设定的周期值INTPRD此时才会输出一个有效的触发脉冲并将计数器清零。ETFLG寄存器中的标志位会置位表明一个触发事件已就绪。通过ETCLR寄存器可以软件清零这些标志位而ETFRC寄存器则允许我们软件强制产生一个事件这在调试和特定控制序列中非常有用。2.2 关键寄存器深度解析与配置策略理解寄存器是精准控制的前提。ET子模块的寄存器虽多但逻辑清晰。ETSEL (Event-Trigger Selection Register)事件选择寄存器这是配置的起点决定了“用什么事件来触发”。INTSEL/SOCASEL/SOCBSEL分别为中断、SOCA、SOCB选择触发事件源。选项涵盖了所有时基事件和数字比较事件。INTEN/SOCAEN/SOCBEN对应功能的使能位。一个常见的疏忽是配置了事件源却忘了使能导致无法产生触发。INTSELCMP/SOCASELCMP/SOCBSELCMP在ePWM类型2中用于进一步选择CMPC或CMPD作为比较事件源提供了更多的比较点。ETPS (Event-Trigger Prescale Register) ETINTPS/ETSOCPS预分频寄存器这决定了“事件发生的频率如何被分频”。INTPRD/SOCAPRD/SOCBPRD设置中断或SOC的触发周期1-15。设为0则禁用对应功能。INTCNT/SOCACNT/SOCBCNT只读显示当前事件计数器的值用于监控。INTPSSEL/SOCPSSEL选择使用传统的ETPS寄存器支持分频比1-3还是增强的ETINTPS/ETSOCPS寄存器支持分频比1-15。对于需要更低频率触发的高级应用务必使用增强寄存器。ETCNTINIT ETCNTINITCTL计数器初始化控制这是一个高级功能允许在接收到同步信号EPWMxSYNCI或软件强制时将事件计数器INTCNT2/SOCxCNT2初始化为一个预设值ETCNTINIT。这在需要多个ePWM模块的事件计数器严格对齐的场景下非常有用例如在多相交错并联电源中确保所有相的电流采样事件在相位上是同步的。实操心得中断与SOC的典型配置场景电流采样同步在电机控制中为了准确重构相电流通常需要在PWM波形的“中点”即计数器从0递增到PRD的中点或对称PWM的过零点进行ADC采样。这时可以将SOCA的触发事件设置为CTRCMPB并将CMPB的值设置为PRD/2。同时将ADC的采样窗口ACQPS与PWM频率匹配即可实现无抖动的同步采样。占空比更新中断在电压环或速度环计算完成后需要在下一个PWM周期开始时更新占空比CMPA。可以将中断触发事件设置为CTRPRD在递增计数模式下这样中断服务程序ISR中计算出的新CMPA值可以在CTR0时从影子寄存器加载到活动寄存器实现无毛刺的平滑更新。故障诊断循环利用预分频功能可以设置一个低频的周期性中断例如每100个PWM周期一次用于执行一些非实时性的监控任务如检查温度、通信状态等而不干扰高频的核心控制循环。2.3 与ADC模块的联动实现硬件级采样触发ET子模块产生的EPWMxSOCA和EPWMxSOCB信号直接连接到芯片的ADC模块。C2000的ADC支持多达16个排序器SOC0-SOC15每个都可以独立配置触发源。通过配置ADCSOCxCTL寄存器可以将某个ADC采样序列SOC的触发源指定为特定的EPWMxSOCA/B。更重要的是芯片内部有一个模拟公共接口总线ACIB它像一个交叉开关允许任何一个ePWM模块的SOC信号触发任何一个ADC模块的任何一个SOC通道。这种灵活性使得复杂的多通道同步采样成为可能例如在三相逆变器中用三个ePWM模块的SOC信号分别触发对三相电流的同步采样。配置步骤通常如下配置ePWM的ET子模块产生所需的SOCA/B脉冲选择事件源、使能、必要时配置预分频。配置ADC模块为特定的SOC例如SOC0选择触发源为对应的EPWMxSOCA通过ADCSOCxCTL.TRIGSEL。配置ADC采样窗口ACQPS以适应信号建立时间。使能ADC中断如果需要在采样完成后读取结果。3. 数字比较DC子模块硬件化的快速保护与事件生成如果说ET子模块是“内部事件调度器”那么数字较子模块就是“外部哨兵”。它的核心功能是将外部数字信号主要是模拟比较器COMPxOUT的输出经过GPIO多路复用器映射为GPTRIPx信号与内部逻辑进行关联直接生成可以影响PWM输出、触发中断或ADC、乃至同步时基的硬件事件。3.1 信号路径与事件生成逻辑DC子模块的输入信号来源广泛包括外部Trip信号(TZ1,TZ2,TZ3)传统的错误联防输入。模拟比较器输出(COMPxOUT)这是DC子模块最典型的应用用于实时比较电流、电压与设定阈值。内部错误信号如ECCDBLERRECC双比特错误、PIEERR等。通用Trip输入(TRIPIN4至TRIPIN15)通过GPTRIPxSEL寄存器可以灵活地将几乎任何GPIO引脚配置为Trip输入极大增强了系统的可配置性。这些输入信号通过DCTRIPSEL寄存器被灵活地映射到四个核心逻辑信号上DCAH(Digital Compare A High)DCAL(Digital Compare A Low)DCBH(Digital Compare B High)DCBL(Digital Compare B Low)你可以将多个输入信号进行“或”逻辑组合后分配给一个DCAH信号。例如将COMP1OUT和COMP2OUT都映射到DCAH这样任意一个比较器输出高电平都会导致DCAH有效。DCAH/L和DCBH/L信号随后进入事件限定Event Qualification逻辑。这里可以配置信号的有效极性高有效或低有效。通过TZDCSEL寄存器我们可以定义当这些信号有效时产生哪些类型的事件DCAEVT1和DCAEVT2DCBEVT1和DCBEVT2每个事件如DCAEVT1都可以独立配置通过DCACTL等寄存器选择将其用于产生四种类型的动作强制Trip(.force)直接强制ePWMxA或ePWMxB输出进入特定的安全状态高阻、拉高、拉低这是实现纳秒级硬件保护的关键。其优先级高于普通的TZ事件。触发中断(.inter)产生一个错误联防中断EPWMxTZINT通知CPU进行故障处理。启动ADC转换(.soc)连接到ET子模块作为SOCA/B的事件源之一。产生同步脉冲(.sync)产生一个同步脉冲可以发送给本模块或其他模块的时基实现基于外部事件的同步。3.2 消隐窗口Blanking Window对抗噪声的利器在功率电路中开关器件如MOSFET、IGBT在开通和关断瞬间会产生严重的电压和电流尖峰噪声。如果这些噪声被模拟比较器捕获并误触发DC事件将导致系统误保护或误动作。DC子模块的消隐窗口功能正是为此而生。消隐窗口逻辑允许你在每个PWM周期内定义一个特定的时间窗口在此期间内忽略指定的DC事件。窗口由两个参数定义偏移量Offset由DCFOFFSET寄存器设置。它定义了从窗口的参考点CTR0或CTRPRD由DCFCTL[PULSESEL]选择开始延迟多少个TBCLK周期后消隐窗口才开始。窗口宽度Window由DCFWINDOW寄存器设置。它定义了消隐窗口持续多少个TBCLK周期。典型应用场景在一个Buck变换器中高边开关开通瞬间电感电流会有一个续流二极管反向恢复或寄生电容充电引起的尖峰。我们希望在开关开通后的一小段时间内例如200ns屏蔽过流比较器的触发。这时可以将消隐窗口的参考点设为CTR0PWM周期开始偏移量设为0窗口宽度设为对应200ns的TBCLK计数。这样在每个周期开始的200ns内比较器的跳变将被忽略从而有效滤除开关噪声。3.3 计数器捕获Counter Capture功能除了过滤DC子模块还能在消隐窗口之外、当DC事件发生时捕获当前时基计数器TBCTR的值并存储到DCCAP寄存器中。这个功能极其有用因为它可以告诉你故障具体发生在PWM周期内的哪个时刻。例如在电机控制中如果因为过流而触发保护捕获到的TBCTR值可以帮助你分析过流是发生在PWM周期的开始、中间还是结束阶段。这对于诊断故障根源是上管直通、下管直通还是续流异常非常有价值。通过配置DCCAPCTL寄存器可以启用捕获功能并选择是捕获DCAEVT1还是DCBEVT1等事件发生时的计数器值。4. 实战应用构建一个带逐周期限流的电机相电流采样系统让我们结合ET和DC子模块设计一个在电机控制中常见的应用实现带逐周期峰值电流保护的同步相电流采样。系统目标在每个PWM周期中点同步触发ADC对电机相电流进行采样。当相电流超过硬件设定的安全阈值时必须在当前PWM周期内纳秒级强制关断对应的PWM输出实现逐周期限流Cycle-By-Cycle Current Limiting。同时产生一个中断通知CPU并记录过流发生的时刻。硬件连接电机相电流通过采样电阻和运放调理后送入C2000片内的模拟比较器COMP1的同相输入端。COMP1的反相输入端连接一个由DAC或PWM滤波器生成的电流阈值电压。COMP1的输出COMP1OUT连接到ePWM1模块的TRIPIN4输入通过GPTRIP4SEL配置。ADC通道用于采样相电流。软件配置步骤4.1 配置数字比较DC子模块// 1. 解除寄存器保护 (EALLOW是C2000特有的指令允许写受保护的寄存器) EALLOW; // 2. 将GPIO引脚配置为Trip输入功能 (假设COMP1OUT连接到GPIO5) // 注意需先配置GPIO复用为外设功能再配置为Trip输入。此处简化。 // 例如GpioCtrlRegs.GPAMUX1.bit.GPIO5 0; // 配置为GPIO // GpioCtrlRegs.GPADIR.bit.GPIO5 0; // 输入 // 然后配置GPTRIPSEL将GPIO5映射到TRIPIN4 EPwm1Regs.DCTRIPSEL.bit.TRIPIN4SEL 5; // GPIO5 映射到 TRIPIN4 // 3. 将TRIPIN4信号分配给数字比较A高事件(DCAH) EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL 4; // 选择TRIPIN4作为DCAH的组合输入源之一 EPwm1Regs.DCAHTRIPSEL.bit.TRIP4 1; // 使能TRIPIN4触发DCAH // 4. 配置DCAH事件的行为当DCAH有效即COMP1OUT高电流超限时产生DCAEVT1事件 // DCAH高有效 EPwm1Regs.DCACTL.bit.EVT1SRCSEL DC_EVT1_SRC_DCAH; // DCAEVT1源为DCAH EPwm1Regs.DCACTL.bit.EVT1FRCSYNCSEL DC_EVT_FRC_SYNC_ASYNC; // 强制信号异步生效最快响应 EPwm1Regs.DCACTL.bit.EVT1SOCE DC_EVT_SOC_DISABLE; // 本例不用SOC用强制Trip EPwm1Regs.DCACTL.bit.EVT1SYNCE DC_EVT_SYNC_DISABLE; // 本例不用同步 // 5. 配置消隐窗口滤除开关噪声假设开关频率100kHzTBCLK100MHz即10ns周期 // 我们希望在上管开通后500ns内屏蔽保护 unsigned int blanking_offset 0; // 从CTR0开始 unsigned int blanking_width 500 / 10; // 500ns / 10ns 50个TBCLK周期 EPwm1Regs.DCFCTL.bit.PULSESEL DC_PULSESEL_BLANK_AT_CTR_ZERO; // 窗口对齐到CTR0 EPwm1Regs.DCFCTL.bit.BLANKE DC_BLANK_ENABLE; // 使能消隐 EPwm1Regs.DCFCTL.bit.SRCSEL DC_SRC_DCAEVT1; // 对DCAEVT1事件进行消隐 EPwm1Regs.DCFOFFSET blanking_offset; EPwm1Regs.DCFWINDOW blanking_width; // 6. 启用计数器捕获记录过流发生时刻 EPwm1Regs.DCCAPCTL.bit.CAPE DC_CAP_ENABLE; // 使能捕获 EPwm1Regs.DCCAPCTL.bit.SHDWMODE DC_CAP_SHDW_FREEZE; // 捕获一次后冻结等待读取 EDIS; // 重新禁止写受保护寄存器4.2 配置错联防Trip-Zone子模块以响应DC事件EALLOW; // 配置当DCAEVT1.force事件发生时对ePWM1A输出采取的动作立即拉低 EPwm1Regs.TZSEL.bit.DCAEVT1 TZ_DCAEVT1_FORCE_ENABLE; // 使能DCAEVT1作为Trip源 EPwm1Regs.TZCTL.bit.DCAEVT1 TZ_FORCE_LO; // 强制输出低电平关断上管 // 同时配置产生中断以便CPU记录故障 EPwm1Regs.TZEINT.bit.DCAEVT1 1; // 使能DCAEVT1中断 EDIS;4.3 配置事件触发ET子模块进行同步电流采样// 目标在PWM周期中点CTRPRD/2触发ADC采样 // 假设采用递增计数模式TBPRD1000则中点CMPB500 // 1. 配置时基和比较器 EPwm1Regs.TBPRD 1000; // PWM周期 EPwm1Regs.CMPB 500; // 中点比较值 EPwm1Regs.TBCTL.bit.CTRMODE TB_COUNT_UP; // 递增计数 EPwm1Regs.CMPCTL.bit.LOADBMODE CC_CTR_ZERO; // CMPB在CTR0时从影子寄存器加载 // 2. 配置ET子模块在CTRCMPB时产生SOCA脉冲 EPwm1Regs.ETSEL.bit.SOCASEL ET_CTR_CMPB; // SOCA事件源CTRCMPB EPwm1Regs.ETSEL.bit.SOCAEN ET_SOCA_ENABLE; // 使能SOCA EPwm1Regs.ETPS.bit.SOCAPRD 1; // 每个事件都触发不分频4.4 配置ADC模块响应ePWM的SOCA// 假设使用ADCINA0采样电流SOC0对应此通道 EALLOW; // 配置SOC0的触发源为EPWM1_SOCA AdcRegs.ADCSOC0CTL.bit.CHSEL 0; // 选择ADCINA0通道 AdcRegs.ADCSOC0CTL.bit.TRIGSEL 5; // 触发源EPWM1_SOCA (查阅TRIGxSEL表) AdcRegs.ADCSOC0CTL.bit.ACQPS 15; // 采样窗口大小根据电路调整 // 配置ADC中断在SOC0转换完成后触发 AdcRegs.ADCINTSEL1N2.bit.INT1SEL 0; // 选择SOC0完成触发ADCINT1 AdcRegs.ADCINTFLGCLR.bit.ADCINT1 1; // 清除ADCINT1标志 AdcRegs.ADCINTE.bit.ADCINT1E 1; // 使能ADCINT1中断 EDIS; // 在PIE中配置ADCINT1中断服务程序通过以上配置我们构建了一个全硬件的保护与采样链实时保护电流超限 → COMP1OUT变高 → DCAH有效 → DCAEVT1.force生效 → 硬件在数十纳秒内强制PWM输出低电平保护功率管。消隐窗口防止开关噪声误触发。故障记录过流事件同时触发TZ中断CPU在中断服务程序中可以读取DCCAP寄存器获知过流发生在周期内的具体时刻并置位故障标志。精准采样每个PWM周期中点硬件自动产生EPWM1SOCA信号触发ADC对电流进行同步采样消除了软件触发的抖动提高了电流环的控制精度。5. 高级应用与疑难问题排查5.1 多模块同步与相位控制在三相逆变器或交错并联变换器中多个ePWM模块需要协同工作。ET和DC子模块在此扮演了同步核心的角色。时基同步主模块可以配置在CTRPRD或CTRCMPB时产生SYNCO信号。从模块通过SYNCI接收此信号并可在此时将其TBCTR加载为主模块的TBPHS相位寄存器值从而实现严格的相位差。DCAEVT1.sync和DCBEVT1.sync事件也可以作为同步源实现基于外部事件的同步。事件计数器同步使用ETCNTINIT功能可以在同步事件发生时将所有从模块的SOC或中断事件计数器初始化为同一值。这确保了在多相系统中各相的ADC采样或控制中断在相位上完全对齐这对于消除相间干扰至关重要。5.2 常见问题与排查技巧问题配置了事件触发但无法产生中断或SOC。检查清单寄存器保护是否使用了EALLOW/EDIS指令对受保护的寄存器如TZDCSEL,DCTRIPSEL进行了写操作使能位ETSEL.INTEN/SOCAEN/SOCBEN、TZEINT中的相应位、ADC中断使能位等是否都已置1事件源选择ETSEL.INTSEL等是否选择了正确的事件例如在递增计数模式下CTRCMPA事件只在计数器等于CMPA且正在递增时发生。预分频器ETPS.INTPRD或SOCAPRD是否为0为0会禁用输出。标志位ETFLG.INT标志是否已置位但未被清除如果标志位为1新的中断可能被阻塞。需要在中断服务程序中用ETCLR.INT清除它。问题数字比较保护动作不稳定有时误触发。检查清单消隐窗口是否配置了合适的消隐窗口用示波器观察比较器输出和PWM开关时刻确保噪声尖峰落在消隐窗口内。窗口太窄可能滤不掉噪声太宽则会降低保护响应速度。输入信号质量检查COMPxOUT或GPIO输入信号是否有振铃或毛刺。可能需要增加RC滤波或调整比较器迟滞。异步/同步路径DCACTL.EVT1FRCSYNCSEL配置为异步DC_EVT_FRC_SYNC_ASYNC能获得最快响应但可能对毛刺更敏感。如果对噪声敏感可考虑使用同步路径经过TBCLK同步但会引入1-2个时钟周期的延迟。Trip优先级检查TZCTL寄存器确认DCAEVT1、DCAEVT2、TZA等事件的优先级是否符合预期。高优先级事件会覆盖低优先级的动作。问题ADC采样时刻有偏差或抖动。检查清单影子寄存器加载点确保CMPB用于触发SOC的影子寄存器加载点CMPCTL.LOADBMODE早于触发事件。通常设置为CTR0时加载这样在新的PWM周期开始时新的比较值就已就绪。ADC采样窗口ADCSOCxCTL.ACQPS设置是否足够采样窗口太短可能导致采样不准确。需要根据ADC前端电路的RC时间常数来计算。SOC触发源映射确认ADCSOCxCTL.TRIGSEL选择的是正确的ePWM SOC信号如EPWM1_SOCA。ePWM时钟同步如果使用多个ePWM模块触发多个ADC通道确保这些ePWM模块的时基是同步的否则采样会有相位差。问题在调试时如何验证配置是否正确使用软件强制ETFRC寄存器可以软件强制产生中断或SOC事件TZFRC可以软件强制产生Trip事件。这可以在不依赖真实硬件事件的情况下测试整个事件响应链是否畅通。监控标志位在调试器中实时查看ETFLG、TZFLG、ADCINTFLG等标志位可以帮助定位事件在哪个环节被阻塞。使用GPIO模拟在开发初期可以用一个GPIO输出模拟COMPxOUT信号通过程序控制其翻转来测试DC子模块的保护逻辑是否按预期工作。深入理解并熟练运用C28x ePWM的事件触发与数字比较子模块能将你的嵌入式控制系统的性能从“够用”提升到“卓越”。它将时间关键型的任务交给硬件让CPU专注于更复杂的算法和逻辑是构建高效、可靠、实时响应系统的关键。在实际项目中我习惯于先在一张纸上画出信号流图从外部信号输入比较器/GPIO到DC事件生成再到ET触发或TZ动作最后到PWM输出或ADC启动。这张图就是配置寄存器的蓝图能帮你理清思路避免遗漏。记住硬件模块再强大也需要精细的配置才能发挥其威力。