TMS320F28004x ePWM模块深度解析:峰值电流控制与HRPWM高精度PWM实现
2026/7/21 1:20:28 网站建设 项目流程

1. 项目概述:为什么我们需要高精度PWM?

在数字电源和电机驱动的世界里,PWM(脉宽调制)信号就是控制功率开关的“指挥官”。它的精度直接决定了电源转换的效率、输出电压的纹波、电机的运行平稳度,甚至是整个系统的可靠性。传统的PWM生成方式,其时间分辨率被系统时钟周期所“卡死”。举个例子,如果你的系统时钟是100MHz(周期10ns),那么你所能控制的最精细的PWM边沿移动步长就是10ns。在开关频率为100kHz时,这或许还能接受,但当频率上升到1MHz甚至更高时,10ns的步长就显得过于粗糙,可能导致输出电压调节精度不足、环路响应迟缓,甚至引发次谐波振荡。

这就是TMS320F28004x的增强型PWM(ePWM)模块,尤其是其高分辨率PWM(HRPWM)特性大显身手的地方。它不仅仅是一个简单的PWM发生器,而是一个集成了时间基准、动作限定、死区生成、故障保护以及数字比较等功能的复杂子系统。其核心价值在于,通过微边沿定位器(MEP)技术,将PWM边沿的控制精度从系统时钟周期(例如10ns)提升到了皮秒(ps)量级,实现了“超细粒度”的时序控制。同时,ePWM模块与片上模拟比较器、ADC的紧密耦合,为实现峰值电流模式控制这类高性能、高可靠性的拓扑提供了硬件基础。今天,我就结合自己调试数字电源和电机驱动的经验,深入拆解ePWM模块的这两大核心功能:峰值电流控制与HRPWM技术,分享从寄存器配置到实际波形调试的全过程细节与避坑指南。

2. ePWM模块架构与核心子模块解析

在深入具体应用之前,我们必须先理解ePWM模块的“五脏六腑”。它不是一个黑盒,而是一个由多个协同工作的子模块构成的精密系统。理解这个架构,是进行任何高级配置的前提。

2.1 核心子模块分工与协作

ePWM模块可以看作一个流水线,信号从时间基准开始,经过一系列处理,最终形成驱动功率器件的两路互补信号(EPWMxA和EPWMxB)。其主要子模块包括:

  1. 时间基准(TB)子模块:这是整个ePWM的“心脏”。它包含一个计数器(TBCTR)、一个周期寄存器(TBPRD)和一个相位寄存器(TBPHS)。计数器可以工作在递增、递减或递增-递减模式,决定了PWM的计数模式。相位寄存器则用于实现多个ePWM通道之间的同步,在多相交错并联的电源或电机相移控制中至关重要。
  2. 计数比较(CC)子模块:这是决定PWM占空比的“大脑”。它包含多个比较寄存器(如CMPA, CMPB, CMPC, CMPD)。当时间基准计数器的值(TBCTR)与这些比较寄存器的值匹配时,会产生特定的事件(CTR=CMPx),这些事件将被送到动作限定器。
  3. 动作限定(AQ)子模块:这是将事件转化为具体动作的“执行官”。它接收来自TB(CTR=PRD, CTR=ZERO)和CC(CTR=CMPx)的事件,并根据预先配置的规则,控制EPWMxA和EPWMxB输出信号的置高(Set)、清零(Clear)或翻转(Toggle)。例如,最常见的配置是:在CTR=0时置高EPWMxA,在CTR=CMPA时清零EPWMxA,从而生成一个占空比为CMPA/TBPRD的PWM波。
  4. 死区生成(DB)子模块:在驱动半桥或全桥拓扑时,上下管的驱动信号必须留有死区时间,防止直通短路。DB模块接收来自AQ的原始信号,可以独立地为上升沿和下降沿插入可编程的延迟,生成带死区的互补输出对。
  5. 故障捕获(TZ)子模块:这是系统的“紧急制动”装置。当外部故障信号(如过流、过压、过热)触发时,TZ模块可以立即强制ePWM输出进入预先定义的安全状态(高阻、拉高或拉低),实现硬件级别的快速保护,响应速度远快于软件中断。
  6. 数字比较(DC)子模块:这是实现峰值电流模式等高级控制的关键。它可以将外部数字信号(如比较器输出)或内部事件,映射为ePWM的触发源,用于实现逐周期限流、逐脉冲关断等功能。
  7. 事件触发(ET)子模块:负责管理ePWM模块产生的中断和ADC启动转换(SOC)信号。你可以配置在特定事件(如CTR=PRD, CTR=CMPB)发生时触发中断或启动ADC采样,这对于实现精准的采样时刻(例如在PWM周期中点采样电流)至关重要。

