深入解析eHRPWM寄存器:从时间基准到动作限定的电机控制核心

深入解析eHRPWM寄存器:从时间基准到动作限定的电机控制核心

1. 从时间基准到动作限定:eHRPWM寄存器全景解析

在嵌入式电机控制和数字电源的世界里,PWM(脉冲宽度调制)是驱动一切的“心跳”。但很多工程师,尤其是刚接触德州仪器(TI)C2000系列MCU的朋友,面对eHRPWM(增强型高分辨率脉宽调制器)那一长串寄存器手册时,常常感到无从下手。手册里每个比特位都定义得清清楚楚,但为什么这么设计?寄存器之间如何联动?实际写代码时到底该怎么配?这些问题往往需要在实际项目中踩过几次坑才能弄明白。

今天,我就结合自己多年在伺服驱动和逆变器开发中的实战经验,带你深入eHRPWM的寄存器世界。我们不满足于照本宣科地翻译手册,而是要拆解从时间基准计数器(TB)如何“打拍子”,到动作限定器(AQ)如何“编舞”的完整逻辑链。你会发现,理解了TBPHS、TBPRD、CMPA、AQCTLA这些寄存器背后的设计哲学,你就能像指挥交响乐一样,精准地控制每一个PWM边沿,从而构建出复杂多变的波形,无论是三相电机的SVPWM,还是LLC谐振变换器的变频控制,都能得心应手。

2. 核心模块与寄存器地图:理解eHRPWM的骨架

在深入每个寄存器之前,我们必须先建立起eHRPWM模块的宏观视图。你可以把它想象成一个高度专业化、可编程的波形发生器流水线。这个流水线有明确的工序,而每个工序都由一组特定的寄存器控制。

一个完整的eHRPWM模块(例如一个EPWM1)包含多个子模块,它们按信号流顺序工作:

  1. 时间基准子模块(Time-Base, TB):这是整个PWM的“时钟心脏”。它产生一个周期性计数的核心信号(TBCNT),决定了PWM的周期和相位。相关的核心寄存器是TBPHS(相位寄存器)、TBCNT(计数器寄存器)和TBPRD(周期寄存器)。
  2. 计数比较子模块(Counter-Compare, CC):这是“事件触发器”。它将TBCNT的实时值与用户设定的比较值(CMPA,CMPB)进行比对,当两者相等时,产生一个“匹配事件”。这个事件是改变PWM输出状态的“发令枪”。
  3. 动作限定子模块(Action-Qualifier, AQ):这是“动作导演”。它接收来自TB(计数到0或周期)和CC(匹配CMPA/CMPB)的事件,并根据用户预先在AQCTLAAQCTLB中编好的“剧本”,指挥输出引脚(EPWMxA/B)做出具体的动作:置高(Set)、拉低(Clear)、翻转(Toggle)或忽略。
  4. 死区生成子模块(Dead-Band Generator, DB):这是“安全调度员”。在电机和电源的桥式电路中,同一桥臂的上下两个开关管绝对不能同时导通(否则会短路烧毁)。DB模块通过在AQ模块输出的原始动作信号上,插入可编程的上升沿延迟(DBRED)和下降沿延迟(DBFED),确保两个互补的PWM信号之间有一个安全的“死区时间”。
  5. 故障保护子模块(Trip-Zone, TZ):这是“紧急制动系统”。当外部硬件检测到过流、过压等故障时,会通过TZ引脚向eHRPWM模块发出信号。TZSELTZCTL等寄存器用于配置故障响应,可以立即将PWM输出强制置高、拉低或高阻态,保护系统安全。
  6. PWM斩波子模块(PWM-Chopper, PC):这是一个“微调器”,主要用于驱动栅极驱动器,通过高频载波调制来优化开关特性,在基础PWM分析中不常涉及,由PCCTL寄存器控制。

理解这个流水线至关重要。TB设定节奏,CC标记关键节拍点,AQ决定在每个节拍点输出脚要做什么动作,DB为动作加上安全缓冲,TZ则随时准备中断整个演出。所有的配置,最终都落在对相应寄存器的读写上。

