深入解析C2000 eHRPWM:从寄存器到电机控制实战

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

在电机控制、数字电源或者任何需要精确控制能量输出的嵌入式系统里,PWM(脉冲宽度调制)技术是工程师手中的“瑞士军刀”。我们通过调节一个方波信号高电平的持续时间(脉宽)占整个周期的比例(占空比),就能等效地控制平均电压或电流,从而驱动电机转速、调节LED亮度或是稳定电源输出电压。然而,当你的项目对效率、精度和响应速度的要求越来越高时,通用定时器生成的PWM往往就显得力不从心了——分辨率不够导致电机抖动、死区时间控制不精准引发桥臂直通风险、多路PWM同步困难造成系统噪声。这时,你就需要像德州仪器(TI)C2000系列微控制器中集成的增强型高分辨率PWM(eHRPWM)模块这样的专业选手登场。

eHRPWM远不止是一个能产生PWM的定时器。它是一个高度集成化、可灵活配置的“PWM生成引擎”,将整个波形生成、保护和管理的流程拆解为多个专注的子模块,并通过一套精密的寄存器体系进行控制。理解这套架构,就像理解一台精密仪器的内部构造,你才能从“会配置参数”进阶到“能设计系统”。本文将带你深入eHRPWM的寄存器世界和子模块架构,从最底层的寄存器位定义,到各子模块(如时间基准TB、计数器比较CC)如何协同工作的逻辑,并结合实际配置代码和避坑经验,为你呈现一份从原理到实战的深度解析。无论你是在调试一台伺服驱动器,还是在设计一个高功率密度的数字电源,掌握eHRPWM的配置精髓,都能让你的系统性能和控制精度提升一个档次。

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

在开始配置任何一个子模块之前,我们必须先拿到eHRPWM的“地图”——寄存器映射表。这张表告诉你所有控制开关的位置和功能。根据TI的技术手册,每个ePWM模块实例都有一套完整的寄存器组,它们按功能被清晰地划分到各个子模块下。

2.1 寄存器分组与寻址逻辑

eHRPWM的寄存器不是杂乱无章地堆在一起,而是严格按照子模块进行分组。例如,所有与控制时间基准计数器相关的寄存器,如TBCTL(控制)、TBSTS(状态)、TBPHS(相位)、TBPRD(周期),都被归在“Time-Base Submodule Registers”组里。这种分组方式非常符合我们的编程和调试思维:当我想调整PWM频率时,我就去时间基准组的寄存器里操作;当我想设置占空比时,我就去找计数器比较组的CMPACMPB

每个ePWM模块(例如EPWM1, EPWM2...)在内存中都有自己独立的寄存器文件起始地址。在编程时,我们通常会通过TI提供的驱动程序库(如driverlib)中定义的结构体指针(例如EPWM_Regs*)来访问这些寄存器。这些结构体的成员变量名称与手册中的寄存器缩写名一一对应,这极大地方便了我们的代码编写和阅读。例如,EPwm1Regs.TBCTL就对应着EPWM1模块的时间基准控制寄存器。

注意:在查阅寄存器表时,要特别注意“Shadow”这一列。标记为“Yes”的寄存器(如TBPRD,CMPA,CMPB)具有影子寄存器功能。这意味着你写入的值不会立即生效去影响硬件波形,而是先存入一个缓冲寄存器(影子寄存器),在特定的、安全的时刻(如计数器为零或达到周期值时)才会自动加载到活动寄存器中。这个机制是防止在PWM周期中间修改关键参数导致输出毛刺或异常的关键设计,务必在编程时理解其加载机制。

2.2 关键寄存器功能速览

为了让你快速建立印象,我将核心子模块的几个关键寄存器及其作用整理如下表。在后续深入每个子模块时,我们会再详细拆解它们的每一个配置位。

