深入解析TI C2000 ePWM计数器模式与波形生成原理
2026/7/23 14:44:41 网站建设 项目流程

1. 项目概述与ePWM核心价值

在电机控制、数字电源、逆变器这些硬核的嵌入式应用里,PWM(脉冲宽度调制)信号就是系统的“脉搏”。它直接决定了功率开关管的导通与关断,进而控制电机的转速、电源的输出电压。但如果你只用过单片机里那种简单的定时器PWM,可能会觉得PWM无非就是设置个频率和占空比。直到你遇到像TI C2000系列DSP里的ePWM(Enhanced PWM)模块,才会发现PWM的世界可以如此精细和复杂。这不再是一个简单的“输出方波”的外设,而是一个由多个精密协同的子模块构成的“信号工厂”。

我们这次要啃的硬骨头,就是ePWM模块里最核心、也最容易让人迷惑的三个部分:计数器模式(Counter Mode)、波形生成(Waveform Generation)和死区控制(Dead-Band Control)。为什么说它们核心?因为所有的PWM波形,无论多么复杂,其底层逻辑都逃不开“计数器怎么跑”以及“什么时候该翻脸(翻转输出电平)”。为什么说容易迷惑?因为官方手册里那张巨大的行为表格(就像你提供的Table 3-12)和一堆波形图,初看就像天书,各种CAU、CBD、TBPRD、CMPA的关系错综复杂。

我经历过不少项目,从三相电机驱动到LLC谐振电源,ePWM的配置都是调试的起点,也是故障的根源。配置错一个动作限定器(AQ)事件,电机可能就不转;死区时间算错几个时钟周期,H桥的上下管就可能直通,瞬间冒烟。所以,理解这些底层机制不是学术研究,而是保命技能。本文的目标,就是带你穿透手册里那些抽象的图表和术语,用工程师的视角,把ePWM的计数器行为、波形合成逻辑以及死区插入的“为什么”和“怎么做”彻底讲透,并附上可直接抄作业的代码和避坑指南。

2. ePWM模块架构与核心子模块速览

在深入细节之前,我们得先知道战场全景。ePWM不是一个单一模块,它更像一个流水线车间,每个车间负责一道工序。

2.1 核心信号流与子模块分工

想象一下PWM信号产生的过程:

  1. 时间基准(TB)子模块:这是车间的心脏,一个可配置的计数器(TBCTR)。它决定了PWM的“节拍”,以何种模式(向上、向下、向上向下)循环计数,计数的最大值就是周期寄存器TBPRD。
  2. 计数器比较(CC)子模块:这里存放着两个关键的“触发器”值——CMPA和CMPB。它们像流水线上的两个标记点,当计数器跑到这个位置时,就会向下一道工序发出“事件”信号。
  3. 动作限定器(AQ)子模块:这是最关键的“决策中心”。它接收来自TB子模块的“零匹配”(TBCTR=0)、“周期匹配”(TBCTR=TBPRD)事件,以及来自CC子模块的“CMPA匹配”、“CMPB匹配”事件。然后,根据我们预先设定的规则(比如:遇到“CMPA向上匹配”事件就把EPWMxA输出置高,遇到“周期匹配”事件就把它拉低),来控制最终的输出电平。你提供的文档中,Figure 3-22到3-27的波形,其灵魂就在于AQ的配置。
  4. 死区发生器(DB)子模块:当我们需要生成一对互补的PWM信号(例如驱动H桥的上管和下管)时,这个模块负责在其中一个信号关闭后,强制插入一段“空白时间”(死区),确保另一个信号不会立刻打开,防止电源直通短路。它接收AQ的输出,进行延迟和极性处理。
  5. 其他子模块(如PWM斩波器PC、错误联防TZ、事件触发ET等)则用于更特殊的应用场景,如变压器隔离驱动、故障保护等。

整个流程可以简化为:TB计数器循环 -> 在特定计数值(0, TBPRD, CMPA, CMPB)产生事件 -> AQ模块根据事件规则驱动输出 -> DB模块对互补输出进行延迟整形 -> 最终PWM信号输出到GPIO。