3. 时间基准子模块:PWM节奏的起源

时间基准子模块是整个eHRPWM的节拍器,它定义了PWM波形的“时间尺子”。其核心是三个寄存器:TBPRDTBCNTTBPHS

3.1 周期寄存器(TBPRD)与计数器模式

TBPRD寄存器直接决定了PWM的周期,从而决定了其频率。这是最核心的配置之一。但它的工作方式与计数器模式紧密相关。eHRPWM的TB模块支持三种计数模式,由**TBCTL[CTRMODE]**位控制:

  • 递增模式(Up-Count):TBCNT从0开始,每个TBCLK时钟加1,直到等于TBPRD值,然后瞬间归零,重新开始。这种模式产生不对称PWM,通常用于功率因数校正(PFC)等需要左对齐或右对齐PWM的应用。
  • 递减模式(Down-Count):TBCNT从TBPRD值开始,每个TBCLK时钟减1,直到等于0,然后瞬间重载TBPRD值,重新开始。同样产生不对称PWM。
  • 递增-递减模式(Up-Down-Count):TBCNT从0开始递增到TBPRD,然后立即递减回0,如此循环。这种模式产生对称(中心对齐)PWM,这是电机控制和许多电源拓扑(如全桥、半桥)的首选,因为它能显著减少谐波分量。

TBPRD的影子和立即加载模式手册中提到**TBCTL[PRDLD]**位控制TBPRD的“影子加载”功能。这是eHRPWM一个非常关键的特性,关乎系统运行的稳定性和灵活性。

  • 影子模式(PRDLD=0,默认):用户写入的值先进入一个“影子寄存器”,并不立即生效。只有当TBCNT计数到0的那个瞬间,影子寄存器的值才会被同步加载到“活动寄存器”中,真正改变PWM周期。这确保了在一个完整的PWM周期结束后才切换频率,避免了周期中间改变TBPRD可能导致的脉冲宽度畸形或毛刺。在电机控制中,改变速度(即改变PWM频率)时,必须使用影子模式。
  • 立即模式(PRDLD=1):用户写入的值直接进入活动寄存器,立即生效。这可能会打断当前计数周期,导致不可预测的输出。通常仅在初始化或特殊调试时使用。

实操要点:如何计算TBPRD值?TBPRD的值与PWM频率和系统时钟相关。公式为:PWM频率 = 系统时钟频率 / (TBPRD * 时钟预分频系数)对于递增-递减模式,由于一个完整周期需要上数加下数,所以实际波形频率是上述计算值的一半。例如,系统时钟SYSCLKOUT为100MHz,时钟预分频设为1(不分频),想要得到10kHz的中心对齐PWM波,计算如下: 一个计数周期(0->TBPRD->0)的时钟节拍数 = TBPRD * 2。 因此,TBPRD = (SYSCLKOUT / PWM频率) / 2 = (100e6 / 10e3) / 2 = 5000。 你需要将5000(十进制)或1388h(十六进制)写入TBPRD寄存器。

3.2 计数器寄存器(TBCNT)与相位寄存器(TBPHS)

TBCNT是实时计数器,软件可读可写。但手册特别警告:对TBCNT的写操作不与TBCLK同步,且没有影子寄存器。这意味着如果你在程序运行时直接修改TBCNT,新值会立即生效,这极有可能导致当前PWM周期出现一个“跳跃”,产生非预期的脉冲。因此,在正常运行时,绝对不要直接写入TBCNT。它的主要用途是读取当前计数值,用于一些高级同步或诊断逻辑。

TBPHS寄存器则用于实现多个eHRPWM模块之间的同步,这是构建多相系统(如三相逆变器)的基石。想象一下,三个eHRPWM模块驱动电机的U、V、W三相,它们必须保持120度的相位差。TBPHS就是用来设置这个相位差的。

