深入解析TI C2000 ePWM计数器模式与波形生成原理
1. 项目概述与ePWM核心价值在电机控制、数字电源、逆变器这些硬核的嵌入式应用里PWM脉冲宽度调制信号就是系统的“脉搏”。它直接决定了功率开关管的导通与关断进而控制电机的转速、电源的输出电压。但如果你只用过单片机里那种简单的定时器PWM可能会觉得PWM无非就是设置个频率和占空比。直到你遇到像TI C2000系列DSP里的ePWMEnhanced 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信号产生的过程时间基准TB子模块这是车间的心脏一个可配置的计数器TBCTR。它决定了PWM的“节拍”以何种模式向上、向下、向上向下循环计数计数的最大值就是周期寄存器TBPRD。计数器比较CC子模块这里存放着两个关键的“触发器”值——CMPA和CMPB。它们像流水线上的两个标记点当计数器跑到这个位置时就会向下一道工序发出“事件”信号。动作限定器AQ子模块这是最关键的“决策中心”。它接收来自TB子模块的“零匹配”TBCTR0、“周期匹配”TBCTRTBPRD事件以及来自CC子模块的“CMPA匹配”、“CMPB匹配”事件。然后根据我们预先设定的规则比如遇到“CMPA向上匹配”事件就把EPWMxA输出置高遇到“周期匹配”事件就把它拉低来控制最终的输出电平。你提供的文档中Figure 3-22到3-27的波形其灵魂就在于AQ的配置。死区发生器DB子模块当我们需要生成一对互补的PWM信号例如驱动H桥的上管和下管时这个模块负责在其中一个信号关闭后强制插入一段“空白时间”死区确保另一个信号不会立刻打开防止电源直通短路。它接收AQ的输出进行延迟和极性处理。其他子模块如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 (向上计数时TBCTRCMPA)CAD: CMPA Down-count match (向下计数时TBCTRCMPA)CBU,CBD同理。ZRO: TBCTR 0x0000PRD: TBCTR TBPRDAQ_SET,AQ_CLEAR,AQ_TOGGLE是对输出采取的动作置高、置低、翻转。理解了这些我们才能看懂那些代码示例Example 3-1至3-6里每一行配置的真实意图。3. 计数器模式深度解析与CMPx行为精讲文档中的Table 3-12是理解所有波形的基础。它看起来复杂但我们可以用工程师的语言重新组织和解读。3.1 三种计数器模式的本质向上计数模式 (Up-Count Mode)行为计数器从0开始每个Tbcik加1直到等于TBPRD然后立即归零重新开始。波形特征产生非对称PWM。因为每个周期只在计数器递增时发生事件波形只在一边通常是上升沿或下降沿被调制。典型应用开关电源如Buck、Boost、简单的LED调光等对波形对称性无要求的场合。向下计数模式 (Down-Count Mode)行为计数器从TBPRD开始每个Tbcik减1直到等于0然后重新加载TBPRD继续递减。波形特征同样产生非对称PWM。与向上计数模式镜像对称应用相对较少。注意文档指出在向下计数模式下CAU/CBU向上比较事件永远不会发生因为计数器根本不向上走。向上向下计数模式 (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。相反该事件会在周期匹配点TBCTRTBPRD被触发。这是一个极其重要的细节如果你配置了CAU事件来清除输出但CMPA设得很大你以为清除点很远实际上它会在周期点立刻清除导致输出脉冲极窄甚至没有。向下计数模式逻辑类似CAD/CBD事件会在周期匹配点TBCTRTBPRD触发。向上向下计数模式无论计数器在递增还是递减只要CMPx ≥ TBPRD对应的比较事件CAU/CBU或CAD/CBD都会在周期匹配点TBCTRTBPRD触发。避坑指南CMPx的“幽灵”事件这是新手配置ePWM时最容易栽跟头的地方。你写了一段代码想通过改变CMPA从0到TBPRD来实现0%-100%占空比。理论上当CMPATBPRD时占空比应为100%。但在向上计数模式下如果你配置的是CAU事件清除输出当CMPATBPRD时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产生奇妙的组合就可能导致旧值动作多持续一个周期新值已经加载但基于旧值的某个动作如置高已经发生且无法撤销。新值动作被延迟一个周期该发生动作时新值还未被加载。文档给出的黄金配置法则就是为了规避这些问题对于对称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。核心逻辑:计数器从0向上数到TBPRD。在计数器为零ZRO时两路输出同时置高AQ_SET。这是脉冲的起点。当计数器向上数到等于CMPA时EPWMxA被清除AQ_CLEAR。当计数器向上数到等于CMPB时EPWMxB被清除AQ_CLEAR。周期点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波形特点: 与配置一相反低电平有效。即默认输出为高有效驱动信号如使能某些低有效使能的驱动器是低电平脉冲。核心逻辑:在周期点PRD两路输出同时被清除拉低。注意这里周期点事件发生在计数器从TBPRD归零的瞬间但逻辑上它标志着一个周期的结束和下一个周期的开始用于将输出复位到无效状态高电平。当计数器向上数到等于CMPA时EPWMxA被置位AQ_SET即拉高结束有效低电平脉冲。当计数器向上数到等于CMPB时EPWMxB被置位AQ_SET。零点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事件翻转。核心逻辑:使用CMPA和CMPB两个寄存器来共同定义一个脉冲的起始边沿和结束边沿。当计数器向上数到CMPA时EPWMxA置高AQ_SET脉冲开始。当计数器向上数到CMPB时EPWMxA拉低AQ_CLEAR脉冲结束。脉冲宽度 (CMPB - CMPA) * Tbcik。通过独立调节CMPA和CMPB你可以将这个脉冲放在周期内的任何位置。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双路独立低电平有效。这是电机驱动中非常经典的配置用于驱动两个独立的半桥或两个不相干的开关管。核心逻辑:计数器在0和TBPRD之间往返。当计数器向上计数到CMPA时EPWMxA置高AQ_SET。注意因为是低有效置高意味着结束有效低电平脉冲。当计数器向下计数到CMPA时EPWMxA拉低AQ_CLEAR开始有效低电平脉冲。EPWMxB逻辑类似由CMPB控制。这样每个通道输出的低电平脉冲在周期中心对称。脉冲宽度低电平时间 2 * (TBPRD - CMPx) * Tbcik。占空比计算: 低电平占空比 (TBPRD - CMPx) / TBPRD。当CMPx0时低电平占空比100%输出常低当CMPxTBPRD时低电平占空比0%输出常高。代码关键行解析:EPwm1Regs.TBCTL.bit.CTRMODE TB_COUNT_UPDOWN; // 关键设置为上下计数模式 EPwm1Regs.AQCTLA.bit.CAU AQ_SET; // 向上匹配CMPAEPWMxA置高结束低脉冲 EPwm1Regs.AQCTLA.bit.CAD AQ_CLEAR; // 向下匹配CMPAEPWMxA拉低开始低脉冲 // EPWMxB配置类似应用场景: 三相逆变器中两个上管或两个下管的独立控制虽然更常用互补模式或其他需要中心对称PWM的独立开关电源。4.5 配置五向上向下计数对称波形互补输出调制对应图表: Figure 3-26, Example 3-5波形特点:对称PWMEPWMxA与EPWMxB互补输出且带有固定的“死区”时间。这是H桥或三相全桥驱动的标准配置。注意这里的“死区”是通过CMPA和CMPB的差值软件实现的而非使用后续的DB模块。核心逻辑:EPWMxA和EPWMxB被配置为一对互补信号通常EPWMxA驱动上管EPWMxB驱动下管。当计数器向上计数到CMPA时EPWMxA置高开启上管。当计数器向下计数到CMPA时EPWMxA拉低关闭上管。当计数器向上计数到CMPB时EPWMxB拉低关闭下管。注意这里和EPWMxA的CAU事件动作相反当计数器向下计数到CMPB时EPWMxB置高开启下管。注意这里和EPWMxA的CAD事件动作相反关键点由于CMPB CMPAEPWMxB的开启CBD置高发生在EPWMxA关闭CAD拉低之后EPWMxB的关闭CBU拉低发生在EPWMxA开启CAU置高之前。这就自然地在两路互补信号之间插入了一段两者都为低的死区时间。死区时间计算死区时间 (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%占空比输出。核心逻辑:这可能是最灵活也最令人困惑的配置。它利用了一个周期内CMPA和CMPB会被匹配两次的特性。配置CAU AQ_SET和CBD AQ_CLEAR。这意味着在计数器向上经过CMPA时输出置高。在计数器向下经过CMPB时输出拉低。因此高电平脉冲的宽度由CMPA上升沿和CMPB下降沿共同决定并且由于计数器的往返这个脉冲在时间轴上是不对称的。文档指出低电平占空比与(CMPA CMPB)成正比。你可以通过调整CMPA和CMPB在周期内“滑动”这个脉冲块。应用场景: 需要复杂PWM图案的应用如某些特定谐波消除SHEPWM技术、特定形状的电流波形控制或者需要在一个通道上产生复杂定时而另一个通道提供简单时钟的场景。实操心得如何选择配置电机驱动FOC/SVPWM无脑选择配置五互补对称PWM。对称PWM谐波小互补输出带死区是桥式电路的刚需。通常我们会结合DB模块来产生死区而不是用CMP差值因为DB模块更专业。开关电源电压/电流环控制通常使用配置一或二非对称PWM。因为电源拓扑中开关管通常单向导通非对称PWM足够且控制简单。需要精确脉冲位置选择配置三脉冲定位。需要复杂调制或特定波形考虑配置六非对称双沿但要做好数学分析。简单独立开关控制配置一或四。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中的经典模式。我们最关心的是以下两种主动高互补模式AHC - Active High Complementary描述EPWMxA_Out是原始信号经过下降沿延迟FED后的版本。EPWMxB_Out是原始信号经过上升沿延迟RED后再取反的版本。波形效果假设原始信号是高有效PWM。EPWMxA_Out的下降沿被推迟EPWMxB_Out的上升沿被推迟且是低有效。这保证了在原始信号跳变时两路输出永远不会同时为高完美防止直通。配置DBCTL[POLSEL] 1, DBCTL[OUT_MODE] 1。主动低互补模式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 150MHzTbcik不分频即Tbcik周期 1/150MHz ≈ 6.667ns。计算所需计数值100ns / 6.667ns ≈ 15。配置寄存器// 假设已配置好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初始化标准流程无论哪种配置遵循一个清晰的初始化流程能避免很多低级错误时钟与引脚配置使能ePWM模块时钟配置GPIO复用为ePWM功能。时基模块TB配置设置周期值TBPRD决定PWM频率。设置计数器模式CTRMODE上/下/上下。设置时钟预分频HSPCLKDIV和CLKDIV得到Tbcik。配置相位加载和同步如果需要多模块同步。比较模块CC配置初始化CMPA和CMPB的值通常初始化为0或某个中间值。配置影子寄存器加载模式LOADAMODE和LOADBMODE通常为在ZERO或PRD时加载。动作限定器AQ配置根据目标波形配置AQCTLA和AQCTLB寄存器中的ZRO,PRD,CAU,CAD,CBU,CBD事件动作。这是最核心的一步。死区模块DB配置如果需要选择模式OUT_MODE和极性POLSEL。设置死区时间DBRED和DBFED。错误联防TZ配置如果需要配置故障触发源和故障响应强制高/低/高阻。使能计数器将TBCTR清零模块开始运行。6.2 常见问题排查实录问题1PWM完全没有输出。检查清单时钟和引脚确认ePWM模块时钟已使能PCLKCRx寄存器。用示波器或万用表检查GPIO引脚是否有输出确认复用功能是否正确。计数器是否在跑在调试器中查看TBCTR寄存器的值看它是否在循环计数。如果为0且不动检查TBCTL.bit.CTRMODE是否被正确设置为非停止模式。输出是否被强制检查AQCTLA/B寄存器配置是否正确特别是AQSF寄存器中是否有强制置位/清除标志被意外触发。检查TZ故障模块是否强制了输出。影子寄存器加载如果你在运行时更新CMPA/B但波形不变检查CMPCTL中LOADAMODE/LOADBMODE和SHDWAMODE/SHDWBMODE的配置。确保影子寄存器已使能并且加载事件ZRO/PRD已发生。问题2PWM波形频率或占空比不对。频率不对复核TBPRD和Tbcik频率的计算公式。记住*向上计数模式周期(TBPRD1)Tbcik上下计数模式周期2TBPRDTbcik。占空比不对或无法调到0%/100%检查AQ事件配置这是最常见原因。对照本章第4节的经典配置检查你的AQCTL寄存器每一位。例如想实现0%-100%在向上计数模式下可能需要用ZRO事件置高、CAU事件清除并确保CMPA可以从0变化到TBPRD1注意边界条件见3.3节。检查CMPA/B与TBPRD的关系如果你配置的是CAU事件但CMPA的值大于等于TBPRD事件会在周期点触发导致占空比异常见3.2节场景二。检查影子寄存器确保你在正确的时间点通常是在中断服务程序里计数器为0或TBPRD时更新CMPA.half.CMPA或CMPB并且更新的是影子寄存器对应的映射地址。问题3互补输出有重叠直通风险。检查死区配置如果使用DB模块确认DBRED和DBFED已设置为非零值且DBCTL模式配置正确如AHC或ALC。如果使用软件死区CMP差值法务必确保CMPB CMPA对于AHC模式并且差值换算的时间大于功率器件的关断时间。用示波器双通道测量这是最直接的方法。测量上下管的驱动波形放大跳变沿确认存在一段两者都为低或都为高取决于有效电平的死区时间。问题4波形中有毛刺或异常跳动。中断冲突如果你在PWM周期中断中更新比较值且中断服务程序执行时间过长可能会错过下一个周期的加载点。优化中断服务程序或考虑使用DMA自动传输更新值。寄存器访问冲突避免在计数器运行过程中直接写入活动的CMP/TBPRD寄存器非影子寄存器。始终通过影子寄存器配置。电源噪声在电机驱动等大功率场合功率回路对控制电路的干扰可能导致逻辑错误。确保电源去耦良好地线布局合理信号线远离功率线。6.3 高级技巧利用影子寄存器实现平滑过渡在电机控制中我们经常需要平滑地改变PWM占空比即转矩电流。直接暴力修改CMP值可能导致扭矩突变。可以利用影子寄存器的双缓冲特性在PWM周期中断例如CTRZRO中断中计算下一个周期需要的CMPA_new值。将这个新值写入CMPA.half.CMPA影子寄存器。硬件会在下一个CTRZRO或PRD事件时自动将影子寄存器的值加载到活动寄存器。 这样占空比的改变总是发生在周期的边界实现了同步更新避免了脉冲宽度突变使电机运行更平稳。最后再强调一次ePWM的调试离不开示波器。理论配置千般好不如示波器上看一眼。养成将关键信号如EPWMxA、EPWMxB、甚至内部的比较事件触发信号引到测试引脚或用示波器监控的习惯是快速定位和解决PWM相关问题的终极法宝。