1. 项目概述在嵌入式电机控制、数字电源转换这些对时序要求极其苛刻的领域PWM脉冲宽度调制信号的精度和同步性直接决定了整个系统的性能上限。我们经常需要多个PWM通道协同工作比如驱动三相电机或者控制一个多相交错并联的DC-DC变换器。这时候一个最基础也是最关键的问题就摆在了面前如何确保所有PWM通道的“心跳”——也就是它们的时间基准计数器——完全同步步调一致如果各自为政哪怕只有几个时钟周期的相位差都可能导致电流波形畸变、效率下降甚至引发严重的电磁干扰和系统不稳定。这就是时间基准同步和计数器比较这两个核心机制的价值所在。它们不是孤立的功能而是构成高精度、高可靠性PWM系统的基石。时间基准同步解决了“何时开始”的问题确保所有通道的计数器从同一个起点、以相同的节奏运行而计数器比较则解决了“在何时做什么动作”的问题它像一个精准的闹钟在计数器到达预设值时触发输出翻转从而精确控制PWM波形的每一个边沿。本文将以德州仪器TIC2000系列微控制器中广泛使用的增强型高分辨率脉宽调制器eHRPWM我们通常简称为ePWM模块为例深入剖析这两个子模块的工作原理。我不会仅仅停留在数据手册的翻译层面而是结合我多年在电机驱动和电源项目中的实际调试经验带你理解寄存器配置背后的设计逻辑分享如何避开那些数据手册里不会明说、但实际开发中一定会遇到的“坑”。无论你是正在学习ePWM的新手还是希望优化现有同步架构的资深工程师相信这些从实战中提炼出的细节都能给你带来启发。2. 时间基准同步构建全局统一的“时钟心跳”想象一下你要指挥一个乐队演奏。如果每个乐手都有自己的节拍器且起步时间略有不同那演奏效果可想而知。在ePWM系统中每个ePWM模块如ePWM1, ePWM2, ePWM3...都内置了一个独立的16位时间基准计数器TBCNT它就是每个PWM通道的“私有节拍器”。时间基准同步机制的目的就是让所有这些“私有节拍器”听从同一个指挥实现全局同步。2.1 同步信号链EPWMxSYNCI与EPWMxSYNCOePWM模块的同步机制设计得非常巧妙且灵活它通过两个关键信号构建了一个单向的同步链EPWMxSYNCI (Synchronization Input)同步输入信号。当模块检测到这个信号的上升沿时可以触发其内部计数器TBCNT进行一次同步操作如加载相位值。EPWMxSYNCO (Synchronization Output)同步输出信号。该信号可以由模块内部产生并输出给下游的其他ePWM模块作为其EPWMxSYNCI。典型的连接方式如图1所示基于常见实践补充。ePWM1的同步输入EPWM1SYNCI通常连接到一个外部引脚由外部时钟源或另一个主设备提供起始同步脉冲。ePWM1在内部处理完同步事件后可以生成一个同步输出脉冲EPWM1SYNCO这个脉冲直接连接到ePWM2的同步输入EPWM2SYNCI。同理ePWM2的同步输出EPWM2SYNCO可以连接到ePWM3的同步输入EPWM3SYNCI以此类推形成一个“菊花链”。外部同步源 -- EPWM1SYNCI -- ePWM1模块 -- EPWM1SYNCO -- EPWM2SYNCI -- ePWM2模块 -- EPWM2SYNCO -- ...这种链式结构的好处是显而易见的你可以灵活地将任意数量的ePWM模块串联起来形成一个同步组。ePWM1可以作为整个组的“主模块”Master其后的模块均为“从模块”Slave。所有从模块的计数器都可以与主模块对齐。实操心得同步链的延迟考量虽然这种硬件链式同步非常可靠但你需要意识到信号在模块间传递会引入一个TBCLK时间基准时钟周期的延迟。这意味着ePWM2的计数器会比ePWM1晚一个TBCLK周期同步ePWM3会比ePWM2再晚一个周期。在大多数应用中这个固定延迟是已知且可接受的你可以通过调整从模块的相位偏移寄存器TBPHS来进行补偿。但在对相位对齐要求极端严格的场合如多相交错并联电源要求各相严格相差180°/N可能需要考虑使用其他同步方案或者确保所有模块使用相同的TBCLK分频设置以最小化抖动。2.2 同步事件的处理相位加载与计数器方向当一个ePWM模块在其EPWMxSYNCI引脚上检测到同步脉冲或由软件强制产生同步脉冲时具体会发生什么完全由时间基准控制寄存器TBCTL中的两个关键位决定PHSEN相位使能和PHSDIR同步后计数方向。2.2.1 相位加载PHSENTBCTL[PHSEN]位控制模块是否响应同步输入。当PHSEN 1时模块使能相位加载功能。此时在下一个有效的TBCLK边沿模块会将其相位寄存器TBPHS的值直接加载到时间基准计数器TBCNT中。这个操作是瞬间完成的即TBPHS → TBCNT。这个功能极其强大它允许你精确地设置从模块相对于主模块的相位差。例如在一个三相逆变器中你需要三路PWM互差120度。你可以将ePWM1设为主模块TBPHS0。ePWM2的TBPHS设置为TBPRD/3假设为向上计数模式ePWM3的TBPHS设置为2*TBPRD/3。当同步脉冲到来时三个模块的TBCNT分别被加载为0、TBPRD/3、2*TBPRD/3从而自然产生120度的相位差。如果PHSEN 0模块将忽略同步脉冲不会加载TBPHS值。但请注意同步脉冲仍然可以通过模块从其EPWMxSYNCO输出继续同步下游模块。这允许你构建一个混合网络部分模块与主模块严格同步启用PHSEN部分模块仅作为同步信号的中继站禁用PHSEN独立运行。2.2.2 同步后的计数方向PHSDIRTBCTL[PHSDIR]位仅在上下计数模式Up-Down-Count Mode下生效。它决定了在同步事件发生后计数器应立即开始计数的方向。PHSDIR 0同步后向下计数。PHSDIR 1同步后向上计数。这个功能对于生成中心对称的PWM波形尤为重要。在上下计数模式下计数器从0向上计数到周期值TBPRD再向下计数回0如此循环。同步事件可能发生在计数周期的任意时刻。PHSDIR位确保了无论同步发生在何时同步后所有模块都能立即以预设的、统一的方向开始计数这对于保持波形的对称性和一致性至关重要。如果没有这个控制同步后计数器可能延续之前的方向导致不同模块的波形不对称。注意事项模式限制PHSDIR位仅在上下计数模式下有意义。在向上计数或向下计数模式下计数方向是固定的TBPHS寄存器的值在同步时会被忽略。在这两种模式下同步事件发生时计数器会被清零。这是很多初学者容易混淆的地方在非上下计数模式下你无法通过TBPHS设置相位偏移同步仅仅起到“对齐到零”的作用。2.3 软件强制同步与全局时钟同步除了硬件同步链ePWM还提供了两种重要的同步控制手段。2.3.1 软件强制同步SWFSYNC通过向TBCTL[SWFSYNC]位写1可以立即产生一个软件强制同步脉冲。这个脉冲在功能上与从EPWMxSYNCI引脚输入的硬件同步脉冲完全等效也会触发相同的相位加载逻辑如果PHSEN使能。软件同步为你提供了极大的灵活性你可以在程序运行的任意时刻动态地新同步所有ePWM模块例如在改变PWM频率或相位关系之后。2.3.2 全局时间基准时钟同步TBCLKSYNC这是另一个层次、且更为根本的同步。之前讨论的同步是计数器值TBCNT的同步而TBCLKSYNC位位于系统模块的CFGCHIP1寄存器中控制的是所有ePWM模块的时间基准时钟TBCLK的启动对齐。ePWM模块的TBCLK来源于系统时钟SYSCLK经过分频由TBCTL中的HSPCLKDIV和CLKDIV控制。即使两个模块的分频设置相同它们内部时钟电路的启动时间也可能有细微差别。TBCLKSYNC位就是为了消除这个启动偏差。正确的配置流程如下使能所有需要用到的ePWM模块的时钟。将TBCLKSYNC位清零0。这个操作会停止所有已使能ePWM模块内部的TBCLK。此时安全地配置各个ePWM模块的TBCTL寄存器设置你需要的计数模式CTRMODE、分频器HSPCLKDIV CLKDIV等。因为时钟已停止所以不会产生意外的PWM边沿。将TBCLKSYNC位置11。这个上升沿会同时启动所有ePWM模块的TBCLK确保它们的第一个时钟边沿是严格对齐的。避坑指南TBCLKSYNC的使用时机务必在配置ePWM模块之前将TBCLKSYNC清零在配置完成之后再将其置1。如果你在模块运行时TBCLK正在跳动更改分频器或计数模式可能会导致计数器出现毛刺或不可预测的行为进而产生错误的PWM输出这在电机驱动中可能导致桥臂直通损坏功率管。一个黄金法则是任何对TBCTL寄存器关键位的修改都应在TBCLK停止TBCLKSYNC0的情况下进行。3. 计数器比较子模块PWM波形生成的“雕刻刀”时间基准同步确保了所有PWM通道有统一的时间标尺而计数器比较CC子模块则是利用这把标尺在精确的时刻“雕刻”出PWM波形边沿的核心工具。它的工作原理直观而优雅持续将时间基准计数器TBCNT的当前值与两个可编程的比较寄存器——CMPA和CMPB——进行比对当匹配发生时即TBCNT CMPA或TBCNT CMPB时产生一个“比较匹配”事件。3.1 影子寄存器机制实现无毛刺动态调整在电机控制这类实时性要求极高的应用中我们经常需要在PWM周期运行过程中动态调整占空比即修改CMPA/CMPB的值。如果软件直接写入正在被硬件使用的“活跃寄存器”Active Register而写入操作恰好发生在计数器匹配的瞬间就可能造成一个PWM周期内比较值不一致导致输出脉宽出现异常一个周期过宽或过窄即所谓的“毛刺”。为了防止这种情况ePWM的CC子模块引入了影子寄存器Shadow Register机制。如图2所示每个比较寄存器CMPA和CMPB都对应一个影子寄存器。软件平时更新的是影子寄存器而硬件实际进行比较操作使用的是活跃寄存器。影子寄存器向活跃寄存器加载的时机由计数器比较控制寄存器CMPCTL中的LOADAMODE和LOADBMODE位精确控制。通常有两种安全的加载点CTR PRD在计数器达到周期值TBCNT TBPRD时加载。CTR 0在计数器归零TBCNT 0x0000时加载。CTR PRD or CTR 0在上述两个时刻都加载较少用。以最常见的上下计数模式、在CTR0时加载为例在一个PWM周期开始时TBCNT0影子寄存器中的新值被安全地拷贝到活跃寄存器。随后在整个当前周期内硬件都使用这个新的、稳定的值进行比较生成PWM边沿。软件可以在本周期内的任何时间通常是在中断服务程序中从容地计算并更新下一个周期所需的CMPA/CMPB值写入影子寄存器等待下一个CTR0时刻生效。这样就实现了占空比的无缝、无毛刺切换。实操心得影子寄存器的开关CMPCTL中的SHDWAMODE和SHDWBMODE位用于使能或禁用对应通道的影子寄存器功能。默认是使能的影子模式。在极少数对实时性有极端要求、且能确保软件写入与硬件读取不会冲突的场景例如使用DMA自动更新寄存器你可以将其设置为“立即加载模式”Immediate Load Mode。此时对CMPA/CMPB寄存器的写入会直接进入活跃寄存器立即生效。除非你非常清楚自己在做什么否则强烈建议保持影子寄存器使能这是保证PWM输出稳定的第一道防线。3.2 不同计数模式下的比较事件行为CC子模块的行为与时间基准计数器TBCNT的工作模式紧密耦合。理解这一点对正确配置PWM至关重要。向上计数模式Up-Count计数器从0线性增加到TBPRD然后归零重启。CTR CMPA和CTR CMPB事件在每个周期内各发生一次。适用于生成非对称PWM边沿对齐PWM。这是最常见的简单PWM生成方式。向下计数模式Down-Count计数器从TBPRD线性减少到0然后重置为TBPRD重启。同样CTR CMPA和CTR CMPB事件在每个周期内各发生一次。也生成非对称PWM但波形相位与向上计数模式相反。上下计数模式Up-Down-Count计数器从0上数到TBPRD然后下数回0如此循环。这是功能最丰富的模式。CTR CMPA和CTR CMPB事件在每个周期内可能发生两次一次在上升沿匹配CAU, CBU一次在下降沿匹配CAD, CBD。适用于生成对称PWM中心对齐PWM。这种波形关于中心点对称其谐波特性更好在电机控制和电源应用中能显著降低电磁干扰EMI。这里有一个关键细节在上下计数模式下如果比较值CMPA/CMPB等于0或等于TBPRD那么比较事件在每个周期只发生一次因为上数和下数经过同一个值只匹配一次。如果比较值介于0和TBPRD之间则比较事件会发生两次。3.3 同步事件对比较逻辑的影响这是一个容易被忽略但非常重要的角落案例。当同步输入事件EPWMxSYNCI发生时它会立即将TBPHS的值加载到TBCNT中如果PHSEN使能。这个“跳变”可能会导致一个潜在的后果预期的比较事件被跳过。参考图3的波形示例假设计数器正在向上计数当前值接近CMPA。此时一个同步脉冲到来TBCNT被瞬间加载为一个远小于CMPA的值例如0。那么在本周期内计数器从新值开始增长可能永远也达不到原本预期的CMPA值因此CTR CMPA事件就不会发生。数据手册明确指出这种行为是正常的软件必须考虑到这一点。在你的中断服务程序或事件处理逻辑中不能绝对依赖每一个周期都必然发生比较事件。特别是在同步功能活跃的系统中比较事件中断可能偶尔“丢失”一次。你的控制算法需要具备一定的鲁棒性来处理这种情况例如采用状态机而非简单的事件计数。4. 动作限定子模块从事件到波形CC子模块产生了“何时”的信号CTRCMPA, CTRCMPB, CTRPRD, CTR0而动作限定AQ子模块则决定了“做什么”。它将这些时间事件转化为对实际输出引脚EPWMxA和EPWMxB的具体操作是PWM波形形状的最终定义者。4.1 事件与动作的映射AQ子模块为每个输出引脚A和B独立配置了一套规则。针对每一个可能的事件CTRCMPA上/下、CTRCMPB上/下、CTRPRD、CTR0你都可以指定当该事件发生时对应的输出引脚应执行四种动作之一置高Set High将输出强制拉高。置低Clear Low将输出强制拉低。翻转Toggle如果当前为高则拉低当前为低则拉高。无操作Do Nothing保持输出不变。注意即使动作是无操作该事件仍然可以触发中断通过事件触发ET子模块。这些配置分别存储在AQCTLA控制输出A和AQCTLB控制输出B寄存器中。通过灵活组合这些事件-动作对你可以生成几乎任何想要的PWM波形。4.2 事件优先级当多个事件同时发生时在上下计数模式下一个复杂的情况是计数器到达TBPRD的瞬间CTRPRD事件和CTR0事件因为计数器从TBPRD归零在时间上非常接近。又或者如果你将CMPA和CMPB设置为相同的值那么CTRCMPA和CTRCMPB事件就会同时发生。硬件为此定义了明确的优先级规则以确保输出行为是确定性的。总的原则是后发生的事件优先级更高软件强制事件拥有最高优先级。以上下计数模式为例其优先级如表1所示1为最高优先级TBCNT递增时0 - TBPRDTBCNT递减时TBPRD - 01 (最高)软件强制事件软件强制事件2CTR CMPB (上升沿 CBU)CTR CMPB (下降沿 CBD)3CTR CMPA (上升沿 CAU)CTR CMPA (下降沿 CAD)4CTR 0CTR PRD5CTR CMPB (下降沿 CBD)CTR CMPB (上升沿 CBU)6 (最低)CTR CMPA (下降沿 CAD)CTR CMPA (上升沿 CAU)理解这个优先级表对于配置复杂波形至关重要。例如如果你在CTRPRD时设置输出为高同时在CTRCMPA下降沿时也设置输出为高且CMPA等于TBPRD那么根据优先级CTRPRD优先级4的动作会覆盖CTRCMPA下降沿优先级6的动作。4.3 典型波形配置实例解析理论需要结合实践。下面我们通过几个最常用的配置实例来看看如何运用AQ子模块“雕刻”出需要的波形。我们将使用寄存器配置表的形式这比单纯的文字描述更清晰。实例1向上计数模式生成两路独立、高电平有效的非对称PWM这是最基本的配置。ePWMxA和ePWMxB输出完全独立的PWM占空比分别由CMPA和CMPB控制。波形特征边沿对齐高电平有效。每个周期开始时CTR0输出置高当计数器增长到CMPA或CMPB时对应输出置低。直到周期结束下个周期开始再置高。配置逻辑AQCTLA: 配置ZRO SET(CTR0时置高)CAU CLEAR(CTRCMPA且上升时置低)。AQCTLB: 配置ZRO SETCBU CLEAR。CMPCTL: 配置LOADAMODE LOADBMODE CTR0在周期开始时从影子寄存器加载新的比较值。寄存器配置表寄存器位字段配置值说明TBCTLCTRMODETB_UP向上计数模式TBCTLPHSENTB_DISABLE本例禁用相位同步TBPRD600PWM周期 (6001)个TBCLKCMPA350ePWMxA占空比 (3501)/(6001)CMPB200ePWMxB占空比 (2001)/(6001)CMPCTLSHDWAMODECC_SHADOWCMPA使能影子寄存器CMPCTLSHDWBMODECC_SHADOWCMPB使能影子寄存器CMPCTLLOADAMODECC_CTR_ZEROCTR0时加载CMPACMPCTLLOADBMODECC_CTR_ZEROCTR0时加载CMPBAQCTLAZROAQ_SETCTR0时EPWMxA置高AQCTLACAUAQ_CLEARCTRCMPA上升时EPWMxA置低AQCTLBZROAQ_SETCTR0时EPWMxB置高AQCTLBCBUAQ_CLEARCTRCMPB上升时EPWMxB置低实例2上下计数模式生成对称PWM用于电机控制在电机控制中中心对称PWM是首选因为它能减少谐波和转矩脉动。波形特征中心对齐高电平有效。波形关于周期中心对称。在上下计数模式下通过分别在上升沿和下降沿匹配时进行置高和置低操作来实现。配置逻辑AQCTLA: 配置CAU SET(上升沿匹配CMPA时置高)CAD CLEAR(下降沿匹配CMPA时置低)。这样高电平脉冲的中心就与计数器的峰值TBPRD对齐。CMPCTL: 同样配置在CTR0时加载影子寄存器。一个重要细节为了实现0%-100%的占空比调制并避免在占空比接近极限时出现一个TBCLK的窄脉冲可能被硬件滤除需要遵循一个规则如果选择在CTR0时加载影子寄存器那么CMPA/CMPB的值应大于等于1如果选择在CTRPRD时加载那么CMPA/CMPB的值应小于等于TBPRD-1。这确保了即使占空比为0%或100%也会有一个完整的TBCLK周期动作波形行为确定。寄存器配置表寄存器位字段配置值说明TBCTLCTRMODETB_UPDOWN上下计数模式TBPRD600PWM半周期600个TBCLK全周期1200个TBCLKCMPA400占空比 (4002) / (6002) 66.7%CMPCTLLOADAMODECC_CTR_ZEROCTR0时加载CMPAAQCTLACAUAQ_SET上升沿匹配CMPA时置高AQCTLACADAQ_CLEAR下降沿匹配CMPA时置低实例3生成带死区的互补PWM用于驱动H桥驱动H桥的上、下管需要互补的PWM信号且中间必须插入死区时间以防止上下管直通。虽然ePWM有独立的死区DB子模块但仅用AQ模块也能实现。波形特征EPWMxA和EPWMxB输出互补且EPWMxB的上升沿滞后于EPWMxA的下降沿EPWMxA的上升沿滞后于EPWMxB的下降沿这个滞后时间就是死区。配置逻辑使用上下计数模式。设置两个比较值CMPA和CMPB且CMPB CMPA。CMPA控制主信号如EPWMxA的关断CMPB控制互补信号如EPWMxB的开启。CMPB - CMPA的值即为死区时间以TBCLK计。AQCTLA: 配置CAU SET,CAD CLEAR。这生成一个以CMPA为脉宽中心的对称PWM。AQCTLB: 配置CBU CLEAR,CBD SET。这生成一个与EPWMxA互补但边沿由CMPB控制的对称PWM。寄存器配置表寄存器位字段配置值说明TBCTLCTRMODETB_UPDOWN上下计数模式TBPRD600CMPA350主信号关断点CMPB400互补信号开启点死区50 TBCLKCMPCTLLOADAMODE/LOADBMODECC_CTR_ZEROCTR0时加载AQCTLACAUAQ_SETAQCTLACADAQ_CLEARAQCTLBCBUAQ_CLEARAQCTLBCBDAQ_SET5. 实战配置流程、常见问题与调试技巧理解了原理最终要落到代码和调试上。下面是一个基于TI C2000芯片的典型ePWM初始化流程以及我踩过的一些坑。5.1 标准初始化流程时钟与引脚配置使能ePWM模块所在的外设时钟。通过GPIO MUX寄存器将所需引脚配置为ePWM功能EPWMxA, EPWMxB。停止时基时钟并配置全局同步// 假设使用SysCtrlRegs寄存器结构体 SysCtrlRegs.CLKCTL.bit.TBCLKSYNC 0; // 停止所有ePWM的TBCLK配置时间基准子模块TBEPwm1Regs.TBCTL.bit.CTRMODE TB_COUNT_UPDOWN; // 设置为上下计数模式 EPwm1Regs.TBCTL.bit.PHSEN TB_DISABLE; // 本例禁用相位同步 EPwm1Regs.TBCTL.bit.PRDLD TB_SHADOW; // 周期寄存器使用影子模式 EPwm1Regs.TBCTL.bit.SYNCOSEL TB_SYNC_DISABLE; // 同步输出选择主模块可设为TB_SYNC_IN EPwm1Regs.TBCTL.bit.HSPCLKDIV TB_DIV1; // 高速时钟分频 EPwm1Regs.TBCTL.bit.CLKDIV TB_DIV1; // 时钟分频 EPwm1Regs.TBPRD 600; // 设置周期值 EPwm1Regs.TBPHS.half.TBPHS 0; // 相位寄存器清零配置计数器比较子模块CCEPwm1Regs.CMPCTL.bit.SHDWAMODE CC_SHADOW; // CMPA使用影子寄存器 EPwm1Regs.CMPCTL.bit.SHDWBMODE CC_SHADOW; // CMPB使用影子寄存器 EPwm1Regs.CMPCTL.bit.LOADAMODE CC_CTR_ZERO; // CTR0时加载CMPA EPwm1Regs.CMPCTL.bit.LOADBMODE CC_CTR_ZERO; // CTR0时加载CMPB EPwm1Regs.CMPA.half.CMPA 300; // 初始化比较值A EPwm1Regs.CMPB 200; // 初始化比较值B配置动作限定子模块AQ// 配置EPWM1A为对称PWM高电平有效 EPwm1Regs.AQCTLA.bit.CAU AQ_SET; // 上升沿匹配CMPA时置高 EPwm1Regs.AQCTLA.bit.CAD AQ_CLEAR; // 下降沿匹配CMPA时置低 // 配置EPWM1B为独立非对称PWM低电平有效另一种常见配置 EPwm1Regs.AQCTLB.bit.ZRO AQ_CLEAR; // CTR0时置低 EPwm1Regs.AQCTLB.bit.CBU AQ_SET; // 上升沿匹配CMPB时置高启动时基时钟SysCtrlRegs.CLKCTL.bit.TBCLKSYNC 1; // 启动所有ePWM的TBCLK全局同步开始5.2 常见问题与排查技巧问题没有PWM输出引脚一直是高电平或低电平。检查1时钟和引脚复用。确认ePWM模块时钟已使能并且GPIO引脚已正确配置为ePWM功能而非普通的GPIO。检查2TBCLK是否启动。确认TBCLKSYNC位已置1。这是最容易被遗忘的一步。检查3AQ配置是否正确。用仿真器查看AQCTLA和AQCTLB寄存器确认事件-动作映射关系符合预期。一个常见的错误是配置了动作但对应的事件没有使能或永远不会发生比如在向上计数模式下配置了CAD动作。检查4影子寄存器加载时机。如果你在运行时动态更新CMPA/CMPB但输出没变化检查LOADAMODE/LOADBMODE配置。确保软件是在更新影子寄存器并且硬件在预期的时刻CTR0或PRD将其加载到了活跃寄存器。可以在CTR0或PRD事件中断中设置断点观察CMPA/CMPB活跃寄存器的值是否改变。问题PWM输出频率或占空比不对。检查1TBPRD和TBCLK计算。PWM频率由TBPRD和TBCLK频率共同决定。对于向上计数模式频率Fpwm Ftbclk / (TBPRD 1)。对于上下计数模式频率Fpwm Ftbclk / (2 * TBPRD)。仔细计算你的系统时钟、分频系数和TBPRD值。检查2CMPA/CMPB值范围。确保CMPA/CMPB的值在0到TBPRD之间对于上下计数模式若要每个周期触发两次比较事件则需在0和TBPRD之间不包含端点。超出范围的值会导致比较事件不按预期发生参考数据手册中“CMPA/CMPB大于周期值时的行为”表格。检查3计数模式匹配。确认你计算占空比的公式与计数模式匹配。例如在上下计数模式下占空比D (CMPA * 2) / (TBPRD * 2)而在向上计数模式下D (CMPA 1) / (TBPRD 1)。问题多个ePWM模块不同步有相位差。检查1同步链连接。确认EPWMxSYNCO和EPWMxSYNCI的物理连接或软件配置如果通过内部信号连接是正确的。检查2PHSEN和TBPHS。确认需要同步的从模块已使能PHSEN并且其TBPHS寄存器设置了正确的相位偏移值。记住在向上/向下计数模式下同步会加载TBPHS值如果使能但同步事件本身会将计数器复位到TBPHS值而非简单地“对齐相位”这可能不是你想要的。在上下计数模式下同步会加载TBPHS并按照PHSDIR指定的方向开始计数。检查3TBCLK分频一致性。TBCLKSYNC只能对齐时钟的启动边沿。如果各个模块的HSPCLKDIV和CLKDIV设置不同它们的TBCLK频率就不同即使起始时刻对齐很快也会失去同步。确保所有需要同步的模块时钟分频设置完全相同。问题动态更新CMPA/CMPB时PWM输出出现毛刺。检查影子寄存器。这几乎是唯一的原因。确保SHDWAMODE/SHDWBMODE位使能了影子寄存器功能并且LOADAMODE/LOADBMODE设置在安全的时刻CTR0或PRD。绝对避免在“立即加载模式”下直接写入活跃寄存器除非在PWM输出被禁用或强制为无效状态的情况下。调试时善用芯片的仿真器和寄存器查看窗口。实时观察TBCNT、CMPA、CMPB注意区分影子和活跃寄存器的变化结合示波器测量实际输出波形是定位问题最直接的方法。对于复杂的同步问题可以尝试先配置一个简单的PWM输出确保单个模块工作正常再逐步添加同步和其他复杂功能这样能有效隔离问题。