实操心得:理解“影子寄存器”ePWM的许多关键寄存器(如TBPRD, CMPA, CMPB)都配有影子寄存器。这意味着你可以随时向影子寄存器写入新值,而不会立即影响当前正在运行的PWM波形。新值会在下一个指定的加载事件(如CTR=0或CTR=PRD)时,从影子寄存器同步到活动寄存器。这是实现PWM参数无毛刺、平滑更新的基础。在编写控制环路代码时,务必注意更新的是影子寄存器,并且确保更新时机与加载事件同步,避免出现半个周期新值、半个周期旧值的混乱波形。

2.2 寄存器锁保护机制:防止代码跑飞的最后防线

在复杂的实时控制系统中,软件跑飞、指针错误等问题可能导致对关键寄存器的意外写操作,从而引发灾难性后果(如PWM输出全高导致炸机)。TMS320F28004x的ePWM模块引入了寄存器锁保护(Register Lock Protection)机制。

关键寄存器组(如HRPWM配置寄存器、数字比较寄存器、故障保护寄存器)被“锁”了起来。通过对EPWMLOCK寄存器的KEY字段写入特定值0xA5A5,才能解锁并进行修改。解锁后,寄存器会保持可写状态,直到下次系统复位。你也可以在修改后立即重新上锁。

配置示例与注意事项:

// 假设要修改高分辨率PWM配置寄存器HRCNFG // 1. 解锁EPWM寄存器 EPwm1Regs. EPWMLOCK.bit.KEY = 0xA5A5; // 2. 进行配置(例如,使能CMPAHR控制,边沿模式为上升沿) EPwm1Regs.HRCNFG.bit.EDGMODE = 1; // 上升沿高分辨率控制 EPwm1Regs.HRCNFG.bit.CTLMODE = 0; // CMPAHR控制 // ... 其他HRCNFG配置 // 3. (可选)重新上锁。如果后续不再修改,可以上锁以提高安全性。 // EPwm1Regs.EPWMLOCK.bit.KEY = 0x0000; // 写入任何非0xA5A5的值即可上锁

避坑指南:32位写入手册中特别强调,对EPWMLOCK寄存器的写操作,必须使用32位写。16位的写操作(只写高16位或低16位)会被硬件忽略。在C语言中,通常对寄存器的访问就是32位的,但如果你在使用汇编或进行特殊的内存操作时,需要特别注意这一点。

3. 峰值电流模式控制:原理、配置与实战

峰值电流模式控制是开关电源中一种广泛应用的高级控制技术。它通过直接控制每个开关周期的峰值电感电流,带来了诸多好处:内在的逐周期过流保护、对输入电压变化的快速前馈补偿、以及避免电感磁饱和。

3.1 工作原理与硬件连接

其核心思想是:用一个参考信号(代表期望的峰值电流)与实时采样的开关电流进行比较。当采样电流达到参考值时,立即关闭当前周期的PWM开关管。