其工作原理是:当一个eHRPWM模块(从模块)接收到同步输入信号(来自主模块或外部)时,如果其**TBCTL[PHSEN]**位被使能,它会立即将自己的TBCNT计数器加载为TBPHS寄存器中设定的值。

  • 示例:主模块EPWM1的TBPRD=6000(对应360度)。我们希望EPWM2滞后120度。那么,EPWM2的TBPHS应设置为(120/360) * TBPRD = 2000��当EPWM1计数到0发出同步脉冲时,EPWM2的TBCNT会被瞬间置为2000,然后开始计数。这样,EPWM2的波形就始终比EPWM1滞后120度电角度。

关键经验:同步功能必须在所有模块的计数器开始运行之前配置好。一旦计数器开始自由运行,再使能同步或改变TBPHS,可能会导致混乱的相位跳变。

4. 计数比较子模块:定义波形关键事件点

如果说TB模块画出了一条时间轴,那么CC模块就在这条轴上标出了关键的“事件点”。这些点就是PWM输出状态发生改变的时刻。

4.1 比较寄存器(CMPA与CMPB)

CMPACMPB是两个独立的比较寄存器。TBCNT在循环计数的过程中,会不断地与CMPA和CMPB的值进行比较。当TBCNT == CMPA时,产生CTR=CMPA事件;当TBCNT == CMPB时,产生CTR=CMPB事件。这些事件被发送给AQ模块,用于触发输出动作。

占空比的计算在递增-递减模式下,一个周期内TBCNT会两次经过CMPA的值(一次递增,一次递减)。通常,我们通过配置AQ模块,在递增匹配时置高输出,在递减匹配时拉低输出。这样,PWM的占空比(Duty Cycle)由CMPA的值决定:占空比 = CMPA / TBPRD例如,TBPRD=5000,想要50%占空比,则设置CMPA=2500。CMPB可以用来产生更复杂的波形,比如在同一个周期内产生两次开关动作。

4.2 影子缓冲与加载模式

与TBPRD类似,CMPA/CMPB也拥有强大的影子缓冲机制,由CMPCTL寄存器控制。

  • SHDWAMODE/SHDWBMODE:决定CMPA/CMPB是影子模式(双缓冲)还是立即模式。
  • LOADAMODE/LOADBMODE:在影子模式下,决定影子寄存器的值在何时加载到活动寄存器。可选在CTR=0(周期开始)、CTR=PRD(周期中点,仅对递增-递减模式有意义)或两者皆可时加载。

为什么需要影子缓冲?在实时控制系统中,比如电机矢量控制(FOC),算法在每个PWM周期(中断服务程序中)都会计算出一个新的电压矢量,并换算成新的CMPA/CMPB值。如果直接写入活动寄存器,而这个写入操作恰好发生在TBCNT等于旧CMPA值之后、新CMPA值之前,那么当前周期就可能丢失一次比较事件,导致输出异常。通过配置在CTR=0时加载,可以确保新的比较值在一个PWM周期开始时统一生效,保证了整个周期内波形的一致性,这对于防止电机转矩脉动至关重要。

SHDWAFULL/SHDWBFULL标志位这是一个非常实用的状态位。当影子寄存器已满(即已有一个值在等待加载)时,该位为1。此时如果CPU再次写入,会覆盖影子寄存器中等待加载的值。在编写控制算法时,在写入CMP值前检查该标志位,可以避免数据被意外覆盖。更常见的稳健做法是,利用在CTR=0(或CTR=PRD)加载的机制,确保每个周期只计算并写入一次新值。

5. 动作限定子模块:编排输出行为的导演

AQ模块是eHRPWM的“逻辑核心”。它接收来自TB(ZRO, PRD事件)和CC(CAU, CAD, CBU, CBD事件)的所有事件,并决定每个输出引脚(EPWMxA和EPWMxB)该如何响应。

5.1 动作控制寄存器(AQCTLA与AQCTLB)

AQCTLA控制EPWMxA输出,AQCTLB控制EPWMxB输出。它们的结构完全对称。每个寄存器包含6个2位的字段,分别对应6个事件:

  • ZRO:当TBCNT == 0时触发。
  • PRD:当TBCNT == TBPRD时触发(在递增-递减模式中,此时方向为递减)。
  • CAU:当TBCNT == CMPA且计数器在递增时触发。
  • CAD:当TBCNT == CMPA且计数器在递减时触发。
  • CBU/CBD:对应CMPB的递增/递减事件。