2.2 关键寄存器与概念澄清

在解读文档时,必须厘清几个易混点:

  • TBPRD (Time-Base Period Register)PWM周期的基准。在向上计数模式下,PWM周期 = (TBPRD + 1) * Tbcik。在向上向下计数模式下,PWM周期 = (2 * TBPRD) * Tbcik。这里的Tbcik是时间基准时钟,由系统时钟分频得到。
  • CMPA/CMPB (Compare Registers)占空比/脉冲位置的控制核心。它们的值必须与TBPRD和计数器模式联合起来理解。文档中Table 3-12的核心就是在讨论当CMPA/B的值大于、等于或小于TBPRD时,比较事件到底何时发生。
  • 影子寄存器 (Shadow Register):这是ePWM的“双缓冲”机制。我们软件写入的CMPA、CMPB、TBPRD值,实际上是先写到它们的影子寄存器里。硬件会在一个安全的时刻(例如计数器为0时,或达到周期时)自动将影子寄存器的值加载到“活动寄存器”中。这能防止在PWM周期中间更新比较值导致脉冲畸形。文档中“Load CMPA/CMPB on zero”就是指在计数器为零时加载。
  • 动作限定器事件:这是手册里CAU, CAD, CBU, CBD, ZRO, PRD这些缩写的全称。务必记住:
    • CAU: CMPA Up-count match (向上计数时,TBCTR=CMPA)
    • CAD: CMPA Down-count match (向下计数时,TBCTR=CMPA)
    • CBU,CBD同理。
    • ZRO: TBCTR = 0x0000
    • PRD: TBCTR = TBPRD
    • AQ_SET,AQ_CLEAR,AQ_TOGGLE是对输出采取的动作:置高、置低、翻转。

理解了这些,我们才能看懂那些代码示例(Example 3-1至3-6)里每一行配置的真实意图。

3. 计数器模式深度解析与CMPx行为精讲

文档中的Table 3-12是理解所有波形的基础。它看起来复杂,但我们可以用工程师的语言重新组织和解读。

3.1 三种计数器模式的本质

  1. 向上计数模式 (Up-Count Mode)

    • 行为:计数器从0开始,每个Tbcik加1,直到等于TBPRD,然后立即归零,重新开始。
    • 波形特征:产生非对称PWM。因为每个周期只在计数器递增时发生事件,波形只在一边(通常是上升沿或下降沿)被调制。
    • 典型应用:开关电源(如Buck、Boost)、简单的LED调光等对波形对称性无要求的场合。
  2. 向下计数模式 (Down-Count Mode)

    • 行为:计数器从TBPRD开始,每个Tbcik减1,直到等于0,然后重新加载TBPRD,继续递减。
    • 波形特征:同样产生非对称PWM。与向上计数模式镜像对称,应用相对较少。
    • 注意:文档指出,在向下计数模式下,CAU/CBU(向上比较事件)永远不会发生,因为计数器根本不向上走。
  3. 向上向下计数模式 (Up-Down-Count Mode)

    • 行为:计数器从0开始递增到TBPRD,然后立即转向,从TBPRD递减回0,如此循环。
    • 波形特征:产生对称PWM(中心对齐PWM)。这是电机驱动(尤其是FOC控制)的首选模式,因为它产生的谐波特性更好,能有效降低电机噪音和损耗。
    • 关键点:一个PWM周期内,同一个CMPx值会匹配两次:一次在递增过程(CAU/CBU),一次在递减过程(CAD/CBD)。这为实现复杂的双边沿调制提供了可能。

3.2 CMPA/CMPB与TBPRD关系的实战解读

Table 3-12的条文可以翻译成更直白的操作逻辑:

场景一:CMPA/CMPB < TBPRD (这是最正常、最常用的场景)

  • 向上计数模式:当计数器向上计数到等于CMPx值时,触发CAU/CBU事件。
  • 向下计数模式:当计数器向下计数到等于CMPx值时,触发CAD/CBD事件。
  • 向上向下计数模式
    • 当计数器向上计数到等于CMPx时,触发CAU/CBU事件。
    • 当计数器向下计数到等于CMPx时,触发CAD/CBD事件。
    • 这就是实现对称PWM的关键:你可以让CAU事件置高输出,CAD事件拉低输出,从而生成一个以周期中心为对称轴的脉冲。

