深入解析C2000 ePWM动作限定器(AQ):从事件映射到波形生成

1. 从事件到波形:理解ePWM动作限定器(AQ)的核心角色

在电机控制、数字电源或者任何需要精确功率调节的嵌入式系统里,PWM(脉冲宽度调制)信号就是系统的“脉搏”。我们通常关注占空比、频率这些宏观参数,但你是否想过,在微控制器内部,一个简单的“高电平持续多久,低电平持续多久”的指令,是如何被硬件一丝不苟地执行,并最终在功率管栅极上产生那个决定生死的开关信号的?对于使用TI C2000系列微控制器的工程师来说,这个问题的答案,很大程度上藏在eHRPWM(增强型高分辨率PWM)模块的动作限定器(Action-Qualifier, AQ)子模块里。

你可以把整个ePWM模块想象成一个高度自动化的精密工厂。时间基准(TB)子模块是流水线的节拍器,它以一个固定的频率(TBCLK)进行递增或递减计数,定义了工作的基本周期。比较(CC)子模块则像两个可移动的传感器,分别安装在CMPA和CMPB的位置上,当计数器的指针经过它们时,就会发出一个“事件”信号。那么,这个“事件”信号具体要触发什么“动作”呢?是让输出引脚EPWMxA立刻变为高电平,还是让它翻转,或者干脆什么都不做?这个至关重要的决策者,就是AQ模块。

AQ模块的本质,是一个高度可编程的“事件-动作”映射器。它接收来自TB和CC模块的四个核心事件:CTR=PRD(计数器等于周期值)、CTR=0(计数器等于零)、CTR=CMPACTR=CMPB。对于每一个事件,你都可以独立地为两个输出引脚EPWMxA和EPWMxB配置三种基本动作:置高(Set)、拉低(Clear)、翻转(Toggle),或者选择不操作(Do Nothing)。更强大的是,对于CTR=CMPACTR=CMPB这两个事件,你还可以根据计数器是处于递增(Up)还是递减(Down)阶段,来配置不同的动作。正是这种精细到计数方向的独立控制能力,使得仅用两个比较寄存器,就能构造出中心对称、边沿对齐、互补带死区等复杂多样的PWM波形,而无需CPU频繁干预。

注意:AQ模块是纯硬件逻辑,其“事件-动作”的响应是单周期内完成的,这保证了PWM边沿的时序精度可以达到一个TBCLK周期,这对于需要高分辨率或高频开关的应用至关重要。软件仅负责初始配置和运行时更新比较值,波形生成本身不消耗CPU带宽。

2. AQ模块的架构与寄存器深度解析

要驾驭AQ模块,必须从它的“控制面板”——寄存器组开始。理解每个比特位的含义,是进行精准波形设计的前提。

2.1 核心控制寄存器:AQCTLA与AQCTLB

AQ模块对两个输出引脚的控制是独立的,分别由AQCTLA(控制EPWMxA)和AQCTLB(控制EPWMxB)这两个16位寄存器完成。它们的结构是对称的,每个寄存器被划分为针对不同事件和计数方向的控制域。

AQCTLA为例,其关键字段如下:

  • AQCTLA.ZRO(2位): 定义当CTR=0事件发生时,对EPWMxA采取的动作。00为不操作,01为置高,10为拉低,11为翻转。
  • AQCTLA.PRD(2位): 定义当CTR=PRD事件发生时的动作。
  • AQCTLA.CAU(2位): 定义当计数器递增CTR=CMPA事件发生时的动作。
  • AQCTLA.CAD(2位): 定义当计数器递减CTR=CMPA事件发生时的动作。
  • AQCTLA.CBU(2位): 定义当计数器递增CTR=CMPB事件发生时的动作。
  • AQCTLA.CBD(2位): 定义当计数器递减CTR=CMPB事件发生时的动作。

AQCTLB的结构完全一致,只是其控制对象是EPWMxB。这种设计提供了极大的灵活性。例如,你可以让EPWMxA在CTR=CMPA递增时置高,在CTR=CMPA递减时拉低,从而生成一个以CMPA为脉宽控制点的对称PWM波;同时,让EPWMxB响应CTR=CMPB事件,生成另一个独立或相关的波形。

2.2 软件强制与事件优先级机制