子模块寄存器缩写寄存器全称核心作用简述
时间基准 (TB)TBCTLTime-Base Control Register配置计数器模式(增/减/增减)、时钟分频、同步使能等全局模式。
TBPRDTime-Base Period Register设置PWM的周期值,是决定PWM频率的核心参数。
TBPHSTime-Base Phase Register设置相位寄存器,用于实现多个PWM模块之间的波形相位差。
计数器比较 (CC)CMPCTLCounter-Compare Control Register控制CMPA/CMPB影子寄存器的加载模式和时机。
CMPACounter-Compare A Register设置与EPWMxA输出相关的比较值,直接影响A路输出的占空比或开关点。
CMPBCounter-Compare B Register设置与EPWMxB输出相关的比较值,用于控制B路输出或辅助事件。
动作限定器 (AQ)AQCTLAAction-Qualifier Control Reg for A定义当CTR=CMPA,CTR=PRD等事件发生时,EPWMxA输出要执行的动作(置高、置低、翻转)。
AQCTLBAction-Qualifier Control Reg for B定义事件发生时,EPWMxB输出要执行的动作。
死区发生器 (DB)DBCTLDead-Band Control Register配置死区生成模式、输出极性等。
DBREDRising Edge Delay Register设置上升沿延迟的计数值。
DBFEDFalling Edge Delay Register设置下降沿延迟的计数值。
事件触发 (ET)ETSELEvent-Trigger Selection Register选择哪些事件(如CTR=PRD,CTR=CMPA)可以触发中断。
ETPSEvent-Trigger Pre-Scale Register设置事件触发中断的预分频(每1次、每2次...事件才触发一次中断)。

这张表是你配置eHRPWM的“菜单”。接下来,我们就从最重要的“厨房”——时间基准子模块开始,看看如何准备这顿PWM“大餐”的基础时序。

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

你可以把时间基准子模块想象成整个eHRPWM系统的“心脏”或“节拍器”。它产生一个基础的、不断循环的计数序列(TBCNT),所有其他子模块的动作(比较、输出动作、产生中断)都以此计数器的值为基准来触发。因此,理解并正确配置TB模块,是生成稳定、准确PWM波形的第一步。

3.1 计数器模式与PWM频率计算

TB模块的核心是一个16位的向上/向下计数器(TBCNT)。它的计数模式由TBCTL[CTRMODE]位决定,直接决定了你生成的是对称PWM还是非对称PWM,也决定了PWM频率的计算公式。

1. 递增计数模式 (TB_COUNT_UP)

  • 工作方式:计数器从0开始,每个TBCLK时钟加1,直到等于周期值TBPRD,然后立即复位到0,重新开始。
  • 波形特性:生成非对称PWM。波形事件(如比较点)只在每个周期内出现一次。
  • 频率公式PWM频率 = TBCLK频率 / (TBPRD + 1)
  • 典型应用:简单的LED调光、蜂鸣器驱动等对波形对称性无要求的场合。

2. 递减计数模式 (TB_COUNT_DOWN)

  • 工作方式:计数器从TBPRD值开始,每个TBCLK时钟减1,直到等于0,然后立即重载为TBPRD,重新开始。
  • 波形特性:同样生成非对称PWM
  • 频率公式:与递增模式相同,PWM频率 = TBCLK频率 / (TBPRD + 1)
  • 应用场景:与递增模式类似,但某些特定算法或与其他模块配合时,递减逻辑可能更直观。

3. 递增-递减计数模式 (TB_COUNT_UPDOWN)

  • 工作方式:计数器从0开始递增到TBPRD,然后立即转向递减回0,如此循环。
  • 波形特性:生成对称PWM(中心对齐PWM)。每个PWM周期内,比较事件会触发两次(一次在递增过程,一次在递减过程),这能有效减少谐波分量。
  • 频率公式PWM频率 = TBCLK频率 / (2 * TBPRD)
  • 典型应用电机控制(如FOC算法)和全桥/半桥电源拓扑的绝佳选择。对称PWM可以显著降低电机噪音和电源的电磁干扰(EMI)。

配置示例与计算: 假设系统时钟SYSCLKOUT = 100MHz,我们希望生成一个20kHz的对称PWM用于电机控制。

  1. 首先设置TBCTL[HSPCLKDIV]TBCTL[CLKDIV],决定TBCLK的分频。为了获得较高的计数器分辨率,我们通常先不分频或低分频。这里设为TB_DIV1,即TBCLK = SYSCLKOUT = 100MHz
  2. 选择TB_COUNT_UPDOWN模式。
  3. 计算TBPRDTBPRD = TBCLK频率 / (2 * PWM频率) = 100e6 / (2 * 20e3) = 2500
  4. TBPRD = 2500写入寄存器。