场景二:CMPA/CMPB ≥ TBPRD (一个需要警惕的边界场景)

  • 向上计数模式CAU/CBU事件不会在比较匹配时发生(因为计数器最大就到TBPRD,永远达不到更大的CMPx)。相反,该事件会在周期匹配点(TBCTR=TBPRD)被触发。这是一个极其重要的细节!如果你配置了CAU事件来清除输出,但CMPA设得很大,你以为清除点很远,实际上它会在周期点立刻清除,导致输出脉冲极窄甚至没有。
  • 向下计数模式:逻辑类似,CAD/CBD事件会在周期匹配点(TBCTR=TBPRD)触发。
  • 向上向下计数模式:无论计数器在递增还是递减,只要CMPx ≥ TBPRD,对应的比较事件(CAU/CBU或CAD/CBD)都会在周期匹配点(TBCTR=TBPRD)触发。

避坑指南:CMPx的“幽灵”事件这是新手配置ePWM时最容易栽跟头的地方。你写了一段代码,想通过改变CMPA从0到TBPRD来实现0%-100%占空比。理论上,当CMPA=TBPRD时,占空比应为100%。但在向上计数模式下,如果你配置的是CAU事件清除输出,当CMPA=TBPRD时,CAU事件会在周期点立即触发清除,导致输出在周期一开始就被拉低,实际占空比为0%。要达成0%-100%的线性控制,必须仔细设计AQ事件,文档后面也给出了具体配置(例如,使用Zero事件置高,CAU事件清除)。

场景三:CMPA/CMPB = TBPRD (等于周期值的特殊情况)

  • 这其实是场景二的一个子集。在向上/向下计数模式中,它意味着比较事件一定发生在周期点。在向上向下模式中,它会导致递增和递减的比较事件都在同一个点(周期点)发生,这在某些配置下可能产生不确定行为,通常应避免。

3.3 影子寄存器加载时机与波形稳定的关系

文档3.2.4.4节的“Note”部分点出了一个高级话题:如何避免在更新CMPA/CMPB时产生毛刺或宽度异常的脉冲

原理是这样的:你在计数器运行过程中(比如在计数值为100时)更新了CMPA的影子寄存器。但硬件加载这个新值到活动寄存器,要等到你设定的加载点(Load on Zero 或 Load on Period)。如果旧值(比如200)和新值(比如50)的关系,与当前计数器的位置(100)产生奇妙的组合,就可能导致:

  1. 旧值动作多持续一个周期:新值已经加载,但基于旧值的某个动作(如置高)已经发生且无法撤销。
  2. 新值动作被延迟一个周期:该发生动作时,新值还未被加载。

文档给出的黄金配置法则就是为了规避这些问题:

  • 对于对称PWM(向上向下计数模式)
    • 如果你设置在计数器为零时(Load on ZRO)加载影子寄存器,那么请确保CMPA/CMPB的值始终大于等于1。这样可以保证每个PWM周期至少有一个Tbcik宽度的脉冲,系统更容易稳定处理。
    • 如果你设置在计数器达到周期时(Load on PRD)加载影子寄存器,那么请确保CMPA/CMPB的值始终小于等于TBPRD-1。目的同上。
  • 为什么是“至少一个Tbcik脉冲”:一个宽度小于一个系统时钟周期的极窄脉冲,在通过数字逻辑、驱动器等环节时,可能无法被正确识别或传递,导致行为不可预测。这个规则强制了一个最小脉冲宽度,提升了系统的鲁棒性。

4. 六大经典波形配置的代码实现与逐行解析

文档中的Figure 3-22到3-27及对应的Example 3-1到3-6,是ePWM应用的“经典食谱”。我们不仅要会“照菜谱做菜”,更要理解“为什么这么配料”。

