1. 项目概述与核心价值
在数字电源和电机驱动的世界里,PWM(脉宽调制)信号就像是控制功率开关的“指挥棒”,它的精度和灵活性直接决定了整个系统的效率和稳定性。对于很多从模拟控制转向数字控制的工程师来说,如何用好微控制器里那个功能强大但寄存器繁多的ePWM模块,常常是第一个需要啃下的硬骨头。特别是当你需要实现像峰值电流模式控制(Peak Current Mode Control, PCM)或者驱动复杂的H桥LLC谐振拓扑时,仅仅知道设置占空比是远远不够的,你需要深入理解每个子模块如何协同工作,如何响应实时事件。
我最近在基于TI的TMS320F28069设计一款高密度电源时,就深度折腾了它的ePWM模块。目标很明确:一个通道用于Buck电路的峰值电流模式控制,实现快速动态响应和可靠的过流保护;另一个通道则要产生驱动H桥LLC谐振转换器的互补PWM对,通过调节频率而非占空比来稳压。官方手册虽然详尽,但更像一本字典,缺乏将各个功能点串联成实际解决方案的“场景化”指南。经过几轮调试和示波器验证,我梳理出了一套从寄存器配置到波形调试的完整实践路径。这篇文章,我就把这两个经典案例——峰值电流模式控制的Buck和H桥LLC谐振转换器的ePWM配置——掰开揉碎了讲清楚,重点不是罗列寄存器,而是解释为什么要这么配置,以及实际调试中会遇到哪些“坑”。
2. 峰值电流模式控制:原理与ePWM配置精解
峰值电流模式控制之所以在开关电源中备受青睐,核心在于它引入了电感电流这个内在状态变量进行闭环。相比单纯的电压模式控制,它本质上是一个电流内环加电压外环的双环系统。电流内环带来了几个立竿见影的好处:首先是逐周期限流,一旦电感电流峰值超过设定值,立即关断开关管,保护能力非常直接;其次是对输入电压变化响应极快,因为输入电压的扰动会直接影响电感电流的上升斜率,从而被内环快速抑制;最后,它还能有效防止磁芯饱和,因为峰值电流被直接限制。
2.1 系统架构与信号流分析
要实现数字式的峰值电流模式控制,我们需要几个关键部件协同工作:一个用来生成基础PWM信号的ePWM模块、一个片内模拟比较器(Comparator)、以及一个可编程的参考源(通常是DAC)。其核心思想是:ePWM模块在每个周期开始时,强制开启上管(对于Buck电路);同时,电感电流通过采样电阻被转换为电压信号,送入比较器的正端;比较器的负端连接一个可调的参考电压,这个电压就代表了当前周期允许的峰值电流。当电感电流上升,使得比较器正端电压超过负端参考电压时,比较器输出翻转。这个翻转信号被ePWM模块的“数字比较”(Digital Compare, DC)子模块捕获,并立即触发一个“Trip”事件,强制关断ePWM的输出。这就实现了一个基于电流峰值的、逐周期的关断机制。
这里的关键在于ePWM模块的“Trip Zone”功能。它允许外部事件(如比较器输出)直接、快速地干预PWM输出,其优先级高于常规的计数器比较匹配事件。这种硬件级的快速响应路径,是保证峰值电流控制精度和可靠性的基石。如果靠软件中断来响应比较器翻转,再修改PWM输出,延迟将是不可接受的,可能导致过流损坏。
2.2 关键寄存器配置与代码逐行解读
下面我们结合TI官方示例代码,详细拆解每个配置步骤背后的意图。假设我们使用ePWM1的A通道(EPWM1A)作为Buck电路上管的驱动信号。
//=========================================================================== // 初始化配置阶段 //=========================================================================== // 1. 时间基准 (Time-Base, TB) 子模块配置 EPwm1Regs.TBPRD = 300; // 设置PWM周期为300个TBCLK计数 // 假设系统时钟SYSCLKOUT=60MHz,TBCLK不分频(见下文配置),则PWM频率 = 60MHz / 300 = 200kHz EPwm1Regs.TBPHS.half.TBPHS = 0; // 相位寄存器清零,作为主模块或独立运行 EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // 设置为递增计数模式(非对称PWM) EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 禁止相位同步加载,本模块自主运行 EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; // 高速时钟预分频设为1 EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; // 时间基准时钟预分频设为1 // 因此 TBCLK = SYSCLKOUT / (HSPCLKDIV * CLKDIV) = 60MHz / (1*1) = 60MHz EPwm1Regs.TBCTL.bit.PRDLD = TB_SHADOW; // 周期寄存器使用影子寄存器模式,在TBCTR=0时加载,避免周期更新时的毛刺 // 2. 动作限定器 (Action-Qualifier, AQ) 子模块配置 - 定义PWM默认行为 EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // 当计数器归零(TBCTR=0)时,设置EPWM1A输出为高(开启开关管) // 注意:这里没有配置CAU/CAD(比较器A匹配)事件的动作,因为关断将由Trip事件负责。 // 3. 数字比较 (Digital Compare, DC) 与 Trip Zone 子模块配置 - 实现峰值电流关断 // 3.1 选择Trip信号源:将比较器1的输出映射到DCAH(数字比较A高)信号线上 EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL = DC_COMP1OUT; // DCAH = Comparator 1 output // 3.2 定义Trip事件:当DCAH信号为高时,生成DCAEVT2事件 EPwm1Regs.TZDCSEL.bit.DCAEVT2 = TZ_DCAH_HI; // DCAEVT2 事件由 DCAH 变高触发 // 3.3 配置Trip事件路径和类型 EPwm1Regs.DCACTL.bit.EVT2SRCSEL = DC_EVT2; // DCAEVT2事件源就是它自己(直连) EPwm1Regs.DCACTL.bit.EVT2FRCSYNCSEL = DC_EVT_ASYNC; // 选择异步路径,确保最快响应,不经过同步器延迟 // 3.4 使能DCAEVT2作为Trip源,并定义其动作 EPwm1Regs.TZSEL.bit.DCAEVT2 = 1; // 使能DCAEVT2作为Trip事件源 // 配置当DCAEVT2事件发生时,对EPWM1A输出采取的动作 EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LO; // 强制EPWM1A输出为低电平(立即关断上管) // 注意:这里使用的是“强制低”,这是一种“Cycle-By-Cycle” (CBC) 保护。事件发生后,输出被强制拉低直到当前周期结束。 // 下一个周期开始时,AQCTLA中定义的ZRO事件(SET)会再次将输出拉高,开启新的周期。 //=========================================================================== // 运行时 (Run Time) - 动态调整峰值电流参考值 //=========================================================================== // 通过调整内部DAC的输出电压(连接到COMP1负端),或改变外部参考电压,来动态设定峰值电流限值。 // 例如,电压外环PI控制器的输出,可以作为峰值电流的给定。 // 这部分代码通常放在中断服务程序中。 // Adjust reference peak current to Comparator 1 negative input // (例如:写入DAC寄存器,或通过GPIO控制外部基准源)配置要点与避坑指南:
- 计数模式选择:对于峰值电流模式Buck,通常使用
TB_COUNT_UP(递增)模式。因为每个周期都是从零开始,开启开关管,直到电流达到峰值关断。这种模式简单直观,占空比由关断时刻(由电流决定)唯一确定。 - 影子寄存器的重要性:
TBCTL.bit.PRDLD = TB_SHADOW和后续没有显示配置但默认生效的CMPA影子寄存器,是数字PWM稳定输出的关键。它们确保了对周期、比较值等关键参数的更新发生在计数器归零的安全时刻,避免了在计数中间更新可能导致的脉冲宽度异常或毛刺。务必养成在初始化时确认影子寄存器配置的习惯。 - Trip路径的选择:
DC_EVT_ASYNC(异步)路径至关重要。比���器输出是模拟信号,转换为数字信号后,如果经过同步器(同步到系统时钟),会引入至少1.5个时钟周期的延迟。在200kHz开关频率(周期5us)下,60MHz时钟的一个周期约16.7ns,这个延迟看似不大,但在峰值电流控制中,这可能意味着实际关断电流比设定值高出好几个安培,特别是在高di/dt的应用中。异步路径牺牲了信号同步的稳定性(理论上可能有亚稳态风险),但换取了最快的关断响应。TI的芯片在此路径上通常做了硬化处理,在实际电源设计中,为了可靠性,必须使用异步路径。 - Cycle-By-Cycle (CBC) vs One-Shot (OSHT):示例中配置的是CBC模式(通过
TZCTL配置为强制低,并在下个周期自动恢复)。CBC模式是逐周期限流,每个周期独立。如果需要一个不可自恢复的锁存关断(即故障后需要软件干预才能重启),则应使用OSHT模式,并配置TZEINT启用相关中断。在设计保护逻辑时,要明确区分“可恢复的限流”和“需要处理的故障”。
2.3 波形分析与设计考量
配置完成后,理想的波形应如下图所示(对应手册中的Figure 3-69):
EPWM1A输出:每个周期开始为高电平,当I_sense电压超过DAC_out(峰值电流参考)时,立即变为低电平。高电平时间(即导通时间)随输入电压和负载变化而自动调节。DAC_out:这是一个可调的直流或慢变化参考电平,由控制算法(如电压环PI输出)决定。I_sense:反映电感电流的三角波(在Buck电路中),其峰值被DAC_out钳位。
设计中的关键计算:
- 电流采样电阻与放大器增益:采样电阻
R_sense的选择需要在功耗(电阻损耗)和信噪比之间折衷。采样电压需放大到适合比较器输入的范围内(如0-3V)。假设峰值电流I_pk为10A,采样电阻为5mΩ,则采样电压为50mV。需要选择一个合适的运放增益,例如60倍,得到3V的满量程电压。 - DAC分辨率与电流调节精度:内部DAC如果是10位,参考电压为3V,则最小电压步进约为3V/1024 ≈ 2.93mV。对应到采样端,2.93mV / 60(增益) / 0.005Ω(采样电阻) ≈ 9.77mA。这意味着你的峰值电流设定精度理论上是约10mA。这对于大多数应用是足够的,但需要评估是否满足你的动态调节需求。
- 比较器延迟的影响:芯片数据手册会给出比较器的传播延迟(Propagation Delay)。这个延迟(通常几十到几百纳秒)会导致实际关断电流高于设定值。需要在软件设定峰值电流参考值时,预留一定的余量(
I_pk_set = I_pk_desired - (di/dt * t_delay)),或者选择延迟更小的比较器。
3. H桥LLC谐振转换器的ePWM配置策略
LLC谐振转换器因其能够在全负载范围内实现原边开关管的零电压开关(ZVS),从而获得极高效率,近年来在充电器、服务器电源等领域广泛应用。其控制核心是调节开关频率(PFM),而非占空比。对于半桥LLC,通常需要一对互补的50%占空比PWM波;对于全桥LLC,则需要两组这样的互补对,且彼此间有180度或可调相位差。
3.1 控制需求分析与ePWM模块规划
我们以图3-70中的单通道控制为例,它实际上驱动了一个半桥(或全桥的一半)。EPWM1A和EPWM1B输出一对互补的、带死区的PWM信号,分别驱动H桥的同侧上下管(或半桥的上下管)。控制目标是:
- 固定占空比:接近50%,以确保谐振腔获得对称的方波激励。
- 调节频率:通过改变时间基准周期寄存器
TBPRD的值,来改变开关频率,从而调节输出电压。 - 固定死区:插入固定的死区时间,防止上下管直通,同时要为ZVS创造条件。
- 同步与扩展:该模块可以作为主模块,通过
SYNCOUT信号同步另一个ePWM模块(例如ePWM2),以生成驱动全桥的另外一对PWM信号,并实现移相控制。
3.2 寄存器配置深度解析
以下配置代码实现了上述需求,生成一对中心对称的互补PWM(Up-Down计数模式),并带有可调死区。
//===================================================================== // 初始化配置 //===================================================================== // 1. 时间基准 (TB) 子模块配置 EPwm1Regs.TBCTL.bit.PRDLD = TB_IMMEDIATE; // 周期寄存器立即加载模式(常用于频率需频繁变化的场合) EPwm1Regs.TBPRD = period; // 设置PWM周期,period值决定了开关频率 Freq = 1/(period * T_tbclk) EPwm1Regs.CMPA.half.CMPA = period/2; // CMPA设为周期的一半,用于在Up-Down模式下生成50%占空比 EPwm1Regs.CMPB = period/4; // CMPB设为周期的1/4,用于触发特定事件(如ADC采样) EPwm1Regs.TBPHS.half.TBPHS = 0; // 相位寄存器清零,此模块作为主模块 EPwm1Regs.TBCTR = 0; // 时间基准计数器清零 EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP_DOWN; // 设置为先递增后递减计数模式(对称PWM) EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; // 禁止相位加载 EPwm1Regs.TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; // 同步输出信号选择为计数器归零时产生,用于同步其他ePWM模块 EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; // 设置TBCLK时钟,与之前例子相同 // 2. 计数器比较 (CC) 子模块配置 EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_PRD; // CMPA影子寄存器在计数器等于周期值(CTR=PRD)时加载到活动寄存器 EPwm1Regs.CMPCTL.bit.LOADBMODE = CC_CTR_PRD; // CMPB同理 EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; // CMPA使用影子寄存器模式 EPwm1Regs.CMPCTL.bit.SHDWBMODE = CC_SHADOW; // CMPB使用影子寄存器模式 // 3. 动作限定器 (AQ) 子模块配置 - 定义EPWM1A和EPWM1B的波形 // 对于EPWM1A (AQCTLA): EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // 在计数器归零时,设置EPWM1A为高 EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // 在递增计数且等于CMPA时,清除EPWM1A为低 // 在递减计数且等于CMPA (CAD) 时,我们没有定义动作,因此输出保持低电平。 // 这样,EPWM1A在0到CMPA(即0到period/2)期间为高,之后为低,形成一个占空比约为50%的PWM。 // 对于EPWM1B (AQCTLB): EPwm1Regs.AQCTLB.bit.CAU = AQ_SET; // 在递增计数且等于CMPA时,设置EPWM1B为高 EPwm1Regs.AQCTLB.bit.PRD = AQ_CLEAR; // 在计数器等于周期值(PRD)时,清除EPWM1B为低 // 这样,EPWM1B在CMPA到PRD期间为高,之后为低。由于是对称计数,PRD点之后计数器递减,在递减到CMPA时我们没有定义动作,因此EPWM1B保持低电平直到下一个周期。 // 最终,EPWM1A和EPWM1B是互补的,但存在一段两者都为低电平的死区时间(由死区模块进一步控制)。 // 4. 死区 (DB) 子模块配置 - 插入上升沿和下降沿延迟,防止直通 EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL; // 死区输入源选择:EPWM1A作为上升沿延迟(RED)和下降沿延迟(FED)的共同源 EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // 使能死区模块,对EPWM1A和EPWM1B输出都应用死区 EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // 输出极性:高电平有效互补模式(Active High Complementary) EPwm1Regs.DBRED = 30; // 设置上升沿延迟为30个TBCLK周期 EPwm1Regs.DBFED = 30; // 设置下降沿延迟为30个TBCLK周期 // 假设TBCLK=60MHz,则死区时间 = 30 * (1/60MHz) = 500ns。手册中提到初始设为300ns,这里30个周期对应500ns,需根据实际开关频率和管子特性调整。 // 5. 错误联防 (Trip Zone, TZ) 子模块配置 - 用于过流、过压保护 EALLOW; // 解除寄存器保护 EPwm1Regs.TZSEL.bit.OSHT1 = 1; // 使能TZ1引脚作为一次性(OSHT)Trip源 EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LO; // 发生Trip时,强制EPWM1A输出低 EPwm1Regs.TZCTL.bit.TZB = TZ_FORCE_LO; // 发生Trip时,强制EPWM1B输出低 EPwm1Regs.TZEINT.bit.OST = 1; // 使能一次性Trip中断,以便在故障后进入中断服务程序进行故障处理 EDIS; // 恢复寄存器保护 // 6. 高分辨率PWM (HRPWM) 配置(如果芯片支持且需要) EALLOW; EPwm1Regs.HRCNFG.all = 0x0; // 先清零配置寄存器 EPwm1Regs.HRCNFG.bit.EDGMODE = HR_FEP; // 边沿定位模式:在下降沿应用高分辨率微调(Falling Edge Position) EPwm1Regs.HRCNFG.bit.CTLMODE = HR_CMP; // 控制模式:高分辨率功能应用于CMPA寄存器 EPwm1Regs.HRCNFG.bit.HRLOAD = HR_CTR_PRD; // 高分辨率影子寄存器在CTR=PRD时加载 EDIS; //===================================================================== // 运行时 - 动态调节频率(PFM控制) //===================================================================== // 在控制循环(如电压环PI计算后)中,更新周期值以改变频率 EPwm1Regs.TBPRD = period_new_value; // 更新PWM周期(频率) // 注意:由于CMPA和CMPB的值通常与周期成固定比例(如50%,25%),在改变period后,通常也需要同步更新它们。 // EPwm1Regs.CMPA.half.CMPA = period_new_value / 2; // EPwm1Regs.CMPB = period_new_value / 4;3.3 波形生成机制与死区插入原理
理解这个配置如何生成波形至关重要。我们结合Up-Down计数模式和AQ、DB模块的动作来分析:
基础互补波形的生成:
- 计数器从0开始递增。在0时刻,
AQCTLA.ZRO动作将EPWM1A置高。 - 计数器递增到
CMPA(=period/2)时,触发两个事件:AQCTLA.CAU将EPWM1A清零;AQCTLB.CAU将EPWM1B置高。此时EPWM1A变低,EPWM1B变高。 - 计数器继续递增到
PRD(=period)时,触发AQCTLB.PRD将EPWM1B清零。同时计数器开始递减。 - 计数器递减再次经过
CMPA时,没有定义AQ动作,因此EPWM1A和EPWM1B都保持低电平,直到下一个周期开始。 - 这样,在没有死区的情况下,我们已经得到了两个互补的、占空比略小于50%的方波(因为EPWM1B在
CMPA时刻才变高,EPWM1A在CMPA时刻就变低了)。
- 计数器从0开始递增。在0时刻,
死区模块的加工:
- 配置
IN_MODE = DBA_ALL意味着死区模块以原始的EPWM1A信号(即上述AQ生成的信号)作为输入源,来生成最终的EPWM1A_OUT和EPWM1B_OUT。 POLSEL = DB_ACTV_HIC定义了输出为高有效互补模式。死区模块内部会生成两个信号:一个是原始信号经过上升沿延迟(RED)后的信号,另一个是原始信号经过下降沿延迟(FED)后取反的信号。- 最终,EPWM1A_OUT = 原始信号经过RED延迟。EPWM1B_OUT = 原始信号经过FED延迟后取反。
- 效果:对于每一个跳变沿,EPWM1A_OUT的上升沿会滞后,EPWM1B_OUT的下降沿会滞后(因为取反关系),从而在上下管驱动信号之间插入了一段两者都为低电平的死区时间。
DBRED和DBFED分别控制这段延迟的时长。
- 配置
3.4 关键设计参数计算与注意事项
开关频率与
TBPRD计算: 开关频率F_sw = F_tbclk / (2 * TBPRD)(对于Up-Down模式,一个完整的PWM周期需要计数器从0到PRD再到0,共计2*PRD个TBCLK)。 例如,目标开关频率F_sw为100kHz,TBCLK为60MHz,则TBPRD = F_tbclk / (2 * F_sw) = 60e6 / (2 * 100e3) = 300。死区时间设置: 死区时间
T_dead = DBRED * T_tbclk(或DBFED * T_tbclk,通常两者设相同值)。 死区时间的选择是门艺术。时间太短,不足以防止直通;时间太长,会限制最大占空比,影响LLC的增益范围,甚至阻碍ZVS的实现。需要根据功率MOSFET/IGBT的开关特性(特别是关断延迟时间和米勒平台时间)来设定。通常从数据手册获取关断延迟t_off(typ)和上升时间t_r,然后设定死区时间T_dead > t_off(max) - t_on(min)(考虑器件离散性和温度变化)。对于LLC,死区时间还需满足ZVS的要求,即需要为谐振电流对开关管结电容的充放电留出足够时间。一个实用的方法是:在样机调试时,用双通道示波器同时测量上下管的Vgs波形,确保在任何工况下,一个管子的Vgs完全下降到关断阈值以下后,另一个管子的Vgs才开始上升。CMPB的作用:在这个配置中,
CMPB = period/4,但AQ模块没有直接使用CMPB事件来控制输出。它常被用来触发ADC采样。例如,可以在计数器等于CMPB时(即PWM周期的1/4和3/4处)触发ADC,采样谐振电流或输出电压,这个时刻通常对应着开关状态的中间点,干扰较小,采样值更具代表性。这需要通过配置事件触发子模块(ET)和ADC启动序列来实现。同步与多模块协作:
SYNCOSEL = TB_CTR_ZERO使得本模块在计数器归零时产生一个同步脉冲输出(EPWM1SYNCO)。可以将这个输出连接到另一个ePWM模块(如ePWM2)的同步输入(EPWM2SYNCI),并将ePWM2配置为相位加载模式(PHSEN=1),并设置TBPHS为period/2。这样,ePWM2生成的PWM波将与ePWM1的波形互补且具有180度相位差,完美驱动一个全桥LLC。这是构建多相交错、移相全桥等复杂拓扑的基础。
4. 核心寄存器功能速查与高级应用技巧
理解了上述两个案例,ePWM的核心子模块功能已经清晰。下面我将几个最关键的子模块寄存器功能整理成表,并分享一些手册上不一定写明的高级技巧和调试心得。
4.1 时间基准(TB)子模块核心控制
| 寄存器位/字段 | 功能描述 | 配置要点与影响 |
|---|---|---|
TBCTL.CTRMODE | 计数器模式 | 00递增,01递减,10先增后减。Buck PCM常用递增,LLC PFM常用先增后减以生成对称波形。 |
TBCTL.PHSEN | 相位加载使能 | 主模块常禁用(0),从模块需使能(1)并设置TBPHS值以实现相位差。 |
TBCTL.PRDLD | 周期寄存器加载模式 | 0影子模式(安全,避免毛刺),1立即模式(响应快)。频率变化快的PFM控制可考虑立即模式,但需注意更新时机。 |
TBCTL.HSPCLKDIV&CLKDIV | TBCLK时钟预分频 | 共同决定TBCLK频率。高频PWM需高分频以降低计数器速度,延长周期值范围;精度要求高时,应尽量使用高频TBCLK。 |
TBPRD | 周期值 | 直接决定PWM频率。在Up-Down模式下,PWM周期T_sw = 2 * TBPRD * T_tbclk。 |
TBPHS | 相位值 | 用于同步多个ePWM模块,实现移相。从模块在收到同步信号后,会将其TBCTR加载为此值。 |
4.2 动作限定器(AQ)与数字比较(DC)/Trip子模块联动
AQ模块定义了“事件-动作”规则,而DC和Trip模块则提供了由外部模拟信号(通过比较器)或数字信号快速干预输出的通道。
一个高级技巧:实现峰值电流模式控制中的斜坡补偿。单纯的峰值电流模式在占空比>50%时会发生次谐波振荡。数字实现中,除了在电流采样信号上叠加模拟斜坡,还可以通过ePWM灵活实现数字斜坡补偿。方法之一是:不使用固定的DAC参考值,而是让DAC的输出(即比较器负端电压)在一个PWM周期内随时间线性增加(一个数字斜坡)。这可以通过在PWM周期开始时设置DAC一个初始值,并在每个TBCLK中断中递增DAC寄存器来实现。这样,电流内环的稳定性会大大提高。这就需要将DAC更新与PWM时基紧密耦合,ePWM的CTR=ZERO或CTR=PRD事件触发ADC/DAC更新中断是完美的选择。
4.3 调试实战问题排查记录
在实际调试中,你可能会遇到以下问题:
问题:PWM输出完全没有波形。
- 排查步骤:
- 检查时钟:确认系统时钟
SYSCLKOUT是否正确配置,ePWM外设时钟是否使能(PCLKCR0/1寄存器)。 - 检查GPIO复用:确认用于EPWMxA/B输出的引脚是否已正确配置为ePWM功能(
GPxMUX寄存器),而非普通的GPIO。 - 检查输出使能:某些芯片的ePWM输出默认可能是高阻态,需要检查是否有独立的输出使能位(如
GPIOx相关的PUD上拉/下拉禁用,或ePWM模块本身的输出控制位)。 - 使用仿真器在线查看
TBCTR寄存器的值是否在循环计数。如果不计数,检查TBCTL.CTRMODE是否被意外设置为11(停止模式)。
- 检查时钟:确认系统时钟
- 排查步骤:
问题:峰值电流控制不稳定,电感电流振荡。
- 排查步骤:
- 首要检查比较器延迟:用示波器同时观察电流采样信号(比较器正端)、DAC参考(比较器负端)和比较器输出。测量从采样信号穿越参考点到比较器输出翻转的实际延迟。这个延迟必须在控制环路设计时予以补偿。
- 检查采样电路:电流采样运放的带宽是否足够?采样电阻的寄生电感是否在高速开关下引起电压尖峰?可以在采样点增加一个小的RC滤波(例如100Ω+1nF),但需注意引入的相位延迟。
- 检查Trip路径:确认
TZDCSEL和DCACTL寄存器配置正确,特别是EVT2FRCSYNCSEL是否设置为DC_EVT_ASYNC。同步路径的延迟可能是罪魁祸首。 - 软件干扰:确保在PWM周期中(特别是开关管导通期间),没有高优先级的任务或中断长时间关闭全局中断,导致无法及时响应Trip事件。
- 排查步骤:
问题:LLC电路无法实现ZVS,或效率在轻载时下降。
- 排查步骤:
- 死区时间不当:这是最常见的原因。用示波器测量上下管的Vgs和Vds波形。理想的ZVS是:在Vgs上升之前,Vds已经通过谐振电流放电到零。如果死区时间太短,Vds还未降到零Vgs就开了,就是硬开关。如果死区时间太长,虽然避免了直通,但体二极管会导通较长时间,导致损耗增加。必须根据实测波形精细调整
DBRED和DBFED。 - 频率调节范围:LLC的增益曲线与频率相关。确保你的控制算法输出的
TBPRD值在合理的范围内,不能超出谐振腔的调频范围。同时,注意TBPRD更新时的平滑性,避免频率跳变过大。 - CMPB触发ADC采样的时刻:如果使用CMPB触发ADC采样谐振腔电流以实现更高级的控制,需要验证采样时刻是否准确避开了开关噪声。可以在采样时刻触发一个GPIO翻转,用示波器观察这个翻转信号与开关波形、电流波形的相对位置。
- 死区时间不当:这是最常见的原因。用示波器测量上下管的Vgs和Vds波形。理想的ZVS是:在Vgs上升之前,Vds已经通过谐振电流放电到零。如果死区时间太短,Vds还未降到零Vgs就开了,就是硬开关。如果死区时间太长,虽然避免了直通,但体二极管会导通较长时间,导致损耗增加。必须根据实测波形精细调整
- 排查步骤:
问题:多相ePWM模块之间同步有偏差,或相位不对。
- 排查步骤:
- 检查同步链:确认主模块的
SYNCOUT信号(通过TBCTL.SYNCOSEL配置)正确产生,并且通过硬件连接到了从模块的SYNCI输入引脚。 - 检查从模块配置:确认从模块的
TBCTL.PHSEN=1,并且TBPHS寄存器设置了正确的相位值。例如,对于两相交错180度的Buck,从模块的TBPHS应设为主模块TBPRD值的一半(对于递增模式)。 - 注意影子寄存器:如果从模块的
TBPRD或TBPHS使用了影子寄存器,那么新值会在下一个同步事件或计数器归零时才生效,这可能导致一个周期的不同步。在初始化同步时,可以考虑使用立即加载模式,或者确保在使能同步前就写好了正确的影子寄存器值。
- 检查同步链:确认主模块的
- 排查步骤:
最后,再分享一个寄存器配置的“好习惯”:在初始化任何一个ePWM模块时,我习惯在配置具体功能前,先执行一个“软复位”操作(如果芯片支持),或者至少将关键的控制寄存器(TBCTL,AQCTLA/B,DBCTL,TZSEL等)全部写为一个已知的默认状态(通常是全0或芯片复位值)。这可以避免之前程序或仿真器调试残留的配置影响当前实验。TI的示例代码往往只给出功能相关的配置,这个“清理现场”的步骤需要你自己加上。
ePWM模块是TI C2000系列微控制器的精髓之一,其灵活性足以应对从简单电机调速到复杂多相数字电源的各类挑战。掌握它,不仅仅是记住寄存器位域,更是理解其内部的事件流、时序逻辑以及如何与模拟世界交互。希望这篇结合实战的详解,能帮你少走些弯路,更快地让手中的芯片输出稳定而精确的功率脉搏。