在TMS320F28004x上,这得益于其片上模拟比较器(COMP)和ePWM的数字比较(DC)子模块的紧密集成。典型的Buck变换器应用连接如下图所示(概念图):

  1. 电流采样:通过一个串联在电感或下管的采样电阻,将开关电流转换为电压信号Isense
  2. 参考生成:芯片内部的12位可编程DAC(或外部参考电压)生成一个代表峰值电流限值的电压Vref
  3. 比较触发Isense接入比较器正端,Vref接入负端。当Isense > Vref时,比较器输出翻高。
  4. 数字联动:比较器的输出被连接到ePWM模块的某个数字比较输入(例如DCAHDCAL)。
  5. 逐周期关断:在DC子模块中,配置该输入信号触发DCAEVT2(或类似事件),并将其动作设置为“强制EPWMxA输出低”。这样,一旦电流超限,PWM会在纳秒级时间内被拉低,实现硬件保护的快速性。

3.2 ePWM配置步骤详解

下面以控制一个Buck变换器为例,详细说明配置流程。假设使用ePWM1A作为主开关信号,COMP1输出连接到DCAEVT1。

步骤1:配置模拟比较器和内部DAC

// 配置内部DAC,设置峰值电流参考电压 (例如,对应2A峰值电流,采样电阻0.1欧姆,则Vref=0.2V) // 假设DAC满量程为3.3V,12位分辨率 uint16_t dac_value = (uint16_t)((0.2 / 3.3) * 4095); DacaRegs.DACVALS.all = dac_value; // 写入DAC值 DacaRegs.DACCTL.bit.DACREFSEL = 1; // 选择VDDA为参考 DacaRegs.DACCTL.bit.MODE = 1; // 使能DAC输出 // 配置比较器COMP1 Comp1Regs.COMPCTL.bit.INN_SEL = 1; // 负端选择内部DAC Comp1Regs.COMPCTL.bit.INP_SEL = 0; // 正端选择外部引脚(连接Isense) Comp1Regs.COMPCTL.bit.CMPINV = 0; // 不反相输出,Isense > Vref时输出高 Comp1Regs.COMPCTL.bit.QUALSEL = 6; // 设置滤波采样周期,根据噪声情况调整 Comp1Regs.COMPCTL.bit.SYNCSEL = 1; // 输出与系统时钟同步

步骤2:配置ePWM时间基准和计数比较

// 初始化ePWM1时间基准 EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 设置为增减计数模式,适用于对称PWM,谐波特性更好 EPwm1Regs.TBPRD = SYSTEM_FREQ / (2 * SWITCHING_FREQ); // 计算周期值,例如100MHz系统时钟,500kHz开关频率,TBPRD=100 EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 本例为主机,不需要相位同步 EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW; // 周期寄存器使用影子寄存器 EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_SYNC_DISABLE; // 禁止同步输出 // 配置计数比较和动作限定,生成初始PWM(占空比由CMPA控制) EPwm1Regs.CMPA.bit.CMPA = EPwm1Regs.TBPRD * 0.3; // 初始占空比30%,写入影子寄存器 EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // 在CTR=0时,将CMPA影子寄存器的值加载到活动寄存器 EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // CTR=0时,设置EPWM1A为高 EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // 在增减计数模式的“增计数”期间,当CTR=CMPA时,清除EPWM1A为低 // 注意:在增减模式下,通常用CAU(增计数比较)和CAD(减计数比较)来共同控制占空比,以实现中心对称PWM。这里为简化,仅用CAU。

步骤3:配置数字比较(DC)子模块实现峰值限流这是最关键的一步,将比较器的输出与PWM强制动作关联起来。