// 假设使用TI的driverlib库 EPWM_setClockPrescaler(EPWM1_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_CLOCK_DIVIDER_1); // TBCLK = SYSCLKOUT EPWM_setTimeBasePeriod(EPWM1_BASE, 2500); // 设置周期值 EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_UP_DOWN); // 设置为增减模式 EPWM_setTimeBaseCounter(EPWM1_BASE, 0); // 计数器从0开始

实操心得:在电机控制中,我强烈建议使用递增-递减模式。除了降低EMI,它还有一个巨大优势:在计数器达到峰值(TBPRD)和谷底(0)时都会产生CTR=PRDCTR=0事件。这为同步ADC采样(例如在PWM周期中点或终点进行电流采样)提供了非常方便且对称的时间点,简化了控制环路的设计。

3.2 时钟同步与相位控制

在复杂的多轴运动控制或多相交错并联电源中,我们经常需要多个PWM模块协同工作,它们的波形可能需要严格同步,或者保持特定的相位差。eHRPWM的TB模块提供了强大的同步链机制。

同步链:每个ePWM模块都有一个同步输入(EPWMxSYNCI)和一个同步输出(EPWMxSYNCO)。通常,EPWM1的同步输入来自外部引脚或特定同步源,而EPWM2的同步输入可以连接到EPWM1的同步输出,以此类推,形成一个链式结构。通过配置TBCTL[SYNCOSEL],你可以选择本模块的同步输出信号源(可以是输入同步信号、CTR=0事件或CTR=CMPB事件)。

相位控制:这是实现多相PWM(如三相逆变器)的关键。通过设置TBPHS(相位寄存器)和使能TBCTL[PHSEN],当模块收到同步输入脉冲时,其计数器TBCNT不会复位,而是会被加载为TBPHS的值。这样,该模块的PWM波形就相对于同步源产生了一个固定的相位偏移。

配置示例:假设我们使用EPWM1作为主模块,EPWM2作为从模块,希望EPWM2的波形滞后于EPWM190度(即1/4周期)。

  1. 配置EPWM1为递增-递减模式,TBPRD = 1000。设置EPWM1SYNCOSELCTR=0,这样每当EPWM1的计数器回到0时,它就产生一个同步输出脉冲。
  2. 配置EPWM2同样为递增-递减模式,TBPRD = 1000。使能EPWM2的相位加载(PHSEN=1),并设置TBPHS = 250(因为1000的1/4是250)。设置EPWM2的同步输入源为EPWM1的输出。
  3. EPWM1计数器归零并发出同步脉冲时,EPWM2的计数器会被强制设置为250,从而其整个波形周期相对于EPWM1延迟了1/4。
// 配置EPWM1为主模块 EPWM_setSyncOutPulseMode(EPWM1_BASE, EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO); // 配置EPWM2为从模块,并设置相位滞后 EPWM_setPhaseShift(EPWM2_BASE, 250); EPWM_syncPhaseShift(EPWM2_BASE); // 使能相位加载 EPWM_setSyncInPulseSource(EPWM2_BASE, EPWM_SYNC_IN_PULSE_SRC_EXTERNAL); // 假设硬件上已连接

避坑指南:同步和相位加载功能非常强大,但配置不当会导致灾难。一个常见的坑是在计数器运行过程中修改TBPHS寄存器。如果影子寄存器未使能,修改会立即生效,可能导致计数器跳变,产生非预期的脉冲。安全的做法是:1) 在初始化、计数器停止时配置相位值;2) 如果必须动态调整,确保使用影子寄存器功能(但TBPHS通常没有影子寄存器,需格外小心),并在安全时刻(如下一个同步事件到来前)更新。

3.3 影子寄存器机制深度解析

