1. 项目概述与ePWM核心价值
在嵌入式系统,尤其是电机控制、数字电源和逆变器这类对时序和精度要求严苛的领域,脉冲宽度调制(PWM)信号的质量直接决定了整个系统的性能上限。很多工程师初涉此领域时,往往从简单的定时器比较输出开始,但随着项目复杂度提升,很快会遇到瓶颈:如何让多个PWM通道精确同步?如何在故障发生时毫秒级响应并安全关断?如何在不频繁打断CPU的情况下,实现复杂的波形调制?这时,一个功能强大的硬件PWM外设就成了刚需。德州仪器(TI)C2000系列微控制器中的增强型PWM(ePWM)模块,正是为此而生。它不是一个简单的定时器加比较器,而是一个高度模块化、可编程的“片上信号发生器”,将时间基准生成、比较匹配、动作限定、死区控制、故障保护、中断触发等复杂功能全部硬件化。
本文不会停留在泛泛而谈,我们将深入其寄存器层面,特别是时间基准(TB)子模块和中断控制机制。为什么是它们?因为时间基准是ePWM的心脏,它决定了所有事件的节拍;而中断控制是其神经反射系统,确保了系统能智能、及时地响应内部事件和外部故障。理解这两者,你就掌握了ePWM精准控制的命脉。无论你是正在调试无刷电机驱动板的工程师,还是设计高性能开关电源的开发者,这篇文章将带你绕过数据手册的繁琐,直击配置核心,分享那些调试中容易踩坑的寄存器位细节和实战配置心得。
2. ePWM架构精解:模块化设计的智慧
在拆解寄存器之前,必须从顶层理解ePWM的架构思想。它与传统MCU中孤立的PWM定时器有本质区别。ePWM采用了一种“正交”或“模块化”的设计理念。如图14-2所示,一个完整的ePWM通道(例如ePWM1)由七个核心子模块构成,像一条精密的流水线:
- 时间基准(TB)模块:整个通道的节拍器,产生核心的计数时钟和同步信号。
- 计数器比较(CC)模块:存储比较值(CMPA, CMPB),与TB计数器的值进行比较,产生匹配事件。
- 动作限定器(AQ)模块:接收TB和CC产生的事件(如CTR=PRD, CTR=CMPA),并据此决定输出引脚EPWMxA/B应该置高、拉低还是翻转。
- 死区发生器(DB)模块:为互补的PWM对(如驱动半桥的上管和下管)插入可编程的死区时间,防止直通短路。
- PWM斩波器(PC)模块:可选模块,用于生成高频载波对PWM信号进行调制,常用于驱动脉冲变压器隔离栅极。
- 故障保护(TZ)模块:监控外部故障引脚(TZ1-TZn),一旦触发,可立即强制PWM输出为预定安全状态(高、低或高阻)。
- 事件触发(ET)模块:管理由TB和CC模块产生的事件,可配置其触发CPU中断或启动ADC转换。
这种设计的精妙之处在于解耦与灵活。每个子模块功能独立,通过标准化的内部信号(如CTR=PRD, CTR=CMPA)连接。你可以单独配置TB的频率、CC的占空比、AQ的输出逻辑、DB的延迟时间,而它们之间通过硬件自动协作。例如,TB模块负责“何时”到达一个点,CC模块定义这个“点”的值,AQ模块决定到达这个点时“做什么”。这种清晰的分工使得复杂波形的生成变得直观且高效。
注意:在开始配置任何ePWM模块前,务必遵循正确的初始化顺序,特别是中断相关部分。一个常见的陷阱是使能模块时钟后,未初始化的寄存器可能产生毛刺事件,误触发中断标志。标准流程应是:1) 关闭全局中断(INTM);2) 禁用ePWM模块中断;3) 初始化所有ePWM寄存器;4) 清除所有ePWM中断标志位;5) 使能ePWM模块中断;6) 最后再打开全局中断。这个顺序能确保系统从一个干净、确定的状态开始运行。
3. 时间基准(TB)子模块:一切时序的起源
时间基准子模块是ePWM所有功能的基石。它不仅仅是一个计数器,更是一个完整的时钟管理系统。如图14-5所示,其核心是一个16位的向上/向下计数器(TBCNT),以及与之相关的周期寄存器(TBPRD)、相位寄存器(TBPHS)和控制逻辑。
3.1 核心寄存器组与控制逻辑
TB子模块由一组关键寄存器控制(见表14-3):
- TBCTL(时间基准控制寄存器):核心控制中心,配置计数模式、时钟分频、同步使能等。
- TBPRD(时间基准周期寄存器):决定PWM的周期。它有一个影子寄存器,可在特定时刻(通常计数器为零时)安全更新,避免周期中途改变导致波形畸形。
- TBPHS(时间基准相位寄存器):用于与其他ePWM模块同步时,设置本模块的相位偏移。
- TBCNT(时间基准计数器寄存器):实时反映当前计数值,只读。
- TBSTS(时间基准状态寄存器):包含一些状态标志,如计数器上溢标志。
时钟链与频率设定:TB模块的时钟源TBCLK来源于系统时钟SYSCLKOUT,但经过两级分频:HSPCLKDIV(高速时钟分频)和CLKDIV(时钟分频)。这意味着你可以为PWM模块选择比CPU主频低得多的计数时钟,以生成更低频率的PWM波,同时保持高分辨率。例如,系统时钟150MHz,通过两级分频各设为/2,则TBCLK = 150MHz / (2*2) = 37.5MHz。每个TBCLK周期,计数器增减1。
计数模式与波形关系:TBCTL[CTRMODE]位域决定了计数模式,这直接影响了PWM波形的类型:
- 向上-向下计数模式(TB_COUNT_UPDOWN):计数器从0开始增到TBPRD,再减回0,循环往复。此模式生成对称PWM波形,其开关事件在周期内对称分布。这是电机控制中最常用的模式,因为它能产生中心对齐的PWM,有助于减少谐波。
- 向上计数模式(TB_COUNT_UP):计数器从0增到TBPRD,然后瞬间复位到0。此模式生成非对称PWM波形(边沿对齐),所有调制边沿都发生在周期开始的一侧。
- 向下计数模式(TB_COUNT_DOWN):计数器从TBPRD减到0,然后瞬间重载TBPRD。同样生成非对称PWM。
周期与频率的计算:这是配置的关键。计算公式取决于模式:
- 向上或向下计数模式:PWM周期
Tpwm = (TBPRD + 1) * Ttbclk。PWM频率Fpwm = 1 / Tpwm。- 例如:TBCLK = 37.5MHz (周期26.67ns),需要20kHz PWM,则
TBPRD = (1 / 20kHz) / 26.67ns - 1 ≈ 1874。
- 例如:TBCLK = 37.5MHz (周期26.67ns),需要20kHz PWM,则
- 向上-向下计数模式:PWM周期
Tpwm = 2 * TBPRD * Ttbclk。PWM频率Fpwm = 1 / Tpwm。- 同样20kHz PWM,
TBPRD = (1 / 20kHz) / (2 * 26.67ns) ≈ 937。
- 同样20kHz PWM,
实操心得:在计算TBPRD时,务必注意寄存器是16位(最大值65535)。在高系统时钟下,若想产生极低频率的PWM,可能需要进一步增大时钟分频比,否则TBPRD会溢出。同时,向上-向下模式下的频率是向上计数模式的两倍(相同TBPRD时),这一点在切换模式时极易被忽略,导致实际频率与预期不符。
3.2 同步机制:多模块协同作战的精髓
单个PWM通道能力有限,真正的威力在于多通道协同。ePWM通过**EPWMxSYNCI(同步输入)和EPWMxSYNCO(同步输出)**信号实现硬件同步,形成一条同步链(见图14-1)。通常,ePWM1的SYNCI来自外部引脚,其SYNCO输出给ePWM2的SYNCI,以此类推。
同步事件的发生:当同步输入脉冲到来时,TB模块可以做出两种响应,由TBCTL[PHSEN]控制:
- 相位加载:如果PHSEN=1,同步事件发生时,TBPHS寄存器中的值会立即加载到TBCNT中。这允许你精确设置某个ePWM模块相对于同步源的���位差。例如,在交错并联电源中,让ePWM2的波形滞后ePWM1 90度相位。
- 计数器复位:如果PHSEN=0且计数器处于使能状态,同步事件会强制TBCNT复位为0。
同步输出的选择:每个模块的SYNCO信号来源可通过TBCTL[SYNCOSEL]配置。它可以选择:
- CTR=0:当本模块计数器归零时,产生一个SYNCO脉冲。这是最常用的方式,用于让后续模块与本模块同时开始新周期。
- CTR=CMPB:当计数器等于CMPB值时产生同步脉冲。这可以实现更灵活的、基于特定点的同步。
- SYNCI:直接转发输入同步脉冲。
- 禁用:不产生同步输出。
软件强制同步:除了硬件同步,还可以通过写TBCTL[SWFSYNC]位产生一个软件同步脉冲,其效果与硬件同步输入相同。这在初始化阶段或需要动态调整同步关系时非常有用。
避坑指南:同步链的配置顺序至关重要。错误的配置可能导致同步信号“打架”或循环依赖。推荐的初始化顺序是:从同步链的源头(如ePWM1)开始,向下游逐个配置。先配置源头模块的TBCTL(包括SYNCOSEL),然后配置下游模块的PHSEN和相位值,最后再使能所有模块的计数器或发送软件同步脉冲。若顺序颠倒,下游模块可能在接收到正确的同步信号前就已开始运行,导致相位混乱。
4. 中断控制与事件触发(ET)子模块:让CPU知情与介入
ePWM能在硬件上自主运行,但CPU仍需知情关键事件(如周期结束、比较匹配)或在故障时紧急处理。事件触发(ET)子模块就是ePWM与CPU之间的“通信官”。它不直接产生PWM波形,而是管理着事件到中断的映射。
4.1 中断寄存器组详解
ET子模块拥有一组精细的中断控制寄存器(见表14-1中ET部分),其设计逻辑清晰:
- ETSEL(事件触发选择寄存器):决定“什么事件”能触发中断。你可以选择多种事件源,例如:
ET_CTR_ZERO: 计数器等于零(CTR=0)。ET_CTR_PRD: 计数器等于周期值(CTR=PRD)。ET_CTRU_CMPA: 在向上计数时,计数器等于CMPA值。ET_CTRD_CMPA: 在向下计数时,计数器等于CMPA值。 这对于在PWM波形的特定点触发ADC采样(例如在空间矢量PWM的中点)至关重要。
- ETPS(事件触发预分频寄存器):决定“第几次事件”才产生中断。它包含一个事件计数器。可以配置为:
ET_DISABLE: 禁止中断。ET_1ST: 每次选定事件发生都产生中断。ET_2ND: 每第二次事件发生才产生中断。ET_3RD: 每第三次事件发生才产生中断。 这能有效降低CPU的中断频率,减轻负载。例如,一个100kHz的PWM,如果每个周期都产生中断,CPU负担会很重。通过设置为ET_2ND,中断频率降为50kHz。
- ETFLG(事件触发标志寄存器):只读状态寄存器。当满足ETSEL和ETPS条件的中断事件真正发生时,对应的中断标志位(INT)会被硬件置1。即使中断未被使能,这个标志位也会置位,可供软件查询。
- ETCLR(事件触发清除寄存器):用于清除ETFLG中的标志位。向某位写1可清除对应标志。切记:在中断服务程序(ISR)中,必须手动清除此标志位,否则会持续触发中断。
- ETFRC(事件触发强制寄存器):软件强制中断。向该寄存器的位写1,可以手动设置对应的中断标志位(ETFLG),从而模拟一个硬件中断事件。这在调试和测试中断服务程序逻辑时非常有用。
4.2 中断处理流程与最佳实践
一个完整的中断处理流程如下:
- 配置:在初始化时,通过ETSEL选择中断事件源,通过ETPS设置分频。
- 使能:在ETSEL中使能中断输出(INTEN位)。
- 等待:硬件运行,当事件发生且满足分频条件时,ETFLG[INT]置位。
- 触发:如果PIE(外设中断扩展器)和CPU中断已使能,则跳转到中断服务程序(ISR)。
- 响应:在ISR中,首先必须通过写ETCLR寄存器清除中断标志位。
- 处理:执行用户的中断服务代码(例如,更新下一个周期的CMPA值以实现调制)。
- 返回:中断返回。
核心技巧:“影子寄存器”机制在中断服务程序中的运用。以CMPA为例,它有一个影子寄存器。你可以在ISR中的任何时间安全地写入新的比较值到CMPA影子寄存器,并指定其加载时机(例如在CTR=PRD或CTR=0时)。硬件会在指定的加载点自动将影子寄存器的值搬运到活动寄存器,从而确保PWM波形在完整的周期边界处平滑切换,避免产生毛刺或畸变。这是实现诸如正弦波调制、步进变化等高级功能的关键。
5. 从理论到实践:配置一个完整的ePWM通道
让我们结合TB和ET模块,配置一个产生中心对称PWM并启用周期中断的实例。假设系统时钟SYSCLKOUT = 150MHz,我们需要ePWM1产生20kHz的中心对称PWM,占空比50%,并在每个PWM周期结束时触发中断。
5.1 步骤详解与代码实现
步骤1:计算关键参数
- 选择TBCLK分频:为获得合适的TBPRD值,选择HSPCLKDIV=2, CLKDIV=2。则TBCLK = 150MHz / (2*2) = 37.5MHz。
Ttbclk ≈ 26.67ns。 - 计算TBPRD(向上-向下模式):
TBPRD = (1 / 20kHz) / (2 * 26.67ns) ≈ 937。取整为937。 - 计算CMPA(50%占空比):对于中心对称PWM,高电平时间对应计数器从0增加到CMPA再减少到0的区间。50%占空比时,
CMPA = TBPRD / 2 = 468(取整)。
步骤2:初始化时间基准(TB)模块
// 假设寄存器基地址为 EPWM1_BASE volatile struct EPWM_REGS* ePWM1 = (void*)EPWM1_BASE; // 1. 配置时钟分频和计数模式 ePWM1->TBCTL.bit.CLKDIV = TB_DIV2; // CLKDIV = /2 ePWM1->TBCTL.bit.HSPCLKDIV = TB_DIV2; // HSPCLKDIV = /2 ePWM1->TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 向上-向下计数,中心对称 // 2. 设置周期值 (启用影子寄存器,默认在CTR=0时加载) ePWM1->TBPRD = 937; // 写入影子寄存器 // 3. 配置同步输出(本例中ePWM1作为主模块,在CTR=0时发出同步脉冲) ePWM1->TBCTL.bit.SYNCOSEL = TB_CTR_ZERO; // 4. 相位控制(本例不需要从模式同步,故禁用相位加载) ePWM1->TBCTL.bit.PHSEN = TB_DISABLE; ePWM1->TBPHS.bit.TBPHS = 0;步骤3:初始化计数器比较(CC)模块
// 1. 配置CMPA的加载模式:使用影子寄存器,在CTR=PRD时加载(也可选CTR=0) ePWM1->CMPCTL.bit.LOADAMODE = CC_CTR_PRD; // 在计数器等于周期值时加载 ePWM1->CMPCTL.bit.SHDWAMODE = CC_SHADOW; // 使用影子模式 // 2. 设置初始比较值(50%占空比) ePWM1->CMPA.bit.CMPA = 468; // 写入CMPA影子寄存器 // CMPB本例未使用,保持默认步骤4:初始化动作限定器(AQ)模块
// 配置EPWM1A输出: // 在向上计数且等于CMPA时,将输出置高 ePWM1->AQCTLA.bit.CAU = AQ_SET; // 在向下计数且等于CMPA时,将输出置低 ePWM1->AQCTLA.bit.CAD = AQ_CLEAR; // 这样就在中心对称模式下,以CMPA为边界,生成了一个对称的PWM脉冲。步骤5:初始化事件触发(ET)模块
// 1. 选择中断事件源:我们选择在计数器等于周期值时(CTR=PRD)触发 // 对于向上-向下计数,CTR=PRD事件发生在计数器的峰值点,也是半个PWM周期点。 // 若想在完整周期结束时触发,应选择CTR=0。这里以CTR=PRD为例。 ePWM1->ETSEL.bit.INTSEL = ET_CTR_PRD; // 2. 设置中断事件分频:每个CTR=PRD事件都触发中断 ePWM1->ETSEL.bit.INTEN = 1; // 使能中断 ePWM1->ETPS.bit.INTPRD = ET_1ST; // 第一次事件就触发 // 3. 清除可能存在的旧中断标志(良好习惯) ePWM1->ETCLR.bit.INT = 1;步骤6:启动计数器
// 确保所有配置完成后,再释放时间基准计数器(如果之前被冻结) // TBCTL[FREE_SOFT]位通常默认在仿真器暂停时冻结,这里我们确保其运行 ePWM1->TBCTL.bit.FREE_SOFT = 0; // 0: 自由运行,不受仿真器影响 // 计数器将在TBCLK驱动下开始自动运行步骤7:编写中断服务程序(ISR)
// 假设中断已正确连接到PIE和CPU __interrupt void ePWM1_ISR(void) { // 1. 清除ePWM模块自身的中断标志位(至关重要!) ePwm1Regs.ETCLR.bit.INT = 1; // 2. 执行用户代码,例如:更新下一个周期的CMPA值以实现动态调制 // uint16_t newCmpa = CalculateNewCmpa(); // 假设的函数 // ePwm1Regs.CMPA.bit.CMPA = newCmpa; // 写入影子寄存器,将在CTR=PRD时加载 // 3. 确认PIE组应答位被清除(具体取决于你的PIE配置) // PieCtrlRegs.PIEACK.bit.ACK1 = 1; // 假设ePWM1中断在PIE组1 // 4. 启用全局中断(如果之前在ISR入口处关闭了) // EINT; }5.2 配置要点与验证
完成上述代码后,你应该能在EPWM1A引脚上测量到20kHz、占空比50%的中心对称PWM波。使用示波器验证频率和占空比。同时,你可以通过在ISR中设置一个GPIO引脚翻转来验证中断是否按预期频率(20kHz)触发。
调试心得:如果测量不到PWM输出,请按以下顺序排查:1) 确认GPIO复用功能是否已正确配置为ePWM输出模式。这一步经常被遗忘。2) 检查TBCLK时钟是否使能(通常通过PCLKCR0寄存器)。3) 使用CCS的寄存器查看窗口,监控TBCNT寄存器是否在循环计数。4) 检查AQ模块配置,确保事件动作(SET/CLEAR)已正确绑定到输出引脚A或B。5) 如果使用影子寄存器,确保加载模式(LOADAMODE)配置正确,并且你写入的是影子寄存器(CMPA),活动寄存器(CMPA)可能在特定时刻才更新。
6. 高级主题:故障保护(TZ)与高分辨率(HRPWM)
除了核心的TB和ET模块,ePWM还有两个在工业应用中至关重要的高级功能:故障保护和更高精度。
6.1 故障保护(Trip-Zone)子模块:系统的安全气囊
故障保护是电机驱动和电源系统的生命线。TZ子模块通过外部引脚(TZ1-TZn)监控故障信号(如过流、过温、母线欠压)。其响应速度是纳秒级的,远快于软件中断。
TZ模块的关键寄存器:
- TZSEL(选择寄存器):配置哪些TZ引脚对本ePWM模块有效,以及每个引脚是触发“周期循环”(CBC)故障还是“一次性”(OSHT)故障。CBC故障在每个PWM周期都会检查并动作,适合持续性的轻微故障;OSHT故障触发后需软件清除,适合严重的致命故障。
- TZCTL(控制寄存器):定义当故障发生时,EPWMxA和EPWMxB输出被强制为何种状态:高电平(FORCE_HI)、低电平(FORCE_LO)、高阻态(HIZ)或忽略(NO_CHANGE)。通常,对于半桥驱动,我们会将一对互补输出强制为低电平,确保功率管全部关断。
- TZFLG(标志寄存器):显示故障状态。
- TZCLR(清除寄存器):用于清除OSHT故障标志。
- TZEINT(中断使能寄存器):使能故障触发CPU中断,以便软件记录故障日志或进行恢复操作。
配置示例:配置ePWM1在TZ1引脚出现低电平(假设低有效)时,立即将EPWM1A和EPWM1B输出强制拉低,并产生中断。
ePWM1->TZSEL.bit.OSHT1 = 1; // 使能TZ1引脚的一次性故障保护 ePWM1->TZCTL.bit.TZA = TZ_FORCE_LO; // TZ故障时,EPWM1A强制拉低 ePWM1->TZCTL.bit.TZB = TZ_FORCE_LO; // EPWM1B强制拉低 ePWM1->TZEINT.bit.OST = 1; // 使能一次性故障中断安全警告:故障保护路径应尽可能“短”且“硬”。这意味着TZ引脚最好直接连接到比较器或专用保护芯片的输出,避免经过复杂的逻辑电路。配置TZ动作时,务必理解你的功率拓扑:强制输出为高或低,哪个是安全状态?对于典型的半桥,上下管同时为低是安全状态(关断)。同时,务必在软件中断中及时调查故障原因并清除标志,但重新使能PWM输出必须谨慎,确保故障条件已消除。
6.2 高分辨率PWM(HRPWM):突破数字精度极限
标准的ePWM分辨率受限于TBCLK的频率。例如,150MHz系统时钟下,37.5MHz的TBCLK提供的最小时间步进是26.67ns。对于需要微秒甚至纳秒级边沿调整的应用(如LLC谐振变换器、数字电源环路补偿),这不够精细。
HRPWM技术通过微边沿定位(MEP)打破了这一限制。它在常规的TBCLK“粗调”基础上,增加了一个基于延迟链的“微调”电路,可以将边沿定位精度提高到惊人的150-200ps量级(取决于具体器件)。
启用HRPWM的关键:
- 确认硬件支持:并非所有ePWM实例都包含HRPWM模块,需查阅芯片数据手册。
- 配置HRPWM控制寄存器(HRCNFG):选择MEP操作模式(控制占空比还是相位)、设置精度等。
- 使用扩展寄存器:对于需要高分辨率的CMPA或TBPHS,你需要使用其对应的高分辨率扩展寄存器:
CMPAHR(8位)和TBPHSHR(8位)。它们与原有的16位寄存器(CMPA, TBPHS)共同组成一个24位的值,其中高16位是粗调,低8位是微调。 - 计算微步值:MEP的微步值需要根据芯片的MEP标定因子(一个存储在特定ROM中的值)进行计算,通常TI会提供库函数(如
HRPWM_setMEPEdgePosition)来简化此过程。
使用心得:HRPWM虽然强大,但会引入额外的功耗和可能的不确定性(工艺、电压、温度变化会影响MEP延迟)。它最适合用于需要非常精细但相对静态或慢速调整的边沿位置。对于需要高速动态调制的场合,仍需依靠核心的TB和CC模块。在启用HRPWM前,务必仔细阅读芯片的HRPWM应用笔记,理解校准流程。
7. 常见问题排查与实战技巧
即使理解了所有寄存器,实际调试中仍会遇到各种问题。下面是一些常见问题的排查思路和实战技巧。
问题1:PWM完全没有输出。
- 检查顺序:GPIO复用配置 → 外设时钟使能(PCLKCRx) → TBCTL计数模式是否非FREEZE → TBCNT是否在变化 → AQCTL是否配置了动作(SET/CLEAR) → 输出引脚是否被其他功能覆盖(如TZ强制拉低)。
- 工具:使用CCS的寄存器实时查看和图形化显示工具(如Data Browser)监控TBCNT和CMPA的值,看它们是否按预期变化并产生匹配事件。
问题2:PWM频率或占空比不对。
- 计算复核:双重检查TBCLK分频比和TBPRD的计算公式,特别注意向上计数与向上-向下计数模式的区别。
- 影子寄存器陷阱:你是否写入了正确的寄存器?对于CMPA,如果你配置为影子模式(SHDWAMODE=1),则写入的是影子寄存器,活动寄存器可能还未更新。尝试改为立即加载模式(SHDWAMODE=0)测试,如果正常了,说明影子寄存器加载点配置有问题。
- 同步干扰:检查SYNCI输入是否被意外激活,导致计数器被复位或相位加载,打乱了自身的计数节奏。
问题3:中断无法进入或进入过于频繁。
- 标志位清理:这是最常见的原因。确保在ISR中第一件事就是清除ePWM模块的ETFLG标志(通过写ETCLR)和PIE���答位。
- 中断使能链:检查整个使能链:ET模块的INTEN位 → PIE控制器中对应ePWM中断的使能位(PIEIERx.y) → CPU级中断使能位(IER)。缺一不可。
- 分频设置:检查ETPS.INTPRD,确认你是否配置了事件分频。如果设为ET_3RD,却期待每个周期都进中断,那当然不行。
- 事件源选择:确认ETSEL.INTSEL选择的事件是否确实会发生。例如,在向上计数模式下选择ET_CTRD_CMPA(向下计数匹配CMPA),这个事件永远不会发生。
问题4:多个ePWM模块之间不同步。
- 同步链配置顺序:确保从主到从配置。主模块配置SYNCOUT源,从模块配置PHSEN和TBPHS。在所有模块静态配置完成后,通过一次软件同步(SWFSYNC)或等待第一个硬件同步事件来对齐它们。
- 相位寄存器值:TBPHS是24位寄存器(带HR扩展)。在设置相位偏移时,要确保写入的值在计数器计数范围内。例如,对于向上-向下计数,最大相位偏移不应超过TBPRD。
- 示波器测量:使用多通道示波器同时测量主从模块的PWM输出,观察其上升沿是否满足预期的相位关系。
问题5:启用死区后,波形异常。
- 极性配置:死区模块的输入是来自AQ的原始信号,输出是两路互补信号。DBCTL[POLSEL]位配置了这两路输出相对于输入信号的极性。务必根据你的功率级驱动芯片(是低电平有效还是高电平有效)来正确配置POLSEL,否则可能导致本该关闭的管子导通。
- 延迟值过大:DBRED(上升沿延迟)和DBFED(下降沿延迟)的值是以TBCLK为单位的。如果设置的值过大,超过了一半的有效脉冲宽度,会导致输出脉冲完全消失。计算死区时间时,需考虑功率管的最短开关时间。
掌握ePWM需要理论与实践紧密结合。最好的学习方式就是动手:从一个简单的通道开始,用示波器观察每一个配置改变带来的波形变化,逐步增加同步、死区、中断、故障保护等复杂功能。当你能够娴熟地驾驭这些寄存器,让它们按照你的意志精确协作时,你便真正掌握了在嵌入式世界中驾驭功率与运动的艺术。