深入解析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频率时,我就去时间基准组的寄存器里操作;当我想设置占空比时,我就去找计数器比较组的CMPA和CMPB。
每个ePWM模块(例如EPWM1, EPWM2...)在内存中都有自己独立的寄存器文件起始地址。在编程时,我们通常会通过TI提供的驱动程序库(如driverlib)中定义的结构体指针(例如EPWM_Regs*)来访问这些寄存器。这些结构体的成员变量名称与手册中的寄存器缩写名一一对应,这极大地方便了我们的代码编写和阅读。例如,EPwm1Regs.TBCTL就对应着EPWM1模块的时间基准控制寄存器。
注意:在查阅寄存器表时,要特别注意“Shadow”这一列。标记为“Yes”的寄存器(如
TBPRD,CMPA,CMPB)具有影子寄存器功能。这意味着你写入的值不会立即生效去影响硬件波形,而是先存入一个缓冲寄存器(影子寄存器),在特定的、安全的时刻(如计数器为零或达到周期值时)才会自动加载到活动寄存器中。这个机制是防止在PWM周期中间修改关键参数导致输出毛刺或异常的关键设计,务必在编程时理解其加载机制。
2.2 关键寄存器功能速览
为了让你快速建立印象,我将核心子模块的几个关键寄存器及其作用整理如下表。在后续深入每个子模块时,我们会再详细拆解它们的每一个配置位。
| 子模块 | 寄存器缩写 | 寄存器全称 | 核心作用简述 |
|---|---|---|---|
| 时间基准 (TB) | TBCTL | Time-Base Control Register | 配置计数器模式(增/减/增减)、时钟分频、同步使能等全局模式。 |
TBPRD | Time-Base Period Register | 设置PWM的周期值,是决定PWM频率的核心参数。 | |
TBPHS | Time-Base Phase Register | 设置相位寄存器,用于实现多个PWM模块之间的波形相位差。 | |
| 计数器比较 (CC) | CMPCTL | Counter-Compare Control Register | 控制CMPA/CMPB影子寄存器的加载模式和时机。 |
CMPA | Counter-Compare A Register | 设置与EPWMxA输出相关的比较值,直接影响A路输出的占空比或开关点。 | |
CMPB | Counter-Compare B Register | 设置与EPWMxB输出相关的比较值,用于控制B路输出或辅助事件。 | |
| 动作限定器 (AQ) | AQCTLA | Action-Qualifier Control Reg for A | 定义当CTR=CMPA,CTR=PRD等事件发生时,EPWMxA输出要执行的动作(置高、置低、翻转)。 |
AQCTLB | Action-Qualifier Control Reg for B | 定义事件发生时,EPWMxB输出要执行的动作。 | |
| 死区发生器 (DB) | DBCTL | Dead-Band Control Register | 配置死区生成模式、输出极性等。 |
DBRED | Rising Edge Delay Register | 设置上升沿延迟的计数值。 | |
DBFED | Falling Edge Delay Register | 设置下降沿延迟的计数值。 | |
| 事件触发 (ET) | ETSEL | Event-Trigger Selection Register | 选择哪些事件(如CTR=PRD,CTR=CMPA)可以触发中断。 |
ETPS | Event-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用于电机控制。
- 首先设置
TBCTL[HSPCLKDIV]和TBCTL[CLKDIV],决定TBCLK的分频。为了获得较高的计数器分辨率,我们通常先不分频或低分频。这里设为TB_DIV1,即TBCLK = SYSCLKOUT = 100MHz。 - 选择
TB_COUNT_UPDOWN模式。 - 计算
TBPRD:TBPRD = TBCLK频率 / (2 * PWM频率) = 100e6 / (2 * 20e3) = 2500。 - 将
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=PRD和CTR=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周期)。
- 配置
EPWM1为递增-递减模式,TBPRD = 1000。设置EPWM1的SYNCOSEL为CTR=0,这样每当EPWM1的计数器回到0时,它就产生一个同步输出脉冲。 - 配置
EPWM2同样为递增-递减模式,TBPRD = 1000。使能EPWM2的相位加载(PHSEN=1),并设置TBPHS = 250(因为1000的1/4是250)。设置EPWM2的同步输入源为EPWM1的输出。 - 当
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模块就是决定在哪里落笔(产生跳变沿)的画笔。它通过CMPA和CMPB这两个比较寄存器,在TB计数器运行的“时间轴”上打上标记,从而精确控制波形的关键时间点。
4.1 CMPA与CMPB的角色与配置
CMPA和CMPB是两个独立的16位比较寄存器。它们的核心功能是:持续将自身的值与时间基准计数器TBCNT的值进行比较,当两者相等时,分别产生CTR=CMPA和CTR=CMPB事件。这些事件被送到后续的动作限定器(AQ)子模块,最终决定PWM输出引脚EPWMxA和EPWMxB的电平变化。
占空比计算:
- 对于递增计数模式:占空比 =
CMPA / (TBPRD + 1)。例如,TBPRD=999,CMPA=300,则占空比约为30%。 - 对于递减计数模式:占空比 =
(TBPRD - CMPA) / (TBPRD + 1)。注意比较值的意义相反。 - 对于递增-递减计数模式:情况稍复杂。通常,我们通过AQ模块的配置,让
CMPA在递增和递减过程中分别触发不同的动作(如递增时置高,递减时置低),从而生成一个对称的PWM脉冲。此时,脉冲宽度与CMPA值相关,但占空比计算不再是简单的除法。脉冲的开始点和结束点由CMPA在递增和递减过程中触发的事件决定。
影子寄存器与加载点:CMPA和CMPB也拥有影子寄存器,由CMPCTL[SHDWAMODE]和CMPCTL[SHDWBMODE]控制。更重要的是,CMPCTL[LOADAMODE]和CMPCTL[LOADBMODE]决定了影子寄存器值加载到活动寄存器的时机:
CTR=PRD:在计数器达到周期值时加载。CTR=0:在计数器归零时加载。CTR=PRD or CTR=0:在以上两个事件任一发生时加载。
配置策略:在电机控制等实时性要求高的应用中,我们通常采用**CTR=PRD或CTR=0时加载**。这样,在一个PWM周期开始时,新的比较值就已就位,确保整个新周期的波形都是基于新参数生成的,避免了在一个周期内波形不一致的问题。这对于实现平滑的占空比变化至关重要。
4.2 不同计数模式下的比较事件特性
理解CC事件在不同计数模式下的行为,是正确配置AQ模块的前提。
- 递增/递减模式:在一个PWM周期内,
CTR=CMPA和CTR=CMPB事件各发生一次。这很直观。 - 递增-递减模式:这是最容易���错的地方。如果
CMPA的值在0和TBPRD之间(不包括0和TBPRD),那么在一个完整的增减周期内,CTR=CMPA事件会发生两次:一次在递增过程中(CTR从0向上经过CMPA时),一次在递减过程中(CTR从TBPRD向下经过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=0或CTR=PRD事件(例如通过强制同步),或者等待一个完整的PWM周期过去,再观察输出。其次,确认你修改的是正确的寄存器。有些库函数可能直接操作活动寄存器,有些则操作影子寄存器,务必查阅库函数说明。
5. 动作限定器(AQ)与死区(DB)子模块:从事件到安全波形
CC模块产生了“何时”的事件,而AQ模块则定义了“做什么”的动作。DB模块则是在此基础上,为桥式电路(如H桥、半桥)增加至关重要的安全延迟。
5.1 动作限定器(AQ):事件到动作的翻译官
AQ模块接收来自TB模块的CTR=PRD、CTR=0事件,以及来自CC模块的CTR=CMPA、CTR=CMPB事件。对于每一个输出通道(EPWMxA和EPWMxB),AQ模块都有一组独立的控制寄存器(AQCTLA,AQCTLB),来定义当某个特定事件发生时,对应的输出引脚应该执行什么动作。
可执行的动作:
AQ_NO_ACTION:无动作。AQ_CLEAR:将输出置为低电平。AQ_SET:将输出置为高电平。AQ_TOGGLE:将输出电平翻转。
关键配置思路:AQ的配置逻辑是eHRPWM编程中最体现“设计”的部分。你需要根据想要的PWM波形,逆向思考在每个关键时间点(事件)需要什么动作。
以生成一个简单的递增计数模式PWM为例(假设使用EPWMxA,高电平有效):
- 目标:在周期开始时输出高电平,当计数器等于
CMPA时输出变低。 - 配置:
- 在
CTR=0事件时,对A输出执行AQ_SET(置高)。 - 在
CTR=CMPA事件时,对A输出执行AQ_CLEAR(置低)。
- 在
- 代码片段:
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,高电平有效):
- 目标:在计数器递增到
CMPA时输出变高,在计数器递减到CMPA时输出变低。 - 配置:
- 在
CTR递增且等于CMPA(CAU)事件时,对A输出执行AQ_SET。 - 在
CTR递减且等于CMPA(CAD)事件时,对A输出执行AQ_CLEAR。
- 在
- 代码片段:
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信号(通常称为EPWMxA和EPWMxB),经过可配置的延迟后,生成带死区的两路互补信号EPWMxA_DB和EPWMxB_DB(通常连接到驱动芯片)。
核心寄存器:
DBCTL:控制死区模式、输入信号极性等。DBRED:上升沿延迟寄存器。定义输入信号上升沿到输出信号上升沿的延迟时间(以TBCLK周期为单位)。DBFED:下降沿延迟寄存器。定义输入信号下降沿到输出信号下降沿的延迟时间。
工作模式:DB模块有多种模式,最常用的是主动高互补模式。在此模式下:
- 假设输入
EPWMxA为高有效PWM,EPWMxB为其反相(可通过AQ配置实现)。 - DB模块会对
EPWMxA的上升沿添加DBRED延迟,对EPWMxB的上升沿添加DBFED延迟(注意,对于EPWMxB,其上升沿对应原EPWMxA的下降沿)。 - 最终输出
EPWMxA_DB和EPWMxB_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输出到引脚避坑指南与实操心得:
- 死区时间不是越长越好:死区时间会引入波形失真,降低有效输出电压,尤其在高速开关场合。需要根据你所使用的功率器件的开关特性(特别是关断延迟时间)来精确计算。通常,死区时间应略大于器件的最大关断延迟时间。
- 务必使用示波器验证:配置完死区后,一定要用示波器同时测量上下管的驱动波形,确认在切换瞬间存在明显的共态关断区间,且时间符合设定。
- AQ与DB的联动:有时为了生成特定的PWM模式(如带死区的对称PWM),需要仔细设计AQ的动作,使其产生的原始
EPWMxA和EPWMxB信号能满足DB模块的输入预期。画一下时序图会非常有帮助。- 影子寄存器:
DBRED和DBFED通常没有影子寄存器,修改会立即生效。因此,尽量避免在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:软件强制中断位,可用于测试。
典型配置流程:
- 选择中断事件:在
ETSEL寄存器中,选择你关心的事件。例如,在对称PWM中,我们常在CTR=PRD(周期中点)或CTR=0(周期结束)时采样电流。那就将INTSEL配置为ET_CTR_PRD或ET_CTR_ZERO。 - 设置中断预分频:在
ETPS寄存器中,设置INTPRD。如果每个PWM周期都需要中断,就设为ET_1ST。 - 使能中断:设置
ETSEL[INTEN]=1。 - 在中断服务程序中:
- 读取
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:定义当故障发生时,EPWMxA和EPWMxB输出应被强制为何种状态(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);安全第一原则:
- 硬件连接是关键:TZ引脚必须可靠地连接到你的硬件保护电路(如比较器输出)。确保故障信号的极性正确(通常是低电平有效)。
- 默认安全状态:
TZCTL中配置的强制状态,必须是电气上的安全状态。对于大多数桥式电路,强制所有输出为低(下管导通,上管关断)或高阻是常见的安全选择,强制为高可能导致直通。- 务必测试:在系统上电前,通过短接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周期内的具体时刻)。
配置要点:
- 确认模块支持:并非所有ePWM实例都支持HRPWM,需查阅芯片数据手册。
- 配置HRPWM时钟:需要通过
HRCNFG寄存器配置MEP步进的比例尺。 - 使用扩展寄存器:使用
CMPAHR来设置高分辨率部分的值。占空比的微调通过一个公式计算后写入CMPAHR。
由于HRPWM的配置相对复杂且与具体芯片型号强相关,这里不展开具体位域。但其核心思想是:通过牺牲一定的动态范围(因为部分寄存器位用于微调),来换取极高的时间分辨率。在需要非常平滑的电压调节或极低谐波失真的应用中,HRPWM价值巨大。
7.2 eHRPWM模块标准初始化流程
一个稳健的eHRPWM初始化流程,可以避免因寄存器状态不确定而导致的毛刺或异常输出。TI手册推荐的标准流程如下:
- 禁用全局中断:操作
CPU INTM位,防止初始化过程中被中断打断。 - 禁用ePWM模块中断:清除
ETSEL[INTEN]等中断使能位。 - 初始化外设寄存器:按照从“上游”到“下游”的顺序配置寄存器:
- 先配置TB模块:设置时钟分频、计数模式、周期值。此时先不要启动计数器(或将其置于冻结模式
TB_FREEZE)。 - 再配置CC模块:设置
CMPA,CMPB及其影子加载模式。 - 然后配置AQ模块:定义输出动作逻辑。
- 接着配置DB, PC, TZ, ET等模块:根据需求配置死区、故障保护等。
- 先配置TB模块:设置时钟分频、计数模式、周期值。此时先不要启动计数器(或将其置于冻结模式
- 清除虚假的中断标志:读取并清除
ETFLG,TZFLG等标志寄存器,避免残留标志导致误中断。 - 使能ePWM模块中断:配置
ETSEL等,使能所需的中断源。 - 使能全局中断:操作
CPU INTM位。 - 启动时间基准时钟同步:如果使用多个ePWM模块且需要时钟同步,按照第3.2节描述的流程,最后操作
CFGCHIP1[TBCLKSYNC]位,同时启动所有模块的TBCLK。 - 解除计数器冻结:将
TBCTL[CTRMODE]从TB_FREEZE改为所需的计数模式(如TB_COUNT_UPDOWN),PWM波形开始输出。
这个流程的核心思想是:在输出使能前,完成所有静态配置;在逻辑正确建立后,再统一启动时序。遵循此流程能最大程度保证系统从上电开始就处于确定、可控的状态。
在我多年的电机驱动开发中,eHRPWM模块的深度配置是区分普通应用和高端应用的关键。从寄存器映射理解其能力边界,通过子模块化配置构建所需波形,再利用事件触发和错误联防实现智能控制与保护,这套组合拳打好了,你的电力电子项目就拥有了一个强大而可靠的心脏。调试时,善用仿真器的寄存器观察窗口和示波器,从TB的计数器波形看起,逐步验证CC、AQ、DB各环节的输出,是快速定位问题的有效方法。
