深入解析TI C2000 eHRPWM:从寄存器到电机控制实战
2026/7/21 11:20:48 网站建设 项目流程

1. 项目概述与eHRPWM核心价值

在嵌入式系统,尤其是电机控制、数字电源和逆变器这些对时序精度要求近乎苛刻的领域,脉冲宽度调制(PWM)信号的生成质量直接决定了整个系统的性能上限。我们常说的“调占空比”听起来简单,但背后涉及到时钟同步、边沿对齐、死区保护、故障响应等一系列复杂且环环相扣的硬件逻辑。德州仪器(TI)在其C2000系列微控制器中集成的增强型高分辨率PWM(eHRPWM)模块,正是为了解决这些复杂需求而生的利器。它不是一个简单的定时器加比较器,而是一套高度模块化、可编程的PWM信号生成“流水线”。

很多工程师初次接触eHRPWM的数百页技术手册时,往往会被密密麻麻的寄存器表格和信号流图劝退。大家更习惯于调用高层API,但一旦遇到波形畸变、同步失锁、保护误触发等棘手问题,如果对底层寄存器的映射关系和子模块间的信号交互没有透彻理解,调试就会像盲人摸象。本文的目的,就是带你穿透API的封装层,直接深入到eHRPWM的寄存器与子模块架构层面。我们将以TI官方技术手册SPRUH80C为蓝本,但不止于翻译,我会结合自己多年在电机驱动项目中的实际调试经验,为你拆解每个关键寄存器位域的真实含义,并厘清时间基准(TB)、计数比较(CC)、动作限定(AQ)等子模块是如何像精密齿轮一样协同工作的。理解这些,不仅是编写稳健底层驱动的基础,更是进行系统级优化(如实现多模块精确同步、设计复杂保护逻辑)的前提。

2. eHRPWM模块整体架构与寄存器地图解析

2.1 模块化设计思想与信号流

eHRPWM模块的精妙之处在于其流水线式的子模块设计。它不是将所有的功能塞进一个复杂的控制寄存器,而是将其分解为七个(或八个,含HRPWM)功能相对独立又紧密衔接的子模块。这种设计使得配置逻辑清晰,且不同功能间的影响可控。

我们可以将其想象为一个PWM信号的“加工厂”:

  1. 时间基准(TB)子模块:这是工厂的“心脏”和“节拍器”。它产生一个不断循环计数的核心时钟TBCNT,决定了PWM波的周期和频率。所有其他子模块的动作时机,都基于这个计数器的值来触发。
  2. 计数比较(CC)子模块:这是“模具车间”。它内部有两个比较器(CMPA和CMPB),持续将TBCNT的值与预设的CMPA/CMPB值进行比较。当匹配时,就产生“CTR=CMPA”和“CTR=CMPB”这两个关键事件信号。这两个值直接决定了PWM脉冲的上升沿和下降沿位置,即占空比。
  3. 动作限定(AQ)子模块:这是“执行车间”。它接收来自TB子模块的“CTR=PRD”(周期匹配)、“CTR=0”(零匹配)事件,以及来自CC子模块的“CTR=CMPA/B”事件。AQ子模块根据配置,决定当这些事件发生时,对最终的输出引脚EPWMxA和EPWMxB采取什么“动作”——置高、拉低、翻转或保持。正是这里将“时间事件”转化为了具体的“电平动作”。
  4. 死区生成(DB)子模块:这是“安全调度室”。在驱动上下桥臂(如半桥或全桥)时,必须防止两者同时导通导致短路。DB子模块对AQ输出的原始信号进行加工,插入可编程的上升沿延迟(RED)和下降沿延迟(FED),从而生成一对互补且带有死区的信号。
  5. 故障保护(TZ)子模块:这是“紧急制动系统”。当外部故障信号(如过流、过压)触发时,TZ子模块可以无视当前所有逻辑,强制将PWM输出设置为预定安全状态(高、低或高阻),实现硬件级快速保护。
  6. 事件触发(ET)子模块:这是“生产报告员”。它监控特定事件(如周期匹配、比较匹配)的发生,并可以据此产生CPU中断,让软件能够及时介入处理,例如更新下一个周期的比较值以实现闭环控制。
  7. PWM斩波(PC)子模块:这是一个“附加加工站”,用于生成高频载波对PWM信号进行调制,主要用于驱动门极变压器等特殊场景。
  8. 高分辨率PWM(HRPWM)子模块(部分型号具备):这是“微雕车间”。它通过微边沿定位(MEP)技术,在系统时钟的一个周期内进行插值,将PWM边沿的控制精度提升到皮秒级,远超传统计数器的分辨率。

