TI C2000 ePWM核心寄存器实战解析:从CMPA到死区控制

TI C2000 ePWM核心寄存器实战解析:从CMPA到死区控制

1. 从寄存器手册到实战:ePWM核心寄存器深度解析

如果你正在用TI的C2000系列MCU做电机控制、数字电源或者任何需要精密PWM波形的项目,那么ePWM模块绝对是你绕不开的核心。手册里那一页页的寄存器描述,像CMPA、AQCTL、DBCTL这些,初看可能觉得就是一堆位域定义,但真正用起来,你会发现它们直接决定了你的PWM波形是否精准、是否安全、是否高效。我这些年调试过不少项目,从简单的LED调光到复杂的伺服驱动,深刻体会到:吃透这几个核心寄存器,就等于掌握了ePWM的“任督二脉”。今天,我就抛开那些照本宣科的翻译,结合实际的调试经验和踩过的坑,带你把这些寄存器“掰开了、揉碎了”看明白,让你配置起来心里有底,调试起来手里有谱。

很多人看手册,只关心某个位写0还是写1,却忽略了这些设置背后的硬件行为逻辑和时序关系。比如,你以为配置了CMPA就能出波,结果输出死活没反应,最后发现是影子寄存器没加载;又比如,死区时间算对了,但电机驱动还是烧了MOS管,一查是极性模式没配对。这些问题,根源都在于对寄存器联动的理解不够深入。本文的目的,就是帮你建立这种系统性的理解。我们会聚焦在波形生成的核心链条上:比较寄存器设定“何时”发生事件,动作限定寄存器决定“发生什么”动作,而死区控制寄存器则确保动作“安全可靠”地输出。我会用具体的代码片段、示波器实测的波形图(文字描述)以及典型的配置场景,把这条链路彻底讲透。

2. 核心寄存器功能总览与设计哲学

在深入每个寄存器之前,我们得先站在模块设计者的角度,看看TI的ePWM是怎么把PWM生成这件事给模块化的。这绝不是一堆寄存器的简单堆砌,而是一个高度结构化、流水线化的硬件状态机。

2.1 ePWM子模块协同工作流

你可以把ePWM模块想象成一个精密的波形加工厂。时间基准计数器是流水线的传送带,它按照你设定的速度和模式(递增、递减、先增后减)循环运转。CMPA和CMPB就像是流水线上的两个光电传感器,你预先设置好它们的位置(比较值)。当传送带(TBCTR)经过这些位置时,就会触发一个“比较匹配”事件信号。

这个事件信号被送到下一个车间:动作限定模块。AQCTLA和AQCTLB就是这里的“工艺指导书”,它们规定了一旦收到某个事件(比如CMPA向上计数匹配、周期匹配、零匹配),流水线末端的机械臂(EPWMxA和EPWMxB输出引脚)应该执行什么动作——是把产品(电平)置高、拉低,还是翻转。

然而,在驱动电机H桥或半桥这样的场景下,直接输出这两个信号是危险的。因为控制上、下管的两路PWM信号不能同时为高,否则会引发直通短路,瞬间烧毁功率管。所以,信号在最终输出前,必须经过死区控制模块。DBCTL、DBRED、DBFED这几个寄存器构成的这个模块,就像一个安全调度员,它会根据你设定的模式,对两路信号的上升沿或下降沿施加一个可编程的延迟,确保在任何时刻,两路信号都有一小段同时为低(或高阻)的“死区时间”,从而从硬件上杜绝直通风险。

最后,还有一套故障保护机制,由TZSEL、TZCTL等寄存器管理。它像工厂的紧急制动按钮,一旦外部检测到过流、过压等故障(通过TZ引脚或数字比较器),可以立即强制PWM输出进入预设的安全状态(如高阻、拉高、拉低),响应速度在纳秒级,这是软件无法比拟的。

2.2 关键寄存器速查与关联

为了让你有个全局视野,我把接下来要重点剖析的寄存器及其核心作用整理成了下面这个表格。你可以把它当作一个“地图”,在后续阅读具体章节时随时回看,理解它们在整个链条中的位置。

