C2000 ePWM数字比较与事件触发模块:工业级电机与电源控制的核心保护机制

1. ePWM数字比较与事件触发模块深度解析

在电机驱动、数字电源或者逆变器这类对实时性和可靠性要求极高的嵌入式控制系统中,PWM波形的生成与控制是核心。德州仪器(TI)C2000系列微控制器中的增强型脉宽调制(ePWM)模块,远不止是一个简单的PWM发生器。它更像一个精密的“波形控制与保护中枢”,其数字比较(DC)与事件触发(ET)子模块,是实现复杂保护逻辑、精准事件响应和高级控制算法的关键。很多工程师初次接触时,往往只关注如何产生PWM波,而忽略了这两个子模块的强大能力,导致系统在应对突发故障或需要精确同步采样时显得笨拙甚至不可靠。

我调试过不少电源和电机项目,深刻体会到,一个健壮的系统,其PWM部分不仅要“会输出”,更要“会感知”和“会应急”。数字比较模块就是系统的“感官神经”,它能实时监测外部关键信号(比如电流采样比较器的输出);而事件触发模块则是“条件反射中枢”,能根据预设的逻辑,自动、快速地做出中断、ADC采样或强制改变PWM状态等反应。理解并熟练配置它们,是从“功能实现”迈向“工业级可靠设计”的必经之路。今天,我就结合TMS320F2838x的参考手册和实际项目经验,把这部分内容掰开揉碎了讲清楚。

2. 核心模块功能与设计思路拆解

2.1 数字比较(DC)子模块:从外部信号到内部事件

数字比较子模块的核心任务,是充当ePWM模块与外部数字世界之间的“翻译官”和“哨兵”。它的输入源非常灵活,主要包括:

  1. 专用的故障输入引脚(TZ1, TZ2, TZ3):通常直接连接硬件故障信号,如过流、过温、驱动芯片的故障输出等,支持异步快速关断,响应速度极快。
  2. 通过输入X-BAR和ePWM X-BAR路由而来的各种数字信号:这是其“增强型”能力的体现。你可以将片上模拟比较器模块(CMPSS)的输出、外部中断信号、甚至其他外设的错误标志(如CLOCKFAIL, ECCDBLERR)路由进来。

这些输入信号被映射为四路核心比较信号:DCAH(数字比较A高)、DCAL(数字比较A低)、DCBH(数字比较B高)、DCBL(数字比较B低)。这里的“高/低”并非指电平,而是指比较条件。例如,你可以配置当CMPSS1的输出为高时,触发DCAH信号;当某个GPIO输入为低时,触发DCAL信号。

关键设计思路:DCA和DCB两套信号是独立且并行的,这允许你对EPWMxA和EPWMxB两个输出通道进行独立且差异化的保护和事件控制。例如,在H桥驱动中,你可以用DCA事件管理上半桥的故障响应,用DCB事件管理下半桥。

这些原始的DCAH/L和DCBH/L信号,经过事件限定逻辑,会生成四路内部事件:DCAEVT1, DCAEVT2, DCBEVT1, DCBEVT2。这四路事件就是后续所有动作的“扳机”。你可以配置事件是电平有效还是边沿有效,这为不同特性的故障信号处理提供了灵活性。

2.2 事件触发(ET)子模块:精细化的事件调度器

事件触发子模块是ePWM的“定时任务管理器”。它接收来自三个地方的事件:

  1. 时间基准(TB)子模块:如计数器等于零(CTR=0)、计数器等于周期值(CTR=PRD)。
  2. 计数比较(CC)子模块:如计数器等于CMPA/CMPB/CMPC/CMPD,并可区分递增和递减计数方向。
  3. 数字比较(DC)子模块:即上文提到的DCAEVT1.soc和DCBEVT1.soc事件。