每个字段可以配置为四种动作之一:

  • 00:无操作(忽略该事件)。
  • 01:清除(Clear),强制输出为低电平。
  • 10:置位(Set),强制输出为高电平。
  • 11:翻转(Toggle),输出电平取反。

经典PWM波形生成配置以生成一个简单的、中心对齐的PWM波(EPWMxA)为例,使用CMPA控制占空比:

  1. 设置TB为递增-递减模式。
  2. 配置AQCTLA寄存器:
    • CAU = 10(Set): 递增匹配CMPA时,输出置高。
    • CAD = 01(Clear): 递减匹配CMPA时,输出拉低。
    • ZRO = 00,PRD = 00,CBU = 00,CBD = 00(忽略其他事件)。
  3. 这样,在每个周期内,TBCNT从0递增到CMPA时,输出变高;从TBPRD递减到CMPA时,输出变低。输出高电平的时间与2 * (TBPRD - CMPA)成正比(对于中心对齐模式)。

5.2 软件强制寄存器(AQSFRC与AQCSFRC)

这两个寄存器提供了通过软件直接干预输出状态的能力,用于特殊控制或调试。

  • AQSFRC(一次性软件强制):你可以通过设置OTSFA位来在EPWMxA上触发一个“一次性强制事件”,并通过ACTSFA字段指定强制动作(置高、拉低或翻转)。这个事件触发一次后,OTSFA位会自动清零。它不会影响AQ模块基于事件的正常操作,只是在当前时刻“插入”一个动作。这在注入特定测试脉冲时非常有用。
  • AQCSFRC(连续软件强制):通过CSFA字段,你可以持续地强制EPWMxA输出为高、低或禁用强制。这个强制信号会覆盖AQ模块产生的正常动作。这是一个非常强大的功能,但也非常危险。例如,在系统故障处理中,如果故障逻辑较复杂,来不及配置TZ模块,可以紧急使用连续软件强制将PWM输出拉低,关断功率管。在影子模式下,强制动作会在下一次影子加载后生效;在立即模式下,则在下个TBCLK边沿生效。

重要提示:软件强制功能,尤其是连续强制,会破坏由TB、CC、AQ正常逻辑生成的波形。除非在调试、保护或特殊工作模式(如脉冲注入测试)下,否则应谨慎使用,并确保有清晰的退出强制状态的逻辑。

6. 死区生成与故障保护:工业级可靠性的保障

6.1 死区控制寄存器(DBCTL, DBRED, DBFED)

死区时间是功率电子中防止直通(Shoot-Through)的必备安全措施。eHRPWM的DB模块提供了高度可配置的死区插入方式。

  • DBRED & DBFED:这两个10位寄存器分别配置上升沿延迟和下降沿延迟的计数值。延迟时间 =计数值 * TBCLK周期。例如,TBCLK为100MHz,需要500ns死区,则计数值设置为500ns / 10ns = 50
  • DBCTL[OUT_MODE]:选择输出模式。11b表示完全使能死区,EPWMxA输出经过上升沿延迟,EPWMxB输出经过下降沿延迟。这是最常用的互补带死区模式。
  • DBCTL[IN_MODE]:选择输入信号源。通常配置为00b,即EPWMxA作为两个延迟单元的输入,生成EPWMxA(延迟上升沿)和EPWMxB(延迟下降沿)作为互补对。
  • DBCTL[POLSEL]:极性选择。可以独立地反转EPWMxA或EPWMxB的输出极性。例如,在驱动一个低电平有效的栅极驱动器时,可以配置POLSEL=01b(ALC模式)来反转EPWMxA。

