
1. 项目概述从计数器到波形ePWM时间基准的基石作用在嵌入式电机控制、数字电源或者任何需要精确时序控制的领域PWM脉冲宽度调制信号的质量直接决定了系统的性能与稳定性。我们常说的占空比调节其背后依赖的是一个精准、可靠且灵活的“时钟心脏”——这就是ePWM模块中的时间基准Time-Base, TB子模块。很多工程师在初学时往往只关注如何设置CMPA/CMPB寄存器来改变占空比却忽略了时间基准的配置才是这一切的基石。一个错误的时间基准配置可能导致PWM频率漂移、多相不同步甚至产生难以排查的毛刺直接让整个控制系统失效。时间基准子模块的核心任务非常简单产生一个周期性、可预测的计数序列。这个序列的“天花板”由周期寄存器TBPRD决定而计数的“步调”则由时间基准时钟TBCLK控制。但正是这个看似简单的计数过程通过三种不同的模式上计数、下计数、上下计数衍生出了非对称和对称PWM波形满足了从简单的LED调光到复杂的三相逆变器驱动的不同需求。更关键的是在现代多核、多模块的微控制器系统中如何让多个ePWM模块的“心跳”保持一致如何安全地在线更新频率参数而不产生干扰这就涉及到了同步机制和影子寄存器等高级功能。理解这些你才能从“会配置PWM”进阶到“能设计出稳健的PWM系统”。2. 时间基准计数器TBCTR的三种模式与波形本质时间基准计数器TBCTR是ePWM模块的节拍器它的行为模式直接定义了PWM载波的波形特征。TI的ePWM模块提供了三种基础计数模式由TBCTL[CTRMODE]位域控制。选择哪种模式绝非随意而是由你最终需要生成的PWM波形类型决定的。2.1 上计数模式Asymmetric Up-Count在这种模式下TBCTR从0开始每个TBCLK周期加1一直计数到等于TBPRD的值然后立即复位到0重新开始下一个周期。波形特征与计算周期Tpwm:Tpwm (TBPRD 1) * Ttbclk频率Fpwm:Fpwm 1 / Tpwm 1 / ((TBPRD 1) * Ttbclk)这里的1是关键。因为计数器从0计数到TBPRD总共经历了(TBPRD - 0 1)个状态也就是TBPRD 1个TBCLK周期。例如TBPRD 4则计数器序列为0, 1, 2, 3, 4, 0... 一个周期包含了5个TBCLK时钟。生成的PWM波形是非对称的。假设我们在CTR CMPA时设置EPWMxA输出为高在CTR PRD时清除为低。那么高电平的持续时间是(CMPA 1) * Ttbclk而低电平的持续时间是(TBPRD - CMPA) * Ttbclk。除非CMPA位于周期中点否则上升沿和下降沿之间的时间间隔是不对称的。这种模式简单直接常用于对波形对称性要求不高的场合如简单的LED调光、蜂鸣器驱动等。注意在上计数模式下CMPA或CMPB的值必须小于或等于TBPRD。如果比较值大于TBPRD则比较事件永远不会发生对应的动作如翻转输出也不会被触发。这是一个常见的配置错误来源。2.2 下计数模式Asymmetric Down-Count与上计数模式相反下计数模式下TBCTR从TBPRD的值开始每个TBCLK周期减1一直计数到0然后立即重新加载TBPRD的值开始下一个周期。波形特征与计算周期Tpwm:Tpwm (TBPRD 1) * Ttbclk频率Fpwm:Fpwm 1 / Tpwm 1 / ((TBPRD 1) * Ttbclk)计算公式与上计数模式完全相同。计数器序列TBPRD4为4, 3, 2, 1, 0, 4... 同样经历5个状态。它生成的也是非对称PWM波形但波形的“形状”与上计数模式是镜像的。如果你在上计数模式中是“先高后低”那么在下计数模式中配置相同的动作会得到“先低后高”的波形。这种模式在某些特定的功率拓扑控制中可能更有优势例如在某些需要下降沿对齐的开关电源控制中。2.3 上下计数模式Symmetric Up-Down-Count这是最复杂也最常用的一种模式尤其在电机控制和全桥逆变器中。TBCTR从0开始加1计数到TBPRD然后立即转为减1计数回到0如此循环往复。波形特征与计算周期Tpwm:Tpwm 2 * TBPRD * Ttbclk频率Fpwm:Fpwm 1 / Tpwm 1 / (2 * TBPRD * Ttbclk)注意这里没有了1。因为一个完整的周期包含了从0到TBPRDTBPRD个步进再从TBPRD回到0TBPRD个步进总共2 * TBPRD个TBCLK周期。序列TBPRD4为0, 1, 2, 3, 4, 3, 2, 1, 0...其生成的PWM波形是对称的中心对齐。同样以CTR CMPA置高CTR CMPA清除为例注意在上下计数模式下通常需要为增计数和减计数分别配置动作。由于计数器会两次经过CMPA值一次增、一次减因此在一个PWM周期内输出会翻转两次天然形成中心对称的脉冲。这种波形具有更低的谐波分量对EMI更友好是电机FOC控制和许多高性能电源的首选。实操心得在上下计数模式下CMPA的值同样不能超过TBPRD。但更重要的是你需要理解“比较事件”会触发两次。在配置动作限定器AQ时你必须明确指定是在计数器递增时CTR_up还是递减时CTR_down响应CTR CMPA事件或者两者都响应。错误的配置会导致完全出乎意料的PWM波形。2.4 模式选择与核心计算公式对比为了更直观地对比我将三种模式的关键特性整理如下表特性上计数模式 (Up-Count)下计数模式 (Down-Count)上下计数模式 (Up-Down-Count)计数器序列0 - TBPRD - 0TBPRD - 0 - TBPRD0 - TBPRD - 0PWM周期公式Tpwm (TBPRD 1) * TtbclkTpwm (TBPRD 1) * TtbclkTpwm 2 * TBPRD * TtbclkPWM频率公式Fpwm 1 / ((TBPRD1)*Ttbclk)Fpwm 1 / ((TBPRD1)*Ttbclk)Fpwm 1 / (2*TBPRD*Ttbclk)波形对称性非对称边沿对齐非对称边沿对齐对称中心对齐每个周期比较事件1次1次2次若0CMPATBPRD典型应用LED调光、简单开关控制特定拓扑的电源控制电机FOC控制、全桥逆变器、高性能DC-DCTBCLK的计算Ttbclk是时间基准的时钟周期它来源于系统时钟EPWMCLK经过预分频器由TBCTL[HSPCLKDIV]和TBCTL[CLKDIV]控制得到。例如系统时钟EPWMCLK 100MHzHSPCLKDIV0(不分频)CLKDIV2(4分频)则TBCLK EPWMCLK / 4 25MHzTtbclk 40ns。将这个值代入上述公式即可得到精确的PWM周期和频率。3. 影子寄存器机制实现无毛刺参数更新的关键在电机或电源等实时控制系统中我们经常需要根据算法运算结果动态调整PWM的频率TBPRD或占空比CMPA/CMPB。如果软件直接写入正在控制硬件的“活动寄存器”Active Register而写入的时机恰好发生在计数器正在使用该值进行比较的瞬间就会导致一个PWM周期内出现不可预测的波形畸变甚至产生危险的脉冲。影子寄存器Shadow Register就是为了解决这个问题而设计的“双缓冲”机制。3.1 影子寄存器的工作原理你可以把活动寄存器想象成舞台上的演员直接面对观众硬件进行表演。而影子寄存器则是后台的候场演员。导演软件可以在任何时候指导候场演员调整动作修改影子寄存器的值只有当幕间休息特定的同步事件时候场演员才会替换台上的演员从而保证给观众的表演是连贯、无错的。具体到ePWM模块活动寄存器直接与比较器、动作限定器等硬件逻辑相连其值直接决定PWM的周期和比较点。影子寄存器一个对硬件不可见的缓冲存储区。软件平时读写通过同一个内存地址的都是这个影子寄存器。加载事件在特定的、安全的时刻如计数器归零CTR0或计数器等于周期值CTRPRD硬件会自动将影子寄存器中的值一次性、同步地复制到活动寄存器中。3.2 TBPRD影子寄存器的配置对于周期寄存器TBPRD其加载模式由TBCTL[PRDLD]位控制影子模式PRDLD 0默认读写操作针对影子寄存器。加载到活动寄存器的时机由TBCTL2[PRDLDSYNC]位选择通常是CTR0或同步输入事件SYNCI。这是最常用、最安全的方式用于运行时改变PWM频率。立即加载模式PRDLD 1读写操作直接针对活动寄存器。写入后立即生效。仅推荐在初始化配置时使用运行时使用此模式风险极高。// 示例配置TBPRD使用影子模式并在CTR0时加载 EPwm1Regs.TBCTL.bit.PRDLD TB_SHADOW; // 使能影子模式 EPwm1Regs.TBCTL2.bit.PRDLDSYNC TB_CTR_ZERO; // 在计数器为零时加载 EPwm1Regs.TBPRD period_value; // 写入的是影子寄存器不会立即影响当前周期 // 写入后硬件会在下一个计数器为零的瞬间将period_value加载到活动寄存器从而更新PWM周期。3.3 CMPA/CMPB的影子寄存器比较寄存器CMPA和CMPB同样拥有影子寄存器其控制更为精细因为占空比的更新需求更频繁。通过CMPCTL[SHDWAMODE]和CMPCTL[SHDWBMODE]使能影子模式后可以通过CMPCTL[LOADAMODE]和CMPCTL[LOADBMODE]独立选择加载时机CTRPRD在计数器达到周期值时加载。适用于上/下计数模式。CTRZERO在计数器归零时加载。适用于上/下计数模式。CTRPRD或CTRZERO在以上任一事件时加载。这是上下计数模式下的标准配置确保在一个完整的三角波周期0-PRD-0开始时更新占空比使得新占空比在下一个完整周期生效避免半个周期波形异常。SYNC事件在接收到同步脉冲时加载。// 示例在上下计数模式下配置CMPA在CTRPRD或CTRZERO时加载新值 EPwm1Regs.CMPCTL.bit.SHDWAMODE CC_SHADOW; // CMPA使用影子模式 EPwm1Regs.CMPCTL.bit.LOADAMODE CC_CTR_ZERO | CC_CTR_PRD; // 在ZERO或PRD事件时加载 // 在中断服务程序中更新占空比 EPwm1Regs.CMPA.half.CMPA new_duty_cycle; // 安全写入影子寄存器踩坑记录我曾在一个电机控制项目中将CMPA的加载模式错误地配置为仅在CTRZERO时加载而工作在上下计数模式。结果发现在高速运行时PWM波形偶尔会出现一个周期特别宽或特别窄的脉冲。排查很久才发现在上下模式中计数器会两次经过CMPA值。如果只在CTRZERO加载那么新值会在计数器从0开始递增时生效但在同一个周期内当计数器从PRD递减时使用的仍然是旧的CMPA值导致上下半波不对称产生了那个怪异的脉冲。教训在上下计数模式下务必使用CTRZERO | CTRPRD加载模式。4. 同步机制构建多模块协同工作的时序骨架在复杂的电力电子设备中经常需要多个ePWM模块协同工作例如三相逆变器需要6个PWM通道两两互补交错并联的DC-DC变换器需要多个相位差固定的PWM信号。如果这些模块各自为政计数器起始时间不同就会导致相位混乱。ePWM提供了强大的同步机制来将它们“捆绑”在一起。4.1 时间基准时钟同步TBCLKSYNC这是最底层的同步确保所有ePWM模块的“心跳”节拍TBCLK从同一个时钟沿开始。它通过系统控制寄存器中的TBCLKSYNC位实现。正确的使能顺序至关重要错误的顺序会导致模块间相位随机偏移使能各模块时钟在PCLKCRx寄存器中使能所有需要同步的ePWM模块的时钟。停止所有时基将TBCLKSYNC位清零0。这会暂停所有已使能模块的TBCTR计数。配置模块参数此时安全地配置各个ePWM模块的TBPRD、计数模式、相位等。因为计数器已停止配置不会产生边沿。同步启动将TBCLKSYNC位置1。所有ePWM模块的TBCTR将在下一个TBCLK上升沿同时开始计数。// 假设使能EPWM1, EPWM2, EPWM3 SysCtrlRegs.PCLKCR2.bit.EPWM1 1; SysCtrlRegs.PCLKCR2.bit.EPWM2 1; SysCtrlRegs.PCLKCR2.bit.EPWM3 1; SysCtrlRegs.TBCLKSYNC.bit.TBCLKSYNC 0; // 停止所有时基时钟 // 配置各个模块的时基参数模式、周期、相位等 ConfigEPwm1(); ConfigEPwm2(); ConfigEPwm3(); SysCtrlRegs.TBCLKSYNC.bit.TBCLKSYNC 1; // 同步启动所有时基时钟注意TBCLKSYNC同步的是TBCLK的起始边沿它要求所有模块的TBCLK分频设置HSPCLKDIV,CLKDIV必须完全相同。如果分频比不同即使同时启动由于时钟频率不同计数器也会很快失去同步。4.2 时间基准计数器同步SYNCI/SYNCO时钟同步让计数器步调一致但计数器同步相位同步则允许你精确地控制多个计数器之间的相位关系。例如让EPWM2的计数器比EPWM1的计数器滞后60度即滞后TBPRD/6个计数值。同步链路由三个关键信号构成EPWMxSYNCI同步输入。接收来自外部如另一个ePWM模块、eCAP模块或GPIO的同步脉冲。EPWMxSYNCO同步输出。可以产生一个同步脉冲输出给其他模块。其信号源可以配置为多种内部事件如CTRZERO,CTRPRD,CTRCMPB等。EPWMxSYNCPER外设同步输出。可以输出到芯片级别的同步网络供其他外设如ADC使用。实现相位同步的核心步骤配置同步源例如将EPWM1的SYNCO配置为在CTRZERO时产生脉冲。配置同步目标将EPWM2的SYNCI源选择为EPWM1_SYNCOUT。使能相位加载在EPWM2中设置TBCTL[PHSEN] 1并给TBPHS相位寄存器写入想要的相位偏移值例如TBPRD/6。触发同步当EPWM1的计数器归零并发出SYNCO脉冲时EPWM2会收到SYNCI。在下一个TBCLK边沿EPWM2的TBCTR会被强制加载为TBPHS的值从而实现相位对齐或偏移。// EPWM1 作为主模块在CTRZERO时输出同步脉冲 EPwm1Regs.TBCTL.bit.SYNCOSEL TB_SYNC_DISABLE; // 自身不同步输入 EPwm1Regs.TBCTL.bit.PHSEN TB_DISABLE; // 自身不使能相位加载 // 注意SYNCOUT的源选择在另一个寄存器ETPS等这里为简化示意逻辑 // EPWM2 作为从模块滞后主模块60度相位 EPwm2Regs.TBCTL.bit.SYNCOSEL TB_SYNC_IN; // SYNCOUT直接转发SYNCI可形成链式同步 EPwm2Regs.TBCTL.bit.PHSEN TB_ENABLE; // 使能相位加载 EPwm2Regs.TBCTL.bit.PHSDIR TB_DOWN; // 同步后计数方向上下模式有效 EPwm2Regs.TBPHS.half.TBPHS (EPwm1Regs.TBPRD * 1) / 6; // 计算60度相位对应的计数值 // 配置EPWM2的SYNCI源为EPWM1的SYNCOUT通过输入交叉开关或同步选择寄存器PHSDIR位的精妙之处在上下计数模式下同步事件发生时计数器可能正处于递增或递减阶段。PHSDIR位决定了同步加载相位值TBPHS后计数器接下来的方向。这让你能精确控制同步后的波形起点对于构建非常规的多相系统如特定谐波消除很有用。4.3 全局加载Global Load与单次加载One-Shot Load在需要同时更新多个模块的多个寄存器如变频控制中同时改TBPRD和CMPx时简单的影子寄存器加载可能因微小的时间差导致各模块更新不同步。全局加载机制允许你将多个模块的多个影子寄存器的加载动作绑定到同一个全局事件上。全局加载控制寄存器GLDCTL, GLDCFG允许你定义一个全局加载事件如某个特定模块的CTRPRD并选择哪些模块的哪些寄存器通过GLDCFG[REGx]响应这个全局事件。当全局加载事件发生时所有被选中的寄存器其影子寄存器的值会原子性地、同时加载到各自的活动寄存器中确保了跨模块的更新一致性。单次加载模式One-Shot Load是全局加载的一个特殊应用。通过设置GLDCTL2[OSHTLD]1可以使得全局加载事件只生效一次。这在需要精确地在某个特定PWM周期例如下一个周期一次性更新所有参数然后恢复原有加载逻辑的场景下非常有用。5. 高级应用计数器-比较CC与动作限定器AQ的联动理解了时间基准我们才能更好地运用CMP和AQ模块来塑造最终的PWM波形。时间基准TBCTR是不断变化的“时间轴”CMPA/CMPB是这条轴上的“刻度”而AQ模块则定义了当“指针”TBCTR走到这些“刻度”时输出引脚应该执行什么“动作”置高、拉低、翻转。5.1 比较事件与计数模式的关系在上/下计数模式中TBCTR单向经过CMP值一次因此CTR CMPx事件每个PWM周期只发生一次。在上下计数模式中TBCTR会双向经过CMP值除非CMP0或CMPTBPRD因此CTR CMPx事件每个PWM周期会发生两次一次在递增过程一次在递减过程。AQ模块的强大之处在于它可以区分这两次事件并分别配置不同的动作。这是生成中心对称PWM、死区插入等复杂波形的基础。5.2 生成互补对称PWM波形以上下计数模式为例假设我们要用EPWM1A和EPWM1B生成一对带死区的互补PWM用于驱动一个半桥。时基配置TBCTR工作在上下计数模式TBPRD决定频率。CMPA配置CMPA的值决定了高电平脉冲的宽度占空比。使用影子模式加载时机为CTRZERO|PRD。AQ模块配置事件1:CTR CMPA(当计数器递增时) - 对 EPWM1A 执行清除动作。事件2:CTR CMPA(当计数器递减时) - 对 EPWM1A 执行置位动作。事件3:CTR CMPB(当计数器递增时) - 对 EPWM1B 执行置位动作。事件4:CTR CMPB(当计数器递减时) - 对 EPWM1B 执行清除动作。其中CMPB CMPA dead_timedead_time是为了防止上下管直通而插入的死区时间对应的计数值。这样配置后EPWM1A和EPWM1B就会输出中心对称、互补且带有死区的PWM波形。AQ模块的灵活配置使得无需外部逻辑电路仅靠寄存器配置就能实现复杂的开关逻辑。6. 实战配置流程与常见问题排查6.1 一个完整的ePWM时基初始化流程以配置一个中心对称PWM为例假设系统时钟SYSCLKOUT 200MHz目标PWM频率Fpwm 20kHz采用上下计数模式。计算TBCLK和TBPRD选择TBCLK分频。为了有较高的计数分辨率我们选择不分频HSPCLKDIV0, CLKDIV0则TBCLK SYSCLKOUT 200MHz,Ttbclk 5ns。计算TBPRDTBPRD (SYSCLKOUT / (2 * Fpwm)) - 1等等这里有个常见的误区。公式Fpwm 1 / (2 * TBPRD * Ttbclk)可以推导出TBPRD SYSCLKOUT / (2 * Fpwm)。但注意TBPRD是一个整数值。代入TBPRD 200e6 / (2 * 20e3) 5000。验证周期Tpwm 2 * 5000 * 5ns 50us频率1/50us 20kHz正确。关键点在上下计数模式下TBPRD就是计数的峰值公式中没有1。而在上/下计数模式中公式是TBPRD (SYSCLKOUT / Fpwm) - 1。配置时基控制寄存器TBCTLEPwm1Regs.TBCTL.bit.CTRMODE TB_COUNT_UPDOWN; // 上下计数模式 EPwm1Regs.TBCTL.bit.PHSEN TB_DISABLE; // 初始不使能相位同步 EPwm1Regs.TBCTL.bit.PRDLD TB_SHADOW; // TBPRD使用影子模式 EPwm1Regs.TBCTL.bit.SYNCOSEL TB_SYNC_DISABLE; // 同步输出禁用 EPwm1Regs.TBCTL.bit.HSPCLKDIV TB_DIV1; // 高速时钟分频 EPwm1Regs.TBCTL.bit.CLKDIV TB_DIV1; // 时钟分频配置周期寄存器TBPRD和相位寄存器TBPHSEPwm1Regs.TBPRD 5000; // 设置周期值 EPwm1Regs.TBPHS.half.TBPHS 0; // 相位偏移设为0配置影子加载时机TBCTL2EPwm1Regs.TBCTL2.bit.PRDLDSYNC TB_CTR_ZERO; // TBPRD在CTR0时从影子加载到活动寄存器可选配置比较寄存器CMPA和动作限定器AQEPwm1Regs.CMPCTL.bit.SHDWAMODE CC_SHADOW; EPwm1Regs.CMPCTL.bit.LOADAMODE CC_CTR_ZERO | CC_CTR_PRD; // 上下模式标准加载方式 EPwm1Regs.CMPA.half.CMPA 2500; // 50%占空比 EPwm1Regs.AQCTLA.bit.ZRO AQ_SET; // CTR0时EPWM1A置高 EPwm1Regs.AQCTLA.bit.CAU AQ_CLEAR; // CTRCMPA up时EPWM1A清除 EPwm1Regs.AQCTLA.bit.CAD AQ_SET; // CTRCMPA down时EPWM1A置高 // 这样会生成一个中心对称的PWM波在周期中心为低电平。6.2 常见问题与排查技巧问题PWM没有输出或者输出频率不对。检查1时钟是否使能。确认PCLKCRx寄存器中对应ePWM模块的时钟使能位已置1。检查2TBCLK分频和TBPRD计算。用示波器测量实际周期反推TBCLK频率。确认分频寄存器配置和计算公式特别是上下模式与上下计数模式的区别是否正确。检查3计数器是否被冻结。确认TBCTL[CTRMODE]不是TB_FREEZE模式。检查4GPIO复用是否正确。ePWM输出引脚需要通过GPIO MUX寄存器配置到ePWM功能。问题PWM输出有毛刺或偶尔出现异常脉冲。检查1影子寄存器是否启用。在运行中动态更新TBPRD或CMPx时必须使用影子模式。检查PRDLD,SHDWAMODE等位。检查2加载时机是否合理。在上下计数模式下CMPx的加载模式必须是CTRZERO|PRD。错误的加载时机会导致半个周期波形错误。检查3同步事件干扰。检查是否有意外的SYNCI脉冲输入导致计数器被意外加载相位PHSEN1时。问题多个ePWM模块之间不同步。检查1TBCLKSYNC使能顺序。严格按照“使能时钟-清零TBCLKSYNC-配置模块-置位TBCLKSYNC”的顺序操作。检查2TBCLK分频是否一致。所有需要同步的模块其HSPCLKDIV和CLKDIV必须设置相同。检查3同步链配置。确认主模块的SYNCO事件源和从模块的SYNCI输入源配置正确。使用示波器或CCS的寄存器实时查看功能观察SYNCI引脚是否有脉冲以及从模块的TBCTR是否在脉冲后加载了TBPHS值。问题在调试器中单步执行时PWM输出异常。原因ePWM是独立于CPU运行的硬件块。当CPU被调试器暂停时ePWM的时钟如果来自系统时钟可能也会停止导致PWM输出冻结。或者单步执行打乱了软件更新寄存器的时序。对策在调试与硬件时序相关的功能时尽量避免在关键配置流程中单步。可以使用断点结合寄存器观察窗口或者将关键配置代码放在一个函数中全速运行通过后再设置断点观察结果。深入理解ePWM的时间基准是驾驭这颗电机与电源控制“心脏”的第一步。从三种计数模式的选择到影子寄存器的安全更新机制再到复杂的多模块同步每一层设计都体现了在实时性、可靠性和灵活性之间的精妙权衡。在实际项目中我习惯于在系统初始化时就规划好所有PWM模块的时钟、同步关系并将TBPRD、CMP等关键参数的计算封装成宏或函数这样不仅能减少错误也便于后期调整。记住稳定的PWM是电力电子系统稳定运行的先决条件而时间基准则是这份稳定的基石。