ET模块的核心能力在于预分频(Prescale)。它允许你设定一个“事件计数器”和一个“周期值”。例如,你可以配置为“每3次CTR=CMPA事件,才产生一次中断”。这对于降低CPU中断负载、或在特定循环序列中触发动作至关重要。它管理两种主要输出:

  • 中断(EPWMxINT):通知CPU进行软件处理。
  • ADC启动转换(EPWMxSOCA/B):直接硬件触发ADC采样,实现PWM周期内特定时刻(如PWM波峰或波谷)的精准采样,这对于电流环控制等应用是必不可少的。

2.3 故障保护(Trip-Zone)子模块:系统的紧急制动

故障保护子模块是系统的最后一道硬件防线。它接收两类故障事件:

  1. 直接故障输入(TZ1-TZ6):这些是专用的、低延迟的硬件故障路径。
  2. 来自数字比较模块的强制事件(DCAEVT1/2.force, DCBEVT1/2.force):这实现了基于逻辑条件的软件可配置故障。

故障动作分为两种模式,这是理解保护逻辑的关键:

  • 单次触发(One-Shot, OSHT):一旦触发,PWM输出将被强制到一个安全状态(如高、低、高阻),并且锁存。除非软件主动清除故障标志,否则输出将一直保持安全状态。适用于过流、短路等严重且需要人工干预的故障。
  • 周期循环(Cycle-by-Cycle, CBC):在每个PWM周期开始时自动清除故障状态。如果故障条件在当前周期内再次发生,则会再次动作。适用于峰值电流限制等需要逐周期进行动态保护的应用。

3. 核心细节解析与实操要点

3.1 数字比较事件路径与优先级深度剖析

数字比较事件如何影响最终的PWM输出?其路径和优先级是配置时的重中之重。以EPWMxA通道为例,其最终输出受多层控制:

外部信号 (e.g., CMPSS, GPIO) -> 输入X-BAR -> DCAH/DCAL信号 -> DCAEVT1/2事件 -> 动作生效于EPWMxA

对EPWMxA输出引脚的控制,存在一个明确的优先级顺序(从高到低):

  1. TZA:来自直接故障引脚TZx的强制动作(通过TZCTL[TZA]配置)。
  2. DCAEVT1.force:来自数字比较事件1的强制动作(通过TZCTLDCA[DCAEVT1U/DCAEVT1D]配置)。
  3. DCAEVT2.force:来自数字比较事件2的强制动作(通过TZCTLDCA[DCAEVT2U/DCAEVT2D]配置)。

实操要点:这个优先级意味着,如果你同时使能了TZ1的故障保护和DCAEVT1的强制拉高,当两者同时发生时,TZ1的配置(比如强制拉低)会覆盖DCAEVT1的动作。这在设计冗余保护时必须仔细考量。通常,最紧急、最严重的故障(如硬件直通短路)应分配给最高优先级的TZ引脚。

3.2 事件滤波(空白窗口)的实战意义与配置陷阱

事件滤波,或称空白窗口(Blanking Window),是数字比较模块中一个极其重要但容易用错的功能。它的目的是在PWM周期的特定时间段内,暂时屏蔽数字比较事件,以防止噪声或开关毛刺引起误触发。

典型应用场景:在同步Buck或逆变器桥臂中,功率管开关瞬间会产生巨大的电压电流尖峰和噪声。如果此时模拟比较器正在采样电流,其输出很可能产生一个短暂的误触发脉冲。如果不加处理,这个脉冲会被数字比较模块捕获,导致PWM被错误关断。

空白窗口的配置涉及三个关键寄存器:

  • DCFCTL[PULSESEL]:选择空白窗口的同步基准源,通常是CTR=PRDCTR=0,即每个PWM周期的开始点。
  • DCFOFFSET:设置从同步基准点之后,延迟多少个TBCLK时钟周期才开始空白窗口。
  • DCFWINDOW:设置空白窗口持续的TBCLK周期数。

一个必须警惕的陷阱:手册中明确警告,必须确保故障输入信号在空白窗口结束后,至少保持3个ePWM时钟周期(TBCLK)的有效时间。这是因为内部同步逻辑需要时间采样和锁存信号。如果信号脉宽太窄(<3*TBCLK),即使在窗口外有效,也可能无法被可靠捕获,导致保护失灵。因此,在设计比较器电路或故障信号生成逻辑时,必须保证信号的脉冲宽度。