配置示例:生成互补带死区PWM假设我们已经通过AQ模块,使EPWMxA输出一个原始的PWM波(假设高电平有效)。目标是生成与之互补的EPWMxB,且两者之间插入死区。

  1. AQ配置:使EPWMxA产生所需PWM,EPWMxB配置为相反(或忽略,由DB模块生成互补)。
  2. DB配置:
    • IN_MODE = 00:EPWMxA作为死区模块的公共输入源。
    • POLSEL = 00:不反转极性(假设驱动器高电平有效)。
    • OUT_MODE = 11:完全使能死区。
    • DBRED = 50:设置上升沿延迟(对应EPWMxA的上升沿延迟和EPWMxB的下降沿延迟?这里需要理解:对于EPWMxA,延迟的是其上升沿;对于由EPWMxA反相再经下降沿延迟得到的EPWMxB,延迟的也是其上升沿。通常我们更关心两个最终输出信号边沿之间的间隔。更常见的做法是设置相同的DBREDDBFED值,来获得对称的死区时间)。
    • DBFED = 50:设置下降沿延迟。
  3. 最终,EPWMxA输出是原始信号经过上升沿延迟后的结果,EPWMxB输出是原始信号反相后再经过下降沿延迟的结果。这样就确保了在任何切换瞬间,两个信号都不会同时为高。

6.2 故障保护寄存器(TZSEL, TZCTL, TZFLG等)

故障保护是工业系统的生命线。TZ模块允许外部硬件信号(如比较器输出的过流信号)直接、快速地关断PWM。

  • TZSEL:选择哪些TZ引脚(TZ1~TZ6)作为故障源,并指定其触发模式是一次性(OSHT)还是逐周期(CBC)
    • 一次性(One-Shot):故障信号有效后,PWM立即被强制到安全状态(如低电平),并且锁存。即使故障信号消失,PWM输出也保持安全状态,直到软件通过TZCLR寄存器显式清除故障标志。用于处理严重的、需要系统完全停机的故障(如短路)。
    • 逐周期(Cycle-By-Cycle):故障信号有效期间,每个PWM周期都会在计数器归零(TBCNT=0)时,将输出强制到安全状态。一旦故障信号消失,下一个周期PWM自动恢复正常运行。用于处理可恢复的、瞬态的过流,比如电机启动时的冲击电流。
  • TZCTL:配置当故障发生时,EPWMxA和EPWMxB的输出动作。可以强制为高、强制为低、置为高阻态(Hi-Z)或不采取动作。通常强制为低电平,以关断功率开关管。
  • TZFLG:故障状态标志寄存器。通过读取它,软件可以知道是哪个类型的故障(CBC/OST)触发了保护,以及是否产生了中断。
  • TZCLR:用于清除TZFLG中的故障标志位。对于OST故障,必须在排除故障原因后,手动清除标志位才能恢复PWM输出。

实战经验

  1. 硬件布线:将电流采样比较器的输出、直流母线电压检测等关键保护信号,直接连接到MCU的TZ引脚,实现纳秒级的硬件保护,远快于软件中断响应。
  2. 优先级:TZ模块的优先级最高,其强制动作会覆盖AQ模块、软件强制甚至DB模块的输出。
  3. 中断处理:使能TZEINT中的中断,可以在故障发生后进入中断服务程序,进行故障记录、系统状态保存等操作。但保护动作本身是由硬件同步完成的,不依赖于中断服务程序,这确保了保护的实时性。

7. 寄存器配置实战:从零构建一个互补PWM信号

理论说了这么多,我们用一个具体的例子,把关键寄存器配置串起来。目标:在EPWM1A和EPWM1B上产生一对中心对齐、带死区、频率10kHz、占空比30%的互补PWM信号。假设系统时钟100MHz,TBCLK不分频,需要500ns死区时间。

步骤1:配置时间基准(TB)子模块

  • 确定TBPRD:TBPRD = (100e6 / 10e3) / 2 = 5000(1388h)。
  • 配置TBCTL:
    • CTRMODE = 2(Up-Down Count)
    • PHSEN = 0(本例不需要同步)
    • PRDLD = 0(TBPRD使用影子模式,安全)
    • HSPCLKDIV和CLKDIV根据需求设置分频,这里设为1
  • 写入寄存器:
    EPwm1Regs.TBPRD = 5000; // 设置周期值 EPwm1Regs.TBCTL.bit.CTRMODE = 2; // 递增-递减模式 EPwm1Regs.TBCTL.bit.PHSEN = 0; // 禁用相位加载 EPwm1Regs.TBCTL.bit.PRDLD = 0; // TBPRD影子模式 EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0; // 高速时钟分频 EPwm1Regs.TBCTL.bit.CLKDIV = 0; // 时基时钟分频