这些子模块通过内部总线共享TBCNT值和配置寄存器,并通过一系列事件信号(如CTR=PRD, CTR=CMPA)进行连锁触发,构成了一个完整的、可配置的PWM信号生成链。

2.2 寄存器映射详解与寻址规则

eHRPWM的寄存器是理解其工作的钥匙。手册中的Table 15-1提供了完整的寄存器地图,但我们需要理解其组织逻辑。

核心要点一:模块化与实例化。所有寄存器按子模块分组排列:TB、CC、AQ、DB、TZ、ET、PC、HRPWM。每个eHRPWM模块实例(例如ePWM1, ePWM2…)都拥有完全相同的一套这样的寄存器组。它们在内存中的基地址(Start Address)由芯片的数据手册定义,通常是连续的内存块。例如,ePWM1的寄存器可能从0x6800开始,ePWM2的从0x6900开始。

核心要点二:偏移地址(Offset)。每个寄存器在它所属的ePWM实例内的相对位置是固定的,由表中的“Offset”列定义。例如,TBCTL寄存器的偏移总是0x0,CMPA寄存器的偏移总是0x12。因此,要访问ePWM2的CMPA寄存器,地址就是ePWM2基地址 + 0x12

核心要点三:影子寄存器(Shadow Register)机制。这是eHRPWM实现无毛刺、同步更新的关键设计,务必深刻理解。表中“Shadow”列标识了该寄存器是否有影子寄存器。

  • 有影子寄存器(Yes):如TBPRD(周期寄存器)、CMPA/B(比较寄存器)。软件平时读写的是“影子寄存器”,它像一个缓冲区。硬件在运行中实际使用的是“活动寄存器(Active Register)”。只有在特定的、安全的时刻(例如计数器归零CTR=0或到达周期值CTR=PRD时),影子寄存器的内容才会一次性加载到活动寄存器中。这确保了在一个PWM周期内,控制参数是稳定不变的,避免了在计数器运行中途更新参数可能导致的脉冲宽度异常。
  • 无影子寄存器(No):如TBCTL(控制寄存器)、TBCNT(计数器值寄存器)。对这些寄存器的写操作会立即生效。这意味着在配置它们时需要更加小心,通常需要在PWM输出禁用或计数器停止时进行。

核心要点四:HRPWM扩展寄存器。表中带有(2)注释的寄存器(如TBPHSHR, CMPAHR, HRCNFG)是可选的高分辨率扩展寄存器。只有支持HRPWM功能的ePWM实例才会存在这些寄存器。在编程前,必须查阅具体芯片的数据手册,确认当前使用的ePWM模块是否支持HRPWM,否则访问这些保留地址可能导致不可预知的行为。

注意:在初始化ePWM时,一个良好的习惯是,先配置好所有带影子寄存器的参数(如TBPRD, CMPA),最后再使能计数器或输出。这样可以确保第一个PWM周期开始前,所有参数都已就绪。

3. 核心子模块深度剖析与配置实战

3.1 时间基准(TB)子模块:PWM节拍器的核心

TB子模块是整个eHRPWM的时序之源。其核心是一个16位的向上/向下计数器(TBCNT),以及控制其运行模式的寄存器组。