// 1. 选择数字比较的输入源 EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL = DC_COMP1OUT; // 将DCAH事件源选择为COMP1的输出 // 2. 配置数字比较事件的动作 EPwm1Regs.DCACTL.bit.EVT1SRCSEL = DC_EVT1; // 事件1的信号源选择 EPwm1Regs.DCACTL.bit.EVT1FRCSYNCSEL = DC_EVT_ASYNC; // 选择异步路径,响应最快(无需同步时钟) // 配置当DCAH为高时(即电流超限),触发DCAEVT1事件 EPwm1Regs.DCACTL.bit.EVT1SRCSEL = DC_EVT_DCAH_HIGH; // 3. 配置动作限定器响应DCAEVT1事件 EPwm1Regs.AQCTLA.bit.DCAEVT1 = AQ_FORCE_LOW; // 当DCAEVT1发生时,强制EPWM1A输出为低 // 同时,配置清除机制。我们希望这个强制低电平只持续当前周期。 EPwm1Regs.DCACTL.bit.EVT1FRCSYNCSEL = DC_EVT_SYNC; // 对于清除事件,可以使用同步路径 EPwm1Regs.DCACTL.bit.EVT1SRCSEL = DC_EVT_DCAH_LOW; // 当DCAH变低时(下个周期开始前),清除强制事件 // 更常见的做法是使用“一次性”强制,并在下一个周期开始时由时间基准事件(如CTR=0)自动清除。 // 这里采用TZ子模块的周期清除功能来模拟,配置更简洁: EPwm1Regs.TZSEL.bit.DCAEVT1 = 1; // 使能DCAEVT1作为故障触发源 EPwm1Regs.TZCTL.bit.DCAEVT1 = TZ_FORCE_LOW; // DCAEVT1触发时,强制输出低 EPwm1Regs.TZCTL.bit.DCAEVT1 = TZ_DISABLE; // 通常TZ是锁存的,这里我们想用逐周期,所以不锁存?不对,需要配置清除方式。 // 实际上,对于逐周期限流,更标准的做法是使用DC子模块的“循环跳闸”模式,并配置TZCTL[TZB]和TZCTL[TZA]为适当值。 // 一个更清晰的配置示例如下(使用Trip-Zone): EPwm1Regs.TZSEL.bit.DCAEVT1 = 1; // 选择DCAEVT1作为TZ1的输入源 EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LOW; // TZ事件发生时,强制EPWM1A低 EPwm1Regs.TZCTL.bit.TZB = TZ_NO_CHANGE; // EPWM1B不变(如果使用) EPwm1Regs.TZCTL2.bit.TZB_D = TZ_DISABLE; // 禁用TZ事件锁存,实现逐周期 EPwm1Regs.TZCTL2.bit.TZA_D = TZ_DISABLE; // 禁用TZ事件锁存 // 同时,需要配置数字比较事件到TZ的映射 EPwm1Regs.DCACTL.bit.EVT1SRCSEL = DC_EVT_DCAH_HIGH; EPwm1Regs.DCACTL.bit.EVT1FRCSYNCSEL = DC_EVT_ASYNC; // 异步强制,响应快 // 确保TZ模块的清除条件为“循环跳闸清除”,即每个PWM周期开始自动清除故障状态。 EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LOW; EPwm1Regs.TZCTL2.bit.TZA_D = TZ_DISABLE; // 这个配置表示是逐周期(Cycle-By-Cycle)跳闸,而非锁存。

步骤4:使能ePWM时钟并启动

SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; // 先停止所有ePWM时钟同步 // ... 完成所有ePWM模块的配置 ... SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; // 使能时钟同步,所有ePWM同时开始运行

调试经验:波形观察与故障排查

  • 示波器抓取:务必同时观察EPWM1A输出波形、Isense信号(采样电阻电压)和DACOUT/COMP1-(参考电压)波形。你应该能看到,当Isense的峰值触及参考电压时,PWM脉冲被立即终止,形成“斩波”波形。
  • 没有动作?检查路径:COMP输出是否使能?DCTRIPSEL配置是否正确?数字比较事件是否映射到了正确的强制动作(AQCTLA或TZCTL)?TZ模块是否配置为逐周期清除?
  • 误动作(噪声触发):比较器输入端可能存在开关噪声。可以采取以下措施:1) 在采样电阻两端并联一个小电容(如100pF)进行滤波;2) 调整比较器的滤波参数(COMPCTL.bit.QUALSEL),增加几个时钟周期的去抖时间;3) 优化PCB布局,减少采样回路面积。
  • 响应延迟:确保DCACTL.bit.EVT1FRCSYNCSEL配置为DC_EVT_ASYNC(异步强制)。同步强制路径会引入至少一个时钟周期的延迟,在高速开关下可能无法及时关断。