除了由计数器匹配自动触发的事件,AQ模块还支持软件强制事件,通过AQSFRC(动作限定器软件强制寄存器)和AQCSFRC(动作限定器连续软件强制寄存器)来控制。软件强制事件是异步的,优先级最高,可以立即改变输出状态,常用于故障注入测试或特殊的同步控制场景。

当多个事件在同一时刻发生时(例如,在计数器从0开始递增的第一个周期,CTR=0事件和CTR=CMPA事件如果CMPA也设为0,就会同时发生),硬件需要决定执行哪个动作。AQ模块内置了固定的事件优先级逻辑。

在上下计数模式(Up-Down-Count Mode)下,优先级规则尤其需要理解:

  1. 最高优先级:软件强制事件。
  2. 次高优先级:与当前计数器方向相同的比较匹配事件。例如,在递增阶段,CBU(CMPB Up)的优先级高于CAU(CMPA Up)。
  3. 较低优先级:固定点事件(CTR=0CTR=PRD)。
  4. 最低优先级:与当前计数器方向相反的比较匹配事件。例如,在递增阶段,CBD(CMPB Down)事件的优先级最低。

这个优先级表不是随意设定的,它确保了在生成对称PWM时,波形中心点的动作(由递减阶段的比较匹配触发)不会被其他事件意外覆盖,从而保证波形的对称性和稳定性。在设计波形时,尤其是使用多个比较事件时,必须心中有这张优先级表,避免配置冲突导致非预期的输出。

2.3 比较值大于周期值的特殊情况处理

在实际编程中,可能会动态计算并更新CMPA/CMPB的值。如果新值意外地大于当前周期值TBPRD,AQ模块的行为是怎样的?TI的硬件设计对此有明确定义,这关乎系统的鲁棒性。

  • 递增计数模式(Up-Count):如果CMPA/CMPB > TBPRD,则递增比较事件(CAU/CBU)永远不会发生。因为计数器从0数到TBPRD就会归零,永远不会等于那个更大的数。
  • 递减计数模式(Down-Count):如果CMPA/CMPB >= TBPRD,则递减比较事件(CAD/CBD)会在CTR=PRD(周期匹配)时发生。因为计数器从TBPRD开始递减,一开始就匹配了。
  • 上下计数模式(Up-Down-Count):这是最常用也最需要小心的模式。如果CMPA/CMPB >= TBPRD,那么无论是递增还是递减比较事件,都会在CTR=PRD时触发。这意味着,如果你配置了CAU=SETCAD=CLEAR来生成对称PWM,当CMPA >= TBPRD时,SET和CLEAR动作都会在周期点发生,其最终结果取决于硬件对同时事件的裁决(通常后生效的动作会覆盖前者),很可能导致输出锁定在高或低电平。

实操心得:在上下计数模式下,为了避免当CMPA/CMPB值变化到边界时出现异常,一个最佳实践是:永远确保比较值在有效范围内。如果从影子寄存器加载比较值的时机是CTR=0,则运行时CMPA/CMPB应满足1 <= CMPx <= TBPRD;如果加载时机是CTR=PRD,则应满足0 <= CMPx <= TBPRD-1。这能保证至少有一个TBCLK周期的脉冲,系统行为可预测。

3. 经典波形生成:从配置到代码的完整实现

理解了寄存器,我们就可以像搭积木一样,用AQ模块构造出各种需要的PWM波形。下面我们以最常用的几种波形为例,拆解其配置逻辑,并给出可直接使用的代码片段(以TI C2000的DriverLib库函数风格为例)。

3.1 上下计数模式生成对称PWM(中心对齐)

这是电机控制中驱动三相逆变器最常用的波形。其特点是波形关于周期中心对称,谐波特性更好。

波形特征:EPWMxA输出一个占空比可调、中心对称的PWM波。高电平时间由CMPA值控制。配置逻辑

  • TB模块���设置为上下计数模式(TBCTL.CTRMODE = TB_COUNT_UPDOWN),TBPRD定义半周期值(因为一个完整周期包含一次递增和一次递减)。
  • CC模块:CMPA寄存器用于控制脉宽。通常配置为在CTR=0CTR=PRD时从影子寄存器加载。
  • AQ模块(核心):
    • AQCTLA.CAU = AQ_SET// 递增至CMPA时,置高EPWMxA
    • AQCTLA.CAD = AQ_CLEAR// 递减至CMPA时,拉低EPWMxA
    • 对于CTR=0CTR=PRD事件,通常配置为AQ_DO_NOTHING