前面提到TBPRD有影子寄存器,这是eHRPWM稳定性的重要保障。我们通过TBCTL[PRDLD]位来控制其加载模式。

  • PRDLD=0(影子模式,默认):软件写入TBPRD地址的值,实际是写入了影子寄存器。硬件会在CTR=0的时刻,自动将影子寄存器的值加载到活动寄存器中。这意味着你可以在任何时刻安全地更新周期值,而不会打断当前正在输出的PWM周期。
  • PRDLD=1(立即加载模式):写入操作直接修改活动寄存器,立即影响下一个计数时钟沿的周期比较。这可能会在当前周期内造成毛刺或周期长度突变,除非有特殊需求(如特定类型的频率突变),否则不推荐使用

为什么需要影子寄存器?想象一下你在开车时突然换挡,如果换挡过程与发动机冲程不同步,就会产生顿挫甚至损坏。PWM生成也一样,在周期中间改变TBPRD,相当于突然改变跑道的长度,计数器可能会产生混乱的比较事件,导致输出脉冲宽度异常。影子寄存器机制确保了参数更新与硬件时序的“同步换挡”。

4. 计数器比较(CC)子模块:PWM占空比的画笔

如果说TB模块定义了画布的尺寸(周期),那么CC模块就是决定在哪里落笔(产生跳变沿)的画笔。它通过CMPACMPB这两个比较寄存器,在TB计数器运行的“时间轴”上打上标记,从而精确控制波形的关键时间点。

4.1 CMPA与CMPB的角色与配置

CMPACMPB是两个独立的16位比较寄存器。它们的核心功能是:持续将自身的值与时间基准计数器TBCNT的值进行比较,当两者相等时,分别产生CTR=CMPACTR=CMPB事件。这些事件被送到后续的动作限定器(AQ)子模块,最终决定PWM输出引脚EPWMxAEPWMxB的电平变化。

占空比计算

  • 对于递增计数模式:占空比 =CMPA / (TBPRD + 1)。例如,TBPRD=999,CMPA=300,则占空比约为30%。
  • 对于递减计数模式:占空比 =(TBPRD - CMPA) / (TBPRD + 1)。注意比较值的意义相反。
  • 对于递增-递减计数模式:情况稍复杂。通常,我们通过AQ模块的配置,让CMPA在递增和递减过程中分别触发不同的动作(如递增时置高,递减时置低),从而生成一个对称的PWM脉冲。此时,脉冲宽度与CMPA值相关,但占空比计算不再是简单的除法。脉冲的开始点结束点CMPA在递增和递减过程中触发的事件决定。

影子寄存器与加载点CMPACMPB也拥有影子寄存器,由CMPCTL[SHDWAMODE]CMPCTL[SHDWBMODE]控制。更重要的是,CMPCTL[LOADAMODE]CMPCTL[LOADBMODE]决定了影子寄存器值加载到活动寄存器的时机:

  • CTR=PRD:在计数器达到周期值时加载。
  • CTR=0:在计数器归零时加载。
  • CTR=PRD or CTR=0:在以上两个事件任一发生时加载。

配置策略:在电机控制等实时性要求高的应用中,我们通常采用**CTR=PRDCTR=0时加载**。这样,在一个PWM周期开始时,新的比较值就已就位,确保整个新周期的波形都是基于新参数生成的,避免了在一个周期内波形不一致的问题。这对于实现平滑的占空比变化至关重要。

4.2 不同计数模式下的比较事件特性

理解CC事件在不同计数模式下的行为,是正确配置AQ模块的前提。

  1. 递增/递减模式:在一个PWM周期内,CTR=CMPACTR=CMPB事件各发生一次。这很直观。
  2. 递增-递减模式:这是最容易���错的地方。如果CMPA的值在0和TBPRD之间(不包括0和TBPRD),那么在一个完整的增减周期内,CTR=CMPA事件会发生两次:一次在递增过程中(CTR从0向上经过CMPA时),一次在递减过程中(CTRTBPRD向下经过CMPA时)。CTR=CMPB事件同理。

这个特性正是生成对称PWM的基础。我们可以配置AQ模块,让递增过程中的CTR=CMPA事件将输出置高,递减过程中的CTR=CMPA事件将输出置低,这样就产生了一个以周期中心为对称点的脉冲。