4. 高分辨率PWM(HRPWM)技术深度剖析

当开关频率提升到数百kHz甚至MHz级别时,传统PWM的量化误差会变得不可忽视。HRPWM通过微边沿定位器(MEP)技术,将边沿控制精度提升了一个数量级。

4.1 MEP原理与传统PWM分辨率瓶颈

传统PWM的分辨率由系统时钟频率Fsys和PWM频率Fpwm决定:

  • 百分比分辨率=(Fpwm / Fsys) * 100%
  • 比特数分辨率=log2(Tpwm / Tsys)=log2(Fsys / Fpwm)

例如,Fsys=100MHz,Fpwm=1MHz,则理论分辨率仅为1/100 = 1%或约6.6 bits。这意味着你无法精确输出一个比如50.5%的占空比,只能选择50%或51%。

MEP技术的核心思想是:在一个系统时钟周期(粗调步长)内,再进行多达255级的细分(微调)。这个细分不是通过更高频率的时钟实现的,而是通过内部模拟延迟链等电路,实现对边沿位���的“微移动”。MEP的步长可以达到150ps左右。这样,等效的时间分辨率就变成了Tsys / 255,对于100MHz系统时钟,等效分辨率高达约10ns / 255 ≈ 39ps

4.2 HRPWM的配置模式与寄存器详解

HRPWM的功能通过一组扩展寄存器(CMPAHR,CMPBHR,TBPRDHR,TBPHSHR,DBREDHR,DBFEDHR)来实现,它们与原有的16位寄存器(CMPA,CMPB等)拼接成24位寄存器进行控制。

核心配置寄存器HRCNFG

  • EDGMODE(边沿模式):决定MEP控制哪个边沿。
    • 00:禁用HRPWM。
    • 01:MEP控制上升沿(用于占空比控制)。
    • 10:MEP控制下降沿(用于占空比控制)。
    • 11:MEP控制双边沿(用于相位或周期控制)。
  • CTLMODE(控制模式):选择由哪个高分辨率寄存器控制MEP。
    • 0:由CMPAHR(或CMPBHR)控制(占空比模式)。
    • 1:由TBPHSHR控制(相位控制模式)。
    • 注意:TBPRDHR的控制由另一个寄存器HRPCTL单独使能。
  • HRLOAD(装载模式):选择高分辨率影子寄存器的装载时机,必须与对应的主寄存器(如CMPCTL[LOADAMODE])设置匹配。
  • AUTOCONV(自动转换模式):这是强烈推荐启用的模式。当AUTOCONV=1时,你只需要向CMPAHR写入代表分数部分的Q8格式数值(例如,0.4表示为0.4 * 256 = 102.4 ≈ 0x66),硬件会自动结合HRMSTEP寄存器中的MEP比例因子,计算出实际的MEP步数。这极大简化了软件计算。

MEP比例因子与SFO函数:MEP的步数(MEP_ScaleFactor)并非固定值,它会随芯片工艺、电压、温度(PVT)漂移。TI提供了一个名为SFO(Scale Factor Optimizer)的库函数。这个函数会在后台运行,通过HRPWM模块内置的诊断功能,实时测量并更新HRMSTEP寄存器中的比例因子值,确保MEP精度。在你的软件中,需要以较低优先级周期性地调用SFO()函数。

4.3 HRPWM占空比控制:从理论到代码

假设我们需要在1.25MHz的PWM频率下,输出40.5%的占空比。系统时钟100MHz,MEP步长约180ps(比例因子MEP_SF ≈ 55.56)。

传统PWM(无HRPWM):

  • 周期Tpwm = 1/1.25MHz = 800ns
  • 系统时钟周期Tsys = 10ns
  • 周期计数值TBPRD = Tpwm / Tsys - 1 = 79(递增计数模式)。
  • 目标高电平时间Thigh = 800ns * 40.5% = 324ns
  • 目标CMPA值= Thigh / Tsys = 32.4
  • 结果:只能取整为32或33,对应占空比40%或41.3%,存在显著误差。