3.1.1 关键寄存器与信号

  • TBCTL(控制寄存器):核心中的核心。你需要通过它设置:
    • CTRMODE[1:0]:计数器模式。00=停止,01=向上计数,10=向下计数,11=向上向下计数。这是决定PWM波形对称性的关键。
    • PHSEN:相位使能。决定是否在同步信号到来时,将相位寄存器(TBPHS)的值加载到计数器TBCNT。
    • PRDLD:周期加载模式。0=影子模式(在CTR=0时加载),1=立即加载模式。强烈建议在大多数应用中使用影子模式以保证同步更新
    • SYNCOSEL[1:0]:同步输出选择。决定本模块产生同步输出信号EPWMxSYNCO的事件源,可以是输入同步SYNCICTR=0CTR=CMPB。用于构建主从同步链。
    • HSPCLKDIVCLKDIV:高速时钟预分频和时钟预分频。两者级联,共同决定时间基准时钟TBCLK相对于系统时钟SYSCLKOUT的频率。TBCLK = SYSCLKOUT / (HSPCLKDIV * CLKDIV)
  • TBPRD(周期寄存器):设定PWM周期的计数值。计数器TBCNT将在0和TBPRD之间循环。PWM频率的计算公式取决于计数模式
    • 向上计数模式T_pwm = (TBPRD + 1) * T_tbclkF_pwm = 1 / T_pwm
    • 向下计数模式:与向上计数模式公式相同。
    • 向上向下计数模式T_pwm = 2 * TBPRD * T_tbclkF_pwm = 1 / T_pwm其中,T_tbclk = 1 / F_tbclkF_tbclkTBCLK的频率。
  • TBPHS(相位寄存器):用于实现多个ePWM模块之间的相位差。当PHSEN=1且同步事件发生时,TBPHS的值会加载到TBCNT中,从而实现从模块与主模块之间固定的相位偏移。
  • 关键事件信号
    • CTR=PRD:计数器等于周期值。在向上计数和向上向下计数模式中产生。
    • CTR=0:计数器等于零。在向下计数和向上向下计数模式中产生。
    • EPWMxSYNCI/SYNCO:同步输入/输出信号,用于模块间级联。

3.1.2 同步机制与相位控制实战多模块同步是工业应用中的常见需求,例如三相逆变器需要三个相位互差120度的PWM波。

场景:使用ePWM1作为主模块,ePWM2和ePWM3作为从模块,输出三相互差120度的对称PWM波。

  1. 主模块(ePWM1)配置
    • 设置TBCTL[SYNCOSEL] = CTR=0,使其在每次计数器归零时产生同步输出脉冲EPWM1SYNCO
    • 配置为向上向下计数模式,设定好TBPRD和TBCLK分频。
  2. 从模块(ePWM2, ePWM3)配置
    • 设置TBCTL[PHSEN]=1,使能相位加载。
    • 设置TBCTL[SYNCOSEL] = SYNCI,将同步输出传递给下一个模块(可选,构成链式)。
    • 关键步骤:计算并设置TBPHS寄存器。对于对称PWM(向上向下计数),一个完整周期是2*TBPRD个时钟。要使ePWM2滞后ePWM1 120度,则相位差对应的计数值为(120/360) * 2 * TBPRD = (2/3) * TBPRD。同理,ePWM3滞后240度,计数值为(4/3) * TBPRD。将计算值(取整)写入各自的TBPHS。
    • 将ePWM1的EPWM1SYNCO连接到ePWM2和ePWM3的EPWMxSYNCI(具体连接方式由芯片的输入多路选择器决定)。
  3. 全局时钟同步启动:为了避免各模块的TBCLK相位随机,TI推荐了标准的启动流程:
    // 1. 使能ePWM模块的时钟(通过PSC模块) SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM1); // 2. 停止所有ePWM的时基时钟 SysCtl_disableTBCLKSync(SYSCTL_TBCLK_SYNC_DISABLE); // 3. 分别配置各个ePWM模块的TBCTL等寄存器(包括分频器HSPCLKDIV/CLKDIV) EPWM_setTimeBasePeriod(epwm1Base, periodValue); EPWM_setPhaseShift(epwm2Base, phase120); // ... 其他配置 // 4. 同步启动所有ePWM的时基时钟 SysCtl_enableTBCLKSync(SYSCTL_TBCLK_SYNC_ENABLE);
    这个流程确保了所有ePWM模块的TBCLK第一个上升沿是对齐的,为精确的相位控制奠定了基础。