工作过程:计数器从0开始递增。当TBCNT < CMPA时,输出保持低电平。当TBCNT == CMPA时,触发CAU事件,AQ模块将EPWMxA置高。计数器继续递增至TBPRD后转为递减。当递减过程中TBCNT == CMPA时,触发CAD事件,AQ模块将EPWMxA拉低。如此循环,形成一个以CMPA位置为边沿的中心对称波形。占空比 = (CMPA * 2) / (TBPRD * 2) = CMPA / TBPRD。

C代码示例

// 假设使用EPWM1模块 void EPWM1_Setup_SymmetricPWM(uint16_t period, uint16_t cmpA) { // 1. 配置时间基准TB EPWM_setTimeBasePeriod(EPWM1_BASE, period); // 设置TBPRD EPWM_setTimeBaseCounter(EPWM1_BASE, 0); // 计数器清零 EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_UP_DOWN); // 上下计数模式 EPWM_disablePhaseShiftLoad(EPWM1_BASE); // 禁用相位加载 EPWM_setClockPrescaler(EPWM1_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1); // 时钟不分频 // 2. 配置计数器比较CC EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, cmpA); // 设置CMPA EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO); // CMPA在CTR=0时从影子寄存器加载 // 3. 配置动作限定器AQ (核心配置) // 清除所有事件的动作(可选,确保从干净状态开始) EPWM_disableActionQualifier(EPWM1_BASE); // 配置事件-动作映射 EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, // CAU事件:置高 EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, // CAD事件:拉低 EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA); // CTR=0和CTR=PRD事件不动作 EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_DO_NOTHING, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_DO_NOTHING, EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD); }

运行时,只需通过EPWM_setCounterCompareValue更新CMPA的影子寄存器值,即可在下一个加载点(CTR=0)后改变PWM占空比。

3.2 递增计数模式生成非对称PWM(边沿对齐)

这种波形常用于简单的LED调光、蜂鸣器驱动或某些电源的Buck/Boost控制。

波形特征:EPWMxA输出一个从周期开始点(CTR=0)触发,脉宽由CMPA决定的PWM波。波形是边沿对齐的。配置逻辑

  • TB模块:设置为递增计数模式(TBCTL.CTRMODE = TB_COUNT_UP),TBPRD定义周期值(计数器从0到TBPRD)。
  • CC模块:CMPA寄存器控制高电平结束点(对于Active High)或低电平结束点(对于Active Low)。
  • AQ模块
    • Active High配置(高电平有效):
      • AQCTLA.ZRO = AQ_SET// 计数器为零时,置高EPWMxA
      • AQCTLA.CAU = AQ_CLEAR// 递增至CMPA时,拉低EPWMxA
      • AQCTLA.PRD = AQ_DO_NOTHING// 周期点不操作
    • Active Low配置(低电平有效):
      • AQCTLA.ZRO = AQ_CLEAR// 计数器为零时,拉低EPWMxA
      • AQCTLA.CAU = AQ_SET// 递增至CMPA时,置高EPWMxA
      • AQCTLA.PRD = AQ_DO_NOTHING

工作过程(以Active High为例):计数器从0开始,CTR=0事件立刻将输出置高。计数器递增,当TBCNT == CMPA时,触发CAU事件,将输出拉低。之后输出保持低电平直至计数器达到TBPRD后归零,CTR=0事件再次将其置高,开始新周期。占空比 = CMPA / (TBPRD + 1)。

注意:这里占空比分母是TBPRD+1,因为递增模式计数器从0到TBPRD,总共TBPRD+1个计数值。这是与上下计数模式的一个重要区别。

3.3 生成互补PWM对与死区时间

在驱动H桥或半桥电路时,我们需要一对互补的PWM信号(EPWMxA和EPWMxB)来控制上下管,并且必须在它们之间插入死区时间(Dead Time),防止上下管同时导通造成短路。

使用AQ模块直接生成带死区的互补PWM: 我们可以利用CMPA和CMPB两个独立的比较寄存器,分别控制两个输出的上升沿和下降沿,从而“硬件合成”出带死区的互补波形,无需启用独立的死区(DB)子模块。

