C28x DSP ePWM模块深度解析:从核心原理到电机驱动实战配置

发布时间:2026/7/21 11:48:34
C28x DSP ePWM模块深度解析:从核心原理到电机驱动实战配置 1. 项目概述与ePWM核心价值如果你正在用德州仪器的C28x系列DSP做电机驱动、数字电源或者任何需要精确控制功率开关的活儿那你肯定绕不开它的增强型脉冲宽度调制模块也就是ePWM。这玩意儿可以说是整个数字控制系统的“心脏起搏器”它发出的PWM波形直接决定了你的MOS管或IGBT怎么开关进而控制了电机的转速、电源的输出电压电流。但很多朋友刚接触时面对手册里那一大堆寄存器——TBCTL、CMPA、AQCTLA、DBCTL——往往感觉无从下手配置出来的波形要么不对要么在关键时刻“打架”导致桥臂直通烧管子。我当年调试第一个三相逆变器时就吃过死区没配好的亏上电瞬间一阵青烟教训深刻。所以今天咱们不搞那些虚头巴脑的理论就扎扎实实地把C28x的ePWM模块掰开揉碎了讲清楚。它之所以叫“增强型”就是因为它不是一个简单的定时器加比较器而是一个高度模块化、可灵活配置的子系统。官方手册里把它分成了八个子模块时间基准TB、计数器比较CC、动作限定器AQ、死区DB、PWM斩波器PC、错误联防TZ、事件触发ET和数字比较DC。这八个模块像一条精密的流水线各司其职共同把CPU的一个设定值转换成安全、可靠、带死区互补、还能响应紧急关断的PWM波。理解这八个子模块怎么协同工作是你玩转C28x DSP进行电力电子控制的第一步。核心思路就是TB模块产生一个不断循环的“时间标尺”计数器CC模块在这个标尺上设定“动作点”比较值AQ模块决定到达动作点时输出脚要“做什么动作”置高、拉低、翻转而DB模块则为互补的上下管动作加上“安全间隔”死区防止同时导通。剩下的PC、TZ、ET、DC模块则是为了更高级的功能比如载波调制、故障保护、触发ADC采样等。接下来我们就一个模块一个模块地拆解我会结合我实际调试中踩过的坑和总结的技巧告诉你每个寄存器配置背后的“为什么”以及怎么配才能不出错。2. ePWM核心子模块深度解析与配置逻辑2.1 时间基准TB子模块一切节拍的起源时间基准子模块是整个ePWM的“时钟心脏”。它的核心是一个16位的计数器TBCTR和两个关键寄存器周期寄存器TBPRD和控制寄存器TBCTL。TBCTR在TBCLK的驱动下循环计数TBPRD则决定了它计数的上限也就是PWM的周期。2.1.1 计数模式与波形对称性TBCTL[CTRMODE]位决定了计数器的三种基本模式这直接影响了PWM波形的对称性和事件产生的时机递增模式Up-Count计数器从0开始加到TBPRD然后归零重启。这种模式产生非对称PWM。波形只在计数器递增时比较因此每个PWM周期内比较事件如CTRCMPA只发生一次。它的周期计算公式是Tpwm (TBPRD 1) * Ttbclk。这种模式简单常用于开关频率固定、对波形对称性要求不高的Buck、Boost等变换器。递减模式Down-Count计数器从TBPRD开始减到0然后重置为TBPRD重启。同样产生非对称PWM特性与递增模式类似。递增-递减模式Up-Down-Count计数器从0加到TBPRD再从TBPRD减回0如此循环。这种模式产生对称PWM中心对齐PWM。在计数过程中比较事件会在上升沿和下降沿各发生一次如果比较值在0和TBPRD之间。其周期计算公式为Tpwm 2 * TBPRD * Ttbclk。对称PWM有一个巨大优势它的谐波能量集中在开关频率的偶数倍附近更容易被滤波器滤除因此在电机驱动如SPWM、SVPWM中广泛应用能有效降低电机噪音和损耗。实操心得模式选择电机控制如FOC几乎无一例外使用递增-递减模式以获得对称波形。而对于简单的DC-DC变换器递增模式更直接。在TBCTL中设置CTRMODE2即为递增-递减模式。2.1.2 时钟预分频与频率计算TBCLK是TBCTR的计数时钟来源于系统时钟SYSCLKOUT。TBCTL中的HSPCLKDIV和CLKDIV位用于对系统时钟进行分频。例如系统时钟150MHz若HSPCLKDIV0/1CLKDIV1/2则TBCLK 150MHz / 2 75MHz。 假设我们设计一个开关频率为20kHz的电机驱动器采用递增-递减模式选择TBCLK 75MHz则Ttbclk 1/75MHz ≈ 13.333ns。周期Tpwm 1/20kHz 50us。根据公式TBPRD Tpwm / (2 * Ttbclk) 50us / (2 * 13.333ns) ≈ 1875。 我们向TBPRD寄存器写入1875即可。实际计算时要注意TBPRD是整数可能会有一点频率误差需评估是否可接受。2.1.3 影子寄存器与同步机制这是ePWM高级且易出错的地方。TBPRD、CMPA等关键寄存器都有“影子寄存器”机制。你可以理解为“双缓冲”软件平时修改的是影子寄存器硬件在某个安全的时刻如CTR0或CTRPRD自动将影子寄存器的值拷贝到“活动寄存器”中生效。这完美避免了在PWM周期中间修改参数导致的波形毛刺或畸变。 对于TBPRD由TBCTL[PRDLD]位控制0为影子模式在CTR0时加载1为立即加载模式。在电机控制这种需要在线改变频率弱磁区或电压的场合必须使用影子模式。多个ePWM模块的同步是构建多相系统如三相逆变器的关键。ePWM1的EPWM1SYNCI通常接外部引脚或内部信号其EPWM1SYNCO输出给ePWM2的EPWM2SYNCI以此链式同步。通过设置TBCTL[PHSEN]1并写入TBPHS寄存器可以精确设置从模块相对于主模块的相位差。例如在三相逆变器中设置ePWM2、ePWM4的相位寄存器TBPHS分别为TBPRD/3和2*TBPRD/3即可实现三路PWM互差120度电角度。避坑指南同步与时钟启动顺序错误的顺序会导致同步失败正确的初始化顺序是a) 使能各ePWM模块时钟PCLKCRxb)将TBCLKSYNC位清零停止所有TBCLKc) 配置所有ePWM模块的TB、CC等参数d)最后将TBCLKSYNC位置1让所有模块的TBCLK同步启动。跳过步骤b和d是常见错误。影子寄存器更新时机在递增-递减模式下CTRPRD和CTR0都会发生。如果你在CTRPRD时更新CMPA影子寄存器并在CTR0时加载那么在新的周期开始时占空比就立即改变了。这需要与你控制算法的计算时机紧密配合。2.2 计数器比较CC子模块占空比的设定者时间基准模块画好了时间格子计数器比较模块的工作就是在特定的格子上做标记。这些标记就是比较事件它们是改变PWM输出状态的直接依据。2.2.1 比较寄存器与事件生成CC子模块核心是四个比较寄存器CMPA,CMPB,CMPC,CMPD。CMPA和CMPB是主力直接用于生成控制占空比的主要事件CTRCMPA和CTRCMPB并送给动作限定器AQ模块。CMPC和CMPD是ePWM类型2模块新增的主要用于触发ADC采样等辅助事件不直接参与主PWM生成。 以最常用的CMPA为例在递增-递减模式下当TBCTR值等于CMPA中设定的值时硬件就会产生一个CTRCMPA事件。这个事件会发送给AQ模块。2.2.2 占空比计算占空比Duty Cycle的计算与TB的计数模式强相关递增-递减模式对称PWM占空比 CMPA / TBPRD。例如TBPRD1000想要50%占空比则设置CMPA500。此时CTRCMPA事会在计数器上升到500和下降到500时各发生一次。递增模式非对称PWM占空比 CMPA / (TBPRD 1)。因为计数器从0计数到TBPRD共有TBPRD1个计数状态。2.2.3 CMPA/CMPB的影子寄存器与加载模式和TBPRD一样CMPA和CMPB也有影子寄存器由CMPCTL[SHDWAMODE]和[SHDWBMODE]控制。在影子模式下加载时机由CMPCTL[LOADAMODE]和[LOADBMODE]精细控制LOADAMODE0在CTRPRD时将CMPA影子寄存器的值加载到活动寄存器。LOADAMODE1在CTR0时加载。LOADAMODE2在CTRPRD或CTR0时加载即每个PWM周期加载两次。LOADAMODE3禁止由计数器事件加载只能通过软件同步事件或全局同步LOADASYNC加载。核心技巧加载时机的选择在电机控制中我们通常采用空间矢量脉宽调制SVPWM。计算出的三个比较值CMPA,CMPB,CMPC对应三相占空比需要在同一个PWM周期开始前全部更新到位否则会导致三相波形不对称引起转矩脉动。因此最稳妥的设置是LOADAMODE1CTR0时加载。这样你在上一个PWM周期的任何时间计算并更新影子寄存器都会在下一个周期开始时CTR0统一生效确保了三相动作的严格同步。LOADBMODE也同理设置。2.3 动作限定器AQ子模块输出行为的导演CC模块发出了“时间到”的信号事件但具体让输出引脚EPWMxA和EPWMxB做什么则由动作限定器模块决定。AQ模块是连接事件与物理输出的最终决策层。2.3.1 事件与动作的映射AQ模块为每个输出EPWMxA和EPWMxB独立定义了一组规则规定在特定事件发生时输出应该执行什么动作。主要事件源包括CTRCMPA和CTRCMPB来自CC模块。CTRPRD和CTRZERO来自TB模块。CTR_dir计数方向信号上升/下降。动作类型包括置高Set将输出强制设为高电平。拉低Clear将输出强制设为低电平。翻转Toggle输出电平反转。无操作Do Nothing。配置寄存器是AQCTLA控制A输出和AQCTLB控制B输出。每个寄存器里都有针对上述事件的配置位域。例如AQCTLA中的CBD1表示在CTRCMPB且计数器递减时对EPWMxA执行CBD位域定义的动作可能是置高或拉低。2.3.2 生成互补对称PWM波形这是最经典的配置用于驱动一个半桥的上下管。假设我们使用EPWMxA作为上管驱动EPWMxB作为下管驱动采用递增-递减模式。TB配置TBPRD1000CTRMODE2递增-递减。CC配置CMPA300假设占空比30%。AQ配置核心对于EPWMxA上管AQCTLA中设置ZRO1CTR0时动作。因为计数器从0开始递增我们希望上管在周期开始时开启。所以ZRO1对应动作设为置高Set。AQCTLA中设置CAU1CTRCMPA且计数器递增时动作。当计数器递增到CMPA(300)时我们希望关闭上管。所以CAU1对应动作设为拉低Clear。对于EPWMxB下管与上管互补AQCTLB中设置PRD1CTRPRD时动作。计数器到达峰值TBPRD(1000)后开始递减我们希望下管在此时开启。所以PRD1对应动作设为置高Set。AQCTLB中设置CBD1CTRCMPA且计数器递减时动作。当计数器递减回CMPA(300)时我们希望关闭下管。所以CBD1对应动作设为拉低Clear。这样我们就得到了两路中心对称、互补的PWM波。EPWMxA高电平区间是从0到300计数上升段EPWMxB高电平区间是从1000到300计数下降段。但注意此时上下管的高电平区间有重叠在计数器等于300的时刻上下管理论上会同时切换这会导致桥臂直通必须引入死区2.4 死区DB子模块安全卫士死区模块是保证功率电路安全的绝对关键环节。它的作用是在互补的两路PWM信号EPWMxA和EPWMxB中插入一个极短的时间延迟确保在任何情况下上下两个开关管不会同时导通即“共通”避免短路烧毁。2.4.1 死区工作原理DB模块接收来自AQ模块的原始信号EPWMxA和EPWMxB经过处理后输出带死区的信号EPWMxA_OUT和EPWMxB_OUT给到芯片引脚。它提供两种主要的延迟模式上升沿延迟在信号从低变高时插入一段可编程的延迟时间。下降沿延迟在信号从高变低时插入一段可编程的延迟时间。通常我们采用主动高有效的PWM驱动高电平开通开关管。那么死区策略就是让开通动作延迟让关断动作立即执行。即对上管的开通EPWMxA上升沿和下管的开通EPWMxB上升沿分别插入延迟。2.4.2 寄存器配置与计算死区模块由DBCTL寄存器控制。关键配置如下OUT_MODE: 选择输出模式。常用0x3即EPWMxA通道使用延迟上升沿EPWMxB通道使用延迟上升沿且两路输出极性不变。POLSEL: 选择哪路信号作为延迟的输入源。通常设为0x0或0x3让两路独立处理。IN_MODE: 选择输入源。通常设为0x0表示EPWMxA和EPWMxB来自AQ模块的输出。RED和FED: 这是两个关键的10位寄存器分别设置上升沿延迟和下降沿延迟的时钟周期数。在主动高有效的互补PWM中我们主要使用上升沿延迟RED。下降沿延迟FED通常设为0。死区时间计算死区时间Tdead RED * Ttbclk。例如Ttbclk13.333ns要插入500ns的死区则RED 500ns / 13.333ns ≈ 37.5取整为38。实际死区时间Tdead 38 * 13.333ns ≈ 506.7ns。致命陷阱与排查技巧死区时间不足这是最危险的。死区时间必须大于功率器件的“存储时间”和驱动电路的“关断延迟”之和。对于IGBT通常需要几百纳秒到几微秒对于MOSFET可以小一些。一定要根据器件手册计算并留有余量。调试时务必用示波器同时测量上下管的驱动波形确认存在死区。极性配置错误如果你的驱动电路是低电平有效如很多隔离驱动芯片那么DBCTL[OUT_MODE]和AQCTL中的动作设置就需要反过来。务必根据实际硬件驱动逻辑来配置否则死区会加错边依然导致直通。影子寄存器RED和FED也有影子寄存器由DBCTL[SHDWDBREDMODE]和[SHDWDBFEDMODE]控制。在线修改死区时间时务必使用影子模式并在安全时刻如CTR0加载避免死区时间在波形中间突变。2.5 错误联防TZ子模块紧急制动系统TZ模块是系统的硬件安全屏障。当外部故障信号如过流、过压、过热触发时它能以最短的硬件路径不经过CPU强制改变PWM输出状态保护系统。2.5.1 故障信号与动作C28x通常有多个TZ输入引脚如TZ1~TZ3。可以配置为高电平有效或低电平有效。当故障发生时可以配置ePWM输出立即采取以下动作之一高阻态Hi-Z立即关闭所有驱动让功率管自然关断。这是最安全的但可能导致感性负载产生高压。强制高Force Hi将输出强制拉高。在某些拓扑中如主动钳位可能需要将某个管子强制开通。强制低Force Lo将输出强制拉低。这是最常用的直接关闭所有开关管。不动作忽略故障危险。配置寄存器是TZCTL。例如TZCTL[TZA]2表示当TZ事件发生时将EPWMxA输出强制拉低。2.5.2 单次触发与周期循环TZSEL寄存器用于选择哪些TZ信号能触发本模块的故障响应。TZCTL决定了触发后的输出动作。TZEINT寄存器使能故障中断以便CPU记录故障原因。TZFLG和TZCLR是标志位和清除位。 故障响应模式有两种单次触发One-Shot故障发生后ePWM输出被锁存在TZCTL设定的状态直到软件手动清除TZFLG标志位后才会恢复。用于严重故障。周期循环Cycle-By-Cycle故障发生后ePWM输出在本PWM周期内被强制但下一个PWM周期会自动恢复。如果故障信号依然存在则再次强制。这种模式适用于逐周期限流保护。工程实践TZ配置步骤TZSEL选择故障源例如将过流比较器的输出接到TZ1并在此选择TZ1。TZCTL设定动作例如TZA和TZB都设为强制低2。TZEINT使能OST或CBC中断以便在故障发生时进入ISR进行故障处理如关闭其他外设、记录日志。TZCLR在中断服务程序中根据模式清除相应的标志位OSTFLG或CBCFLG。务必在初始化时就配置好TZ并在主循环开始前使能。它是最后一道安全防线。2.6 事件触发ET与数字比较DC子模块精准的时序协作者这两个模块用于实现更高级的同步和触发功能。2.6.1 事件触发ET模块ET模块负责管理ePWM内部事件与CPU中断、ADC启动转换之间的映射。它就像一个“事件路由器”。中断触发可以将CTRPRD、CTRZERO、CTRCMPA、CTRCMPB等事件配置为触发PIE中断EPWMx_INT。例如在电机FOC控制中我们常在CTRZERO中心点或CTRPRD峰值点触发中断在中断服务程序中执行电流采样和新的SVPWM计算。ADC启动SOC触发可以配置EPWMx_SOCA和EPWMx_SOCB信号来触发ADC开始转换。这是实现同步采样的关键。例如配置在CTRCMPB事件时触发ADC采样可以精准地在PWM波形的特定时刻如开关管中点对电流进行采样避开开关噪声。配置寄存器主要是ETSEL选择触发源和ETPS设置预分频即每N次事件才触发一次。ETFLG和ETCLR用于标志位管理。2.6.2 数字比较DC模块DC模块是ePWM类型2中的增强功能它允许将外部数字信号如另一个比较器COMPxOUT的输出或经过滤波的TZ信号直接与TBCTR计数器的值进行比较从而产生更灵活的事件。事件生成例如可以配置当TBCTR的值在某个窗口内DCACTL配置且外部COMP1OUT为高时产生一个DCAEVT1事件。事件用途这个DCAEVT1事件可以像普通的CTRCMPx事件一样被送到AQ模块去控制PWM输出实现基于电流阈值的逐周期限流或者被送到TZ模块作为故障源也可以被送到ET模块去触发中断或ADC。DC模块实现了硬件层面的快速响应闭环比软件判断快得多对于需要超高动态响应的保护或控制场景至关重要。3. 完整ePWM配置流程与代码实例下面以一个典型的电机控制用ePWM1模块初始化为例配置为中心对齐互补PWM带死区并启用CTRZERO中断用于FOC计算。3.1 配置步骤分解时钟与同步初始化// 1. 使能ePWM1模块时钟 SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC 0; // 先停止所有TBCLK SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK 1; // 使能EPWM1时钟 DELAY_US(10); // 短暂延时时间基准TB子模块配置// 配置为递增-递减模式产生对称PWM EPwm1Regs.TBCTL.bit.CTRMODE TB_COUNT_UPDOWN; // 设置时钟预分频HSPCLKDIV /1, CLKDIV /2 EPwm1Regs.TBCTL.bit.HSPCLKDIV TB_HSPCLKDIV_1; EPwm1Regs.TBCTL.bit.CLDIV TB_CLKDIV_2; // 假设系统时钟150MHz则TBCLK75MHz // 设置PWM频率为20kHzTBPRD Fclk/(2*Fpwm) 75e6/(2*20000) 1875 EPwm1Regs.TBPRD 1875; // 使能影子寄存器在CTR0时加载 EPwm1Regs.TBCTL.bit.PRDLD TB_SHADOW; // 相位寄存器清零作为主模块 EPwm1Regs.TBPHS.half.TBPHS 0; // 禁止相位加载主模块忽略同步输入 EPwm1Regs.TBCTL.bit.PHSEN TB_DISABLE; // 设置同步输出源为CTRZero用于同步后续模块 EPwm1Regs.TBCTL.bit.SYNCOSEL TB_SYNC_OUT_CTR_ZERO;计数器比较CC子模块配置// 初始化占空比为0 EPwm1Regs.CMPA.half.CMPA 0; EPwm1Regs.CMPB 0; // 配置CMPA影子寄存器在CTR0时加载确保三相同步更新 EPwm1Regs.CMPCTL.bit.SHDWAMODE CC_SHADOW; EPwm1Regs.CMPCTL.bit.LOADAMODE CC_CTR_ZERO; // 配置CMPB同理 EPwm1Regs.CMPCTL.bit.SHDWBMODE CC_SHADOW; EPwm1Regs.CMPCTL.bit.LOADBMODE CC_CTR_ZERO;动作限定器AQ子模块配置// 配置EPWM1A (上管等效输出) // 在CTR0时置高在CTRCMPA且递增时拉低 EPwm1Regs.AQCTLA.bit.ZRO AQ_SET; EPwm1Regs.AQCTLA.bit.CAU AQ_CLEAR; // 配置EPWM1B (下管等效输出) // 在CTRPRD时置高在CTRCMPA且递减时拉低 EPwm1Regs.AQCTLB.bit.PRD AQ_SET; EPwm1Regs.AQCTLB.bit.CBD AQ_CLEAR;死区DB子模块配置// 使能死区模块 EPwm1Regs.DBCTL.bit.OUT_MODE DB_FULL_ENABLE; // 两路均使能上升沿延迟 EPwm1Regs.DBCTL.bit.POLSEL DB_ACTV_HIC; // 主动高互补模式 EPwm1Regs.DBCTL.bit.IN_MODE DBA_ALL; // 输入源为EPWMxA和EPWMxB // 设置死区时间假设需要500nsTtbclk13.333ns, RED 500/13.333 ≈ 38 EPwm1Regs.DBRED 38; EPwm1Regs.DBFED 0; // 下降沿延迟设为0 // 使能影子寄存器 EPwm1Regs.DBCTL.bit.SHDWDBREDMODE DB_SHDW_ENABLE; EPwm1Regs.DBCTL.bit.SHDWDBFEDMODE DB_SHDW_ENABLE;错误联防TZ子模块配置// 选择TZ1作为故障源 EPwm1Regs.TZSEL.bit.OSHT1 1; // 配置TZ故障时将EPWM1A和1B都强制拉低 EPwm1Regs.TZCTL.bit.TZA TZ_FORCE_LO; EPwm1Regs.TZCTL.bit.TZB TZ_FORCE_LO; // 使能单次触发中断 EPwm1Regs.TZEINT.bit.OST 1;事件触发ET子模块配置// 使能CTRZero事件触发中断 EPwm1Regs.ETSEL.bit.INTEN 1; // 使能中断 EPwm1Regs.ETSEL.bit.INTSEL ET_CTR_ZERO; // 选择CTRZero为中断源 EPwm1Regs.ETPS.bit.INTPRD ET_1ST; // 每个事件都触发中断启动时钟与使能// 最后启动所有ePWM的时基时钟 SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC 1;3.2 中断服务程序ISR示例在PIE中配置好ePWM1的INT中断后在ISR中需要清除标志位并执行控制算法。__interrupt void epwm1_isr(void) { // 1. 清除ePWM1中断标志 EPwm1Regs.ETCLR.bit.INT 1; // 2. 清除PIE组标志位 (假设ePWM1在PIE组3) PieCtrlRegs.PIEACK.all PIEACK_GROUP3; // 3. 在此处执行FOC控制算法 // - 读取ADC采样结果电流、电压 // - 运行Clarke/Park变换、PI调节器、反Park变换、SVPWM // - 计算新的CMPA、CMPB值对应新的占空比 // - 更新CMPA和CMPB的影子寄存器 // 例如EPwm1Regs.CMPA.half.CMPA new_cmpa; // 4. 如果需要处理TZ故障标志 if (EPwm1Regs.TZFLG.bit.OST 1) { // 处理过流等障 EPwm1Regs.TZCLR.bit.OST 1; // 清除OST标志 } }4. 高级应用与疑难问题排查4.1 多模块同步与相移控制在三相逆变器中需要三个相位互差120度的PWM。假设使用ePWM1, 2, 4驱动三相。配置主模块ePWM1如上文所述设置SYNCOSELCTR_ZERO。配置从模块ePWM2, ePWM4时钟分频与TBPRD与主模块完全一致。设置TBCTL[PHSEN]1使能从模块相位加载。设置EPWMxSYNCI信号源通常来自前一级的SYNCO。计算并设置相位寄存器TBPHS。对于ePWM2B相电角度滞后主模块120度。在递增-递减模式下一个完整的电气周期对应计数器从0到TBPRD再到0。因此120度相位差对应的计数值偏移为(120/360) * TBPRD * 2 (2/3) * TBPRD。因为是对称模式一个完整周期是2*TBPRD个计数。所以TBPHS (int)( (2.0/3.0) * (float)TBPRD );。对于ePWM4C相滞后240度或超前120度TBPHS (int)( (4.0/3.0) * (float)TBPRD );或等效的(int)( -(2.0/3.0) * (float)TBPRD )注意处理负数取模。4.2 高频PWM与HRPWM当开关频率很高如500kHz或需要极高分辨率时标准的16位计数器可能不够。C28x的HRPWM高分辨率PWM模块通过微边沿定位器MEP技术可以将PWM边沿的调节精度提高到约150ps级别。这需要使用支持HRPWM的ePWM模块和引脚。配置HRCNFG寄存器使能HRPWM。使用CMPAHR和TBPRDHR等扩展寄存器来设置高分辨率部分。注意MEP步长与系统时钟和TBCLK的关系进行校准。4.3 常见问题排查速查表现象可能原因排查步骤无PWM输出1. ePWM模块时钟未使能。2.TBCLKSYNC未置1。3. 输出引脚未配置为ePWM功能GPIO MUX。4. AQ模块未配置任何动作。1. 检查PCLKCR1寄存器对应位。2. 检查TBCLKSYNC位启动顺序。3. 检查GPIOxMUX和GPIOxGMUX寄存器。4. 检查AQCTLA/B是否配置了SET或CLEAR动作。PWM频率不对1.TBPRD计算错误。2. 计数模式CTRMODE选择错误。3.TBCLK分频设置HSPCLKDIV/CLKDIV错误。1. 复核频率计算公式和系统时钟。2. 确认模式递增/递减模式公式含1递增-递减模式是2*TBPRD。3. 用示波器测量频率反推TBCLK。占空比不可控或不变1.CMPA值大于TBPRD。2.CMPA影子寄存器未正确加载LOADAMODE。3. AQ模块事件-动作映射错误。1. 确保CMPATBPRD。2. 检查CMPCTL[SHDWAMODE]和[LOADAMODE]。3. 在调试器中单步检查CMPA活动寄存器的值是否更新。4. 核对AQCTL配置特别是CAU/CAD与计数方向的关系。互补波形有重叠无死区1. 死区模块未使能DBCTL[OUT_MODE]0。2. 死区时间RED/FED设置为0。3. 输出极性POLSEL配置错误。1. 检查DBCTL寄存器配置。2. 计算并设置合适的RED值。3.务必用示波器双通道测量最终驱动波形确认死区存在。中断不触发1. PIE中断未使能或向量表配置错误。2. ePWM的ET模块中断未使能ETSEL[INTEN]。3. 中断标志未清除导致后续中断被屏蔽。1. 检查PIE相关寄存器PIEIER,PIEACK。2. 检查ETSEL和ETPS配置。3. 在ISR中首先清除ETCLR.INT和相应的PIEACK位。TZ故障保护不动作1. TZ输入引脚未正确配置或故障信号未产生。2.TZSEL未选择正确的故障源。3.TZCTL未配置强制动作。4. 输出引脚被GPIO MUX覆盖。1. 检查TZ引脚配置和外部故障电路。2. 检查TZSEL寄存器。3. 检查TZCTL寄存器动作设置。4. 确保ePWM输出优先级高于GPIO。调试ePWM最有力的工具就是示波器。一定要养成习惯将关键的内部信号如CTRPRD,CTRCMPA通过EPWMxSOCA/SOCB触发ADC的功能暂时改为输出到GPIO或者直接观察最终的EPWMxA/B输出波形结合寄存器值进行比对分析。从时间基准TB的波形是否正常开始逐步向后级排查是定位问题的有效方法。