3.3 周期循环(CBC)保护与比较器锁存的协同设计

在峰值电流模式控制等应用中,我们使用CBC保护来逐周期限制峰值电流。这里有一个经典的“故障残留”问题。

问题描述:假设CMPSS比较器在PWM周期末尾(靠近CTR=PRD时)触发了一个跳变。这个信号经过数字滤波器(CMPSS内部或ePWM的DC模块)会产生N个时钟周期的延迟。如果这个被延迟的、有效的故障信号在周期结束时仍未消失,它会被锁存并带入下一个PWM周期。导致新周期一开始,PWM输出就被错误地强制为保护状态。

解决方案(基于手册26.11.3节):

  1. 系统设计规避:确保你的控制环路和硬件参数使得比较器触发点不会过于接近周期末尾。这需要仔细的仿真和裕量计算。
  2. 利用ePWM空白窗口:在周期结束前至少2个TBCLK启动空白窗口,并持续到下一个周期开始后至少N个TBCLK。这样就能“覆盖”掉周期末可能出现的毛刺和延迟信号。
  3. 使用CMPSS锁存与软件/硬件清零:如果使用了CMPSS的锁存输出(COMPxLATCH),可以在每个周期结束前(至少N个TBCLK)通过软件(写COMPSTSCLR寄存器)或硬件(利用ePWM生成的PWMSYNCPER信号)将其清零,从而确保每个周期都从“干净”的状态开始。

实操心得:在调试峰值电流控制时,如果发现波形在启动或负载突变时偶尔出现异常关断,首先应该怀疑的就是CBC故障残留问题。用示波器同时观察比较器输出、PWM输出和电流波形,并检查空白窗口和锁存清零的配置时序。

4. 完整配置流程与核心环节实现

下面,我将通过一个完整的电机相电流过流保护与同步采样的实例,串联起DC、ET和TZ模块的配置。场景是:使用CMPSS1监控电机U相下桥臂电流,当其超过阈值时,通过数字比较产生CBC保护,并同时触发ADC对三相电流进行同步采样。

4.1 系统初始化与GPIO/X-BAR配置

这是所有工作的基础,顺序错误可能导致启动瞬间的误触发。