配置目标:EPWMxA和EPWMxB互补,EPWMxA的上升沿领先于EPWMxB的下降沿一个死区时间,EPWMxA的下降沿领先于EPWMxB的上升沿一个死区时间。配置逻辑(上下计数模式)

  • 假设期望的EPWMxA高电平时间由CMPA控制,死区时间为DB个TBCLK。
  • 我们需要计算四个边沿点:
    • EPWMxA上升沿:由CAU=SET触发。
    • EPWMxA下降沿:由CAD=CLEAR触发。
    • EPWMxB下降沿(对应A上升沿后的死区结束):应比A上升沿晚DB。在递减阶段,CBD=CLEAR可以定义B的下降沿。我们需要设置CMPB = CMPA + DB(需考虑计数器方向)。
    • EPWMxB上升沿(对应A下降沿前的死区开始):应比A下降沿早DB。在递增阶段,CBU=SET可以定义B的上升沿。我们需要设置CMPB = CMPA - DB
  • 问题:这里CMPB只有一个值,无法同时满足CMPA+DBCMPA-DB。因此,更常见的做法是使用对称死区,即上升沿和下降沿的死区时间相等,并通过巧妙的配置,让一个通道(如A)的边沿由CMPA控制,另一个通道(B)的边沿由CMPB控制,且两者错开一个死区时间。

一种更清晰的配置方案

  • 定义PWMWidth为高电平时间(以计数值表示),DeadBand为死区时间。
  • 设置:
    • CMPA = PWMWidth
    • CMPB = PWMWidth + DeadBand(确保CMPB > CMPA)
  • AQ配置:
    • AQCTLA.CAU = AQ_SET// A上升沿
    • AQCTLA.CAD = AQ_CLEAR// A下降沿
    • AQCTLB.CBU = AQ_CLEAR// B上升沿(在递增阶段,当CTR=CMPB时拉低B?这里需要仔细推敲)
    • AQCTLB.CBD = AQ_SET// B下降沿(在递减阶段,当CTR=CMPB时置高B?)

推演过程:我们期望的波形是:A高时B低,A低时B高,且切换时有死区(两者都低)。

  1. 计数器从0递增。当CTR=CMPA时,CAU事件将A置高。此时B的状态?
  2. 计数器继续递增至CTR=CMPBCMPB > CMPA)。如果配置CBU = AQ_CLEAR,则此时将B拉低。但B可能本来就是低?这取决于初始状态和CTR=0/PRD事件。
  3. 计数器达到TBPRD后递减。当CTR=CMPB时,CBD事件将B置高。此时A仍为高。
  4. 计数器递减至CTR=CMPA时,CAD事件将A拉低。此时B已为高。

这样,在A从低变高(CTR=CMPA递增)���B从高变低(CTR=CMPB递增)之间,存在CMPB - CMPA = DeadBand的时间,两者都为高?这不符合死区要求(死区期间应两者都低)。实际上,要生成正确的互补带死区波形,逻辑会更复杂,通常需要结合输出极性反转。因此,对于经典的死区生成,更推荐使用ePWM模块中专门的死区(DB)子模块,它可以直接基于一个输入信号(如EPWMxA),自动生成带可编程上升沿延迟(RED)和下降沿延迟(FED)的两路互补输出,逻辑更清晰,配置更简单。

4. 高级应用与实战避坑指南

掌握了基础波形生成后,我们来看一些高级应用场景和实际开发中容易踩的“坑”。

4.1 利用Toggle动作生成特定脉冲

Toggle(翻转)动作是一个强大的工具。例如,你想在PWM周期内的一个特定位置(比如CTR=CMPA时)产生一个固定宽度的脉冲,而不是改变整个后半周期的电平。

场景:在EPWMxB上生成一个50%占空比的方波,频率是PWM频率的一半。配置思路

  • 将TB配置为递增模式。
  • 对EPWMxB的CTR=0事件配置AQ_TOGGLE动作。
  • CTR=PRD事件也配置AQ_TOGGLE动作(或不配置,因为计数器达到TBPRD后会归零,触发CTR=0事件,效果一样)。
  • 这样,每个PWM周期开始和结束时,EPWMxB都会翻转一次,从而产生一个周期为2 * (TBPRD+1) * T_{TBCLK}的方波。

C代码片段

