1. 项目概述
在电力电子和电机控制领域,精确的脉冲宽度调制(PWM)波形生成是驱动系统性能的核心。无论是驱动一个无刷直流电机,还是构建一个高效率的开关电源,你都需要对PWM信号的频率、占空比、相位以及多通道间的同步关系进行毫秒甚至微秒级的精确控制。传统的PWM模块往往功能单一,难以应对复杂拓扑(如三相逆变器、交错并联LLC)中对多路信号协同工作的严苛要求。这时,像德州仪器(TI)C2000系列微控制器中集成的增强型PWM(ePWM)模块,就从一个简单的信号发生器,演变成了一个高度可配置、逻辑严密的“波形合成引擎”。
我接触过不少从8位或16位MCU转向C2000平台的工程师,最初面对ePWM那几十个寄存器时都会感到头大。但一旦你理解了它的核心设计哲学——以时基计数器为心脏,以事件动作为骨骼——整个模块就会变得脉络清晰。今天,我们就抛开数据手册的平铺直叙,从一个系统设计者的角度,深入ePWM的腹腔,看看它的同步机制、计数器模式以及最终如何像搭积木一样,构建出你想要的任何PWM波形。我们会重点剖析那些手册里一笔带过,但在实际调试中却能让你省下数天时间的细节,比如同步事件如何精确对齐时钟边沿,影子寄存器更新时机对波形的影响,以及如何避免在模式切换时产生毛刺脉冲。
2. ePWM模块架构与核心设计哲学
在拆解具体功能之前,我们必须先建立对ePWM模块整体架构的认知。它不是一个黑盒,而是一个由多个专业子模块精密协作的流水线。理解这条流水线,是灵活运用其功能的前提。
2.1 模块化流水线结构
ePWM模块可以看作一个波形生成流水线,其核心子模块包括时基(TB)、计数比较(CC)、动作限定器(AQ)、死区(DB)、事件触发(ET)和故障保护(TZ)。我们本次聚焦的前三个,正是波形生成的“铁三角”。
- 时基子模块(TB):这是整个ePWM的“心跳”。它包含一个可自由运行或受同步信号控制的核心计数器(TBCTR),以及定义其计数范围的周期寄存器(TBPRD)。它决定了PWM波形的根本频率和相位基准。
- 计数比较子模块(CC):这是波形的“雕刻刀”。它包含两个比较寄存器CMPA和CMPB,持续将它们的值与TBCTR进行比较。当数值匹配时,产生“CTR=CMPA”和“CTR=CMPB”两个关键事件。这两个事件是后续定义波形边沿位置的时间戳。
- 动作限定器子模块(AQ):这是波形的“装配工”。它接收来自TB的周期/零值事件和来自CC的比较匹配事件,并根据用户配置的规则(如“当CTR=CMPA且计数器向上时,将EPWMxA输出置高”),直接驱动GPIO引脚输出高低电平。
这个“TB产生时间 -> CC标记时刻 -> AQ执行动作”的流程,是ePWM所有复杂波形生成的基础。任何高级功能,如同步、互补输出、带死区的PWM,都是在这个基础流程上添加的“修饰”或“保护”逻辑。
2.2 影子寄存器:硬件同步更新的艺术
这是ePWM设计中一个至关重要的安全机制,也是新手最容易忽略导致波形异常的点。CMPA、CMPB和TBPRD等关键寄存器通常都配有“影子寄存器”。
你可以把“活动寄存器”想象成舞台上正在演出的演员,而“影子寄存器”是后台候场的替补。软件(CPU)平时修改的是后台的影子寄存器,不会直接影响正在输出的波形。只有在特定的、安全的时刻(例如计数器归零的瞬间),硬件才会自动将影子寄存器的值一次性加载到活动寄存器中。
为什么需要这个机制?想象一下,你正在用PWM控制电机的转速,占空比由CMPA的值决定。如果在计数器运行到一半时,软件突然改写CMPA,可能会导致一个PWM周期内出现两个比较匹配事件,或者本该发生的匹配事件被错过,从而产生一个极窄或畸变的脉冲。这种“毛刺”在功率电路中是致命的,可能直接导致桥臂直通,烧毁MOSFET。影子寄存器机制从根本上杜绝了软件异步写入对波形连续性的破坏,确保了控制的平滑和安全。
配置要点:通过CMPCTL[LOADAMODE]等位,你可以选择在“CTR=PRD”(周期匹配)或“CTR=ZERO”(零匹配)时加载影子寄存器。在上下计数模式中,选择在“CTR=ZERO”时加载是最常见和最安全的方式,因为它是一个确定性的、每个周期都会发生的时刻。
3. 时基同步机制深度解析
多模块协同工作是ePWM的看家本领。无论是三相逆变器需要6路严格互差120度的PWM,还是交错式Boost电路需要2路相位差180度的信号,都离不开精确的同步。
3.1 同步信号链:EPWMxSYNCI与EPWMxSYNCO
每个ePWM模块都有一个同步输入(EPWMxSYNCI)和一个同步输出(EPWMxSYNCO)。它们构成了一个同步信号传递链。通常,我们将第一个模块(如ePWM1)配置为同步主模块(忽略SYNCI输入),并将其SYNCO输出连接到第二个模块(ePWM2)的SYNCI输入,ePWM2的SYNCO再连接到ePWM3,以此类推。这样就建立了一个主从同步链。
关键配置位:TBCTL[PHSEN]这个位是同步功能的开关。当TBCTL[PHSEN]=1时,该模块使能相位加载功能,即它作为一个“从模块”,会响应同步输入信号。当检测到有效的EPWMxSYNCI脉冲时,硬件会在下一个有效的TBCLK时钟沿,将相位寄存器(TBPHS)的值加载到计数器(TBCTR)中。
注意:这个“下一个TBCLK时钟沿”是关键。它意味着同步不是瞬间完成的,而是与模块的时钟同步。这避免了在亚稳态区间进行操作,保证了系统的可靠性。延迟通常是1个TBCLK周期(如果TBCLK与系统时钟VCLK3不同频)。
3.2 相位寄存器(TBPHS)的应用艺术
TBPHS的值决定了从模块相对于主模块的相位偏移。这不是一个简单的延时,而是直接设定计数器初值。
场景举例:生成相位差120度的三相PWM假设主模块ePWM1的周期TBPRD = 600,工作在上下计数模式(对称PWM)。那么一个完整的电角度周期对应计数器从0到600再到0。
- 对于U相(主模块),我们设置
TBPHS = 0。 - 对于V相(从模块ePWM2),需要滞后120度。在上下计数模式下,120度相位差对应的计数器偏移量是
(120/360) * TBPRD * 2 = (1/3) * 600 * 2 = 400。因此,设置ePWM2的TBPHS = 400。当同步脉冲到来,ePWM2的计数器会从400开始计数,其产生的波形自然就滞后于ePWM1。 - 同理,W相(ePWM3)滞后240度,设置
TBPHS = 800(注意,由于计数器在0和TBPRD之间往返,实际效果等同于800 mod (2*TBPRD)的余数效应,需要根据波形对称性仔细计算,有时设置为(2*TBPRD) - 400 = 800来体现相位关系)。
软件强制同步与数字比较同步除了外部硬件同步脉冲,同步还可以由软件触发(写TBCTL[SWFSYNC]=1)或由模块内部的数字比较(DC)子模块事件触发。这在一些复杂的闭环控制中非常有用。例如,你可以设定当电流采样值超过某个阈值时(产生DC事件),自动触发所有PWM模块重新同步,实现快速的一致性响应。
3.3 全局时钟同步(TBCLKSYNC)
这是一个经常被遗忘但极其重要的功能。即使各模块的相位通过TBPHS对齐了,如果它们的时基时钟(TBCLK)没有同时启动,计数器之间也会存在微小的初始偏移,可能导致第一个脉冲宽度异常。
正确的启动顺序如下:
- 使能所有需要用到的ePWM模块的时钟(通过PCLKCR寄存器)。
- 将TBCLKSYNC位清零。这个位在系统级控制模块中。此操作会暂停所有ePWM模块的时基时钟(TBCLK),让它们的计数器“冻结”在当前位置(通常是0)。
- 分别配置各个ePWM模块的所有参数:时钟预分频(TBCTL[CLKDIV])、计数模式、周期、相位、比较值、动作配置等。
- 将TBCLKSYNC位置1。这个操作会同时释放所有ePWM模块的TBCLK,确保它们在同一个时钟上升沿开始计数。只有这样,之前设置的相位偏移(TBPHS)才会在绝对时间上精确生效。
跳过第2和第4步,是很多工程师在调试多相PWM时发现第一个脉冲怪异或相位有抖动的根本原因。
4. 计数器模式与波形生成原理
时基计数器(TBCTR)的工作模式直接决定了PWM波形的基本形态。ePWM提供三种主动模式,理解其细微差别是精准控制的基础。
4.1 上计数模式(Asymmetric Up-Count)
在此模式下,计数器从0开始,每个TBCLK周期加1,直到达到周期值TBPRD,然后立即归零,重新开始循环。
- 波形特征:生成非对称(Asymmetric)PWM,也称为边沿对齐(Edge-Aligned)PWM。所有PWM脉冲的起始边沿(通常是上升沿)在时间上是严格对齐的(发生在计数器归零的时刻),而结束边沿(下降沿)的位置由比较值CMPx决定。
- 周期计算:
PWM_Period = (TBPRD + 1) * T_TBCLK。这里+1是因为计数器从0计数到TBPRD,总共是TBPRD+1个状态。 - 占空比计算:对于“零时刻置高,CMPA匹配时清零”的配置,占空比 =
CMPA / (TBPRD + 1)。这种模式简单直观,是许多通用PWM应用的首选。
4.2 下计数模式(Asymmetric Down-Count)
与上计数模式相反,计数器从TBPRD值开始,每个TBCLK周期减1,直到0,然后重新装载TBPRD,开始下一轮循环。
- 波形特征:同样生成非对称PWM,但它是“后沿对齐”。所有PWM脉冲的结束边沿在时间上对齐(发生在计数器归零的时刻),而起始边沿由比较值决定。
- 应用场景:在某些特定的数字电源控制算法中,下计数模式可以简化计算逻辑。例如,在峰值电流模式控制中,用下计数模式可能更方便实现关断时间固定、开通时间调制的控制方式。
4.3 上下计数模式(Symmetric Up-Down-Count)
这是功能最强大、也最复杂的模式。计数器从0开始向上计数到TBPRD,然后立即反向向下计数回0,如此往复。
- 波形特征:生成对称(Symmetric)PWM,也称为中心对齐(Center-Aligned)PWM。PWM脉冲的中心与计数器的峰值(TBPRD点)对齐,脉冲关于中心点对称。
- 周期计算:
PWM_Period = 2 * TBPRD * T_TBCLK。因为完成一个完整的向上再向下循环,计数器经历了2 * TBPRD个状态变化(从0到TBPRD是TBPRD次,从TBPRD回0也是TBPRD次)。 - 占空比控制:这是关键。在上下计数模式下,每个比较事件在一个PWM周期内会发生两次:一次在向上计数过程中(CAU/CBU),一次在向下计数过程中(CAD/CBD)。因此,你需要为同一个比较事件(如CTR=CMPA)在向上和向下阶段分别配置动作,才能形成一个完整的脉冲。
- 例如,要生成一个占空比为D的对称PWM,通常配置:
CAU = SET(向上匹配CMPA时置高),CAD = CLEAR(向下匹配CMPA时清零)。此时,高电平时间对应于计数器从CMPA值向上到TBPRD再向下回到CMPA值的这段区间。占空比D = (TBPRD - CMPA) / TBPRD。当CMPA=0时,占空比为100%;当CMPA=TBPRD时,占空比为0%。
- 例如,要生成一个占空比为D的对称PWM,通常配置:
- 核心优势:
- 谐波特性优:中心对齐PWM的谐波能量集中在开关频率的偶数倍附近,且幅值较低,有利于EMI滤波设计。
- 适用于H桥互补输出:在电机驱动中,上下计数模式天然适合生成带死区的互补PWM对,用于驱动H桥的上下管,可以有效减少电流纹波。
- 同步整流:在LLC谐振变换器等场合,对称PWM是必须的。
4.4 同步事件对计数器的影响
当同步事件(EPWMxSYNCI)发生时,如果使能了相位加载(PHSEN=1),计数器TBCTR会被立即重载为TBPHS的值。这里有一个至关重要的细节:在上下计数模式下,重载发生后计数器的方向由TBCTL[PHSDIR]位单独决定,与重载前的方向无关。
PHSDIR = 0:同步后,计数器向下计数。PHSDIR = 1:同步后,计数器向上计数。
这个特性允许你在同步点强制改变计数方向,为实现某些特殊的波形序列提供了可能。但在绝大多数同步应用中,我们期望同步后模块能延续其原有的计数规律。因此,需要根据同步发生时主模块的计数方向,来合理设置从模块的PHSDIR位,或者通过精确控制同步脉冲的发送时机,来避免方向突变带来的波形不连续。
5. 动作限定器(AQ)配置与波形构建实战
动作限定器是将“时间事件”转化为“引脚动作”的翻译官。它的配置直接决定了EPWMxA和EPWMxB引脚上最终输出的波形。
5.1 事件与动作的映射
AQ子模块监听四种事件:CTR=PRD,CTR=ZERO,CTR=CMPA,CTR=CMPB。对于每个事件,你都可以为EPWMxA和EPWMxB两个输出独立配置四种动作之一:SET(置高)、CLEAR(置低)、TOGGLE(翻转)、DO NOTHING(无操作)。
关键逻辑:动作的配置可以且经常与计数方向(CTR_dir)进行“与”条件组合。例如:
CAU: Counter equals CMPA when Counting Up. (向上计数且匹配CMPA时)CBD: Counter equals CMPB when Counting Down. (向下计数且匹配CMPB时)
这种“事件+方向”的精细控制,是生成复杂波形(特别是对称PWM)的基石。
5.2 事件优先级机制
当多个事件在同一时刻发生时(例如在上下计数模式下,CTR=PRD和CTR=CMPA可能同时发生),AQ模块依据固定的硬件优先级进行裁决。优先级顺序在数据手册的表20-9至20-11中有明确列出。
一个必须理解的优先级案例: 在上下计数模式、生成对称PWM的典型配置中(CAU=SET, CAD=CLEAR),如果设置CMPA = TBPRD,那么在计数器到达峰值TBPRD的瞬间,会同时发生CTR=PRD事件和CTR=CMPA事件(因为CMPA等于TBPRD)。根据优先级表,CTR=PRD的优先级高于CTR=CMPA(在向下计数开始时)。如果你不小心为CTR=PRD也配置了动作(比如误设为CLEAR),它将会覆盖你为CTR=CMPA配置的动作,导致波形错误。
最佳实践:除非有特殊需求,否则只为CTR=CMPA和CTR=CMPB配置动作,而将CTR=PRD和CTR=ZERO的动作设置为DO NOTHING,这样可以避免潜在的优先级冲突,让逻辑更清晰。
5.3 常见波形配置代码剖析
让我们结合代码,深入看几个典型配置。假设系统时钟SYSCLK = 100MHz,我们希望生成一个频率为10kHz的PWM。
配置1:上计数模式,非对称PWM,主动高电平
// 初始化部分 EPwm1Regs.TBPRD = 9999; // 周期 = (9999 + 1) * 10ns = 100us, 对应10kHz EPwm1Regs.CMPA.half.CMPA = 3000; // 占空比 = 3000 / 10000 = 30% EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UP; // 上计数模式 EPwm1Regs.TBCTL.bit.PHSEN = TB_DISABLE; EPwm1Regs.TBCTL.bit.HSPCLKDIV = TB_DIV1; EPwm1Regs.TBCTL.bit.CLKDIV = TB_DIV1; // TBCLK = SYSCLK = 100MHz EPwm1Regs.CMPCTL.bit.SHDWAMODE = CC_SHADOW; EPwm1Regs.CMPCTL.bit.LOADAMODE = CC_CTR_ZERO; // 在CTR=0时更新CMPA // 动作配置:计数器归零时置高,向上计数匹配CMPA时清零 EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;这段配置产生的波形是:每个周期开始(CTR=0)时,输出变高;当计数器计数到3000时,输出变低,并保持低电平直到周期结束。这是一个标准的、上升沿对齐的PWM波。
配置2:上下计数模式,对称PWM,互补输出带死区(软件实现)这是电机驱动全桥逆变器的经典配置。我们使用EPWMxA和EPWMxB输出一对互补的PWM,并通过设置不同的CMPA和CMPB值来引入死区时间。
// 初始化部分 EPwm1Regs.TBPRD = 5000; // 周期 = 2 * 5000 * 10ns = 100us, 对应10kHz EPwm1Regs.CMPA.half.CMPA = 4000; // 用于控制主脉冲边沿 EPwm1Regs.CMPB = 4500; // CMPB - CMPA = 500个TBCLK,即5us死区时间 EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 上下计数模式 // ... 时钟、影子寄存器配置同上 // 动作配置:EPWMxA (上管驱动) EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; // 向上匹配CMPA时置高 EPwm1Regs.AQCTLA.bit.CBD = AQ_CLEAR; // 向下匹配CMPB时清零 // 动作配置:EPWMxB (下管驱动,与A互补) EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR; // 向上匹配CMPB时清零 EPwm1Regs.AQCTLB.bit.CAD = AQ_SET; // 向下匹配CMPA时置高这个配置的精妙之处在于:
- EPWMxA:在计数器向上走到CMPA(4000)时开启,在计数器向下走到CMPB(4500)时关闭。高电平时间中心对称。
- EPWMxB:在计数器向上走到CMPB(4500)时关闭,在计数器向下走到CMPA(4000)时开启。其低电平时间中心对称。
- 死区形成:观察同一时刻:
- 当EPWMxA在CMPA(4000)开启时,EPWMxB已经在CMPA(4000)被置为低电平(由CAD=SET动作在上一个向下计数阶段设置,并持续到当前向上阶段的CMPB点才被清零)。所以EPWMxB是先低后高?这里需要仔细推敲。实际上,标准的互补带死区配置通常使用死区生成子模块(DB),用硬件自动插入延迟。这里用CMPA/CMPB软件模拟,逻辑更复杂,容易出错。它演示了AQ的灵活性,但实际工程中,对于固定的死区,更推荐使用DB模块。
6. 高级应用与避坑指南
掌握了基本原理后,我们来看一些高级场景和实际调试中常见的“坑”。
6.1 实现0%-100%占空比控制
在某些应用中,如线性稳压器的旁路控制或某些类型的灯光调光,需要PWM占空比能从真正的0%(常低)到100%(常高)连续变化。
对于上计数模式(非对称PWM): 要实现0-100%,配置应为:ZRO = AQ_SET,CAU = AQ_CLEAR。那么:
- 当
CMPA = 0时,CAU事件在计数器为0时立刻发生,由于CLEAR动作优先级低于SET(参考优先级表),或者几乎同时发生,结果可能是输出一个极窄的脉冲或保持为低(取决于硬件仲裁)。更可靠的方法是让CMPA的值从0变化到TBPRD+1。当CMPA >= (TBPRD+1)时,CAU事件在整个周期内都不会发生,CLEAR动作永远不会被触发,输出保持高电平(100%占空比)。但注意,CMPA寄存器是16位,其值不能无限制增大。
对于上下计数模式(对称PWM): 标准配置(CAU=SET, CAD=CLEAR)下,当CMPA = TBPRD时,占空比为0%;当CMPA = 0时,占空比为100%。这看起来是完美的0-100%。但是,这里有一个重大陷阱:影子寄存器的加载时机。
- 如果你设置
LOADAMODE = CC_CTR_ZERO(在计数器为0时加载CMPA),那么当软件将CMPA更新为0时,这个新值会在下一个CTR=ZERO时刻才生效。在生效前的最后一个周期,如果旧的CMPA值是一个正数,你将会得到一个非100%的脉冲。反之,从100%切换到小占空比时也可能产生一个全高的脉冲。 - 解决方案:为了确保在0%和100%边界切换时没有杂散脉冲,需要遵循数据手册的建议:如果选择在
CTR=ZERO时加载,那么应确保CMPA/CMPB的值大于等于1;如果选择在CTR=PRD时加载,那么应确保CMPA/CMPB的值小于等于TBPRD-1。这样,总能保证至少有一个TBCLK宽度的脉冲,而这个极窄的脉冲在功率系统中通常可以被负载滤除或忽略。对于真正的0%和100%,可能需要结合输出强制(AQSFRC寄存器)或Trip-Zone功能来实现。
6.2 同步事件导致的比较事件丢失
这是一个非常隐蔽的问题。数据手册的图20-12下的注释明确警告:“An EPWMxSYNCI external synchronization event can cause a discontinuity in the TBCTR count sequence. This can lead to a compare event being skipped.”
问题重现:假设模块工作在上下计数模式,计数器正在从200向上计数,CMPA=250。此时,一个同步脉冲到来,TBCTR被瞬间重载为TBPHS=100。那么,计数器从200跳到100,直接跳过了CMPA=250这个点。本应在向上计数过程中发生的CTR=CMPA事件就永远丢失了。如果这个事件被配置为翻转输出,就会导致整个PWM波形相位错乱。
规避策略:
- 精确定时同步脉冲:将同步脉冲安排在不会影响关键比较点的时间。例如,在上下计数模式下,同步脉冲可以安排在计数器为0的时刻(
CTR=ZERO)。这需要主模块在计数器为0时产生同步输出(SYNCO)。 - 使用软件强制同步:在安全的时间点(如所有关键动作完成后),通过软件触发同步(SWFSYNC),而不是依赖可能随时到来的外部硬件同步。
- 应用层容错:在某些闭环控制中,偶尔丢失一个比较事件可能不会造成灾难性后果,系统可以通过下次调节恢复。但这需要评估对系统稳定性的影响。
6.3 影子寄存器更新时的“一个周期延迟”
这是动态调整PWM参数时的经典问题。当你在运行中修改CMPA的影子寄存器值时,这个新值并不会立即生效,而是要等到你预设的加载点(如CTR=ZERO)。这意味着,从你写入新值,到新值实际影响波形,中间至少间隔了当前正在进行的这个PWM周期。
带来的影响:在高速实时控制中(如数字电源的电压环),这个延迟会引入额外的相位滞后,可能影响控制环路的稳定性。在设计补偿器时,需要将这个计算延迟和PWM延迟一并考虑进去。
优化建议:对于需要极快响应的应用,可以考虑:
- 使用“立即加载模式”(
SHDWAMODE=1)。但这风险极高,因为可能在任何时刻写入,破坏波形,必须确保写入操作与PWM周期严格同步(例如在中断服务程序中,在计数器为0的瞬间写入)。 - 采用预测控制算法,提前一个周期计算并更新比较值,以补偿这个固有的延迟。
7. 调试技巧与问题排查实录
理论最终要服务于调试。下面是我在多年项目中总结的ePWM调试清单。
7.1 初始化顺序检查表
- 时钟使能:确认PWM所在外设模块的时钟已使能(例如
SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC=0先停止,但EPWM模块时钟要开)。 - 全局同步:在配置所有参数前,务必设置
TBCLKSYNC=0。 - 模块基础配置:按顺序配置TB、CC、AQ等子模块的寄存器。建议遵循“TB -> CC -> AQ”的顺序,因为后者依赖前者的参数。
- 启动时钟:所有模块配置完毕后,再设置
TBCLKSYNC=1,统一启动。 - 引脚复用:确认GPIO MUX已正确配置为ePWM功能模式。
7.2 无输出或输出异常排查流程
现象:完全没有波形输出。
- 检查1:用示波器测量引脚,确认是否有任何电平变化。如果没有,首先检查GPIO复用配置是否正确。
- 检查2:确认ePWM模块时钟是否使能。检查
PCLKCR0寄存器中对应位。 - 检查3:确认时基计数器是否在运行。可以在调试器中实时读取
TBCTR寄存器的值,看它是否在循环变化。如果为0且不变,检查TBCTL[CTRMODE]是否被误设为FREEZE模式。 - 检查4:检查动作限定器AQ的配置。是否将所有事件的动作都设为了
DO NOTHING?确认至少有一个事件(如ZRO=SET)设置了有效动作。
现象:有输出,但频率不对。
- 检查1:计算理论周期。
TBCLK = SYSCLK / (CLKDIV * HSPCLKDIV)。确认TBPRD寄存器的值是否正确。 - 检查2:确认计数模式。上计数模式周期为
(TBPRD+1)*T_TBCLK,上下计数模式周期为2*TBPRD*T_TBCLK。这是最常见的计算错误。 - 检查3:用示波器测量实际周期,与理论值对比。如果差很多倍,可能是
CLKDIV或HSPCLKDIV分频器配置有误。
- 检查1:计算理论周期。
现象:占空比不对或不可调。
- 检查1:确认
CMPA/CMPB寄存器的值是否在0到TBPRD之间(上下计数模式需注意边界)。写入的值是否真的更新到了活动寄存器?检查影子寄存器加载模式LOADAMODE。 - 检查2:在调试器中,在运行时修改
CMPA的值,并观察影子寄存器CMPA和活动寄存器CMPA(有时是同一个地址,但硬件区分影子)的值。确认新值是否在预期的加载点被搬运。 - 检查3:检查AQ配置是否与你的占空比计算逻辑匹配。例如,对于“高电平有效”的上计数模式PWM,应该是
ZRO=SET, CAU=CLEAR。如果你配成了PRD=CLEAR, CAU=SET,那么占空比逻辑就完全反了。 - 检查4:如果占空比变化不线性,或者在某些值突变,检查是否发生了比较事件丢失(见6.2节)或影子寄存器更新冲突。
- 检查1:确认
现象:多路PWM之间相位关系不对。
- 检查1:确认主从同步链连接正确。ePWM1的SYNCO是否接到了ePWM2的SYNCI?
- 检查2:确认所有从模块的
TBCTL[PHSEN]都已使能。 - 检查3:检查各从模块的
TBPHS寄存器值。计算相位差时,必须考虑计数模式。在上下计数模式下,360度相位差对应2*TBPRD的计数值。 - 检查4:最重要的步骤:确认是否执行了全局时钟同步(
TBCLKSYNC)操作。没有这一步,即使相位值设对了,由于计数器启动时刻不同,相位也是乱的。用示波器双通道同时抓取主从模块的第一个脉冲上升沿,看时间差是否符合预期。
7.3 使用CCS调试器与示波器联调
- 图形化视图:TI的Code Composer Studio (CCS)调试器通常提供ePWM寄存器的图形化视图,比直接看十六进制数值直观得多。利用好这个功能。
- 实时变量监控:将
TBCTR,CMPA,EPwm1Regs.AQCTLA.all等关键寄存器添加到Expressions窗口,并设置为定期自动刷新,可以直观看到运行时的变化。 - 触发与同步:将示波器的一个通道连接到主PWM输出,另一个通道连接到从PWM输出。使用主PWM的上升沿作为示波器触发源,可以稳定观察相位差。
- 单步调试陷阱:注意,在调试器中单步执行代码会暂停CPU,但ePWM是独立的外设,其计数器可能仍在运行(取决于仿真器设置)。这可能导致你读到的寄存器状态与实际全速运行时不符。关键测试一定要在全速运行下进行。
ePWM模块的深度和灵活性,使其成为C2000系列芯片在实时控制领域立足的根本之一。从简单的LED调光到复杂的三相电机磁场定向控制,其底层都离不开对这些同步、计数和动作机制的精确掌控。希望这篇从实战角度出发的解析,能帮你绕过那些手册里语焉不详的暗礁,更自信地驾驭这颗强大的“波形之心”。记住,所有的配置最终都是为了在示波器上呈现出那一条干净、准确、时序正确的波形,那才是对你代码最直接的肯定。