配置示例:生成一个中心对称的PWM

// 假设已配置TB模块为增减模式,TBPRD=1000 EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, 300); // 设置CMPA=300 // 配置AQ模块(详见下一章): // 当 CTR 递增且等于 CMPA 时,将 EPWMxA 置高 (AQ_SET on CAU) EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); // 当 CTR 递减且等于 CMPA 时,将 EPWMxA 置低 (AQ_CLEAR on CAD) EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);

这段配置会产生一个脉冲:在TBCNT从0递增到300时输出变高,在TBCNT从1000递减到300时输出变低。脉冲在周期内是对称的。

常见问题排查“我修改了CMPA的值,但PWM输出占空比没有变化!”首先,检查CMPCTL[SHDWAMODE]是否为影子模式。如果是,检查LOADAMODE设置的加载事件是否已发生。一个高效的调试方法是:在调试器中单步运行,在修改CMPA影子寄存器后,手动触发一个CTR=0CTR=PRD事件(例如通过强制同步),或者等待一个完整的PWM周期过去,再观察输出。其次,确认你修改的是正确的寄存器。有些库函数可能直接操作活动寄存器,有些则操作影子寄存器,务必查阅库函数说明。

5. 动作限定器(AQ)与死区(DB)子模块:从事件到安全波形

CC模块产生了“何时”的事件,而AQ模块则定义了“做什么”的动作。DB模块则是在此基础上,为桥式电路(如H桥、半桥)增加至关重要的安全延迟。

5.1 动作限定器(AQ):事件到动作的翻译官

AQ模块接收来自TB模块的CTR=PRDCTR=0事件,以及来自CC模块的CTR=CMPACTR=CMPB事件。对于每一个输出通道(EPWMxAEPWMxB),AQ模块都有一组独立的控制寄存器(AQCTLA,AQCTLB),来定义当某个特定事件发生时,对应的输出引脚应该执行什么动作。

可执行的动作

  • AQ_NO_ACTION:无动作。
  • AQ_CLEAR:将输出置为低电平。
  • AQ_SET:将输出置为高电平。
  • AQ_TOGGLE:将输出电平翻转。

关键配置思路:AQ的配置逻辑是eHRPWM编程中最体现“设计”的部分。你需要根据想要的PWM波形,逆向思考在每个关键时间点(事件)需要什么动作。

以生成一个简单的递增计数模式PWM为例(假设使用EPWMxA,高电平有效):

  1. 目标:在周期开始时输出高电平,当计数器等于CMPA时输出变低。
  2. 配置:
    • CTR=0事件时,对A输出执行AQ_SET(置高)。
    • CTR=CMPA事件时,对A输出执行AQ_CLEAR(置低)。
  3. 代码片段:
    EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);

对于更常用的增减计数模式对称PWM(假设使用EPWMxA,高电平有效):

  1. 目标:在计数器递增到CMPA时输出变高,在计数器递减到CMPA时输出变低。
  2. 配置:
    • CTR递增且等于CMPA(CAU)事件时,对A输出执行AQ_SET
    • CTR递减且等于CMPA(CAD)事件时,对A输出执行AQ_CLEAR
  3. 代码片段:
    EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);

5.2 死区发生器(DB):功率电路的保护神

在驱动MOSFET或IGBT的桥式电路中,同一桥臂的上管和下管绝不能同时导通,否则会造成电源直通短路,瞬间烧毁器件。死区时间就是在控制上管关断和下管导通(或反之)之间插入的一段两个管子都关断的安全延时。

eHRPWM的DB模块接收来自AQ模块的原始PWM信号(通常称为EPWMxAEPWMxB),经过可配置的延迟后,生成带死区的两路互补信号EPWMxA_DBEPWMxB_DB(通常连接到驱动芯片)。

核心寄存器

  • DBCTL:控制死区模式、输入信号极性等。
  • DBRED:上升沿延迟寄存器。定义输入信号上升沿到输出信号上升沿的延迟时间(以TBCLK周期为单位)。
  • DBFED:下降沿延迟寄存器。定义输入信号下降沿到输出信号下降沿的延迟时间。