启用HRPWM(自动转换模式):

  1. 计算整数部分(CMPA)CMPA = floor(32.4) = 32
  2. 计算分数部分(CMPAHR)Fraction = 32.4 - 32 = 0.4
  3. 写入寄存器(启用AUTOCONV):我们只需将分数部分转换为Q8格式(左移8位)并写入CMPAHR
    • CMPAHR_Q8 = (uint16_t)(Fraction * 256) = (uint16_t)(0.4 * 256) = 102,即0x66
    • 由于是8位字段,实际写入的是CMPAHR寄存器的高8位,低8位保留。通常我们进行32位写操作,将CMPACMPAHR组合。
  4. 硬件自动完成:硬件读取HRMSTEP(假设SFO函数已将其更新为55),并自动计算:MEP_Steps = Fraction * MEP_SF = 0.4 * 55 = 22。然后控制MEP逻辑将边沿精确移动22个步长(约22 * 180ps = 3.96ns)。
  5. 最终效果:实际高电平时间= 32 * 10ns + 22 * 0.18ns ≈ 320ns + 3.96ns = 323.96ns,占空比≈ 323.96ns / 800ns = 40.495%,与目标的40.5%误差极小。

C语言配置示例:

#include "sfofunction.h" // 包含SFO库函数声明 void ConfigureHRPWM_for_DutyControl(EPWM_Handle epwm1, float duty_cycle) { // 0. 确保已调用SFO初始化并定期在后台运行更新HRMSTEP // SFO(); // 通常在低优先级后台任务中调用 // 1. 配置常规ePWM参数 EPWM_setClockPrescaler(epwm1, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1); EPWM_setTimeBasePeriod(epwm1, 79); // 1.25MHz PWM,递增计数模式 EPWM_setTimeBaseCounterMode(epwm1, EPWM_COUNTER_MODE_UP); EPWM_setCounterCompareValue(epwm1, EPWM_COUNTER_COMPARE_A, 0); // 先写0,后续更新 EPWM_setActionQualifierAction(epwm1, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); EPWM_setActionQualifierAction(epwm1, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_COUNTER_COMPARE_A); // 2. 配置HRPWM // 启用ePWM和HRPWM时钟 SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; // 暂停同步以安全配置 // ... (其他模块配置) // 配置HRCNFG寄存器 EPwm1Regs.HRCNFG.bit.EDGMODE = HR_EPWM_EDGMODE_RISING; // 上升沿高分辨率控制 EPwm1Regs.HRCNFG.bit.CTLMODE = HR_EPWM_CTLMODE_CMPA; // 由CMPAHR控制 EPwm1Regs.HRCNFG.bit.HRLOAD = HR_EPWM_LOAD_ON_CNT_ZERO; // 在CTR=0时装载影子寄存器 EPwm1Regs.HRCNFG.bit.AUTOCONV = 1; // 启用自动转换模式!关键! // 3. 计算并写入高分辨率占空比 uint32_t cmpA_value; uint16_t cmpA_int; uint16_t cmpAhr_frac; float period_counts = 80.0; // TBPRD+1 float desired_counts = duty_cycle * period_counts; // 例如 0.405 * 80 = 32.4 cmpA_int = (uint16_t)desired_counts; // 整数部分 = 32 float fraction = desired_counts - cmpA_int; // 小数部分 = 0.4 // 在自动转换模式下,CMPAHR直接写入Q8格式的小数部分 cmpAhr_frac = (uint16_t)(fraction * 256.0); // 0.4 * 256 = 102.4 -> 102 (0x66) // 组合成32位值进行写入:[CMPA:CMPAHR] cmpA_value = ((uint32_t)cmpA_int << 16) | ((uint32_t)cmpAhr_frac << 8); EPwm1Regs.CMPA.all = cmpA_value; // 单次32位写入,同时更新CMPA和CMPAHR // 4. 重新使能时钟同步,启动PWM SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; }