步骤2:配置计数比较(CC)子模块

  • 计算CMPA:CMPA = TBPRD * Duty = 5000 * 0.3 = 1500(5DCh)。
  • 配置CMPCTL:
    • SHDWAMODE = 0(CMPA影子模式)
    • LOADAMODE = 0(在CTR=0时加载影子寄存器)
    • SHDWBMODE = 0(CMPB影子模式,本例未使用CMPB,但可同样配置)
    • LOADBMODE = 0
  • 写入寄存器:
    EPwm1Regs.CMPA.half.CMPA = 1500; // 设置比较值A EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0; // CMPA影子模式 EPwm1Regs.CMPCTL.bit.LOADAMODE = 0; // CTR=0时加载

步骤3:配置动作限定(AQ)子模块

  • 目标:EPWM1A在递增匹配CMPA时置高,递减匹配CMPA时拉低。EPWM1B由死区模块生成互补信号,因此AQ模块可以将其配置为忽略所有事件,或者配置为与EPWM1A完全相反的动作(但通过DB统一管理更清晰)。
  • 配置AQCTLA:
    • CAU = 2(Set)
    • CAD = 1(Clear)
    • 其他字段 = 0。
  • 配置AQCTLB(让DB模块生成互补信号,这里AQ不动作):
    • 所有字段 = 0。
  • 写入寄存器:
    EPwm1Regs.AQCTLA.bit.CAU = 2; // 递增匹配CMPA时置高 EPwm1Regs.AQCTLA.bit.CAD = 1; // 递减匹配CMPA时拉低 EPwm1Regs.AQCTLB.all = 0; // EPWM1B输出由死区模块控制

步骤4:配置死区(DB)子模块

  • 计算死区计数值:TBCLK周期 = 1/100MHz = 10ns计数值 = 500ns / 10ns = 50(32h)。
  • 配置DBCTL:
    • OUT_MODE = 3(完全使能死区)
    • POLSEL = 0(不反转极性)
    • IN_MODE = 0(EPWM1A作为死区输入源)
  • 写入寄存器:
    EPwm1Regs.DBRED = 50; // 上升沿延迟 EPwm1Regs.DBFED = 50; // 下降沿延迟 EPwm1Regs.DBCTL.bit.OUT_MODE = 3; // 使能双路死区 EPwm1Regs.DBCTL.bit.POLSEL = 0; // 主动高 EPwm1Regs.DBCTL.bit.IN_MODE = 0; // EPWM1A作为源

步骤5:启动计数器

  • 最后,通过配置TBCTL,启动计数器运行。
    EPwm1Regs.TBCTL.bit.CTRMODE = 2; // 确保是递增-递减模式 // 或者通过设置FORCE位进行软件同步启动(在多模块系统中)

完成以上配置后,EPWM1A将输出一个经过死区延迟的PWM波,EPWM1B输出其互补信号,两者之间保证有至少500ns的死区时间。你可以通过示波器同时测量EPWM1A和EPWM1B引脚来验证。

8. 高级应用与调试技巧

8.1 高分辨率PWM(HRPWM)的扩展

对于需要极高精度(皮秒级)占空比控制的场合,如数字电源的轻载效率优化,eHRPWM的HRPWM扩展功能至关重要。它通过微边沿定位器(MEP)技术,在传统的数字计数器基础上,实现了对PWM边沿的亚时钟周期级微调。这主要涉及CMPAHR寄存器。

  • 原理:CMPA寄存器控制“粗调”边沿(以TBCLK为步进),而CMPAHR寄存器(通常8位或更多)控制“微调”边沿,其步进可达系统时钟周期(SYSCLKOUT)的几分之一。
  • 使用:你需要将占空比对应的精确时间,转换为对CMPA(整数部分)和CMPAHR(小数部分)的联合配置。TI提供了专门的库函数和校准流程,以克服半导体工艺带来的MEP延迟偏差。
  • 注意:HRPWM功能不是所有ePWM实例都有,需查阅具体芯片数据手册。启用HRPWM通常需要配置特定的时钟和校准寄存器。