// 配置EPWMxB输出50%占空比方波,频率为主PWM频率的一半 EPWM_setActionQualifierAction(epwm_base, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_TOGGLE, // 零值事件时翻转 EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); // 注意:在递增模式下,CTR=PRD事件后立刻归零,所以通常只需配置ZRO事件翻转即可。 // 若担心时序,可同时配置PRD事件翻转。

4.2 影子寄存器加载时机与波形毛刺

这是ePWM应用中最隐蔽也最容易出问题的地方之一。CMPA、CMPB和TBPRD寄存器都有影子寄存器。影子寄存器的值只有在特定的“加载点”才会被复制到活动寄存器生效。这个加载点由CMPCTL.LOADAMODE/LOADBMODETBCTL.PRDLD等位控制。

问题:假设你在中断服务程序(ISR)中计算并更新了CMPA的影子寄存器值,希望下一个PWM周期立即采用新的占空比。如果加载点配置不当,可能会导致:

  1. 占空比更新延迟一个周期:如果你在CTR=PRD的中断中更新CMPA,但CMPA的加载点配置为CTR=0,那么新值要到下下个周期才会生效。
  2. 产生非法的窄脉冲或宽脉冲:在上下计数模式下,如果你在计数器递增阶段更新了CMPA,而加载点发生在CTR=PRD,那么在当前周期的递减阶段,比较匹配可能仍然使用旧值,导致波形不对称或出现毛刺。

避坑指南

  • 保持一致性:对于对称PWM,如果CMPA用于控制高电平时间,建议将加载点设置为CTR=0。这样,新值在一个完整周期(0->PRD->0)开始前加载,确保整个周期的对称性。
  • 理解“双缓冲”效应:在CTR=0加载的情况下,运行时CMPA的值应大于等于1。如果CMPA=0,则CAUCAD事件都会在计数器为0时立即触发(取决于优先级),可能导致输出异常。同理,在CTR=PRD加载时,CMPA应小于等于TBPRD-1
  • 使用适当的同步策略:在复杂的多模块同步系统中,利用EPWMxSYNCIEPWMxSYNCO信号来同步多个ePWM模块的计数器以及影子寄存器加载,可以确保所有通道的波形变化严格对齐。

4.3 调试技巧:如何观察和验证AQ配置

当PWM输出不符合预期时,如何快速定位是AQ配置问题?

  1. 使用寄存器查看工具:在CCS(Code Composer Studio)的寄存器视图中,直接检查AQCTLAAQCTLBCMPACMPBTBCNT等寄存器的值,确保与你的配置一致。
  2. 逻辑分析仪/示波器:这是最直接的方法。测量EPWMxA和EPWMxB的实际波形,与理论波形对比。特别注意边沿发生的位置是否与CMPA、CMPB的值对应。
  3. 利用软件强制事件进行“单步调试”:在调试初期,可以暂时不启动TB计数器(TBCTL.CTRMODE = TB_FREEZE)。然后通过写AQSFRC寄存器,手动触发CTR=0CTR=PRD等软件强制事件,观察输出引脚的电平变化是否与你为这些事件配置的动作一致。这可以隔离计数器运行的影响,单独验证AQ的“事件-动作”映射逻辑是否正确。
  4. 检查优先级冲突:如果你的波形在某个特定点(如0点或PRD点)出现“抖动”或非预期跳变,检查是否有多个事件(如CTR=0CTR=CMPx,且CMPx也设为0)同时发生。根据优先级表,判断最终执行的动作是否符合你的设计意图。必要时,可以通过调整比较值或改变动作配置来避免冲突。

5. 从AQ到DB:死区模块的协同工作

虽然AQ模块本身可以通过精细控制CMPA和CMPB来产生带时间间隔的边沿,但对于标准的上升沿延迟和下降沿延迟型死区,使用专用的死区(DB)子模块更为方便和通用。AQ模块生成的原始PWM对(通常是互补的)作为DB模块的输入,DB模块再输出最终带死区的两路信号。