4.1 配置一:向上计数,非对称波形,双路独立调制(高有效)

  • 对应图表: Figure 3-22, Example 3-1
  • 波形特点: EPWMxA和EPWMxB两路独立输出,都是高电平有效单边沿调制(上升沿固定,下降沿可调)的非对称PWM。
  • 核心逻辑:
    1. 计数器从0向上数到TBPRD。
    2. 在计数器为零(ZRO)时,两路输出同时置高AQ_SET)。这是脉冲的起点。
    3. 当计数器向上数到等于CMPA时,EPWMxA被清除AQ_CLEAR)。
    4. 当计数器向上数到等于CMPB时,EPWMxB被清除AQ_CLEAR)。
    5. 周期点(PRD)事件未使用(配置为“Do Nothing”)。
  • 占空比计算: 对于EPWMxA,高电平时间对应计数器从0到CMPA,因此占空比 = CMPA / (TBPRD + 1)。CMPA从0到TBPRD变化,占空比从0%到100%变化。
  • 代码关键行解析:
    EPwm1Regs.AQCTLA.bit.ZRO = AQ_SET; // 零点,EPWMxA置高 EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // CMPA向上匹配,EPWMxA拉低 EPwm1Regs.AQCTLB.bit.ZRO = AQ_SET; // 零点,EPWMxB置高 EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR; // CMPB向上匹配,EPWMxB拉低
  • 应用场景: 控制两个独立的开关管,例如一个双向Buck-Boost电路的两个MOSFET。

4.2 配置二:向上计数,非对称波形,双路独立调制(低有效)

  • 对应图表: Figure 3-23, Example 3-2
  • 波形特点: 与配置一相反,低电平有效。即默认输出为高,有效驱动信号(如使能某些低有效使能的驱动器)是低电平脉冲。
  • 核心逻辑:
    1. 在周期点(PRD),两路输出同时被清除(拉低)。注意,这里周期点事件发生在计数器从TBPRD归零的瞬间,但逻辑上它标志着一个周期的结束和下一个周期的开始,用于将输出复位到无效状态(高电平)。
    2. 当计数器向上数到等于CMPA时,EPWMxA被置位AQ_SET),即拉高,结束有效低电平脉冲。
    3. 当计数器向上数到等于CMPB时,EPWMxB被置位AQ_SET)。
    4. 零点(ZRO)事件未使用。
  • 占空比计算: 对于EPWMxA,低电平(有效)时间对应计数器从0到CMPA,因此低电平占空比= CMPA / (TBPRD + 1)。你需要反过来理解有效电平。
  • 代码关键行解析:
    EPwm1Regs.AQCTLA.bit.PRD = AQ_CLEAR; // 周期点,EPWMxA拉低(开始有效脉冲) EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; // CMPA向上匹配,EPWMxA拉高(结束有效脉冲) // EPWMxB配置类似
  • 应用场景: 驱动内部集成了反相器的栅极驱动器芯片,或者需要低电平触发的功率器件。

4.3 配置三:向上计数,非对称波形,单路脉冲定位

  • 对应图表: Figure 3-24, Example 3-3
  • 波形特点: 专注于在周期内任意位置生成一个脉冲。EPWMxA产生一个位置和宽度都可调的脉冲,EPWMxB则被“借用”来产生一个固定的50%占空比方波(通过ZRO事件翻转)。
  • 核心逻辑:
    1. 使用CMPA和CMPB两个寄存器来共同定义一个脉冲的起始边沿结束边沿
    2. 当计数器向上数到CMPA时,EPWMxA置高AQ_SET),脉冲开始。
    3. 当计数器向上数到CMPB时,EPWMxA拉低AQ_CLEAR),脉冲结束。
    4. 脉冲宽度= (CMPB - CMPA) * Tbcik。通过独立调节CMPA和CMPB,你可以将这个脉冲放在周期内的任何位置。
    5. EPWMxB的配置(ZRO = AQ_TOGGLE)��一个巧妙的“副产品”,它在每个周期零点翻转一次,自然生成一个50%占空比、频率为PWM频率一半的方波,可用于时钟同步等用途。
  • 代码关键行解析:
    EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; // CMPA匹配,EPWMxA上升沿 EPwm1Regs.AQCTLA.bit.CBU = AQ_CLEAR; // CMPB匹配,EPWMxA下降沿 EPwm1Regs.AQCTLB.bit.ZRO = AQ_TOGGLE; // 零点,EPWMxB翻转 -> 50%占空比方波
  • 应用场景: 需要产生精确时间位置触发信号的场合,如雷达系统中的发射脉冲、激光调制,或者需要用一个ePWM模块同时产生PWM和时钟信号。