4.4 高分辨率周期/相位控制

除了占空比,HRPWM还可以控制周期(TBPRDHR)和相位(TBPHSHR),这对于需要精确频率控制或相移的应用(如相移全桥LLC谐振变换器)至关重要。

高分辨率周期控制配置要点:

  1. 使能:通过设置HRPCTL寄存器的HRPE位来使能高分辨率周期模式。
  2. 配置顺序:必须严格按照手册18.15.1.5.4.1节的步骤进行初始化,特别是要在配置完所有常规ePWM参数并设置好HRCNFG后,最后一步才使能HRPETBCLKSYNC
  3. 抖动问题:启用高分辨率周期模式后,高分辨率输出的那个通道(例如,只在ePWMxA上使能HRPWM)会产生±1(递增计数)或±2(增减计数)个TBCLK周期的抖动。因此,在需要同步多个通道时,要谨慎选择同步源(SYNCOSEL),避免每个周期都引入抖动。
  4. 计算:计算TBPRDHR的方法与CMPAHR类似,但目标值是周期的小数部分。同样,在自动转换模式下,只需写入frac(PWM_Period_In_Counts) << 8

LLC谐振变换器中的应用: 在H桥LLC拓扑中,通常需要两路互补的50%占空比信号,并通过调节开关频率来控制增益。使用HRPWM的高分辨率周期控制,可以实现极其精细的频率调节步进,从而对谐振腔的增益进行平滑、精确的控制,有助于优化轻载效率和提高输出电压精度。配置时,将ePWM设置为增减计数模式以生成对称PWM,固定CMPA=CMPB=TBPRD/2以获得50%占空比,然后通过实时更新TBPRDTBPRDHR来微调频率。

4.5 HRPWM使用中的限制与避坑指南

  1. 占空比范围限制:MEP逻辑并非在整个PWM周期内都有效。在周期开始和结束的约3个TBCLK周期内,高分辨率控制是无效的。这意味着占空比不能太接近0%或100%。具体限制取决于PWM频率。例如,在1MHz(TBCLK=100MHz)下,3个时钟周期占整个周期的3%���因此可用占空比范围约为3%到97%。在配置控制算法时,必须对占空比指令进行限幅。
  2. SFO函数的调用MEP_ScaleFactor会随环境变化。必须确保SFO()函数在后台以较低频率(如1-10kHz)持续运行,以更新HRMSTEP寄存器。SFO()函数执行需要一定时间(几十个微秒),不要在高速中断中调用它。
  3. 影子寄存器装载时机:在增减计数模式下,HRCNFG.HRLOAD必须设置为在CTR=0CTR=PRD时都装载(HR_EPWM_LOAD_ON_CNT_ZERO_OR_PERIOD),即使你的用户代码只在一个点(如CTR=0)更新影子寄存器。这是HRPWM内部逻辑的要求。
  4. 代码移植性:不同系列的C2000芯片(如F28004x, F2837x)其HRPWM模块类型(Type 0, 1, 2, 4)可能不同,支持的功能(如高分辨率周期、死区)也有差异。在移植代码时,务必查阅具体芯片的数据手册和技术参考手册。

5. 常见问题排查与实战技巧

在实际项目中调试ePWM和HRPWM时,会遇到各种问题。下面是一些常见问题的排查思路和从实践中总结的技巧。

5.1 问题排查速查表