寄存器名称偏移地址核心功能简述关联子模块配置优先级
TBCTR0x00时间基准计数器,PWM时基的核心。时间基准最先配置
CMPA0x10比较器A值,定义第一个波形跳变点。计数比较次优先
CMPB0x16比较器B值,定义第二个波形跳变点或互补波形点。计数比较次优先
AQCTLA0x14控制EPWMxA输出引脚在各类事件(CMPA, CMPB, PRD, ZRO)上的动作。动作限定必须与CMPx配合
AQCTLB0x1A控制EPWMxB输出引脚在各类事件上的动作。动作限定必须与CMPx配合
DBCTL0x1C死区控制寄存器,决定是否启用死区、输入信号源和输出极性。死区控制在AQ之后配置
DBRED0x22上升沿延迟寄存器,设置信号上升沿的延迟时间。死区控制在DBCTL之后
DBFED0x20下降沿延迟寄存器,设置信号下降沿的延迟时间。死区控制在DBCTL之后
TZSEL0x26选择哪些信号源(引脚/数字比较)能触发故障保护。故障保护根据硬件连接配置
TZCTL0x2A定义当故障发生时,EPWMxA/B输出应采取的紧急动作。故障保护必须配置的安全策略

提示:配置ePWM时,建议遵循“时基 -> 比较值 -> 动作 -> 死区 -> 保护”的流程。这个顺序符合信号在硬件中的实际生成路径,能避免很多因依赖关系导致的意外行为。

3. 波形生成的基石:CMPA/CMPB比较寄存器详解

CMPA和CMPB寄存器是PWM占空比和相位控制的直接设定者。很多人觉得它们简单,不就是写个值吗?但里面的“影子寄存器”机制和与计数器模式的配合,才是精准控制的精髓。

3.1 寄存器位域与影子机制

CMPA和CMPB都是16位可读写寄存器,复位值为0。它们的位域非常简单,低16位就是比较值CMPACMPB。这个值会与时间基准计数器TBCTR进行实时比较。

但关键在于,手册里提到的“active register”(活动寄存器)和“shadow register”(影子寄存器)。这是TI为了确保PWM波形在切换参数时平滑无毛刺而设计的双缓冲机制。默认情况下,你通过软件写入CMPA地址的值,并不是直接进入那个直接与硬件比较器相连的活动寄存器,而是先写入了它的影子寄存器。活动寄存器会在一个特定的、安全的时刻(例如TBCTR计数到0时),自动从影子寄存器加载新值。

这个机制由CMPCTL寄存器中的SHDWAMODESHDWBMODE位控制。当该位为0(默认),影子模式启用。此时:

  • LOADAMODE/LOADBMODE位决定加载时机:通常设置为在CTR=0CTR=PRD时加载,这样能确保在一个完整的PWM周期开始时启用新比较值,避免周期中间出现跳变,导致脉冲宽度异常。
  • 在写入前,应通过查询SHDWAFULL/SHDWBFULL状态位来确认影子寄存器是否为空(可写入)。如果满了还强行写,可能会丢失数据。一个稳健的写法是:
while(EPwm1Regs.CMPCTL.bit.SHDWAFULL == 1) { // 等待影子寄存器空闲,通常耗时极短 } EPwm1Regs.CMPA.half.CMPA = new_duty_cycle_value; // 写入影子寄存器

SHDWxMODE位为1时,影子寄存器被禁用,任何读写操作直接针对活动寄存器。这种模式适用于需要实时、立即更新PWM参数的场景,但风险是可能破坏正在输出的PWM周期,导致脉冲畸变。在电机控制中,除非是做特定调试,否则强烈建议使用影子模式。

3.2 比较值计算与计数器模式实战

比较值的设定,完全取决于你采用的计数器模式。TI ePWM主要支持两种模式:递增计数模式递增-递减计数模式

场景一:不对称PWM(边沿对齐) - 递增计数模式在此模式下,TBCTR从0计数到周期值TBPRD,然后归零重启。CMPA的值决定了在哪个计数值时触发事件。假设你要生成一个占空比为D(0.0到1.0)的PWM,计算公式为:CMPA = (1 - D) * TBPRD等等,为什么是(1-D)?这是因为在递增模式下,通常我们配置的动作是:当CTR=CMPA清零输出,当CTR=PRD置位输出。这样,输出高电平的时间就是从周期开始到CMPA点,占空比D = CMPA / TBPRD。但更常见的做法是,我们想让CMPA直接代表高电平时间,那么公式就是CMPA = D * TBPRD,同时配置动作:CTR=CMPA置位CTR=PRD清零。这两种配置都能生成PWM,只是相位相反。关键是要理解你的动作配置和比较值之间的数学关系

场景二:对称PWM(中心对齐) - 递增-递减计数模式这是电机控制中最常用的模式,波形关于中心对称,谐波特性更好。TBCTR从0递增到TBPRD,再递减回0。此时,一个PWM周期内,TBCTR会两次经过同一个CMPA值(一次递增,一次递减)。因此,一个CMPA值可以产生两个事件,这为实现复杂的波形(如带死区的互补PWM)提供了基础。 通常,我们配置动作在递增匹配和递减匹配时分别进行置位清零操作。例如,要生成一个占空比为D的对称PWM,可以设置:CMPA = D * TBPRD然后配置AQCTL:在CTR=CMPA且递增时清零,在CTR=CMPA且递减时置位。这样,在一个周期内,输出会在计数值上升阶段和下降阶段各跳变一次,形成中心对称的波形。CMPB则可以用来生成另一路具有相位差的PWM,例如用于控制H桥的另一臂。

注意:在递增-递减模式下,TBPRD寄存器配置的是计数器的峰值。因此,实际的PWM周期Tpwm = 2 * TBPRD * Ttbclk,其中Ttbclk是时间基准时钟周期。计算死区时间和开关频率时,务必用这个公式。

4. 动作指挥官:AQCTLA/AQCTLB动作限定寄存器解析

如果说CMPA/CMPB决定了事件发生的“时刻”,那么AQCTLA和AQCTLB就是决定此时输出引脚该做何“动作”的指挥官。它们的配置直接决定了波形的形状。

4.1 寄存器位域深度解读

以AQCTLA为例(AQCTLB结构完全一致,仅作用于EPWMxB输出),它是一个16位寄存器,但有效配置位集中在低8位,每2位控制一种事件发生时的动作:

  • CAU (Bits 5-4): 当计数器等于CMPA且处于递增方向时的动作。
  • CAD (Bits 7-6): 当计数器等于CMPA且处于递减方向时的动作。
  • CBU (Bits 9-8): 当计数器等于CMPB且处于递增方向时的动作。
  • CBD (Bits 11-10): 当计数器等于CMPB且处于递减方向时的动作。
  • PRD (Bits 3-2): 当计数器等于周期值TBPRD时的动作。在递增-递减模式下,此时方向定义为递减。
  • ZRO (Bits 1-0): 当计数器等于0时的动作。在递增-递减模式下,此时方向定义为递增。

每2位字段的取值含义:

  • 00b: 无操作(忽略事件)。
  • 01b: 清零(强制输出低电平)。
  • 10b: 置位(强制输出高电平)。
  • 11b: 翻转(低变高,高变低)。

这里有一个极其重要的细节:这些事件是彼此独立的,并且按优先级处理。如果在一个TBCLK时钟沿,有多个事件同时发生(理论上可能,比如CMPA=TBPRD),硬件有固定的优先级顺序来处理这些动作。通常,ZRO和PRD事件的优先级高于CAU/CAD等比较事件。这意味着你必须仔细设计你的比较值,避免在计数器等于0或周期值时,CMPA/CMPB也恰好等于这些值,否则可能导致非预期的动作覆盖。

4.2 典型波形配置实例与代码

让我们通过两个最常用的例子,把CMP和AQ的配置串起来。

实例1:生成简单的递增计数模式PWM(EPWMxA输出)目标:100kHz开关频率,50%占空比,系统时钟SYSCLKOUT=100MHz,采用预分频器使TBCLK=SYSCLKOUT。

  1. 计算TBPRD:Tpwm = 1/100kHz = 10usTtbclk = 1/100MHz = 10ns。在递增模式下,TBPRD = Tpwm / Ttbclk - 1 = 999
  2. 计算CMPA: 50%占空比,CMPA = 0.5 * TBPRD = 499(取整)。
  3. 配置动作:我们希望波形在周期开始时为高,在CMPA点时变低。
    • CTR=PRD时(周期结束点),我们希望输出置位(变高),所以设置AQCTLA.PRD = 2(10b)。
    • CTR=CMPA时(匹配点),我们希望输出清零(变低),所以设置AQCTLA.CAU = 1(01b)。(因为是递增模式,只用CAU)
EPwm1Regs.TBPRD = 999; // 设置周期值 EPwm1Regs.CMPA.half.CMPA = 499; // 设置比较值 EPwm1Regs.AQCTLA.bit.PRD = 2; // PRD事件:置位 EPwm1Regs.AQCTLA.bit.CAU = 1; // CMPA递增匹配:清零 EPwm1Regs.TBCTL.bit.CTRMODE = 0; // 设置为递增计数模式

实例2:生成带死区的互补对称PWM(用于半桥)目标:使用EPWMxA和EPWMxB输出一对互补的对称PWM,为后续死区模块提供原始信号。我们利用一个CMPA和不同的动作配置来实现。

  1. 设置TBPRD,假设为500,采用递增-递减模式。
  2. 设置CMPA为250(50%占空比)。
  3. 配置AQCTLA(控制EPWMxA):
    • ZRO(CTR=0): 无操作或置位/清零,取决于初始相位。假设我们希望周期中心为高,可以设ZRO=1(清零)。
    • CAU(CTR=CMPA且递增): 设为2(置位)。这样,在计数上升阶段到达CMPA时,EPWMxA变高。
    • CAD(CTR=CMPA且递减): 设为1(清零)。这样,在计数下降阶段离开CMPA时,EPWMxA变低。
    • PRD(CTR=TBPRD): 无操作。
  4. 配置AQCTLB(控制EPWMxB),生成互补信号:
    • ZRO: 设为2(置位),与EPWMxA相反。
    • CAU: 设为1(清零),与EPWMxA相反。
    • CAD: 设为2(置位),与EPWMxA相反。
    • PRD: 无操作。

这样配置后,EPWMxA和EPWMxB将输出完全互补的对称PWM,但两者之间没有死区,直接驱动半桥会短路。这就是为什么必须引入死区控制模块的原因。

实操心得:在调试AQCTL配置时,如果输出波形不符合预期,一个非常有效的方法是使用CCS的寄存器观察窗口和实时图形化工具(如CCS的Data Graph),同时结合GPIO翻转来标记代码执行点。先屏蔽死区模块(DBCTL.OUT_MODE=0),直接观察AQ模块输出的原始信号,确保其逻辑正确,然后再启用死区处理。这能帮你快速定位问题是出在动作配置上,还是死区模块的配置上。

5. 安全屏障:死区控制寄存器DBCTL、DBRED、DBFED精讲

死区控制是功率电子中的保命机制。它的原理很简单:在两路互补的PWM信号中,插入一段两者都为低电平(或无效状态)的时间,确保一个开关管完全关断后,另一个才开启。ePWM的死区模块硬件化实现了这一功能,精度高且不占用CPU资源。

5.1 DBCTL:控制逻辑与模式选择

DBCTL寄存器是整个死区模块的大脑,它决定了三个关键问题:用谁的信号作为输入?输出要不要反向?以及死区功能是否启用?

  • IN_MODE (Bits 5-4): 输入模式选择。这是最容易出错的地方之一。它选择��路信号作为上升沿延迟和下降沿延迟的输入源。

    • 00(默认): EPWMxA作为两路延迟的输入源。这是最经典的“同源”模式,适用于用一路AQ输出生成带死区的两路互补信号。
    • 01: EPWMxA作为下降沿延迟输入,EPWMxB作为上升沿延迟��入。这种模式允许你使用两路不同的原始信号(来自AQ)来生成死区,灵活性更高。
    • 10: EPWMxA作为上升沿延迟输入,EPWMxB作为下降沿延迟输入。
    • 11: EPWMxB作为两路延迟的输入源。
  • POLSEL (Bits 3-2): 极性选择。它选择在延迟后,对哪路信号进行取反。

    • 00: 主动高模式。两路都不反相。输出EPWMxA是输入信号经过上升沿延迟后的结果;输出EPWMxB是输入信号经过下降沿延迟后的结果。
    • 01: 主动低互补模式。对EPWMxA输出取反。这种模式常用于驱动需要低电平有效的功率器件,或者为了与后续驱动芯片的逻辑匹配。
    • 10: 主动高互补模式。对EPWMxB输出取反。
    • 11: 主动低模式。两路都取反。
  • OUT_MODE (Bits 1-0): 输出模式控制,即死区功能使能位。

    • 00: 完全旁路。AQ的输出直接送到下一级,死区模块不工作。调试AQ时务必先设为此模式
    • 01: 禁用上升沿延迟。EPWMxA直通,EPWMxB输出为带下降沿延迟的信号。
    • 10: 禁用下降沿延迟。EPWMxA输出为带上升沿延迟的信号,EPWMxB直通。
    • 11: 完全使能。EPWMxA输出带上升沿延迟,EPWMxB输出带下降沿延迟。这是最常用的模式

配置策略:对于典型的半桥驱动,我们通常希望输出两路互补、带死区、且初始状态都为低的PWM(防止上电瞬间导通)。一种常见的配置组合是:IN_MODE=00(EPWMxA作共同源),POLSEL=01(EPWMxA取反,即A输出低有效,B输出高有效或经延迟),OUT_MODE=11(完全使能死区)。但具体取决于你的驱动芯片逻辑和MOS管类型(N管高电平导通,P管低电平导通)。

5.2 DBRED与DBFED:延迟时间计算与精度

DBRED和DBFED是两个10位寄存器,分别控制上升沿延迟和下降沿延迟的计数值。这个“延迟”是以TBCLK(或半周期TBCLK,见下文)为单位的计数延迟。

  • DEL (Bits 9-0): 10位延迟值,范围0-1023。
  • 死区时间计算Tdead = DEL * Tdbclk其中,Tdbclk是死区模块的时钟周期,由DBCTL的HALFCYCLE位决定。
    • 如果HALFCYCLE=0Tdbclk = Ttbclk
    • 如果HALFCYCLE=1Tdbclk = Ttbclk / 2。这相当于将死区时钟频率加倍,从而在相同的DEL值下获得更精细的死区时间分辨率,或者在相同的分辨率下能用更小的DEL值实现相同的死区时间,节省寄存器位宽。在需要非常小死区时间的高频应用中,启用半周期时钟非常有用

举例Ttbclk = 10ns(100MHz),HALFCYCLE=0,需要500ns的死区时间。则DEL = 500ns / 10ns = 50。将50分别写入DBRED和DBFED,即可为上升沿和下降沿添加500ns的延迟。

重要警告:死区时间是插入到原始信号中的。例如,对于EPWMxA(假设为高有效),死区模块会在其原始上升沿后延迟DBRED个时钟再给出上升沿,在其原始下降沿后延迟DBFED个时钟再给出下降沿。对于互补信号EPWMxB,逻辑相反。务必确保DBRED + DBFED的值小于你的PWM最小脉宽,否则会导致有效脉冲完全消失,输出恒高或恒低。通常,死区时间设置为功率器件开关时间(关断延迟+存储时间)的1.5到2倍,并留有一定裕量。

5.3 完整死区配置流程与验证

假设我们要基于实例2中AQ生成的互补对称PWM(EPWMxA高有效,EPWMxB低有效),添加死区。

  1. 配置AQ模块:如实例2所示,生成一对理想的、无死区的互补信号EPWMxA和EPWMxB(来自AQ输出)。
  2. 配置DBCTL
    EPwm1Regs.DBCTL.bit.IN_MODE = 0; // 00: EPWMxA作为两路延迟的源 EPwm1Regs.DBCTL.bit.POLSEL = 1; // 01: ALC模式,对EPWMxA取反 (使EPWMxA输出低有效) EPwm1Regs.DBCTL.bit.OUT_MODE = 3; // 11: 完全使能死区 // 注意:经过POLSEL取反后,最终输出的EPWMxA_DB和EPWMxB_DB的逻辑需要仔细分析。 // 一种更清晰的思路是:我们希望最终输出两路高有效、带死区的互补信号。 // 可以配置IN_MODE=00, POLSEL=00, 这样EPWMxA_DB = EPWMxA延迟上升沿, EPWMxB_DB = EPWMxA延迟下降沿。 // 但此时EPWMxB_DB的相位与原始EPWMxB(来自AQ)是反的。因此,我们需要返回去调整AQCTLB的配置,使其生成的原始EPWMxB与EPWMxA同相,而不是互补! // 这才是正确的配置逻辑:让AQ生成两路同相的信号,然后利用死区模块的延迟和取反功能,生成最终的互补带死区信号。
  3. 重新审视并修正AQ配置
    • 目标:最终输出EPWMxA_DB和EPWMxB_DB为高有效互补带死区。
    • 策略:配置AQ模块,使原始EPWMxA和EPWMxB输出相同的PWM波形(例如,都是50%占空比的高有效PWM)。
    • 死区模块设置:IN_MODE=00(都用EPWMxA作源),POLSEL=00(都不取反),OUT_MODE=11(完全使能)。
    • 结果:EPWMxA_DB = EPWMxA延迟上升沿;EPWMxB_DB = EPWMxA延迟下降沿。由于是对同一个信号的不同边沿做延迟,自然形成了互补,并且死区存在于两个跳变沿之间。
  4. 计算并设置死区时间
    Uint16 dead_time_ns = 500; // 目标死区时间500ns float t_tbclk_ns = 10.0; // TBCLK周期10ns EPwm1Regs.DBCTL.bit.HALFCYCLE = 0; // 使用全周期时钟 Uint16 del_val = (Uint16)(dead_time_ns / t_tbclk_ns); EPwm1Regs.DBRED = del_val; // 上升沿延迟 EPwm1Regs.DBFED = del_val; // 下降沿延迟
  5. 验证:用示波器同时测量最终的EPWMxA_DB和EPWMxB_DB引脚。你应该看到两路高电平有效的互补PWM,并且在一路下降沿和另一路上升沿之间,存在一个两者都为低电平的死区时间,其宽度应等于你设置的值。

6. 高级应用与故障保护寄存器初探

在掌握了波形生成和死区控制的核心后,ePWM还提供了更强大的功能,如软件强制输出、数字比较以及至关重要的故障保护。这些功能通过AQSFRC、AQCSFRC、TZSEL、TZCTL等寄存器实现。

6.1 软件强制与数字比较

AQSFRC (One-Time Software Force): 这个寄存器允许你通过软件立即触发一次性的动作。例如,OTSFA位写1,会立即产生一个针对EPWMxA的强制事件,并根据ACTSFA位的配置(清零、置位、翻转)改变输出。这在某些需要同步或特定初始化的场景下有用。注意:这是一个一次性触发,写操作后位会自动清零。

AQCSFRC (Continuous Software Force): 与AQSFRC类似,但它是持续性的强制。一旦设置CSFA=1(强制A输出低),输出将一直被强制为低,直到你清除该强制(CSFA=0)。这在故障调试、手动控制输出状态时非常方便。

数字比较与事件触发:TZDCSEL、TZSEL等寄存器允许你将片上的数字比较器模块的输出作为ePWM的事件源。比如,你可以用ADC转换结果与某个阈值在数字比较器中比较,当其输出满足条件时(如DCAH为高),触发一个事件(DCAEVT1),这个事件可以直接通过TZCTL寄存器控制PWM输出进入安全状态(如高阻),或者通过配置AQCTL产生特定的波形动作。这实现了模拟信号对PWM的实时、硬件级联动控制,响应速度极快。

6.2 故障保护机制:最后的防线

故障保护是工业系统的生命线。ePWM的Trip-Zone子模块提供了硬件级别的快速保护。

  1. 故障源选择 (TZSEL): 你可以选择哪些信号能触发保护。包括外部引脚TZ1~TZ6(通常连接过流、过压比较器)以及内部数字比较器事件DCAEVT1/2DCBEVT1/2。每个源还可以单独配置为一次性触发周期循环触发

    • 一次性触发:故障发生后,输出被锁存在安全状态,直到软件清除故障标志。
    • 周期循环触发:故障在每个PWM周期都会被检测,如果故障消失,输出会在下一个周期自动恢复正常。适用于需要逐周期限流的场景。
  2. 故障动作配置 (TZCTL): 当故障发生时,你希望PWM输出立即变成什么状态?TZCTL寄存器为EPWMxA和EPWMxB分别提供了配置选项:

    • 00: 高阻状态。这是最安全的,直接断开驱动。
    • 01: 强制高电平。
    • 10: 强制低电平。
    • 11: 无操作(不推荐用于安全保护)。选择哪种状态,取决于你的功率拓扑和驱动电路。对于大多数桥式电路,强制两路输出都为低电平(或高阻),是让所有开关管关断的稳妥做法。
  3. 故障处理流程

    • 配置TZSEL启用故障源。
    • 配置TZCTL定义安全状态(如TZA=2, TZB=2,强制为低)。
    • 当故障触发,硬件会在纳秒级内将输出强制到安全状态。
    • 同时,TZFLG寄存器中的相应标志位会被置起。
    • 如果使能了中断(通过TZEINT),还会产生中断通知CPU。
    • 在中断服务程序或主循环中,必须查明故障原因并处理后,手动清除TZCLR寄存器中的相应标志位,否则输出将一直保持安全状态

踩坑记录:曾经在一个项目中,故障保护功能测试正常,但在实际运行中偶尔失效。后来发现,是在清除TZFLG标志后,没有等待足够的时间就重新使能了PWM输出,而此时外部故障信号可能尚未完全消除(比较器有恢复时间),导致瞬间再次触发。正确的做法是:在清除故障标志后,加入一个小的延时(几十微秒),或者通过查询故障引脚状态确认故障已消失,再重新初始化ePWM模块。此外,务必确保故障信号源的硬件滤波电路合理,避免噪声误触发。