4.4 配置四:向上向下计数,对称波形,双路独立调制(低有效)

  • 对应图表: Figure 3-25, Example 3-4
  • 波形特点:对称PWM双路独立低电平有效。这是电机驱动中非常经典的配置,用于驱动两个独立的半桥或两个不相干的开关管。
  • 核心逻辑:
    1. 计数器在0和TBPRD之间往返。
    2. 当计数器向上计数到CMPA时,EPWMxA置高AQ_SET)。注意,因为是低有效,置高意味着结束有效低电平脉冲
    3. 当计数器向下计数到CMPA时,EPWMxA拉低AQ_CLEAR),开始有效低电平脉冲
    4. EPWMxB逻辑类似,由CMPB控制。
    5. 这样,每个通道输出的低电平脉冲在周期中心对称。脉冲宽度(低电平时间)= 2 * (TBPRD - CMPx) * Tbcik。
  • 占空比计算: 低电平占空比 = (TBPRD - CMPx) / TBPRD。当CMPx=0时,低电平占空比100%(输出常低);当CMPx=TBPRD时,低电平占空比0%(输出常高)。
  • 代码关键行解析:
    EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 关键:设置为上下计数模式 EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; // 向上匹配CMPA,EPWMxA置高(结束低脉冲) EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR; // 向下匹配CMPA,EPWMxA拉低(开始低脉冲) // EPWMxB配置类似
  • 应用场景: 三相逆变器中两个上管或两个下管的独立控制(虽然更常用互补模式),或其他需要中心对称PWM的独立开关电源。

4.5 配置五:向上向下计数,对称波形,互补输出调制

  • 对应图表: Figure 3-26, Example 3-5
  • 波形特点:对称PWMEPWMxA与EPWMxB互补输出,且带有固定的“死区”时间。这是H桥或三相全桥驱动的标准配置。注意,这里的“死区”是通过CMPA和CMPB的差值软件实现的,而非使用后续的DB模块。
  • 核心逻辑:
    1. EPWMxA和EPWMxB被配置为一对互补信号,通常EPWMxA驱动上管,EPWMxB驱动下管。
    2. 当计数器向上计数到CMPA时,EPWMxA置高(开启上管)。
    3. 当计数器向下计数到CMPA时,EPWMxA拉低(关闭上管)。
    4. 当计数器向上计数到CMPB时,EPWMxB拉低(关闭下管)。注意这里和EPWMxA的CAU事件动作相反!
    5. 当计数器向下计数到CMPB时,EPWMxB置高(开启下管)。注意这里和EPWMxA的CAD事件动作相反!
    6. 关键点:由于CMPB > CMPA,EPWMxB的开启(CBD置高)发生在EPWMxA关闭(CAD拉低)之后;EPWMxB的关闭(CBU拉低)发生在EPWMxA开启(CAU置高)之前。这就自然地在两路互补信号之间插入了一段两者都为低的死区时间。
    7. 死区时间计算:死区时间 = (CMPB - CMPA) * Tbcik。你可以通过改变CMPB来动态调整死区。
  • 代码关键行解析:
    EPwm1Regs.AQCTLA.bit.CAU = AQ_SET; // 上管开启 EPwm1Regs.AQCTLA.bit.CAD = AQ_CLEAR; // 上管关闭 EPwm1Regs.AQCTLB.bit.CBU = AQ_CLEAR; // 下管关闭 (在上管开启前) EPwm1Regs.AQCTLB.bit.CBD = AQ_SET; // 下管开启 (在上管关闭后) // 通过设置CMPB > CMPA来产生死区 EPwm1Regs.CMPA.half.CMPA = 350; EPwm1Regs.CMPB = 400; // 死区时间 = (400-350)*Tbcik
  • 应用场景: 所有需要互补PWM驱动的场合,如直流电机H桥、三相交流电机逆变器、同步整流Buck电路等。这是必须掌握的配置