实操心得:在调试同步系统时,如果发现相位关系不对,首先检查TBCLK的分频设置HSPCLKDIV/CLKDIV在所有模块中是否一致。不一致的分频会导致即使同步信号对齐,计数器步进速度也不同,相位差会逐渐漂移。其次,用示波器同时抓取主模块的SYNCO信号和从模块的SYNCI信号,确认同步脉冲是否准确送达。

3.2 计数比较(CC)子模块:占空比的直接塑造者

CC子模块接收TB子模块的实时计数值TBCNT,并与CMPA和CMPB寄存器进行比较,产生决定PWM边沿的关键事件。

3.2.1 影子寄存器加载机制详解CMPA和CMPB寄存器都带有影子寄存器。其加载行为由CMPCTL寄存器控制:

  • SHDWAMODE/SHDWBMODE:选择CMPA/CMPB的工作模式。0=影子模式,1=立即加载模式。为保障PWM波形连续无毛刺,必须使用影子模式
  • LOADAMODE/LOADBMODE[1:0]:选择影子寄存器加载到活动寄存器的时机。这是实现PWM参数实时无扰更新的关键。
    • 00(CTR=0):在计数器等于0时加载。
    • 01(CTR=PRD):在计数器等于周期值时加载。
    • 10(CTR=0CTR=PRD):在以上两个事件任一发生时加载。
    • 11:禁用加载(立即模式时)。

加载时机的选择策略

  • 向上计数或向下计数模式:由于每个周期只有一个CTR=0CTR=PRD事件,选择哪个时机加载都可以,效果一样。通常选择CTR=PRD加载。
  • 向上向下计数模式:这是重点。一个PWM周期内,CTR=0CTR=PRD事件各发生一次。选择不同的加载时机,会影响新比较值生效的对称性。
    • 若选择CTR=PRD加载,则新值将在计数器到达峰值后开始下降时生效。
    • 若选择CTR=0加载,则新值将在计数器到达谷底后开始上升时生效。
    • 若选择CTR=0CTR=PRD,则新值可能在周期的任一个端点生效,取决于软件写入影子寄存器的时机,这可能导致不对称的波形,通常不推荐
    • 最佳实践:对于对称PWM,为了实现中心对齐且参数更新平滑,通常将LOADAMODE设置为CTR=PRDLOADBMODE也设置为CTR=PRD(或根据需求一致)。然后在中断服务程序中,在CTR=PRD事件发生后(即计数器开始下降时)更新CMPA/CMPB的影子寄存器值。这样,新参数将在下一个完整周期生效,且关于中心点对称。

3.2.2 占空比计算与CMP值设定占空比(Duty Cycle)定义为高电平时间与整个周期的比值。CMPA/B寄存器的值决定了事件触发点,进而通过AQ子模块决定边沿。

  • 向上计数模式(非对称PWM)
    • 假设我们希望EPWMxA输出一个在计数器等于CMPA时拉高,在CTR=PRD时拉低的波形(这是常见配置)。
    • 那么,高电平时间 =(TBPRD - CMPA) * T_tbclk
    • 占空比 =(TBPRD - CMPA) / (TBPRD + 1)
    • 因此,CMPA = TBPRD - Duty * (TBPRD + 1)
  • 向上向下计数模式(对称PWM)
    • 假设我们希望EPWMxA输出一个在CTR=CMPA(上升沿)时拉高,在CTR=CMPA(下降沿)时拉低的波形(AQ配置为在CTR=CMPA且计数器向上时置高,向下时拉低)。
    • 那么,高电平时间 =2 * (TBPRD - CMPA) * T_tbclk
    • 占空比 =(TBPRD - CMPA) / TBPRD
    • 因此,CMPA = TBPRD - Duty * TBPRD