8.2 影子寄存器的深入使用与同步

在多模块协同工作(如三相逆变器)时,影子寄存器的加载时机同步是关键。

  1. 相位同步:如前所述,使用TBPHS和同步信号(EPWMxSYNCI/O)实现。
  2. 数据同步:确保所有PWM模块的CMPA/B新值在同一时刻生效。这通过将它们的LOADAMODE/LOADBMODE都设置为在CTR=0时加载来实现。当你更新所有模块的CMPA影子寄存器后,它们会在各自下一个周期的起点同时加载新值,保证了三相电压矢量的同步更新,这对于电���控制的稳定性至关重要。
  3. 软件强制同步:使用EPwm1Regs.TBCTL.bit.SWFSYNC位可以产生一个软件同步脉冲,强制所有配置为同步从模式的模块加载其TBPHS值。这在系统初始化或运行中动态调整相位时非常有用。

8.3 常见问题排查与调试心得

  1. 没有PWM输出

    • 检查时钟:首先确认ePWM模块的时钟是否使能(在PCLKCR0/1寄存器中)。这是最容易被忽略的一步。
    • 检查引脚复用:确认GPIO引脚是否已正确配置为ePWM功能(通过GPxMUX寄存器)。
    • 检查计数器状态:读取TBCNT寄存器,看它是否在循环计数。如果为0且不变,可能是TBCTL.CTRMODE配置错误或时钟未供给。
    • 检查输出强制:检查AQCTL、AQSFRC、AQCSFRC、TZCTL等寄存器,是否有配置将输出强制到了固定电平。
  2. PWM频率不对

    • 复核计算:仔细检查TBPRD、HSPCLKDIV、CLKDIV的计算公式。注意递增-递减模式频率要除以2。
    • 检查影子模式:如果修改了TBPRD但频率没变,确认是否处于影子模式(PRDLD=0)且TBCNT从未归零?在影子模式下,新周期值必须等到TBCNT=0才会加载。可以尝试先停止计数器,修改TBPRD,再启动。
  3. 死区时间不生效或异常

    • 确认OUT_MODE:DBCTL.OUT_MODE必须设置为2、3或1(使能至少一路延迟),如果为0则完全旁路死区模块。
    • 检查输入源:确认DBCTL.IN_MODE配置是否符合你的信号流设计。如果你期望EPWMxA和EPWMxB是互补的,但实际不是,很可能是IN_MODE配置有误。
    • 测量方法:用示波器两个通道分别测量EPWMxA和EPWMxB,使用上升沿触发,测量另一个信号对应边沿的延迟。确保测量的是最终输出引脚,而不是AQ模块输出的原始信号。
  4. 故障保护不动作

    • 检查TZ引脚配置:除了TZSEL寄存器,还需要将对应的GPIO引脚配置为TZ功能,并且通常需要使能内部上拉(因为故障信号通常是低有效)。
    • 检查TZCTL动作:确认TZCTL.TZA/TZB是否配置为期望的安全状态(如强制为低)。
    • 模拟故障:在调试时,可以尝试将TZ引脚通过电阻临时拉低,观察PWM输出是否立即被强制,并检查TZFLG标志位是否置起。
  5. 使用调试器实时观察寄存器:在CCS等IDE中,结合图形化工具(如TI的SysConfig)和寄存器实时查看窗口,可以非常直观地验证寄存器配置,并观察TBCNT、CMPA匹配等动态过程,这是学习eHRPWM最有效的方式之一。

理解eHRPWM寄存器,本质上是理解一个精密数字波形发生器的硬件自动化流程。从时间基准的节奏设定,到比较匹配的事件触发,再到动作限定的逻辑编排,最后经过死区安全和故障保护的淬炼,每一步都通过寄存器留下了灵活的编程接口。掌握它们,你就能让MCU的PWM模块精准可靠地驱动外部世界,无论是让电机平稳旋转,还是让电源高效转换。