4.6 配置六:向上向下计数,非对称双沿调制

  • 对应图表: Figure 3-27, Example 3-6
  • 波形特点: 在对称计数模式下,实现双边沿非对称调制。即脉冲的上升沿和下降沿可以独立地在周期内的任意位置(不关于中心对称)放置。EPWMxB被用作一个固定的50%占空比输出。
  • 核心逻辑:
    1. 这可能是最灵活也最令人困惑的配置。它利用了一个周期内CMPA和CMPB会被匹配两次的特性。
    2. 配置CAU = AQ_SETCBD = AQ_CLEAR。这意味着:
      • 在计数器向上经过CMPA时,输出置高。
      • 在计数器向下经过CMPB时,输出拉低。
    3. 因此,高电平脉冲的宽度由CMPA(上升沿)和CMPB(下降沿)共同决定,并且由于计数器的往返,这个脉冲在时间轴上是不对称的。
    4. 文档指出,低电平占空比与(CMPA + CMPB)成正比。你可以通过调整CMPA和CMPB,在周期内“滑动”这个脉冲块。
  • 应用场景: 需要复杂PWM图案的应用,如某些特定谐波消除(SHEPWM)技术、特定形状的电流波形控制,或者需要在一个通道上产生复杂定时而另一个通道提供简单时钟的场景。

实操心得:如何选择配置?

  1. 电机驱动(FOC/SVPWM):无脑选择配置五(互补对称PWM)。对称PWM谐波小,互补输出带死区是桥式电路的刚需。通常我们会结合DB模块来产生死区,而不是用CMP差值,因为DB模块更专业。
  2. 开关电源(电压/电流环控制):通常使用配置一或二(非对称PWM)。因为电源拓扑中开关管通常单向导通,非对称PWM足够且控制简单。
  3. 需要精确脉冲位置:选择配置三(脉冲定位)
  4. 需要复杂调制或特定波形:考虑配置六(非对称双沿),但要做好数学分析。
  5. 简单独立开关控制配置一或四

5. 死区控制(DB)子模块:硬件死区的正确打开方式

虽然配置五展示了用CMPA/CMPB差值实现死区,但在工程中,我们更倾向于使用专用的死区发生器(DB)子模块。原因有三:1) 硬件实现,不占用CPU资源;2) 配置更直观,独立于PWM占空比计算;3) 提供丰富的极性控制模式,直接适配市面上大多数栅极驱动器。

5.1 DB模块工作原理与配置模式

DB模块位于AQ模块之后。它接收AQ产生的原始PWM信号(假设为EPWMxA_In),然后生成两路带有可编程延迟的互补信号EPWMxA_Out和EPWMxB_Out。

其核心是两个独立的延迟计数器:

  • 上升沿延迟(RED):对输入信号的上升沿进行延迟。
  • 下降沿延迟(FED):对输入信号的下降沿进行延迟。

通过开关S0-S5(对应DBCTL[OUT_MODE]和[POLSEL]位)的不同组合,可以产生文档Table 3-14中的经典模式。我们最关心的是以下两种:

  1. 主动高互补模式(AHC - Active High Complementary)

    • 描述:EPWMxA_Out是原始信号经过下降沿延迟(FED)后的版本。EPWMxB_Out是原始信号经过上升沿延迟(RED)后再取反的版本。
    • 波形效果:假设原始信号是高有效PWM。EPWMxA_Out的下降沿被推迟,EPWMxB_Out的上升沿被推迟且是低有效。这保证了在原始信号跳变时,两路输出永远不会同时为高,完美防止直通。
    • 配置DBCTL[POLSEL] = 1, DBCTL[OUT_MODE] = 1
  2. 主动低互补模式(ALC - Active Low Complementary)

    • 描述:EPWMxA_Out是原始信号经过上升沿延迟(RED)后取反。EPWMxB_Out是原始信号经过下降沿延迟(FED)后的版本。
    • 波形效果:与AHC逻辑类似,只是有效电平相反。适用于低有效驱动的桥臂。
    • 配置DBCTL[POLSEL] = 0, DBCTL[OUT_MODE] = 1