注意事项:CMPA/B的值必须在0TBPRD之间(对于向上向下计数模式)。如果设置值等于0或TBPRD,比较事件在周期中只会发生一次(在波峰或波谷),这会影响AQ的动作次数。如果设置值超出范围,在向上/向下模式下可能永远不会触发比较事件。

3.3 动作限定(AQ)子模块:事件到动作的翻译官

AQ子模块是连接“时间事件”和“引脚动作”的桥梁。它接收来自TB的CTR=PRDCTR=0事件和来自CC的CTR=CMPACTR=CMPB事件,并根据当前计数器的方向(CTR_dir),按照AQCTLAAQCTLB寄存器的配置,对输出EPWMxA和EPWMxB执行操作。

3.3.1 AQCTLA/AQCTLB寄存器配置逻辑每个寄存器(控制A输出或B输出)包含6个2位字段,分别对应6个事件:

  • CBUCTR = CMPB且计数器向上 (CTR_dir=UP)
  • CBDCTR = CMPB且计数器向下 (CTR_dir=DOWN)
  • CAUCTR = CMPA且计数器向上
  • CADCTR = CMPA且计数器向下
  • PRDCTR = PRD
  • ZROCTR = 0

每个字段可以配置为:

  • 00:无动作。
  • 01:在事件发生时,清除输出(置为低电平)。
  • 10:在事件发生时,置位输出(置为高电平)。
  • 11:在事件发生时,翻转输出。

通过灵活组合这些事件和动作,可以生成极其丰富的PWM波形。