现象可能原因排查步骤与解决方法
PWM无输出1. 时钟未使能。
2. 输出引脚未配置为ePWM功能。
3. 动作限定器(AQ)配置错误。
4. 输出被强制(TZ或DC事件)。
1. 检查PCLKCR0寄存器中对应ePWM模块的时钟使能位。
2. 检查GPIO多路复用器配置,确保引脚功能选择正确。
3. 使用CCS的寄存器视图或调试器,单步检查AQCTLA/AQCTLB寄存器配置,确认在CTR=0CTR=CMPA等事件上有正确的SET/CLEAR动作。
4. 检查TZCTLDCACTL/DCBCTL寄存器,确认没有配置强制输出高/低。
占空比不受控或不变1. CMPA/CMPB影子寄存器未正确加载。
2. 比较值大于周期值。
3. HRPWM配置冲突。
1. 检查CMPCTL.LOADAMODE/LOADBMODE是否与计数器模式匹配(如增减模式常用LOAD_ON_CNT_ZERO)。
2. 确保写入CMPA的值小于等于TBPRD
3. 如果使能了HRPWM,检查CMPAHR是否被意外写入,或HRCNFG.CTLMODE配置是否正确。
HRPWM精度不达标或波形异常1.HRMSTEP值不准确或未初始化。
2. 占空比进入限制区(接近0%或100%)。
3. 自动转换模式未启用,但软件计算错误。
4. SFO函数未运行或运行异常。
1. 确保在初始化HRPWM后,SFO()函数已被成功调用至少一次,并检查HRMSTEP寄存器是否为非零合理值(通常几十到一百多)。
2. 在软件中对目标占空比进行限幅,避开限制区(如限制在5%~95%)。
3. 确认HRCNFG.AUTOCONV=1。如果禁用,必须手动完成Fraction * MEP_SF + 0.5的计算。
4. 检查SFO()函数的返回值,确保其为SFO_INCOMPLETE_ERRORSFO_COMPLETE。将其放在一个低优先级定时器中断或后台循环中。
峰值电流控制不动作1. 模拟比较器未使能或配置错误。
2. 数字比较输入源选择错误。
3. 故障动作未映射到PWM输出。
4. 故障清除模式配置为锁存而非逐周期。
1. 用示波器测量比较器正负输入端和输出端电压,确认比较器逻辑正确。
2. 核对DCTRIPSEL寄存器,确保将正确的比较器输出映射到了DCAH/DCAL等事件。
3. 检查AQCTLATZCTL寄存器,确认DCAEVTxTZ事件配置了FORCE_LOW等动作。
4. 对于逐周期限流,确保TZCTL2中对应的TZx_D位被禁用(=0),或使用DC子模块的异步强制功能。
系统运行一段时间后HRPWM失控1.HRMSTEP值因温度/电压漂移而未更新。
2. 软件意外修改了HRPWM相关寄存器。
3. 代码跑飞,触发了寄存器写保护。
1. 增加SFO()函数的调用频率,或确保其在温度变化大的应用中持续运行。
2. 在调试阶段,可以在关键HRPWM配置后将其寄存器锁住(EPWMLOCK)。
3. 检查是否有数组越界、栈溢出等问题。使用看门狗。

5.2 高级调试技巧

  • 利用CCS的寄存器实时视图和图形化工具:Code Composer Studio的调试界面可以实时刷新显示所有ePWM寄存器的值。结合图形化工具观察TBCTR计数器和EPWMxA/B输出信号,可以直观理解计数器模式、比较匹配和动作触发的关系。
  • “数字电源”软件库:TI为其C2000系列提供了名为“Digital Power SDK”的软件库。其中包含了针对常见拓扑(如Buck、Boost、PFC、LLC)的完整驱动程序示例,其中ePWM和HRPWM的配置都是优化过的。在开始自己的项目前,强烈建议先研究、移植并理解这些官方例程,可以避免很多底层配置的坑。
  • 示波器的高级触发:在调试峰值电流控制时,使用示波器的“脉宽触发”功能。可以设置为触发“小于某个脉宽”的PWM脉冲,这样可以轻松捕获到因电流限流而被提前关断的异常短脉冲,从而分析限流点是否准确。
  • HRPWM精度验证:要定量验证HRPWM的精度,可以编写一个简单的斜坡测试程序。让目标占空比从0%到100%缓慢线性变化(使用高分辨率控制),同时用高精度示波器或逻辑分析仪测量实际输出的高电平时间。将测量值与理论值对比,可以绘制出线性度和误差曲线。注意避开占空比限制区。

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

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

立即咨询