5.2 死区时间计算与配置示例

死区时间以Tbcik的整数倍为单位。

  • 基本公式死区时间 = DBRED (或 DBFED) * Tbcik
  • 高分辨率模式:如果使能半周期时钟(DBCTL[HALFCYCLE]=1),则分辨率提高一倍:死区时间 = DBRED (或 DBFED) * Tbcik / 2

配置示例:为互补PWM添加100ns死区假设系统时钟SYSCLKOUT = 150MHz,Tbcik不分频(即Tbcik周期 = 1/150MHz ≈ 6.667ns)。

  1. 计算所需计数值:100ns / 6.667ns ≈ 15。
  2. 配置寄存器
    // 假设已配置好ePWM1为互补对称PWM模式(如之前的配置五) EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE; // 使能上升沿和下降沿延迟 EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC; // 主动高互补模式 (AHC) EPwm1Regs.DBCTL.bit.IN_MODE = DBA_ALL; // EPWMxA作为两路延迟的输入源(默认) EPwm1Regs.DBRED = 15; // 上升沿延迟15个Tbcik EPwm1Regs.DBFED = 15; // 下降沿延迟15个Tbcik
    • 在AHC模式下,DBRED实际上延迟了EPWMxB_Out的上升沿(经反相后表现为下降沿延迟),DBFED延迟了EPWMxA_Out的下降沿。通常我们将两者设为相同值,以产生对称的死区。

致命陷阱:死区时间不足死区时间的设置必须大于功率器件(MOSFET/IGBT)的关断时间(Turn-off time)。这个时间可以在器件数据手册的“Switching Characteristics”部分找到。如果死区时间小于关断时间,就会出现一个管子还未完全关断,另一个管子已经打开的情况,导致瞬间短路,炸管是分分钟的事。一个安全的设计原则是:死区时间 = 最大关断时间 + 裕量(通常20%-50%)。例如,某MOSFET关断时间为50ns,则死区至少设为60-75ns。

6. 实战配置流程、常见问题与调试技巧

6.1 ePWM初始化标准流程

无论哪种配置,遵循一个清晰的初始化流程能避免很多低级错误:

  1. 时钟与引脚配置:使能ePWM模块时钟,配置GPIO复用为ePWM功能。
  2. 时基模块(TB)配置
    • 设置周期值TBPRD,决定PWM频率。
    • 设置计数器模式CTRMODE(上/下/上下)。
    • 设置时钟预分频HSPCLKDIVCLKDIV,得到Tbcik。
    • 配置相位加载和同步(如果需要多模块同步)。
  3. 比较模块(CC)配置
    • 初始化CMPACMPB的值(通常初始化为0或某个中间值)。
    • 配置影子寄存器加载模式LOADAMODELOADBMODE(通常为在ZERO或PRD时加载)。
  4. 动作限定器(AQ)配置:根据目标波形,配置AQCTLAAQCTLB寄存器中的ZRO,PRD,CAU,CAD,CBU,CBD事件动作。这是最核心的一步。
  5. 死区模块(DB)配置(如果需要):
    • 选择模式OUT_MODE和极性POLSEL
    • 设置死区时间DBREDDBFED
  6. 错误联防(TZ)配置(如果需要):配置故障触发源和故障响应(强制高/低/高阻)。
  7. 使能计数器:将TBCTR清零,模块开始运行。

6.2 常见问题排查实录