配置流程

  1. 用AQ生成原始互补信号:首先配置AQ模块,使EPWMxA和EPWMxB输出一对没有死区的互补信号(例如,A高则B低,A低则B高)。这通常通过将A和B配置为对同一事件(如CTR=CMPA)采取相反动作来实现。
  2. 配置DB模块
    • 选择输入模式(DBCTL.IN_MODE):通常选择EPWMxA作为两路延迟的输入源。
    • 选择输出模式(DBCTL.OUT_MODE):选择需要应用的延迟,例如同时使能上升沿延迟(RED)和下降沿延迟(FED)。
    • 选择极性(DBCTL.POLSEL):根据你的功率开关管驱动电平要求(高有效还是低有效)选择。
    • 设置延迟值:分别向DBREDDBFED寄存器写入所需的延迟计数(以TBCLK周期为单位)。
  3. 计算死区时间:死区时间 = 延迟计数值 × TBCLK周期。例如,系统时钟SYSCLKOUT=100MHz,TBCLK不分频,则T_{TBCLK} = 10ns。若需要500ns的死区,则DBRED = DBFED = 500ns / 10ns = 50

关键优势:使用DB模块,你只需要关心一个通道(如EPWMxA)的占空比(通过CMPA控制),死区时间由独立的寄存器管理。当需要调整死区时间时,只需修改DBRED/DBFED,无需重新计算和协调CMPA、CMPB两个值,大大简化了软件逻辑,也避免了因计算错误导致桥臂直通的风险。

6. 实战案例:构建一个双通道交错并联Buck控制器

假设我们需要用C2000控制一个双相交错并联的Buck变换器,以降低输入输出电流纹波。要求:

  • 两路PWM(EPWM1A, EPWM2A)频率相同,均为500kHz。
  • 两路PWM相位相差180度(交错)。
  • 每路PWM需要互补输出带死区(EPWM1A/1B, EPWM2A/2B)。
  • 死区时间设为100ns。

实现步骤

  1. 计算定时器参数

    • 系统时钟假设为100MHz (T_{SYSCLK} = 10ns)。
    • 目标PWM频率f_{PWM} = 500kHz,周期T = 2us
    • 采用上下计数模式(中心对称),则TBPRD应满足2 * TBPRD * T_{TBCLK} = T
    • 令TBCLK = SYSCLKOUT = 10ns,则TBPRD = T / (2 * T_{TBCLK}) = 2us / (2 * 10ns) = 100
  2. 配置EPWM1为主模块(Master)

    • TB配置为上下计数模式,TBPRD = 100
    • 配置AQ模块,使EPWM1A生成一个占空比可调的对称PWM(如3.1节所述)。EPWM1B暂时不配置(将由DB模块生成)。
    • 配置DB模块,输入为EPWM1A,输出模式为Active High Complementary (AHC),DBRED = DBFED = 100ns / 10ns = 10
    • 配置TBCTL.SYNCOSEL = TB_SYNC_OUT,使EPWM1在CTR=0时产生��步输出脉冲(EPWM1SYNCO)。
  3. 配置EPWM2为从模块(Slave)

    • TB配置为上下计数模式,TBPRD = 100
    • 配置TBCTL.PHSEN = TB_ENABLE,并使能相位加载。设置TBPHS = 100(因为TBPRD=100,相位差180度即相差半个周期,计数值为100)。
    • 配置TBCTL.SYNCOSEL = TB_SYNC_IN,使其接收来自EPWM1的同步信号(EPWM1SYNCO连接到EPWM2SYNCI)。
    • AQ和DB配置与EPWM1完全相同。
  4. 工作原理

    • EPWM1的计数器从0开始计数。当它计数到0时,产生一个同步脉冲给EPWM2。
    • EPWM2接收到同步脉冲后,将其计数器加载为TBPHS=100的值,然后开始计数。
    • 因此,EPWM2的波形在相位上刚好落后EPWM1半个周期(180度)。
    • 两个模块的DB子模块分别基于各自的EPWMxA,生成带死区的互补对EPWMxA/EPWMxB。

通过这个案例,我们可以看到ePWM模块的AQ、DB、TB同步功能如何有机结合起来,实现一个复杂的多相电源控制需求。AQ模块负责核心的波形形状(占空比),DB模块负责安全隔离(死区),而TB的同步和相位功能则实现了通道间的交错。所有这些都在硬件中自动完成,CPU只需设定好参数,极大地减轻了软件负担并提高了系统的可靠性和精度。

最后的小技巧:在调试此类多模块系统时,建议先将所有ePWM模块的同步功能禁用,逐个模块单独调试,确保每个模块能独立输出正确的PWM和互补死区波形。然后再使能同步功能,检查相位关系。这样可以分步排查问题,避免多个故障点交织在一起难以定位。