3.3.2 典型波形生成配置示例假设我们需要在ePWM1上生成一对互补带死区的PWM信号(A和B),采用向上向下计数模式,中心对齐。

  1. 配置TB子模块:设置为向上向下计数模式,设定TBPRD。
  2. 配置CC子模块:设定CMPA和CMPB的值,用于控制占空比和死区(死区由DB模块添加,此处CMPA=B可用于对称情况)。
  3. 配置AQ子模块(这是核心):
    • 我们希望EPWM1A在计数器向上过程中达到CMPA时置高,在计数器向下过程中达到CMPA时拉低。这对应CAU=SET (10)CAD=CLEAR (01)
    • 我们希望EPWM1B与EPWM1A完全互补(死区由后续DB模块添加)。那么EPWM1B应该在CAU事件时拉低,在CAD事件时置高。即CAU=CLEAR (01)CAD=SET (10)
    • 对于PRDZRO事件,我们通常不直接操作输出,而是用于触发中断或同步。可以设置为无动作(00)
    • 因此:
      EPWM_setActionQualifierAction(epwm1Base, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, // CAU EPWM_AQ_EVENT_COUNTER_UP_CMPA); EPWM_setActionQualifierAction(epwm1Base, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, // CAD EPWM_AQ_EVENT_COUNTER_DOWN_CMPA); EPWM_setActionQualifierAction(epwm1Base, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_LOW, // CAU EPWM_AQ_EVENT_COUNTER_UP_CMPA); EPWM_setActionQualifierAction(epwm1Base, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_HIGH, // CAD EPWM_AQ_EVENT_COUNTER_DOWN_CMPA);
  4. 配置DB子模块:在AQ输出的原始互补信号基础上,插入死区时间。

3.3.3 软件强制输出AQSFRCAQCSFRC寄存器提供了通过软件直接强制输出电平的能力,这在调试或特定控制序列中非常有用。AQSFRC是单次强制,AQCSFRC是连续强制(直到被清除)。但要注意,故障保护(TZ)子模块的优先级高于软件强制。

3.4 死区生成(DB)与故障保护(TZ)子模块:安全与可靠的保障

3.4.1 死区生成(DB)模块死区时间是防止桥臂直通的生命线。DB模块对来自AQ的一对信号(通常假设为互补的A和B)进行处理。

  • 关键寄存器
    • DBCTL:控制寄存器,用于使能/禁用死区、选择输入信号极性、选择输出模式(例如,对A路信号插入延迟生成A和B两路输出)。
    • DBRED:上升沿延迟计数值。指定在输入信号上升沿后,延迟多少个TBCLK周期才让输出信号上升。
    • DBFED:下降沿延迟计数值。指定在输入信号下降沿后,延迟多少个TBCLK周期才让输出信号下降。
  • 工作模式:常见的是“主动高互补模式”。AQ输出的EPWMxA作为源信号,DB模块生成两路输出:
    • EPWMxA_DB(通常作为上管驱动):在源信号上升沿延迟DBRED后变高,在下降沿延迟DBFED后变低。
    • EPWMxB_DB(通常作为下管驱动):在源信号下降沿延迟DBFED后变高,在上升沿延迟DBRED后变低。 这样就确保了一路关断后,另一路要经过一段死区时间才会开通。
  • 计算死区时间:死区时间 =DBRED * T_tbclk(或DBFED * T_tbclk,通常两者设成相同值)。例如,TBCLK=100MHz (10ns)DBRED=50,则死区时间为500ns

3.4.2 故障保护(TZ)模块TZ模块是硬件安全屏障,响应速度远快于软件中断。

  • 关键寄存器
    • TZSEL:选择哪些外部故障引脚(TZ1~TZn)可以触发本ePWM模块的保护动作。
    • TZCTL:配置当故障发生时,EPWMxA和EPWMxB输出应被强制为何种状态(高、低、高阻Hi-Z或忽略)。
    • TZEINT:使能故障触发CPU中断。
    • TZFLG:故障标志位,指示哪个故障源发生了。
    • TZCLR:用于清除故障标志。
    • TZFRC:软件强制触发故障,用于测试。
  • 工作模式
    • 单次触发(One-Shot):故障信号有效后,输出立即被强制到安全状态,并且锁存。即使故障信号消失,输出也保持安全状态,直到软件通过TZCLR清除标志。
    • 周期逐次(Cycle-By-Cycle):故障信号有效期间,每个PWM周期输出都会被强制到安全状态。一旦故障信号消失,下一个PWM周期输出即恢复正常。这种模式适用于过流保护等需要快速响应的场景。
  • 配置实战:假设我们使用TZ1引脚连接过流比较器输出,希望触发周期逐次保护,将输出强制拉低。
    // 选择TZ1作为故障源,并配置为周期逐次模式 EPWM_enableTripZoneSignals(epwm1Base, EPWM_TZ_SIGNAL_1); EPWM_setTripZoneAction(epwm1Base, EPWM_TZ_ACTION_EVENT_TZB, // 这里TZB代表周期逐次模式 EPWM_TZ_ACTION_LOW); // 动作:强制输出为低 // 使能TZ中断(如果需要) EPWM_enableTripZoneInterrupt(epwm1Base);

避坑指南:故障保护配置后,一定要在硬件上模拟一个故障信号(例如拉低TZ引脚),用示波器验证输出是否按预期被强制。同时,确保在软件中断服务程序(如果使能了)中正确清除故障标志TZFLG,否则可能导致保护无法退出或中断持续触发。

4. 高级功能与系统集成考量

4.1 事件触发(ET)与中断管理

ET子模块负责将PWM周期内的关键事件转化为CPU中断,是实现软件实时控制(如电流环、电压环)的基石。

  • 关键寄存器
    • ETSEL:选择触发中断(INT)或ADC启动(SOC)的事件源。事件源包括:CTR=PRD,CTR=0,CTR=CMPA(上/下),CTR=CMPB(上/下)。
    • ETPS:事件预分频。可以配置为在第N次(1st, 2nd, 3rd)事件发生时才产生中断脉冲。这对于降低CPU中断负载非常有用。例如,在CTR=PRD事件处产生中断来更新占空比,但可以设置为每2个周期中断一次。
    • ETFLG:中断标志位。
    • ETCLR:清除中断标志。
    • ETFRC:软件强制触发中断事件。
  • 标准中断初始化流程:手册15.2.2节强调了一个关键流程,旨在避免因ePWM时钟刚使能时寄存器状态不确定而产生的伪中断。
    1. 禁用全局中断(操作CPU的INTM位)。
    2. 禁用ePWM模块中断(清除ETSEL[INTEN])。
    3. 初始化所有ePWM配置寄存器(TB, CC, AQ, DB等)。
    4. 清除所有可能已置位的伪中断标志(ETFLG)。
    5. 使能ePWM模块中断(设置ETSEL[INTEN])。
    6. 使能全局中断。 这个流程是保证中断系统稳定运行的黄金法则。

4.2 高分辨率PWM(HRPWM)扩展

对于需要极高精度(如功率因数校正PFC、谐振变换器)的应用,传统PWM的边沿分辨率受限于TBCLK周期。HRPWM通过微边沿定位(MEP)技术,在TBCLK的一个周期内进行亚周期级的延时,可将分辨率提高8-12倍。

  • 核心思想:利用芯片内部的一个数字延迟线,对传统的PWM边沿进行微调。调整的步进可以达到150ps左右,远小于一个TBCLK周期(例如10ns)。
  • 关键寄存器
    • CMPAHR:这是CMPA的高分辨率扩展寄存器。其低8位(MEP)用于微调。
    • TBPHSHR:相位寄存器的高分辨率扩展。
    • HRCNFG:HRPWM配置寄存器,用于选择操作模式(如微调CMPA还是相位)、边沿选择等。
  • 使用方式:通常,我们通过特定的HRPWM校准API获取当前芯片的MEP标定因子,然后通过公式计算CMPAHR的值。TI提供了库函数来简化这一过程。重要提示:HRPWM功能对温度、电压和工艺敏感,通常需要在不同工作点进行校准,并将校准数据存储在非易失性存储器中,上电时加载。

4.3 多模块协同与系统级设计要点

当设计一个包含多个ePWM模块的复杂系统(如三相逆变器、交错并联LLC)时,需考虑:

  1. 时钟同步:务必使用SysCtl_enableTBCLKSync()函数同步启动所有模块的TBCLK,确保时序基准一致。
  2. 相位关系:利用TBPHS寄存器精确设定模块间的相位差。计算时注意计数模式(向上向下模式需用2*TBPRD作为周期基准)。
  3. 中断分配:合理规划各模块的中断源。例如,让主桥臂的ePWM在CTR=PRD时中断,用于更新所有桥臂的占空比;让从桥臂仅在故障时中断。利用ETPS预分频减轻CPU负担。
  4. 故障保护联动:可以将多个ePWM模块的故障输入TZn连接到同一个硬件故障信号,并配置相同的保护动作,实现全局快速关断。
  5. 影子寄存器更新策略:在中断服务程序中更新CMPA/B影子寄存器时,要确保在正确的加载事件(CTR=0PRD之前完成写入。通常,在中断发生后立即更新是安全的,因为计数器到达事件点与加载动作发生之间有一个时钟周期的延迟。

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

即使理解了所有原理,实际调试中依然会遇到各种问题。以下是我在项目中积累的一些常见问题与排查思路:

问题1:PWM完全没有输出。

  • 检查清单
    1. 时钟与使能:确认系统时钟SYSCLKOUT正常,ePWM模块的时钟通过PSC模块已使能。
    2. GPIO复用:确认EPWMxA/B对应的引脚已正确配置为PWM输出功能,而非普通的GPIO。
    3. 输出使能:检查AQ子模块是否配置了有效的动作(SET/CLEAR/TOGGLE)。如果所有事件都配置为“无动作”,输出将保持默认状态(通常是高阻)。
    4. 计数器状态:读取TBCNT寄存器,看它是否在循环计数。如果TBCTL[CTRMODE]被误设为FREEZE(冻结)模式,计数器不会运行。
    5. 强制输出测试:尝试使用AQSFRC寄存器软件强制输出高或低,看引脚是否有响应。这可以快速隔离是配置问题还是时钟/引脚问题。

问题2:PWM频率或占空比与计算值不符。

  • 检查清单
    1. TBCLK计算:双重检查TBCTL[HSPCLKDIV]TBCTL[CLKDIV]的分频系数。TBCLK = SYSCLKOUT / (HSPCLKDIV * CLKDIV)。一个常见的错误是忽略了高速预分频器HSPCLKDIV
    2. 计数模式与公式:确认使用的频率/占空比公式与TBCTL[CTRMODE]设置的计数模式匹配。向上向下计数模式的周期是2*TBPRD*T_tbclk,而非(TBPRD+1)*T_tbclk
    3. 影子寄存器:确认你修改的是否是影子寄存器,以及加载时机LOADAMODE是否设置正确。如果你在计数器运行中更新了CMPA的影子寄存器,但加载时机未到,新值不会立即生效。读取CMPA寄存器(活动值)和影子寄存器值(通过特定方式)进行对比。
    4. CMPA/B值范围:确保CMPA/B的值在0到TBPRD之间。超出范围的值在向上/向下模式下可能导致比较事件永不发生。

问题3:多个ePWM模块无法同步,或相位差不对。

  • 检查清单
    1. 同步信号路径:用示波器或代码读取EPWMxSYNCI输入状态,确认主模块的SYNCO脉冲是否到达从模块。检查TBCTL[SYNCOSEL]配置。
    2. 相位加载使能:确认从模块的TBCTL[PHSEN]位已置1。
    3. TBCLK分频一致性这是最容易被忽略的一点!所有需要同步的ePWM模块,其TBCTL[HSPCLKDIV]CLKDIV必须设置为完全相同的值。否则,即使同时启动,计数器累加速度不同,相位也会很快错开。
    4. TBPHS值计算:重新计算相位寄存器值。对于向上向下模式,相位差对应的计数值是(相位差/360) * 2 * TBPRD

问题4:插入死区后,波形异常或死区时间不对。

  • 检查清单
    1. DB模块输入源:检查DBCTL寄存器中IN_MODE位的配置,确认DB模块接收的是来自AQ的哪两路信号。配置错误会导致输出混乱。
    2. 输出极性:检查DBCTL[POLSEL],确保生成的互补信号极性符合你的功率级驱动要求(例如,上管高有效,下管低有效)。
    3. DBRED/DBFED:确认写入的延迟计数值。死区时间 = 计数值 *T_tbclk。用示波器测量上升沿和下降沿之间的实际延迟,与计算值对比。
    4. AQ输出与DB输入关系:在使能DB模块前,先验证AQ子模块输出的原始信号是否正确。可以临时旁路DB模块(DBCTL[MODE]=DISABLE),直接观察AQ的输出。

问题5:故障保护(TZ)不动作或误动作。

  • 检查清单
    1. 故障源选择:检查TZSEL寄存器,确认你关心的故障引脚(如TZ1)已被使能。
    2. 动作配置:检查TZCTL寄存器,确认为指定的故障事件配置了正确的强制动作(如拉低)。
    3. 工作模式:确认配置的是单次触发(OSHT)还是周期逐次(CBC)模式。TZSEL寄存器中分别有对应的使能位。
    4. 引脚状态:检查故障输入引脚的实际电平。可能是外部比较器电路问题,或者引脚内部上拉/下拉配置冲突。
    5. 标志位清除:如果是单次触发模式,故障发生后输出会锁存。必须在处理完故障原因后,手动向TZCLR寄存器的对应位写1来清除故障标志TZFLG,否则输出将一直保持强制状态。

调试eHRPWM,最强大的工具是结合代码仿真(观察寄存器值)和示波器(观察实际波形)。当遇到问题时,系统地按照“时钟源 -> 计数器 -> 比较器 -> 动作器 -> 输出整形 -> 引脚”这条信号链进行分段排查,总能定位到问题的根源。理解本文所述的寄存器与子模块架构,正是为了让你在调试时,能清晰地知道该去检查哪个环节的哪个寄存器。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询