问题1:PWM完全没有输出。

  • 检查清单
    1. 时钟和引脚:确认ePWM模块时钟已使能(PCLKCRx寄存器)。用示波器或万用表检查GPIO引脚是否有输出,确认复用功能是否正确。
    2. 计数器是否在跑:在调试器中查看TBCTR寄存器的值,看它是否在循环计数。如果为0且不动,检查TBCTL.bit.CTRMODE是否被正确设置为非停止模式。
    3. 输出是否被强制:检查AQCTLA/B寄存器配置是否正确,特别是AQSF寄存器中是否有强制置位/清除标志被意外触发。检查TZ(故障)模块是否强制了输出。
    4. 影子寄存器加载:如果你在运行时更新CMPA/B但波形不变,检查CMPCTLLOADAMODE/LOADBMODESHDWAMODE/SHDWBMODE的配置。确保影子寄存器已使能,并且加载事件(ZRO/PRD)已发生。

问题2:PWM波形频率或占空比不对。

  • 频率不对:复核TBPRD和Tbcik频率的计算公式。记住*向上计数模式周期=(TBPRD+1)Tbcik上下计数模式周期=2TBPRDTbcik
  • 占空比不对或无法调到0%/100%
    • 检查AQ事件配置:这是最常见原因。对照本章第4节的经典配置,检查你的AQCTL寄存器每一位。例如,想实现0%-100%,在向上计数模式下,可能需要用ZRO事件置高、CAU事件清除,并确保CMPA可以从0变化到TBPRD+1(注意边界条件,见3.3节)。
    • 检查CMPA/B与TBPRD的关系:如果你配置的是CAU事件,但CMPA的值大于等于TBPRD,事件会在周期点触发,导致占空比异常(见3.2节场景二)。
    • 检查影子寄存器:确保你在正确的时间点(通常是在中断服务程序里,计数器为0或TBPRD时)更新CMPA.half.CMPACMPB,并且更新的是影子寄存器对应的映射地址。

问题3:互补输出有重叠(直通风险)。

  • 检查死区配置:如果使用DB模块,确认DBREDDBFED已设置为非零值,且DBCTL模式配置正确(如AHC或ALC)。
  • 如果使用软件死区(CMP差值法):务必确保CMPB > CMPA(对于AHC模式),并且差值换算的时间大于功率器件的关断时间。
  • 用示波器双通道测量:这是最直接的方法。测量上下管的驱动波形,放大跳变沿,确认存在一段两者都为低(或都为高,取决于有效电平)的死区时间。

问题4:波形中有毛刺或异常跳动。

  • 中断冲突:如果你在PWM周期中断中更新比较值,且中断服务程序执行时间过长,可能会错过下一个周期的加载点。优化中断服务程序,或考虑使用DMA自动传输更新值。
  • 寄存器访问冲突:避免在计数器运行过程中直接写入活动的CMP/TBPRD寄存器(非影子寄存器)。始终通过影子寄存器配置。
  • 电源噪声:在电机驱动等大功率场合,功率回路对控制电路的干扰可能导致逻辑错误。确保电源去耦良好,地线布局合理,信号线远离功率线。

6.3 高级技巧:利用影子寄存器实现平滑过渡

在电机控制中,我们经常需要平滑地改变PWM占空比(即转矩电流)。直接暴力修改CMP值可能导致扭矩突变。可以利用影子寄存器的双缓冲特性:

  1. 在PWM周期中断(例如CTR=ZRO中断)中,计算下一个周期需要的CMPA_new值。
  2. 将这个新值写入CMPA.half.CMPA(影子寄存器)。
  3. 硬件会在下一个CTR=ZRO(或PRD)事件时,自动将影子寄存器的值加载到活动寄存器。 这样,占空比的改变总是发生在周期的边界,实现了同步更新,避免了脉冲宽度突变,使电机运行更平稳。

最后,再强调一次,ePWM的调试离不开示波器。理论配置千般好,不如示波器上看一眼。养成将关键信号(如EPWMxA、EPWMxB、甚至内部的比较事件触发信号)引到测试引脚或用示波器监控的习惯,是快速定位和解决PWM相关问题的终极法宝。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询