工作模式:DB模块有多种模式,最常用的是主动高互补模式。在此模式下:

  • 假设输入EPWMxA为高有效PWM,EPWMxB为其反相(可通过AQ配置实现)。
  • DB模块会对EPWMxA的上升沿添加DBRED延迟,对EPWMxB的上升沿添加DBFED延迟(注意,对于EPWMxB,其上升沿对应原EPWMxA的下降沿)。
  • 最终输出EPWMxA_DBEPWMxB_DB是互补的,且在任何切换时刻都保证了先关断、后导通的安全间隔。

死区时间计算:死区时间 = 延迟值 *TBCLK周期。例如,TBCLK = 100MHz (10ns)DBRED = 50,则上升沿死区时间为 50 * 10ns = 500ns。

配置示例

// 首先,通过AQ模块生成EPWMxA和其反相的EPWMxB(假设用于上下管) EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, ...); // 配置A输出 EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B, ...); // 配置B输出为A的反相 // 然后,配置死区模块 EPWM_setDeadBandDelayMode(EPWM1_BASE, EPWM_DB_RED, EPWM_DB_FED); // 使能上升沿和下降沿延迟 EPWM_setDeadBandDelayPolarity(EPWM1_BASE, EPWM_DB_POLARITY_ACTIVE_HIGH, EPWM_DB_POLARITY_ACTIVE_HIGH_COMPL); // 主动高互补模式 EPWM_setRisingEdgeDeadBandDelay(EPWM1_BASE, 50); // 设置DBRED = 50个TBCLK EPWM_setFallingEdgeDeadBandDelay(EPWM1_BASE, 50); // 设置DBFED = 50个TBCLK // 最后,将EPWMxA_DB和EPWMxB_DB输出到引脚

避坑指南与实操心得

  1. 死区时间不是越长越好:死区时间会引入波形失真,降低有效输出电压,尤其在高速开关场合。需要根据你所使用的功率器件的开关特性(特别是关断延迟时间)来精确计算。通常,死区时间应略大于器件的最大关断延迟时间。
  2. 务必使用示波器验证:配置完死区后,一定要用示波器同时测量上下管的驱动波形,确认在切换瞬间存在明显的共态关断区间,且时间符合设定。
  3. AQ与DB的联动:有时为了生成特定的PWM模式(如带死区的对称PWM),需要仔细设计AQ的动作,使其产生的原始EPWMxAEPWMxB信号能满足DB模块的输入预期。画一下时序图会非常有帮助。
  4. 影子寄存器DBREDDBFED通常没有影子寄存器,修改会立即生效。因此,尽量避免在PWM运行时动态修改死区时间。如果必须修改,应在PWM输出被禁用或处于安全状态(如下管恒通)时进行。

6. 事件触发(ET)与错误联防(TZ)子模块:让系统更智能可靠

eHRPWM不仅负��产生波形,还提供了完善的事件管理和故障保护机制,这对于构建健壮的工业系统至关重要。

6.1 事件触发(ET)子模块:精准的中断发生器

在电机控制或数字电源中,我们经常需要在PWM周期的特定时刻触发ADC采样(用于读取电流、电压)或者执行控制算法计算。ET模块就是为此而生。它允许你选择ePWM内部的各种事件(如CTR=PRD,CTR=0,CTR=CMPA等)作为中断源。

核心寄存器

  • ETSEL:选择中断事件。例如,ETSEL[INTSEL]位域用于选择具体哪个事件能触发中断。
  • ETPS:中断预分频。你可以设置中断是每个事件都触发(ET_1ST),还是每2个、每3个事件才触发一次(ET_2ND,ET_3RD)。这在需要降低CPU中断负载时非常有用。
  • ETFLG:中断标志位。当选定的事件发生时,此标志位置1。
  • ETCLR:用于在中断服务程序(ISR)中清除中断标志。
  • ETFRC:软件强制中断位,可用于测试。