void EPWM_DC_ET_Init(void) { // 步骤1: 禁用ePWM模块时钟(防止误操作) SysCtl_disablePeripheral(SYSCTL_PERIPH_CLK_EPWM1); // 步骤2: 配置GPIO引脚复用为ePWM和CMPSS功能 // 假设GPIO0为EPWM1A, GPIO1为EPWM1B, GPIO2为CMPSS1输出 GPIO_setPinConfig(GPIO_0_EPWM1_A); GPIO_setPinConfig(GPIO_1_EPWM1_B); GPIO_setPinConfig(GPIO_2_CMPSS1_OUT); // 步骤3: 配置输入X-BAR,将CMPSS1输出路由到ePWM X-BAR的某个输入 // 假设将CMPSS1.HOUT映射到INPUT X-BAR的INPUT5 InputXbar_configureInput(INPUTXBAR_BASE, INPUT5, INPUT5_SRC_CMPSS1_HOUT); // 再将INPUT X-BAR的INPUT5连接到ePWM X-BAR的TRIP4(作为数字比较源) EPWM_configureTripCombinationInput(EPWM1_BASE, EPWM_TRIP_COMBINATION_INPUT4, EPWM_TRIP_INPUT_SOURCE_INPUTXBAR5); // 步骤4: 现在才使能ePWM模块时钟 SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM1); // 等待时钟稳定 DEVICE_DELAY_US(10); }

注意:手册特别强调,必须先配置好GPIO和X-BAR,最后再使能ePWM的Trip-Zone功能。如果顺序颠倒,在配置X-BAR的瞬间,输入信号的电平跳变可能被误认为是一个有效的故障事件,导致系统意外进入保护状态。

4.2 数字比较(DC)子模块配置

我们将配置TRIP4(来自CMPSS1)作为数字比较A高(DCAH)事件的源,并启用事件滤波。

void configureDigitalCompare(EPWM_Handle epwmHandle) { uint32_t base = EPWM_getBaseAddr(epwmHandle); // 步骤1: 选择数字比较事件的信号源 // 将ePWM X-BAR的TRIP4分配给DCAH(数字比较A高事件) EPWM_selectDigitalCompareTripInput(base, EPWM_DC_TRIP_TRIP4, EPWM_DC_TYPE_DCAH); // 配置DCAH为高电平有效(当CMPSS1输出高时,认为条件满足) EPWM_setDigitalCompareEventSource(base, EPWM_DC_MODULE_A, EPWM_DC_EVENT_1, EPWM_DC_EVENT_SOURCE_TRIP_HIGH); // 步骤2: 配置事件滤波(空白窗口) // 使能DCAEVT1的事件滤波功能 EPWM_enableDigitalCompareEventFilter(base, EPWM_DC_MODULE_A, EPWM_DC_EVENT_1); // 设置空白窗口的同步源为CTR=PRD(每个PWM周期开始) EPWM_setDigitalCompareFilterEventSource(base, EPWM_DC_MODULE_A, EPWM_DC_EVENT_1, EPWM_DC_WINDOW_START_SOURCE_PERIOD); // 设置偏移量:在CTR=PRD后延迟10个TBCLK再开始空白窗口 EPWM_setDigitalCompareFilterOffset(base, EPWM_DC_MODULE_A, 10); // 设置空白窗口持续时间为20个TBCLK EPWM_setDigitalCompareFilterWindow(base, EPWM_DC_MODULE_A, 20); // 注意:根据之前的分析,需要确保故障信号在窗口外持续至少3个TBCLK // 步骤3: 配置DCAEVT1事件的动作 // 将DCAEVT1配置为周期循环(CBC)故障源 EPWM_enableTripZoneSignals(base, EPWM_TZ_SIGNAL_DCAEVT1, EPWM_TZ_ACTION_CBC); // 配置当DCAEVT1 CBC故障发生时,强制EPWM1A输出低电平(关断上管) EPWM_setTripZoneAction(base, EPWM_TZ_ACTION_EVENT_DCAEVT1, EPWM_TZ_OUTPUT_A, EPWM_TZ_OUTPUT_LOW); // EPWM1B的动作可以根据需要独立配置,例如也拉低或高阻 EPWM_setTripZoneAction(base, EPWM_TZ_ACTION_EVENT_DCAEVT1, EPWM_TZ_OUTPUT_B, EPWM_TZ_OUTPUT_HIGH_Z); }

配置逻辑解析

  1. 信号路由:将CMPSS1的输出,经过两级X-BAR,最终映射为ePWM1模块内部的DCAH信号。
  2. 事件定义:定义当DCAH信号为高时,产生DCAEVT1事件。
  3. 噪声抑制:在PWM周期开始后的10-30个TBCLK时钟内(空白窗口),忽略任何DCAEVT1事件。这覆盖了功率管开关的噪声期。
  4. 保护动作:将DCAEVT1事件配置为CBC故障,并指定其动作为强制EPWM1A输出低(安全状态)。这是一个典型的逐周期过流保护。

4.3 事件触发(ET)子模块配置

我们希望当DCAEVT1事件发生时(即电流超限),不仅能触发保护动作,还能同步启动ADC采样,记录故障发生时的电流值。

void configureEventTrigger(EPWM_Handle epwmHandle) { uint32_t base = EPWM_getBaseAddr(epwmHandle); // 步骤1: 配置ADC启动转换(SOC)事件 // 选择DCAEVT1.soc作为SOCA的触发源 EPWM_setADCTriggerSource(base, EPWM_SOC_A, EPWM_SOC_DCAEVT1); // 配置SOCA为单次触发模式(每个DCAEVT1事件触发一次ADC转换) EPWM_setADCTriggerEventPrescale(base, EPWM_SOC_A, 1); // 每1个事件触发一次 // 使能SOCA触发 EPWM_enableADCTrigger(base, EPWM_SOC_A); // 步骤2: 配置中断事件(可选,用于故障记录) // 我们也可以选择在DCAEVT1事件发生时产生中断,用于软件记录故障次数等 EPWM_enableTripZoneInterrupt(base, EPWM_TZ_INTERRUPT_DCAEVT1); // 设置中断事件预分频:每发生1次DCAEVT1事件就产生一次中断 EPWM_setInterruptEventCount(base, 1); // 选择中断事件源为DCAEVT1 // 注意:这里的中断源是TZ子模块的DCAEVT1中断,与ET子模块的中断不同源但关联 // 更常见的做法是在TZ中断服务程序里处理,这里仅为示例 }

配置逻辑解析

  1. ADC同步采样:将DCAEVT1事件链接到SOCA。一旦电流超限(DCAEVT1发生),硬件会立即发出一个ADC启动脉冲,无需CPU干预。这保证了采样时刻与故障时刻的严格同步,对于事后分析至关重要。
  2. 中断处理:使能了DCAEVT1的Trip-Zone中断。���中断发生时,可以在中断服务程序(ISR)中清除故障标志、增加故障计数器或执行更复杂的恢复逻辑。注意:CBC故障通常不需要在每次发生时都进中断,以免中断过于频繁。这里使能主要用于严重故障统计或首次故障记录。

4.4 故障保护(Trip-Zone)子模块的完整配置

综合以上配置,并补充TZ直接引脚的配置。

void configureTripZone(EPWM_Handle epwmHandle) { uint32_t base = EPWM_getBaseAddr(epwmHandle); // 配置直接故障引脚 TZ1 (假设接硬件紧急故障,如驱动芯片FAULT) // 将TZ1配置为单次触发(OSHT)源 EPWM_enableTripZoneSignals(base, EPWM_TZ_SIGNAL_OSHT1, EPWM_TZ_ACTION_OSHT); // 配置TZ1触发时,强制两个PWM输出都为低(安全状态) EPWM_setTripZoneAction(base, EPWM_TZ_ACTION_EVENT_TZ1, EPWM_TZ_OUTPUT_A, EPWM_TZ_OUTPUT_LOW); EPWM_setTripZoneAction(base, EPWM_TZ_ACTION_EVENT_TZ1, EPWM_TZ_OUTPUT_B, EPWM_TZ_OUTPUT_LOW); // 使能TZ1中断,用于通知CPU发生了不可自恢复的严重故障 EPWM_enableTripZoneInterrupt(base, EPWM_TZ_INTERRUPT_OSHT1); // 数字比较故障(DCAEVT1)的CBC配置已在configureDigitalCompare中完成 // 此处需要使能其Trip-Zone中断(如果之前没在ET配置中使能) EPWM_enableTripZoneInterrupt(base, EPWM_TZ_INTERRUPT_DCAEVT1); // 配置故障引脚极性(假设TZ1低电平有效) EPWM_setTripZoneInputPolarity(base, EPWM_TZ_INPUT_1, EPWM_TZ_POLARITY_ACTIVE_LOW); // 最后,使能整个Trip-Zone模块 EPWM_enableTripZone(base); }

配置总结

  • TZ1 (OSHT):硬件紧急故障,锁存式保护,最高优先级。用于处理必须停机检查的严重故障。
  • DCAEVT1 (CBC):软件逻辑故障(电流超限),逐周期保护,可自动恢复。用于处理动态的、可容忍的瞬时过流。
  • 动作优先级:TZ1的动作会覆盖DCAEVT1的动作,符合安全设计原则。

5. 常见问题与排查技巧实录

在实际调试中,ePWM的DC和ET模块配置灵活,也容易遇到一些隐蔽的问题。下面是我在项目中踩过的一些“坑”及解决方法。

5.1 问题一:故障保护完全无反应,PWM输出不受控

现象:配置了数字比较和故障保护,但模拟比较器输出有效信号时,PWM输出毫无变化。

排查步骤

  1. 检查时钟与使能:确认ePWM模块的时钟(PCLKCR)已使能,并且时间基准计数器(TBCTR)正在运行。一个静止的计数器不会产生任何周期事件,很多逻辑依赖于此。
  2. 验证信号通路:这是最复杂的一环。使用CCS的寄存器观察窗口或实时调试功能。
    • 首先检查GPIOxDAT寄存器,确认输入引脚的电平是否随外部信号变化。
    • 检查输入X-BAR选择寄存器INPUTxSELECT,确认GPIO引脚是否正确映射到了预期的INPUT通道。
    • 检查ePWM X-BAR配置,确认INPUT信号是否路由到了正确的TRIP输入(如TRIP4)。
    • 在DC模块中,检查DCTRIPSEL寄存器,确认TRIP输入是否被选为DCAH/DCAL等信号的源。
    • 检查TZDCSEL寄存器,确认DCAH/L信号是否被正确限定以生成DCAEVT1事件。
    • 最后,检查TZFLG寄存器。当故障条件满足时,对应的CBC或OST标志位应该被置1。如果标志位没变化,说明故障信号在到达TZ模块前就已经丢失。
  3. 检查动作配置:确认TZSEL寄存器已使能对应事件(DCAEVT1)作为CBC或OST源。确认TZCTLTZCTLDCA寄存器已配置了非“忽略(Ignore)”的动作(如强制高、低、高阻)。

技巧:可以软件强制故障来隔离问题。通过写TZFRC寄存器的对应位(如TZFRC[DCAEVT1]),可以手动产生一个故障事件。如果强制后PWM能按预期动作,说明TZ模块本身的配置是正确的,问题出在前端的信号通路或事件生成逻辑。

5.2 问题二:ADC SOC触发不稳定或时机不对

现象:配置了由DCAEVT1触发SOCA,但ADC有时不转换,或转换时刻飘忽不定。

排查步骤

  1. 确认事件源:检查ETSEL[SOCASEL]寄存器,确保选择的是DCAEVT1.soc,而不是其他事件。
  2. 检查预分频与计数器:这是最常见的原因。重点检查ETPS[SOCACNT]ETPS[SOCAPRD]
    • SOCAPRD不能为0:如果设为0,SOC发生器是被禁用的,永远不会触发。必须设为1(每个事件触发)或更大。
    • 理解计数器逻辑SOCACNT会在每个选择的DCAEVT1.soc事件时递增。当SOCACNT == SOCAPRD时,才会产生一个SOC脉冲,并且SOCACNT被清零。如果SOCAPRD=2,那么是每2个事件触发一次。如果你的故障事件只发生了一次,SOCACNT从0加到1,不等于2,所以不会触发SOC。你需要检查SOCACNT的当前值。
  3. 检查空白窗口冲突:如果DCAEVT1事件发生在你为它配置的空白窗口内,该事件会被过滤掉,自然不会产生DCAEVT1.soc信号。检查DCFOFFSETDCFWINDOW的设置是否不合理地覆盖了故障发生的实际时间点。
  4. 检查ADC模块配置:确保ADC的SOCA通道已正确配置,并且ADC模块已使能,不在复位状态。

技巧:使用ETFRC[SOCA]位进行软件强制。在调试时,手动置位此位,观察ADC是否能正常启动转换。这可以快速判断是ePWM的SOC生成逻辑问题,还是ADC接收端的问题。

5.3 问题三:周期循环(CBC)故障无法自动清除,输出持续被钳位

现象:电流超限触发CBC保护后,即使故障信号已消失,PWM输出在下一个周期仍然保持被钳位的安全状态,没有恢复。

排查步骤

  1. 确认是CBC模式:检查TZSEL[CBCx]位是否已使能对应的事件源(如DCAEVT1)。
  2. 检查CBC锁存清除条件:CBC锁存会在每个PWM周期开始时,当TBCTR=0TBCTR=PRD时(取决于TZCLR[CBCPULSE]的配置)自动清除。确保你的时间基准模块工作在递增计数(UP)上下计数(UP-DOWN)模式。如果工作在冻结模式,计数器不运行,CBC锁存永远不会被自动清除。
  3. 检查故障信号脉宽:回顾之前提到的“故障残留”问题。如果故障信号(或经过滤波延迟后的信号)在周期清除点(CTR=0)时仍然有效,那么清除动作会失效,锁存状态会保持到下一个周期。用示波器或CCS的图形工具,同时捕获比较器输出和TBCTR的值,观察时序关系。
  4. 检查TZ标志位:在ISR或主循环中,需要软件清除CBC故障标志TZFLG[CBC]。虽然CBC动作是硬件自动恢复的,但标志位需要软件清除,否则可能影响后续中断触发。使用TZCLR[CBC]来清除它。

一个隐蔽的坑:如果你同时使能了多个CBC源(例如TZ1和DCAEVT1),那么任何一个CBC源有效,都会导致CBC动作。你必须确保所有CBC源的条件都已解除,并且清除了所有对应的TZFLG[CBCx]标志,PWM输出才会恢复正常。

5.4 配置检查清单与调试建议

为了避免低级错误,在完成配置后,可以按照以下清单快速核对:

检查项相关寄存器/位预期状态
ePWM模块时钟使能PCLKCR0/2对应EPWMx位=1
TBCTR在运行TBCTL[CTRMODE]非00(冻结模式)
GPIO复用正确GPxMUX, GPxDIR对应引脚配置为外设功能
X-BAR路由正确INPUTxSELECT, EPWM X-BAR配置信号源->INPUT->TRIP路径畅通
DC事件源选择DCTRIPSEL, DCAHTRIPSEL等正确选择了TRIP输入
DC事件限定TZDCSELDCAH/L等信号能生成EVT
事件滤波配置DCFCTL, DCFOFFSET, DCFWINDOW偏移和窗口值合理,未覆盖有效事件区
TZ事件使能TZSEL[CBCx], TZSEL[OSHTx]对应事件源已使能
TZ动作配置TZCTL, TZCTLDCA/DCB动作非“忽略”(3)
ET事件源选择ETSEL[INTSEL], ETSEL[SOCASEL]选择了正确的事件
ET预分频配置ETPS[INTPRD], ETPS[SOCAPRD]值不为0,符合预期分频
中断使能与标志TZEINT, ETFLG, ETCLR中断已��能,标志位能正确置位/清除

调试建议

  • 分步调试:不要一次性配置所有复杂功能。先配置基本的PWM输出,然后逐步添加数字比较、事件触发、故障保护。
  • 善用强制功能TZFRCETFRC寄存器是你的好朋友。在硬件信号难以模拟时,用软件强制产生事件,可以高效地验证后续逻辑是否正确。
  • 可视化工具:充分利用CCS的寄存器观察窗口、内存浏览器,以及更高级的实时变量跟踪和图形显示功能,直观地观察TBCTR、CMPA、故障标志等关键变量的变化。
  • 双通道示波器:永远是硬件调试的利器。一个通道看PWM输出,另一个通道看故障输入信号或比较器输出,可以一目了然地看清时序问题。

我个人在多个大功率电机驱动项目上应用了这套配置。最深的一点体会是:保护逻辑的可靠性比控制性能的极致更重要。一次误保护可能导致停机,但一次保护失灵则可能导致炸机。因此,在配置数字比较和故障保护时,一定要反复推敲时序,考虑最坏情况,并充分利用空白窗口、滤波和优先级机制来构建一个既灵敏又抗干扰的“安全网”。例如,对于关键的硬件故障(如IGBT去饱和检测),我通常会同时使用硬件TZ引脚(最高优先级,OSHT模式)和经过软件滤波的数字比较路径(CBC模式)进行双重保护,确保万无一失。