1. 项目概述:从标准PWM到高分辨率PWM的跨越
在电机控制、数字电源和逆变器这些对精度和动态响应要求极高的领域,脉宽调制(PWM)技术是驱动一切的“心脏”。传统的PWM,就像一个节拍器,通过定时器计数和比较器匹配来生成固定频率、可调占空比的方波。它的精度受限于系统时钟频率和计数器的位数。比如,一个100MHz时钟、16位计数器的PWM,其时间分辨率是10纳秒,这对于许多现代高性能应用来说,已经显得“粗糙”了。
这就引出了我们今天要深入探讨的核心:高分辨率PWM(HRPWM)。你可以把它理解为给传统的PWM装上了一副“显微镜”。HRPWM的核心是一种称为微边沿定位(MEP)的技术。它不再满足于以整个系统时钟周期为最小步进来移动PWM边沿,而是通过一个精密的数字延迟线,在每个粗调时钟周期(Coarse Step)内,再插入多个微调步进(MEP Step)。以TMS320F28004x为例,其MEP逻辑可以在一个约10ns的粗调步进内,实现大约150ps的边沿移动精度,相当于将分辨率提升了约65倍。
这种精度的跃升意味着什么?在数字电源中,它可以直接转化为更平滑、纹波更小的输出电压;在电机驱动中,意味着更平稳的转矩控制和更低的谐波噪声;在精密仪器中,则能实现更精准的波形合成。而实现这一切的关键,就在于对ePWM模块中一系列专用寄存器的深入理解和精准配置。这不仅仅是填写几个数值,而是理解整个信号链如何从你的配置字,转化为引脚上那个精确到皮秒级别的跳变沿。
2. HRPWM核心原理与架构解析
2.1 微边沿定位(MEP)技术揭秘
要理解HRPWM,必须先从MEP的工作原理入手。想象一下,你要在一把尺子上精确标定一个点,尺子的最小刻度是1厘米(这就是我们的TBCLK周期,比如10ns)。MEP技术相当于在这1厘米的间隔内,又嵌入了一把更精密的游标卡尺。这把“游标卡尺”就是MEP延迟线。
在TMS320F28004x中,每个ePWM模块的HRPWM子模块都内置了这样一条延迟线。它的工作流程是这样的:当PWM的粗调边沿(由CMPA/CMPB或TBPRD决定)到来时,并不会立即输出,而是进入这条延迟线。延迟线由一系列可编程的精细延迟单元构成。HRMSTEP寄存器中存储的MEP_ScaleFactor值,就定义了在一个粗调步进内,最多可以插入多少个这样的精细延迟步进。这个值不是固定的,它会随着芯片工艺、电压和温度的变化而动态变化,因此需要SFO(比例因子优化器)软件库在运行时进行实时校准。
MEP_ScaleFactor可以理解为“每粗调步进所包含的微步进数”。例如,如果MEP_ScaleFactor校准为180,那么在一个10ns的粗调步进内,你就可以实现10ns / 180 ≈ 55.6ps的边沿调整精度。你想要实现的精细时间偏移,会被转换成需要插入的微步进数量,并写入到高分辨率寄存器(如CMPAHR)的高8位中。硬件会自动将这个数值乘以MEP_ScaleFactor,并转换成实际的延迟时间。
2.2 HRPWM的三种控制模式
HRPWM不仅仅能控制占空比,它的能力覆盖了PWM波形的多个维度。在TMS320F28004x中,主要通过HRCNFG寄存器的CTLMODE和EDGMODE位域来配置:
高分辨率占空比控制(Duty Control):这是最常用的模式。通过
CMPAHR或CMPBHR寄存器来控制PWM上升沿或下降沿的精细位置。EDGMODE配置为01(上升沿)或10(下降沿),CTLMODE配置为0。在此模式下,你写入CMPA:CMPAHR这个32位寄存器的值,其高16位是标准的比较值,低16位中的高8位(即CMPAHR[15:8])则用于微调边沿。硬件会自动完成CMPAHR值与MEP_ScaleFactor的乘法运算。高分辨率周期控制(Period Control):此模式允许你以高分辨率调整PWM的整个周期,即频率。这通过
TBPRDHR寄存器实现。你需要将HRPCTL寄存器的HRPE位使能,并将HRCNFG的EDGMODE配置为11(双边沿控制)。在这种模式下,TBPRD:TBPRDHR这个32位寄存器共同决定了周期值,TBPRDHR提供了周期的高分辨率微调部分。这对于需要频率微调或扩频调制(Spread Spectrum)的应用至关重要。高分辨率相位控制(Phase Control):此模式用于多个ePWM模块之间的精确同步。通过
TBPHSHR寄存器,你可以让一个ePWM模块相对于另一个模块的同步信号,以一个高分辨率的相位差启动。配置CTLMODE为1,EDGMODE为11。这对于多相交错并联的电源拓扑(如多相Buck、逆变器)是必备功能,可以精确控制各相之间的相位差,优化纹波和EMI。
2.3 SFO库:HRPWM稳定运行的“守护者”
MEP_ScaleFactor对温度、电压极其敏感。如果使用一个固定值,在不同工作条件下精度会严重漂移,甚至导致MEP逻辑失效(表现为PWM输出异常)。因此,TI提供了SFO(Scale Factor Optimizer)V8库。它是一个在后台运行的校准函数int SFO()。
这个函数的主要职责是:
- 动态测量:实时测量当前条件下的
MEP_ScaleFactor。 - 自动更新:将测量得到的最新值写入
HRMSTEP寄存器(该寄存器仅存在于EPwm1Regs地址空间,但可供所有ePWM模块的HRPWM逻辑使用)。 - 状态返回:函数返回一个状态值。
1表示校准完成且更新成功;0表示校准未完成,需要继续调用;2表示错误,通常是因为测得的MEP_ScaleFactor超过了最大值255,此时自动转换功能可能异常。
在实际工程中,你需要在主循环或一个定时的中断服务程序中周期性地调用SFO()函数。一个常见的做法是初始化后连续调用直到返回1,之后以较低的频率(如每秒几次)进行维护性校准,以跟踪环境变化。
注意:
HRMSTEP寄存器是只写的,你无法通过读取它来获取当前的MEP_ScaleFactor。SFO()函数内部通过特定的测试逻辑来测量这个值。此外,确保在访问HRPWM相关寄存器(地址0x20至0x2D)前,使用EALLOW指令解除写保护,配置完成后使用EDIS指令恢复保护。
3. 关键寄存器配置详解与实战指南
面对数十个ePWM寄存器,初学者容易感到无从下手。我们将其分为基础时基、比较与动作、高分辨率核心和故障保护四大功能块来梳理。配置ePWM通常遵循一个清晰的流程:先搭建基础时钟和计数框架,再定义比较行为生成PWM波形,接着启用并配置HRPWM提升精度,最后设置故障保护机制。
3.1 时基模块(Time-Base Module)配置
时基模块是PWM的“发动机”,决定了波形的频率和相位。核心寄存器是TBCTL和TBPRD。
TBCTL(时基控制寄存器):
CTRMODE[1:0]:计数模式选择。00为递增模式,产生非对称PWM;10为递增-递减模式,产生对称PWM(中心对齐),这在电机控制和全桥变换器中很常用,因为它能减少谐波。PHSEN:相位使能。置1后,当接收到同步信号(EPWMxSYNCI)时,计数器TBCTR会从TBPHS寄存器加载相位值,实现多个PWM模块的同步启动。PRDLD:周期寄存器装载模式。0为影子模式(Shadow),你在一个周期内写入TBPRD的值,会在下一个周期开始时(TBCTR=0)生效,实现无毛刺的频率切换。1为立即模式,写入立即生效,可能导致当前周期波形畸变。CLKDIV和HSPCLKDIV:时钟预分频。共同决定时基时钟TBCLK = EPWMCLK / (HSPCLKDIV * CLKDIV)。例如,系统时钟EPWMCLK为100MHz,若HSPCLKDIV=2,CLKDIV=2,则TBCLK=25MHz,周期为40ns。
TBPRD(周期寄存器):
- 这个16位寄存器决定了PWM的周期。在递增计数模式下,PWM频率 =
TBCLK / (TBPRD + 1)。在递增-递减模式下,PWM频率 =TBCLK / (2 * TBPRD)。 - HRPWM扩展:当使能高分辨率周期模式时,你需要使用32位的
TBPRD:TBPRDHR联合寄存器。TBPRDHR存放高8位微调值。
- 这个16位寄存器决定了PWM的周期。在递增计数模式下,PWM频率 =
配置示例:生成一个100kHz的中心对齐PWM假设EPWMCLK=100MHz,目标PWM频率为100kHz。
- 选择递增-递减模式:
TBCTL.CTRMODE = 2。 - 计算
TBPRD值:TBPRD = EPWMCLK / (2 * PWM_Freq) = 100e6 / (2 * 100e3) = 500。 - 设置预分频,直接使用系统时钟:
TBCTL.HSPCLKDIV=1,TBCTL.CLDIV=1。 - 配置影子模式,确保平滑:
TBCTL.PRDLD = 0。
// 假设使用ePWM1 EPwm1Regs.TBCTL.bit.CTRMODE = 2; // 递增-递减模式 EPwm1Regs.TBCTL.bit.PRDLD = 0; // 周期寄存器影子模式 EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0; // 分频系数 /1 EPwm1Regs.TBCTL.bit.CLKDIV = 0; // 分频系数 /1 EPwm1Regs.TBPRD = 500; // 设置周期值,对应100kHz3.2 计数比较模块(Counter-Compare Module)与动作限定器(AQ)
这个模块负责在特定的计数点(与CMPA、CMPB等寄存器匹配时)触发动作,从而形成PWM的边沿。影子寄存器机制在这里至关重要。
CMPCTL(比较控制寄存器):
SHDWAMODE/SHDWBMODE:CMPA/CMPB影子模式。通常设为0(影子模式)。这样,你可以在任何时间安全地更新CMPA:CMPAHR或CMPB:CMPBHR,而新值会在LOADAMODE/LOADBMODE指定的时刻(如TBCTR=0)加载到活动寄存器,避免在PWM周期中间产生毛刺。LOADAMODE[1:0]:CMPA影子到活动的装载点。00在TBCTR=0时装载(适用于递增模式或对称PWM的周期开始);01在TBCTR=TBPRD时装载(适用于递减阶段);10在两者任一时刻装载。CMPA/CMPB:比较寄存器。在影子模式下,我们写入的是影子寄存器。CMPA的值决定了占空比。例如,在递增计数、高电平有效模式下,CMPA的值就是输出从低变高的点。
AQCTLA/AQCTLB(动作限定器控制寄存器):
- 这些寄存器定义了当特定事件(如
TBCTR等于CMPA、CMPB、0或TBPRD)发生时,输出引脚EPWMxA/B应该执行什么动作:清零(CLEAR)、置位(SET)或翻转(TOGGLE)。 - 例如,要生成一个简单的PWM,可以配置:当
TBCTR等于CMPA时,将EPWMxA清零(AQCTLA.CAU = 1);当TBCTR等于0时,将EPWMxA置位(AQCTLA.ZRO = 2)。这样,在计数从0增加到CMPA期间输出高电平,从CMPA到TBPRD期间输出低电平。
- 这些寄存器定义了当特定事件(如
配置示例:设置CMPA影子更新及动作
// 配置CMPA为影子模式,并在计数器为零时从影子寄存器加载到活动寄存器 EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0; // CMPA影子模式 EPwm1Regs.CMPCTL.bit.LOADAMODE = 0; // 在TBCTR=0时加载 // 设置占空比为30%。假设TBPRD=500。 EPwm1Regs.CMPA.bit.CMPA = 150; // CMPA = 500 * 0.3 = 150 // 配置动作:TBCTR=0时置位EPWM1A, TBCTR=CMPA时清零EPWM1A EPwm1Regs.AQCTLA.bit.ZRO = 2; // 置位 EPwm1Regs.AQCTLA.bit.CAU = 1; // 清零3.3 高分辨率PWM(HRPWM)专用寄存器配置
这是实现超高精度的核心。配置前务必使用EALLOW指令。
HRCNFG(HRPWM配置寄存器):
EDGMODE[1:0]:选择高分辨率控制的边沿。01控制上升沿(使用CMPAHR),10控制下降沿,11控制双边沿(用于周期或相位控制)。CTLMODE:选择控制寄存器。0为占空比/周期控制(使用CMPAHR或TBPRDHR),1为相位控制(使用TBPHSHR)。HRLOAD[1:0]:高分辨率影子寄存器装载点。与CMPCTL.LOADAMODE类似,定义CMPAHR值何时生效。通常与CMPA的装载点保持一致。AUTOCONV:自动转换使能。这是关键!必须置1,才能让硬件自动将你写入CMPAHR的微调值,乘以HRMSTEP中的MEP_ScaleFactor,转换成实际的延迟。如果置0,则需要软件手动完成这个乘法运算,复杂且易错。
HRMSTEP(MEP步进寄存器):
- 这是一个8位寄存器(位于
EPwm1Regs空间),由SFO()库函数自动更新。你绝不应该手动写入该寄存器。它的值代表了每个粗调步进内可用的微步进数量,是MEP精度的标尺。
- 这是一个8位寄存器(位于
HRPCTL(高分辨率周期控制寄存器):
HRPE:高分辨率周期使能。当需要使用TBPRDHR进行周期微调时,必须将此位置1。TBPHSHRLOADE:高分辨率相位装载使能。当需要多个ePWM模块进行高分辨率相位同步时,将此位与TBCTL.PHSEN一同使能。
配置示例:使能ePWM1A的上升沿高分辨率控制
EALLOW; // 解除写保护 // 配置HRPWM:上升沿高分辨率控制,自动转换,影子装载点与CMPA同步 EPwm1Regs.HRCNFG.bit.EDGMODE = 1; // 上升沿MEP控制 EPwm1Regs.HRCNFG.bit.CTLMODE = 0; // 使用CMPAHR控制占空比 EPwm1Regs.HRCNFG.bit.HRLOAD = 0; // 在TBCTR=0时装载CMPAHR EPwm1Regs.HRCNFG.bit.AUTOCONV = 1; // 使能自动比例因子转换(必须!) // 可选:交换A/B输出,或将B输出反相为A的互补信号 // EPwm1Regs.HRCNFG.bit.SWAPAB = 0; // EPwm1Regs.HRCNFG.bit.SELOUTB = 0; EDIS; // 恢复写保护 // 在主循环初始化中,运行SFO校准直到完成 int sfo_status; do { sfo_status = SFO(); // 调用MEP比例因子优化器 } while (sfo_status == 0); // 返回1表示完成 // 设置高分辨率占空比。假设目标占空比=30.5%,TBPRD=500, MEP_ScaleFactor已由SFO()更新。 // 计算:CMPA = 500 * 0.305 = 152.5。整数部分152写入CMPA,小数部分0.5需要转换。 // 小数部分转换:CMPAHR = (0.5 * MEP_ScaleFactor) << 8 // 假设SFO()测得的HRMSTEP值为180,则 CMPAHR = (0.5 * 180) * 256 = 23040 (0x5A00) // 由于AUTOCONV=1,硬件会自动处理乘法,我们只需写入计算后的CMPAHR值。 // 注意:CMPAHR是16位寄存器,但我们只使用高8位[15:8],低8位忽略。 float duty_frac = 0.305; // 30.5% Uint16 cmp_a_int = (Uint16)((float)EPwm1Regs.TBPRD * duty_frac); float frac_part = (float)EPwm1Regs.TBPRD * duty_frac - cmp_a_int; // 提取小数部分 Uint16 cmp_a_hr = (Uint16)(frac_part * 256.0); // 转换为高8位值 EPwm1Regs.CMPA.bit.CMPA = cmp_a_int; // 写入整数部分 EPwm1Regs.CMPA.bit.CMPAHR = cmp_a_hr; // 写入高分辨率部分(硬件自动缩放)3.4 死区生成模块(Dead-Band Module)与故障保护(Trip Zone)
在高功率应用中,死区和故障保护是安全运行的基石。
DBCTL(死区控制寄存器):
OUT_MODE[1:0]:输出模式。11使能完整的上升沿延迟(RED)和下降沿延迟(FED)。01或10则只使能其中一种延迟。POLSEL[1:0]:极性选择。用于生成互补的PWM对,驱动半桥或全桥的上管和下管。例如,01(ALC模式)将A路输出反相,常用于一对互补信号。IN_MODE[1:0]:输入源选择。通常设为00,使用EPWMxA作为两路延迟的输入源。DBRED和DBFED:死区时间寄存器。值代表延迟的TBCLK周期数。死区时间 = 寄存器值 *TBCLK周期。例如,TBCLK=25MHz (40ns),要设置500ns死区,则寄存器值 = 500ns / 40ns = 12.5,取整为12或13。- 高分辨率死区:
DBREDHR和DBFEDHR寄存器提供了死区时间的高分辨率控制,其配置方式与CMPAHR类似,通过HRCNFG2寄存器使能���
TZSEL(Trip Zone选择寄存器)与TZCTL(Trip Zone控制寄存器):
TZSEL:选择哪些故障信号(如TZ1~TZ6引脚,或数字比较器事件DCAEVT1等)可以触发一次性(OST)或周期循环(CBC)故障。TZCTL:定义当故障发生时,EPWMxA和EPWMxB输出应采取的动作:高阻(HiZ)、强制高(HIGH)、强制低(LOW)或保持不变。在电机驱动中,通常配置为强制低,立即关闭功率管,防止短路。
配置示例:插入死区并配置故障保护
// 配置死区:上升沿和下降沿均延迟10个TBCLK周期(假设TBCLK=40ns,则死区为400ns) EPwm1Regs.DBCTL.bit.OUT_MODE = 0x3; // 使能全死区 EPwm1Regs.DBCTL.bit.POLSEL = 0x2; // AHC模式:EPWMxB反相,常用于互补对 EPwm1Regs.DBCTL.bit.IN_MODE = 0x0; // EPWMxA作为两路延迟的源 EPwm1Regs.DBRED = 10; // 上升沿延迟 EPwm1Regs.DBFED = 10; // 下降沿延迟 // 配置故障保护:使能TZ1引脚作为一次性(OST)和周期循环(CBC)故障源 EALLOW; EPwm1Regs.TZSEL.bit.OSHT1 = 1; // TZ1作为一次性故障源 EPwm1Regs.TZSEL.bit.CBC1 = 1; // TZ1作为周期循环故障源 // 配置故障动作:TZ1事件发生时,强制EPWM1A和EPWM1B输出低电平 EPwm1Regs.TZCTL.bit.TZA = 2; // TZA动作:强制低 EPwm1Regs.TZCTL.bit.TZB = 2; // TZB动作:强制低 EDIS;4. 实战配置流程与代码剖析
理解了单个寄存器后,我们将其串联起来,看一个完整的ePWM模块初始化流程。这里以实现一个带高分辨率占空比控制、死区保护和故障保护的互补PWM输出为例。
4.1 初始化步骤分解
- 时钟与引脚配置:首先确保系统时钟正确,并将对应的GPIO引脚复用为ePWM功能。
- 配置时基模块:设定PWM频率、计数模式、相位和时钟预分频。
- 配置比较模块与动作:设置初始占空比,并定义计数器与比较值匹配时的输出动作。
- 配置死区模块:根据所驱动的功率器件(如MOSFET、IGBT)的开关特性,设置合适的死区时间。
- 配置故障保护:连接硬件故障信号(如过流、过压检测电路的输出)到TZ引脚,并配置紧急关断行为。
- 使能并配置HRPWM: a. 使用
EALLOW解锁。 b. 配置HRCNFG寄存器,选择高分辨率模式、边沿和装载点。 c. 调用SFO()库函数进行初始校准。 d. 使用EDIS重新锁定。 - 运行期高分辨率控制:在中断或主循环中,根据控制算法(如PID输出)计算所需的占空比,分别计算出整数部分写入
CMPA,小数部分转换为高分辨率值写入CMPAHR。
4.2 核心代码实现与注释
以下是一个基于TI C2000平台的典型初始化函数片段:
void InitEPwm1(void) { // 步骤1: 配置GPIO引脚为ePWM功能 (此处依赖于具体型号的GPIO复用寄存器) // 例如:GPIO_setPinConfig(GPIO_0_EPWM1A); GPIO_setPinConfig(GPIO_1_EPWM1B); // 步骤2: 配置时基模块 EPwm1Regs.TBCTL.bit.CTRMODE = 2; // 递增-递减模式,对称PWM EPwm1Regs.TBCTL.bit.PHSEN = 0; // 禁用相位装载(主模块) EPwm1Regs.TBCTL.bit.PRDLD = 0; // 周期寄存器影子模式 EPwm1Regs.TBCTL.bit.SYNCOSEL = 0; // 同步输出选择:使用输入同步信号 EPwm1Regs.TBCTL.bit.HSPCLKDIV = 0; // 高速时钟预分频 /1 EPwm1Regs.TBCTL.bit.CLKDIV = 0; // 时钟预分频 /1 EPwm1Regs.TBPRD = SYSTEM_FREQ / (2 * PWM_FREQ); // 计算周期值 // 步骤3: 配置比较模块与动作限定器 EPwm1Regs.CMPCTL.bit.SHDWAMODE = 0; // CMPA影子模式 EPwm1Regs.CMPCTL.bit.SHDWBMODE = 0; // CMPB影子模式 EPwm1Regs.CMPCTL.bit.LOADAMODE = 0; // CTR=Zero时装载CMPA EPwm1Regs.CMPCTL.bit.LOADBMODE = 0; // CTR=Zero时装载CMPB // 设置初始占空比(例如50%) EPwm1Regs.CMPA.bit.CMPA = EPwm1Regs.TBPRD / 2; EPwm1Regs.CMPB.bit.CMPB = EPwm1Regs.TBPRD / 2; // 互补通道 // 配置动作:产生互补的对称PWM // EPWM1A: 计数器=0时置位,计数器=CMPA时清零 EPwm1Regs.AQCTLA.bit.ZRO = 2; // SET EPwm1Regs.AQCTLA.bit.CAU = 1; // CLEAR // EPWM1B: 计数器=0时清零,计数器=CMPB时置位(与A互补) EPwm1Regs.AQCTLB.bit.ZRO = 1; // CLEAR EPwm1Regs.AQCTLB.bit.CBU = 2; // SET // 步骤4: 配置死区 EPwm1Regs.DBCTL.bit.OUT_MODE = 0x3; // 使能上升沿和下降沿延迟 EPwm1Regs.DBCTL.bit.POLSEL = 0x2; // AHC模式:EPWMxB输出反相 EPwm1Regs.DBCTL.bit.IN_MODE = 0x0; // EPWMxA作为死区输入源 // 计算死区时间对应的计数值 Uint16 db_counts = (Uint16)(DEAD_TIME_NS * SYSTEM_FREQ_MHZ / 1000.0); EPwm1Regs.DBRED = db_counts; EPwm1Regs.DBFED = db_counts; // 步骤5: 配置故障保护 EALLOW; EPwm1Regs.TZSEL.bit.OSHT1 = 1; // 使能TZ1为一次性故障源 EPwm1Regs.TZSEL.bit.CBC1 = 1; // 使能TZ1为周期循环故障源 EPwm1Regs.TZCTL.bit.TZA = 2; // TZ事件触发时,EPWM1A强制低 EPwm1Regs.TZCTL.bit.TZB = 2; // EPWM1B强制低 EPwm1Regs.TZEINT.bit.OST = 1; // 使能一次性故障中断(可选) EDIS; // 步骤6: 使能并配置HRPWM (以ePWM1A上升沿高分辨率为例) EALLOW; // 注意:只有ePWM1具有HRMSTEP寄存器,但所有ePWM模块的HRPWM都引用它 EPwm1Regs.HRCNFG.bit.EDGMODE = 1; // 上升沿高分辨率控制 EPwm1Regs.HRCNFG.bit.CTLMODE = 0; // 使用CMPAHR控制占空比 EPwm1Regs.HRCNFG.bit.HRLOAD = 0; // 装载点与CMPA同步(CTR=Zero) EPwm1Regs.HRCNFG.bit.AUTOCONV = 1; // 必须使能自动转换! EDIS; // 初始化SFO库并校准MEP比例因子 int sfo_status; SFO(); // 首次调用,可能返回0 do { sfo_status = SFO(); } while (sfo_status == 0); // 等待校准完成 if(sfo_status == 2) { // 错误处理:MEP_ScaleFactor超限,HRPWM可能工作不正常 Handle_SFO_Error(); } } // 步骤7: 运行期更新高分辨率占空比函数 void UpdatePwmDutyHighRes(float duty_cycle) // duty_cycle范围: 0.0 ~ 1.0 { Uint16 period = EPwm1Regs.TBPRD; // 1. 计算整数部分比较值 float cmp_f = (float)period * duty_cycle; Uint16 cmp_int = (Uint16)cmp_f; // 2. 计算小数部分,并转换为高分辨率寄存器值 // 公式: CMPAHR = (fraction * 256) // 由于AUTOCONV=1,硬件会自动乘以HRMSTEP,我们只需提供0-255的分数表示 float frac = cmp_f - (float)cmp_int; Uint16 cmp_hr = (Uint16)(frac * 256.0); // 3. 写入寄存器(影子模式,会在下一个CTR=0时生效) EPwm1Regs.CMPA.bit.CMPA = cmp_int; EPwm1Regs.CMPA.bit.CMPAHR = cmp_hr; }5. 调试技巧与常见问题排查
即使配置看起来正确,实际调试中也可能遇到各种问题。以下是一些实战中积累的经验和排查思路。
5.1 常见问题速查表
| 现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| 无PWM输出 | 1. 时钟未使能或分频过大。 2. 动作限定器(AQ)未配置或配置错误。 3. 输出引脚未正确复用为ePWM功能。 4. 时基计数器被冻结( CTRMODE=11)。 | 1. 检查TBCTL.CLKDIV/HSPCLKDIV,确认TBCLK有频率。用示波器测EPWMCLK。2. 检查 AQCTLA/AQCTLB,确认在ZRO、PRD、CAU/CAD等事件上有明确的SET/CLEAR动作。3. 核对芯片数据手册的GPIO复用表,配置正确的 GPxMUX寄存器。4. 确认 TBCTL.CTRMODE不为11(冻结模式)。 |
| PWM频率不对 | 1.TBPRD计算或设置错误。2. 计数模式 CTRMODE理解有误。3. 时钟源 EPWMCLK频率与预期不符。 | 1. 复核TBPRD计算公式:递增模式Fpwm = TBCLK / (TBPRD+1);增减模式Fpwm = TBCLK / (2*TBPRD)。2. 确认 CTRMODE设置与频率计算公式匹配。3. 检查系统时钟配置,确认 EPWMCLK是否正确。 |
| 占空比无法改变或变化不线性 | 1.CMPA/CMPB影子寄存器未正确加载。2. 在错误的时间点(如活动周期中间)写入了比较寄存器(立即模式)。 3. HRPWM的 AUTOCONV未使能,但软件未进行手动缩放。 | 1. 检查CMPCTL.LOADAMODE,确保其与计数模式匹配。例如,增减模式常用LOADAMODE=0(CTR=PRD)。2.强烈建议始终使用影子模式( SHDWAMODE=0),并在安全的时刻(如CTR=0的中断里)更新CMPA。3. 检查 HRCNFG.AUTOCONV位,必须为1。如果为0,需手动计算:CMPAHR = (frac * HRMSTEP) << 8。 |
| HRPWM精度差或输出异常 | 1.SFO()库未调用或调用失败。2. MEP_ScaleFactor超限(SFO返回2)。3. 写入 CMPAHR的值超出了8位范围(>255)。4. 芯片电压或温度剧烈变化,超出SFO校准范围。 | 1. 确保在初始化后至少成功调用一次SFO()(返回1)。可以定期在后台调用。2. SFO返回2是严重错误,检查电源稳定性、时钟。可能需降低 TBCLK频率或检查硬件。3. 确保计算出的 CMPAHR高8位值在0-255之间。公式是(小数部分 * 256),不是* HRMSTEP。4. 确保芯片工作在额定电压和温度范围内。对于极端环境,需增加SFO调用频率。 |
| 死区不生效或不对称 | 1.DBCTL.OUT_MODE未正确使能。2. DBCTL.IN_MODE配置错误,导致延迟源不对。3. DBRED和DBFED值设置过小(小于功率管开关延迟)。 | 1. 确认DBCTL.OUT_MODE设置为01,10或11以启用延迟。2. 典型配置是 IN_MODE=00,使用同一路信号作为两路延迟的源。3. 死区时间必须大于功率器件的开通/关断延迟时间。用示波器双通道测量上下管栅极信号,确认无重叠。 |
| 故障保护不动作 | 1. TZ引脚未正确配置或硬件连接问题。 2. TZSEL寄存器未使能对应的故障源。3. TZCTL配置的动作是HiZ,但外部有上拉/下拉。 | 1. 检查TZ引脚的GPIO复用和输入方向配置。用信号发生器模拟故障信号测试。 2. 仔细核对 TZSEL中对应位(如OSHT1,CBC1)是否已置1。3. 在紧急关断场景,通常配置为强制低( TZA/TZB = 2)最安全。检查板级电路,确保HiZ状态不会导致误开通。 |
| 多个ePWM模块无法同步 | 1. 同步链未正确连接。 2. 从模块的 TBCTL.PHSEN未使能。3. 主模块的 TBCTL.SYNCOSEL未配置为输出同步脉冲。 | 1. 软件同步:将主模块的TBCTL.SWFSYNC置1,并确保从模块的TBCTL.SYNCOSEL选择EPWMxSYNCI。2. 在从模块中,设置 TBCTL.PHSEN=1,并设置TBPHS寄存器为期望的相位偏移值。3. 对于HRPWM同步,还需设置 HRPCTL.TBPHSHRLOADE=1。 |
5.2 高级调试技巧
- 利用影子寄存器状态位:在频繁更新PWM参数的应用中(如数字电源的电压环),
CMPCTL寄存器中的SHDWAFULL和SHDWBFULL位非常有用。在写入CMPA/CMPAHR之前,可以检查SHDWAFULL是否为0(表示影子寄存器空),避免覆盖尚未加载的值。这是一种简单的软件流控机制。 - 事件触发(ET)模块的妙用:
ETSEL和ETPS寄存器可以配置ePWM在特定事件(如CTR=PRD、CTR=CMPA)时触发ADC转换。这在数字电源的峰值电流模式控制或电机驱动的相电流采样中至关重要,可以实现与PWM波形严格同步的采样,消除采样延迟带来的误差。 - 数字比较(DC)与故障滤波:
DCTRIPSEL、DCACTL、DCFCTL等寄存器允许你将模拟比较器(CMPSS模块)的输出直接作为ePWM的故障源或事件源,并可以配置数字滤波(消抖)和空白窗口(避开开关噪声)。这对于实现基于硬件的、响应速度极快的逐周期限流保护至关重要。 - 全局加载(Global Load)功能:
GLDCTL和GLDCFG寄存器允许你将多个影子寄存器(如CMPA、CMPB、TBPRD等)的更新同步到同一个事件(如CTR=0)。这在需要同时更新多个参数以保持相位一致性的多相交错系统中非常有用,可以避免因参数更新时刻不同步导致的电流不平衡。
配置TMS320F28004x的ePWM,尤其是其HRPWM功能,是一个从全局框架到精细调优的过程。始终遵循“先基础,后高级;先功能,后优化”的原则。先从标准的PWM输出调通,再加入死区,然后使能故障保护,最后才切入HRPWM的配置和SFO校准。调试时,善用示波器观察每个阶段的波形变化,并结合CCS的寄存器实时查看功能,能让你快速定位问题所在。记住,寄存器配置是手段,理解其背后的硬件行为逻辑,才是驾驭这颗强大控制芯片的关键。