典型配置流程

  1. 选择中断事件:在ETSEL寄存器中,选择你关心的事件。例如,在对称PWM中,我们常在CTR=PRD(周期中点)或CTR=0(周期结束)时采样电流。那就将INTSEL配置为ET_CTR_PRDET_CTR_ZERO
  2. 设置中断预分频:在ETPS寄存器中,设置INTPRD。如果每个PWM周期都需要中断,就设为ET_1ST
  3. 使能中断:设置ETSEL[INTEN]=1
  4. 在中断服务程序中
    • 读取ETFLG确认中断源。
    • 执行关键操作(如启动ADC转换、运行PID计算、更新CMPA/CMPB值)。
    • ETCLR寄存器相应的位来清除中断标志。

配置示例:在每个PWM周期结束时触发中断

EPWM_enableInterrupt(EPWM1_BASE); // 使能EPWM1中断(底层会操作ETSEL) EPWM_setInterruptSource(EPWM1_BASE, EPWM_INT_TBCTR_ZERO); // 选择CTR=0为中断源 EPWM_setInterruptEventCount(EPWM1_BASE, 1); // 每个事件都触发中断 (ET_1ST) // 注意:还需要在PIE/CPU级别配置中断向量和使能全局中断

注意事项:中断服务程序(ISR)必须尽可能高效。长时间停留在ISR中会导致错过后续的中断,造成系统控制失调。对于复杂的计算,应考虑在ISR中设置标志位,在主循环中处理。

6.2 错误联防(TZ)子模块:系统的紧急制动

TZ模块是eHRPWM的安全卫士。它连接到一个或多个外部故障引脚(TZ1-TZn),当这些引脚被触发(通常由过流、过压、过热等硬件保护电路拉低),TZ模块可以立即强制PWM输出进入预定义的安全状态(如全部置高、全部置低或高阻态),从而保护功率电路和电机。

核心寄存器

  • TZSEL:选择哪些故障引脚(TZ1-TZn)可以触发保护动作。你可以配置为“任一引脚触发即动作”或“所有选定引脚同时触发才动作”。
  • TZCTL:定义当故障发生时,EPWMxAEPWMxB输出应被强制为何种状态(TZ_FORCE_HI,TZ_FORCE_LO,TZ_HIZ高阻,TZ_NONE忽略)。
  • TZEINT:使能故障触发CPU中断,以便软件记录故障日志或进行恢复操作。
  • TZFLG:故障标志寄存器。
  • TZCLR:清除故障标志。
  • TZFRC:软件强制产生故障信号,用于测试。

动作模式

  • 单次触发(One-Shot):故障事件发生后,PWM输出被强制锁定在安全状态,直到软件通过TZCLR清除标志位后才会恢复。适用于需要人工干预的严重故障。
  • 周期循环(Cycle-By-Cycle):故障事件发生后,PWM输出在当前周期被强制为安全状态,但下一个PWM周期会自动恢复。如果故障信号持续存在,则下个周期会再次被强制。适用于可自恢复的瞬时过流保护。

配置示例:配置TZ1引脚为周期循环过流保护,触发时强制两路输出为低

EPWM_enableTripZoneSignals(EPWM1_BASE, EPWM_TZ_SIGNAL_1); // 使能TZ1信号 EPWM_setTripZoneAction(EPWM1_BASE, EPWM_TZ_ACTION_EVENT_TZA, EPWM_TZ_ACTION_LOW); // TZA故障时拉低 EPWM_setTripZoneAction(EPWM1_BASE, EPWM_TZ_ACTION_EVENT_TZB, EPWM_TZ_ACTION_LOW); // TZB故障时拉低 EPWM_setTripZoneCycleByCycle(EPWM1_BASE); // 设置为周期循环模式 // 如果需要中断,再使能TZ中断 EPWM_enableTripZoneInterrupt(EPWM1_BASE);

安全第一原则

  1. 硬件连接是关键:TZ引脚必须可靠地连接到你的硬件保护电路(如比较器输出)。确保故障信号的极性正确(通常是低电平有效)。
  2. 默认安全状态TZCTL中配置的强制状态,必须是电气上的安全状态。对于大多数桥式电路,强制所有输出为低(下管导通,上管关断)或高阻是常见的安全选择,强制为高可能导致直通。
  3. 务必测试:在系统上电前,通过短接TZ引脚到地等方式,模拟故障条件,用示波器验证PWM输出是否能按预期被强制,并且恢复逻辑是否符合预期。这是保证产品可靠性的最后一道硬件防火墙。

7. 高分辨率PWM(HRPWM)扩展与初始化流程

对于追求极致控制精度的应用,如高性能数字电源(LLC, PFC)或需要极细步进调节的场合,标准的PWM分辨率可能不够。eHRPWM模块的HRPWM扩展功能,通过微调PWM边沿的位置,可以将时间分辨率提升到皮秒(ps)级别。

7.1 HRPWM原理简介

传统PWM的边沿切换时刻只能发生在TBCLK的整数倍时刻。HRPWM通过一个称为“微边沿定位(MEP)”的技术,在TBCLK的一个周期内,进一步插入数百个精细的步进,从而允许边沿在子TBCLK周期内移动。这通常通过一个特殊的CMPAHR寄存器(高分辨率比较寄存器)来实现,它与标准的CMPA寄存器配合使用。CMPA决定粗调位置(哪个TBCLK),CMPAHR决定微调位置(在该TBCLK周期内的具体时刻)。

配置要点

  1. 确认模块支持:并非所有ePWM实例都支持HRPWM,需查阅芯片数据手册。
  2. 配置HRPWM时钟:需要通过HRCNFG寄存器配置MEP步进的比例尺。
  3. 使用扩展寄存器:使用CMPAHR来设置高分辨率部分的值。占空比的微调通过一个公式计算后写入CMPAHR

由于HRPWM的配置相对复杂且与具体芯片型号强相关,这里不展开具体位域。但其核心思想是:通过牺牲一定的动态范围(因为部分寄存器位用于微调),来换取极高的时间分辨率。在需要非常平滑的电压调节或极低谐波失真的应用中,HRPWM价值巨大。

7.2 eHRPWM模块标准初始化流程

一个稳健的eHRPWM初始化流程,可以避免因寄存器状态不确定而导致的毛刺或异常输出。TI手册推荐的标准流程如下:

  1. 禁用全局中断:操作CPU INTM位,防止初始化过程中被中断打断。
  2. 禁用ePWM模块中断:清除ETSEL[INTEN]等中断使能位。
  3. 初始化外设寄存器:按照从“上游”到“下游”的顺序配置寄存器:
    • 先配置TB模块:设置时钟分频、计数模式、周期值。此时先不要启动计数器(或将其置于冻结模式TB_FREEZE)。
    • 再配置CC模块:设置CMPA,CMPB及其影子加载模式。
    • 然后配置AQ模块:定义输出动作逻辑。
    • 接着配置DB, PC, TZ, ET等模块:根据需求配置死区、故障保护等。
  4. 清除虚假的中断标志:读取并清除ETFLG,TZFLG等标志寄存器,避免残留标志导致误中断。
  5. 使能ePWM模块中断:配置ETSEL等,使能所需的中断源。
  6. 使能全局中断:操作CPU INTM位。
  7. 启动时间基准时钟同步:如果使用多个ePWM模块且需要时钟同步,按照第3.2节描述的流程,最后操作CFGCHIP1[TBCLKSYNC]位,同时启动所有模块的TBCLK
  8. 解除计数器冻结:将TBCTL[CTRMODE]TB_FREEZE改为所需的计数模式(如TB_COUNT_UPDOWN),PWM波形开始输出。

这个流程的核心思想是:在输出使能前,完成所有静态配置;在逻辑正确建立后,再统一启动时序。遵循此流程能最大程度保证系统从上电开始就处于确定、可控的状态。

在我多年的电机驱动开发中,eHRPWM模块的深度配置是区分普通应用和高端应用的关键。从寄存器映射理解其能力边界,通过子模块化配置构建所需波形,再利用事件触发和错误联防实现智能控制与保护,这套组合拳打好了,你的电力电子项目就拥有了一个强大而可靠的心脏。调试时,善用仿真器的寄存器观察窗口和示波器,从TB的计数器波形看起,逐步验证CC、AQ、DB各环节的输出,是快速定位问题的有效方法。