1. 项目概述与ePWM核心价值在电力电子和电机驱动的世界里精确的脉冲控制是驱动一切的核心。无论是让电机平稳转动还是让电源高效转换能量背后都离不开一个关键角色脉冲宽度调制PWM模块。而德州仪器TI在其C2000系列微控制器中集成的增强型PWMePWM模块则将这种控制能力提升到了工业级的灵活性与可靠性。它不是简单的定时器加比较器而是一个高度模块化、可编程的子系统能够应对从简单的LED调光到复杂的三相逆变器驱动等各种场景。我接触过不少PWM模块但ePWM的深度和灵活性始终让我印象深刻。它把波形生成的各个环节——时间基准、比较匹配、动作输出、死区插入、故障保护——拆解成独立的子模块就像一套精密的乐高积木。你可以根据需求自由组合搭建出从简单到极其复杂的PWM波形。本文我们就来深入这套“乐高”的核心计数器模式如何决定波形的骨架比较寄存器如何雕刻出波形的细节以及如何通过死区控制确保功率开关的安全。无论你是正在调试第一个电机驱动项目还是希望优化现有电源设计理解这些底层机制都能让你从“配置寄存器”走向“真正掌控波形”。2. ePWM模块架构与核心子模块解析要玩转ePWM首先得看清它的全貌。ePWM模块并非一个黑盒它由多个协同工作的子模块构成每个子模块负责波形生成流水线中的一个特定环节。理解这个架构是进行任何高级配置的前提。2.1 核心子模块功能分解一个完整的ePWM模块例如ePWM1通常包含以下关键子模块数据流大致从左至右时间基准TB子模块这是整个ePWM的“心脏”。它包含一个核心计数器TBCTR、一个周期寄存器TBPRD和一个相位寄存器TBPHS。TB子模块决定了PWM波的频率和相位。计数器在时钟驱动下按照设定的模式上、下、上下计数循环运行其计数值是后续所有比较和动作的基准。计数比较CC子模块这是波形的“雕刻刀”。它包含两个比较寄存器CMPA和CMPB通常都有影子寄存器支持缓冲更新。CC子模块持续将TBCTR的当前值与CMPA/CMPB的值进行比较当匹配发生时会产生相应的事件信号如CTRCMPA即“比较A匹配”事件。动作限定器AQ子模块这是波形的“指挥官”。它接收来自TB子模块如CTR0, CTRTBPRD和CC子模块CTRCMPA, CTRCMPB的事件并根据用户配置的“动作规则”控制输出引脚EPWMxA和EPWMxB的电平是置高SET、置低CLEAR还是翻转TOGGLE。波形的基本形状占空比、对称性就是在这里被定义的。死区生成器DB子模块这是功率电路的“安全员”。它接收来自AQ子模块的原始PWM信号并对其上升沿和/或下降沿插入可编程的延迟从而生成一对带有死区时间的互补信号EPWMxA和EPWMxB。死区时间是为了防止同一桥臂的上、下两个功率管如MOSFET或IGBT同时导通而发生直通短路是电机驱动和逆变器应用中的强制性安全措施。故障保护TZ子模块这是系统的“紧急制动”。它监控多个外部故障信号如过流、过压一旦触发可以立即强制PWM输出进入预定安全状态高、低或高阻保护功率器件不被损坏。事件触发ET与PWM斩波器PC子模块ET用于在特定事件如周期匹配时触发ADC转换或产生中断PC则用于生成高频载波来调制PWM波常用于驱动脉冲变压器隔离的门极驱动电路。2.2 寄存器映射与影子寄存器机制在编程层面我们通过操作一组内存映射的寄存器来控制这些子模块。以TI的C2000为例每个ePWM模块都有一套独立的寄存器组如EPwm1Regs.TBPRD、EPwm1Regs.CMPA.half.CMPA、EPwm1Regs.AQCTLA等。这里需要特别理解影子寄存器机制这是实现PWM波形无毛刺、平滑变化的关键。对于关键寄存器如TBPRD、CMPA、CMPB硬件上实际有两套活动寄存器和影子寄存器。我们软件写入的是影子寄存器。影子寄存器中的值只有在特定的“加载事件”如计数器归零或达到周期值发生时才会一次性同步到活动寄存器中供硬件使用。实操心得这个机制至关重要。想象一下如果你在PWM波形的中间时刻直接修改了活动比较寄存器的值可能会导致当前周期内产生一个极窄的、非预期的脉冲glitch这在电机驱动中可能引发电流尖峰。通过配置CMPCTL.LOADAMODE等位确保在计数器归零CTR0或达到周期值CTRTBPRD的“安全时刻”更新就能保证整个PWM周期的完整性实现占空比的平滑过渡。3. 计数器模式波形生成的基石ePWM的波形多样性首先源于其时间基准计数器TBCTR的三种基本工作模式。模式不同波形的对称性、事件触发点以及占空比的计算方式都会随之改变。3.1 上计数模式Up-Count Mode这是最简单、最直观的模式。计数器从0开始每个TBCLK时钟周期加1一直计数到周期值TBPRD然后在下一个时钟周期瞬间归零并重新开始计数。波形特征生成非对称PWM波。每个PWM周期只在计数器递增时产生边沿。关键事件点CTR 0计数器归零事件。CTR CMPx在计数上升过程中当计数值等于比较寄存器CMPA或CMPB时触发“比较向上”事件CAU/CBU。CTR TBPRD计数器达到周期值事件。注意在达到TBPRD的下一个时钟周期计数器即归零。占空比计算在这种模式下通常我们配置在CTR0时置高输出在CTRCMPA时清零输出对于主动高电平输出。那么高电平时间脉冲宽度就对应计数器从0计数到CMPA的时间。因此占空比 (CMPA值) / (TBPRD 1)。这里“1”是因为计数器从0计数到TBPRD总共经历了TBPRD1个计数值。典型应用开关电源如Buck、Boost变换器的简单控制、LED调光、蜂鸣器驱动等只需要单边调制且对波形对称性无要求的场合。3.2 下计数模式Down-Count Mode与上计数模式相反计数器从TBPRD值开始每个时钟周期减1一直减到0然后瞬间跳回TBPRD重新开始。波形特征同样生成非对称PWM波但边沿产生的逻辑与上计数模式形成镜像。在实际应用中单纯使用下计数模式的情况较少。关键事件点CTR TBPRD计数器载入周期值事件起始点。CTR CMPx在计数下降过程中当计数值等于比较寄存器时触发“比较向下”事件CAD/CBD。CTR 0计数器归零事件。占空比计算逻辑与上计数模式镜像。例如在CTRTBPRD时置高CTRCMPA时清零则高电平时间为从TBPRD下降到CMPA的时间。占空比计算方式与上计数模式类似但需注意计数方向。3.3 上下计数模式Up-Down Count Mode这是电机控制和全桥逆变器中最常用、也是最强大的模式。计数器从0开始递增到TBPRD然后立即转为递减从TBPRD减回到0如此循环往复。波形特征生成对称PWM或中心对齐PWM。每个PWM周期在计数上升和下降阶段各产一次边沿机会波形关于中心点对称。关键事件点CTR 0计数器归零事件也是计数方向由减转增的转折点。CTR TBPRD计数器达到周期值事件计数方向由增转减的转折点。CTR CMPx (Up)在计数上升过程中匹配触发“比较向上”事件CAU/CBU。CTR CMPx (Down)在计数下降过程中匹配触发“比较向下”事件CAD/CBD。占空比计算这是上下计数模式最精妙的地方。为了实现0%-100%的对称PWM调制通常采用一种“比较-匹配-置位/清零”的对称操作。例如一个常见的配置是在CAU事件上升匹配时置高输出在CAD事件下降匹配时清零输出。此时高电平时间对应于计数器从CMPA值上升到TBPRD再下降回CMPA值的时间窗口。占空比 (TBPRD - CMPA) / TBPRD。当CMPATBPRD时高电平时间为0占空比0%当CMPA0时高电平时间为整个周期占空比100%。核心优势与避坑指南优势对称PWM的谐波特性更好在电机驱动中能有效减小转矩脉动和电流谐波。它天然为每个PWM周期提供了两个可独立控制的边沿便于实现更复杂的调制策略。避坑点影子寄存器加载时机。在上下计数模式下影子寄存器的加载时机Load on Zero or Load on PRD需要与比较值的范围谨慎配合。官方文档给出了一个黄金法则如果设置在CTR0时加载影子寄存器那么CMPA/CMPB的值必须大于等于1。如果设置在CTRTBPRD时加载影子寄存器那么CMPA/CMPB的值必须小于等于TBPRD-1。为什么这是为了避免“比较值等于加载触发点”时可能出现的竞争条件。例如若在CTR0加载且CMPA0则硬件可能在加载新值0的同一时刻就判定发生了比较匹配CTR0CMPA导致行为不确定或产生一个极窄的、可能被系统忽略的脉冲。遵守上述规则可以确保每个PWM周期至少有一个TBCLK周期宽度的脉冲行为确定。下表总结了三种计数器模式的核心特性特性上计数模式 (Up-Count)下计数模式 (Down-Count)上下计数模式 (Up-Down-Count)波形对称性非对称 (边沿对齐)非对称 (边沿对齐)对称 (中心对齐)计数器轨迹0 - TBPRD - 0TBPRD - 0 - TBPRD0 - TBPRD - 0关键事件CTR0, CTRCMPx (Up), CTRTBPRDCTRTBPRD, CTRCMPx (Down), CTR0CTR0, CTRTBPRD,CTRCMPx (Up), CTRCMPx (Down)PWM频率1 / [(TBPRD1) * TTBCLK]1 / [(TBPRD1) * TTBCLK]1 / [2 * TBPRD * TTBCLK]典型应用简单DC-DC变换器调光较少单独使用电机驱动全桥/半桥逆变器需要对称波形的场合占空比公式(示例)Duty CMPA / (TBPRD 1)Duty (TBPRD - CMPA) / (TBPRD 1)Duty (TBPRD - CMPA) / TBPRD4. 动作限定器AQ配置与波形生成实战理解了计数器模式我们就有了画布的尺寸和画笔运动的规则。而动作限定器AQ子模块则是我们决定在画布的哪个位置落下何种颜色电平的调色板。它通过配置“在XX事件发生时对YY输出执行ZZ动作”的规则来最终塑造PWM波形。4.1 AQ动作规则详解AQ子模块为每个输出EPWMxA和EPWMxB独立维护一组动作规则通常通过AQCTLA和AQCTLB寄存器配置。每个规则对应一个特定的事件并指定三种动作之一置位 (SET)将输出引脚强制拉高。清零 (CLEAR)将输出引脚强制拉低。翻转 (TOGGLE)将输出引脚电平反转。关键事件包括CTR PRD计数器达到周期值。CTR ZRO计数器归零。CTR CMPA当计数器等于CMPA时触发。根据计数方向又细分为CAU: 在上计数过程中CTR等于CMPA。CAD: 在下计数过程中CTR等于CMPA。CTR CMPB同理分为CBU和CBD。4.2 经典波形配置代码解析我们结合输入材料中的几个经典示例看看AQ是如何“作画”的。示例1上计数模式非对称PWM双路独立调制主动高电平这是最基础的配置对应图3-22和示例3-1代码。// 初始化代码关键部分 EPwm1Regs.TBPRD 600; // 周期寄存器PWM频率由 (TBPRD1) 决定 EPwm1Regs.CMPA.half.CMPA 350; // 比较寄存器A决定EPWMxA的占空比 EPwm1Regs.CMPB 200; // 比较寄存器B决定EPWMxB的占空比 EPwm1Regs.TBCTL.bit.CTRMODE TB_COUNT_UP; // 上计数模式 // 动作限定器配置这是核心 EPwm1Regs.AQCTLA.bit.ZRO AQ_SET; // 事件CTR0时对EPWMxA执行 SET置高 EPwm1Regs.AQCTLA.bit.CAU AQ_CLEAR; // 事件CTRCMPA上数时对EPWMxA执行 CLEAR置低 EPwm1Regs.AQCTLB.bit.ZRO AQ_SET; // 事件CTR0时对EPWMxB执行 SET EPwm1Regs.AQCTLB.bit.CBU AQ_CLEAR; // 事件CTRCMPB上数时对EPWMxB执行 CLEAR波形解读计数器从0开始上升。在0时刻两个输出都被置高。当计数器上升到200CMPB时EPWMxB被清零上升到350CMPA时EPWMxA被清零。计数器达到600TBPRD后归零两个输出再次被置高开始下一个周期。占空比计算EPWMxA占空比 350 / (600 1) ≈ 58.2%EPWMxB占空比 200 / 601 ≈ 33.3%。两路PWM独立可调。示例4上下计数模式对称PWM双路独立调制主动低电平这是电机驱动中非常经典的配置对应图3-25和示例3-4代码。// 初始化代码关键部分 EPwm1Regs.TBPRD 600; // 周期寄存器 EPwm1Regs.CMPA.half.CMPA 400; // 比较寄存器A EPwm1Regs.CMPB 500; // 比较寄存器B EPwm1Regs.TBCTL.bit.CTRMODE TB_COUNT_UPDOWN; // 上下计数模式 // 动作限定器配置 EPwm1Regs.AQCTLA.bit.CAU AQ_SET; // 上升过程中CTRCMPA时EPWMxA置高 EPwm1Regs.AQCTLA.bit.CAD AQ_CLEAR; // 下降过程中CTRCMPA时EPWMxA置低 EPwm1Regs.AQCTLB.bit.CBU AQ_SET; // 上升过程中CTRCMPB时EPWMxB置高 EPwm1Regs.AQCTLB.bit.CBD AQ_CLEAR; // 下降过程中CTRCMPB时EPWMxB置低波形解读计数器从0上升到TBPRD(600)再下降回0。对于EPWMxA在上升阶段当CTR400(CMPA)时输出被置高在下降阶段当CTR再次等于400时输出被置低。因此EPWMxA的高电平出现在计数器值大于400的区间即400-600-400这个“山顶”区域是一个中心对称的脉冲。EPWMxB同理其高电平出现在计数器值大于500的区间。占空比计算EPWMxA占空比 (600 - 400) / 600 200 / 600 ≈ 33.3%。EPWMxB占空比 (600 - 500) / 600 ≈ 16.7%。注意这里输出是“主动低电平”即默认低电平是无效状态高电平是有效状态。占空比指的是有效高电平时间占比。示例5上下计数模式对称PWM互补输出这是驱动H桥上下管的经典配置对应图3-26和示例3-5代码。它利用CMPA和CMPB生成一对带有“软件死区”的互补信号。// 初始化代码关键部分 EPwm1Regs.TBPRD 600; EPwm1Regs.CMPA.half.CMPA 350; // 控制上管或下的导通时间 EPwm1Regs.CMPB 400; // CMPB CMPA差值(CMPB-CMPA)即为“软件死区时间” EPwm1Regs.TBCTL.bit.CTRMODE TB_COUNT_UPDOWN; // 动作限定器配置关键在于是用CAU/CAD还是CBU/CBD来控制哪个输出 EPwm1Regs.AQCTLA.bit.CAU AQ_SET; // EPWMxA在上升匹配CMPA时置高 EPwm1Regs.AQCTLA.bit.CAD AQ_CLEAR; // EPWMxA在下降匹配CMPA时置低 EPwm1Regs.AQCTLB.bit.CBU AQ_CLEAR; // EPWMxB在上升匹配CMPB时置低 EPwm1Regs.AQCTLB.bit.CBD AQ_SET; // EPWMxB在下降匹配CMPB时置高波形解读EPWMxA的高电平区间是计数器值在350到600再回到350的“山顶”区域。EPWMxB的高电平区间是计数器值在0到400再回到0的“山脚”区域因为它在CTRCMPB(400)时被清零在CTRCMPB(400)时被置高注意动作是CLEAR on BU, SET on BD。仔细观察EPWMxA的下降沿发生在CTR350下降匹配和EPWMxB的上升沿发生在CTR400下降匹配之间存在一个50个TBCLK计数的时间差400-350这就是软件实现的死区。在这段时间内两个输出都是低电平确保了H桥不会直通。注意事项这种利用两个比较器差值生成死区的方法非常灵活可以动态调整。但它需要占用CMPA和CMPB两个资源。对于更标准化和自动化的死区插入ePWM提供了专用的死区生成器DB子模块。4.3 高级技巧实现0%-100%占空比有时我们需要PWM能覆盖从完全关闭0%到完全开启100%的整个范围。在上下计数对称模式下直接使用上述“CAUSET, CADCLEAR”配置当CMPATBPRD时占空比为0%CMPA0时占空比为100%看似完美。但这里有一个陷阱当CMPA0时在计数器上下穿越0点的瞬间CAU和CAD事件几乎同时发生CTR0SET和CLEAR动作的先后顺序可能导致输出出现一个极窄的毛刺。官方应用报告推荐了更稳健的配置来实现0%-100%对于上下计数模式生成0%-100%对称PWM配置在周期点CTRPRD加载影子寄存器并确保CMPA/CMPB的值小于等于TBPRD-1。这样即使CMPA0比较事件也发生在计数器离开0点之后避免了竞争条件。对于上计数模式生成0%-100%非对称PWM一种配置是在CTR0时置高在CTRCMPA时清零并将CMPA的调制范围设为0到TBPRD1。当CMPA0时清零事件在起点发生输出始终为低0%当CMPATBPRD1时清零事件发生在下一个周期的0点之后输出几乎在整个周期为高100%。但需注意CMPA最大值受寄存器位宽限制且TBPRD1可能超出有效计数范围需仔细处理边界。5. 死区生成器DB子模块深度解析在驱动半桥或全桥电路时死区时间是必须的。虽然可以用两个比较器CMPA/CMPB通过AQ手动实现“软件死区”但ePWM内置的死区生成器DB子模块提供了更标准化、更易用且分辨率更高的解决方案。5.1 死区生成器的工作原理DB模块的核心功能是对输入信号通常来自AQ的EPWMxA的上升沿和下降沿分别插入可编程的延迟从而生成两路输出EPWMxA和EPWMxB。这两路输出通常是互补的并且通过插入的延迟时间死区时间保证了在任何时刻都不会同时为有效电平对于主动高电平驱动即不会同时为高。DB模块的配置主要围绕三个寄存器DBCTL(Dead-Band Control)控制输入源选择、输出模式、极性控制等。DBRED(Rising Edge Delay)设置上升沿延迟的计数值。DBFED(Falling Edge Delay)设置下降沿延迟的计数值。延迟时间的计算公式很简单基本模式死区时间 计数值(DBRED或DBFED) × T_TBCLK半周期时钟模式DBCTL[HALFCYCLE]1死区时间 计数值 × T_TBCLK / 2。此模式将时间分辨率提高了一倍。5.2 经典死区模式配置DB模块支持多种极性组合以适应不同门极驱动芯片的需求有些是高电平有效开启有些是低电平有效开启。以下是几种最常用的经典模式假设输入信号为来自AQ的EPWMxA原始PWM波。模式描述DBCTL[POLSEL]DBCTL[OUT_MODE]输出特性适用场景AHC (Active High Complementary)主动高电平互补10b11bEPWMxA_OUT 原始信号上升沿延迟后。EPWMxB_OUT 反相后的原始信号下降沿延迟后。最常用。驱动需要互补PWM、高电平有效的半桥电路。ALC (Active Low Complementary)主动低电平互补01b11bEPWMxA_OUT 原始信号上升沿延迟后取反。EPWMxB_OUT 原始信号下降沿延迟后。驱动需要互补PWM、低电平有效的半桥电路。AH (Active High)主动高电平00b11bEPWMxA_OUT 原始信号上升沿延迟后。EPWMxB_OUT 原始信号下降沿延迟后。生成两路同相但边沿错开的信号可用于驱动非互补结构。AL (Active Low)主动低电平11b11bEPWMxA_OUT 原始信号上升沿延迟后取反。EPWMxB_OUT 反相后的原始信号下降沿延迟后。生成两路反相且边沿错开的低有效信号。Bypass直通模式XX00bEPWMxA_OUT EPWMxA_IN, EPWMxB_OUT EPWMxB_IN。禁用死区功能信号直接通过。配置示例生成AHC模式死区假设我们需要为EPWM1模块配置一个上升沿延迟100ns下降沿延迟150ns的AHC死区。系统时钟SYSCLKOUT100MHzTBCLK不分频即TBCLK周期10ns。// 首先确保AQ模块已配置生成所需的原始PWM波形例如EPWM1A有输出EPWM1B未使用或固定 // 然后配置DB模块 EPwm1Regs.DBFED 15; // 下降沿延迟 15 * 10ns 150ns EPwm1Regs.DBRED 10; // 上升沿延迟 10 * 10ns 100ns // 配置DB控制寄存器AHC模式输入源为EPWMxA默认 EPwm1Regs.DBCTL.bit.OUT_MODE DB_FULL_ENABLE; // 使能上升沿和下降沿延迟 EPwm1Regs.DBCTL.bit.POLSEL DB_ACTV_HIC; // AHC模式 // IN_MODE 保持默认值00b即EPWMxA作为两个延迟块的输入源 // HALFCYCLE 保持默认值0使用全周期时钟配置完成后原始的EPWM1A信号经过DB模块会生成两路最终输出EPWM1A(最终输出)在原始信号上升沿后延迟100ns才变高在原始信号下降沿后延迟150ns才变低。EPWM1B(最终输出)与EPWM1A反相并且在它的上升沿对应原始信号下降沿和下降沿对应原始信号上升沿也插入了相同的延迟。这样EPWM1A和EPWM1B在任何时候都不会同时为高电平中间的死区时间由DBRED和DBFED共同决定。5.3 死区时间计算与避坑指南计算死区时间必须大于功率器件的开关时间开通延迟关断延迟并留有一定裕量。通常根据器件手册和实验确定范围在几百纳秒到几微秒。分辨率死区时间分辨率受TBCLK周期限制。若TBCLK10ns则最小死区步进为10ns。启用半周期模式(HALFCYCLE1)可将分辨率提高到5ns。避坑点顺序问题务必先配置DBRED和DBFED值再使能DB模块通过OUT_MODE。否则可能产生不可预测的初始脉冲。输入信号选择DBCTL[IN_MODE]默认使用EPWMxA作为两路延迟的输入源。如果你需要更复杂的逻辑例如两路延迟分别来自EPWMxA和EPWMxB可以修改此配置但这属于高级用法。与AQ配合DB模块处理的是AQ输出的信号。在AHC/ALC等互补模式下通常只需在AQ中配置EPWMxA产生PWM波EPWMxB配置为固定电平或忽略由DB模块自动生成互补信号。不要在AQ中再对EPWMxB进行复杂的动作配置以免冲突。极端占空比当原始PWM波的占空比非常大接近100%或非常小接近0%时插入死区可能导致有效脉冲宽度过窄甚至完全消失。软件上需要限制占空比的可调范围确保有效脉宽 死区时间。6. 实战配置流程与调试技巧理论最终要服务于实践。下面以一个典型的电机驱动应用——生成一对带死区的互补对称PWM为例梳理完整的配置流程和调试中会遇到的问题。6.1 完整配置步骤假设我们需要用ePWM1模块生成一对频率为20kHz、中心对称、带死区时间的互补PWM波AHC模式用于驱动一个半桥。系统时钟SYSCLKOUT 100MHz。确定时间基准参数期望PWM频率Fpwm 20kHz。采用上下计数模式周期公式为Tpwm 1/Fpwm 2 * TBPRD * T_TBCLK。为简化设TBCLK SYSCLKOUT即T_TBCLK 1/100MHz 10ns。计算TBPRD (1 / Fpwm) / (2 * T_TBCLK) (50us) / (2 * 10ns) 2500。设置EPwm1Regs.TBPRD 2500。配置时间基准TB子模块EPwm1Regs.TBCTL.bit.CTRMODE TB_COUNT_UPDOWN; // 上下计数模式 EPwm1Regs.TBCTL.bit.PHSEN TB_DISABLE; // 禁止相位加载 EPwm1Regs.TBCTL.bit.PRDLD TB_SHADOW; // 周期寄存器使用影子模式 EPwm1Regs.TBCTL.bit.SYNCOSEL TB_SYNC_DISABLE; // 禁止同步输出 EPwm1Regs.TBCTL.bit.HSPCLKDIV TB_DIV1; // 高速时钟分频 1 EPwm1Regs.TBCTL.bit.CLKDIV TB_DIV1; // 时钟分频 1 EPwm1Regs.TBPHS.word 0; // 相位寄存器清零 EPwm1Regs.TBCTR 0; // 计数器清零配置比较寄存器CC与动作限定器AQ假设初始占空比为50%。对于对称PWM占空比Duty (TBPRD - CMPA) / TBPRD。因此CMPA TBPRD * (1 - Duty) 2500 * 0.5 1250。我们只需要用CMPA来控制占空比CMPB可以用于其他目的或设为固定值。EPwm1Regs.CMPA.half.CMPA 1250; // 初始占空比50% EPwm1Regs.CMPCTL.bit.SHDWAMODE CC_SHADOW; // CMPA使用影子寄存器 EPwm1Regs.CMPCTL.bit.LOADAMODE CC_CTR_ZERO; // 在CTR0时加载影子寄存器安全 // 配置AQ生成原始对称PWM仅在EPWMxA上 EPwm1Regs.AQCTLA.bit.CAU AQ_SET; // 上升匹配CMPA时置高 EPwm1Regs.AQCTLA.bit.CAD AQ_CLEAR; // 下降匹配CMPA时置低 // EPWMxB在AQ中不配置动作由DB模块生成互补信号配置死区生成器DB假设需要死区时间为1us1000ns。T_TBCLK 10ns。上升沿和下降沿延迟各设为500ns以均衡开关损耗。DBRED DBFED 500ns / 10ns 50。EPwm1Regs.DBRED 50; // 上升沿延迟50个TBCLK 500ns EPwm1Regs.DBFED 50; // 下降沿延迟50个TBCLK 500ns EPwm1Regs.DBCTL.bit.OUT_MODE DB_FULL_ENABLE; // 使能双沿延迟 EPwm1Regs.DBCTL.bit.POLSEL DB_ACTV_HIC; // AHC模式 // IN_MODE, HALFCYCLE 使用默认值即可运行时代码更新占空比// 在中断或主循环中安全地更新占空比 float new_duty 0.7f; // 新的占空比70% Uint16 new_cmpa (Uint16)(EPwm1Regs.TBPRD * (1.0f - new_duty)); // 将新值写入影子寄存器它会在下一个CTR0时刻生效 EPwm1Regs.CMPA.half.CMPA new_cmpa;6.2 调试技巧与常见问题排查即使配置看起来正确第一次上电也常常看不到预期的波形。以下是一些实用的调试技巧和常见问题没有输出检查GPIO复用和输出使能这是新手最常踩的坑ePWM输出引脚如GPIO0/GPIO1对应EPWM1A/1B默认可能是通用输入模式。必须在系统初始化中配置相应的GPIO复用控制寄存器将其功能选择为ePWM输出。例如对于TI C2000需要配置GPyMUX和GPyGMUX寄存器。确认ePWM模块的时钟是否使能PCLKCR0或PCLKCR1寄存器中的相应位。波形频率不对检查TBPRD和时钟分频用示波器测量实际频率与计算值对比。确认TBCTL[CLKDIV]和[HSPCLKDIV]的分频设置是否正确。TBCLK SYSCLKOUT / (CLKDIV * HSPCLKDIV)。确认计数器模式是否正确。上下计数模式的实际频率是Fpwm 1 / (2 * TBPRD * T_TBCLK)。占空比无法调节或跳动检查影子寄存器加载机制如果你在运行时直接修改了CMPA活动寄存器而不是通过影子寄存器可能会导致毛刺或占空比跳动。确保CMPCTL[LOADAMODE]配置正确如CC_CTR_ZERO并在CTR0或CTRPRD的安全时刻更新CMPA影子寄存器值。在调试时可以在更新CMPA后读取其值确认写入成功。死区时间不生效或不对检查DB模块配置顺序和模式确保DBRED和DBFED寄存器在使能DB模块OUT_MODE之前已写入正确值。确认POLSEL模式是否符合你的门极驱动逻辑。用示波器同时观察EPWMxA和EPWMxB确认它们是互补的并且存在预期的死区时间两个信号同时为低电平的时间段。检查输入源IN_MODE确保死区模块接收到了正确的原始PWM信号。使用示波器触发抓取异常当出现罕见的毛刺或故障时可以配置ePWM的事件触发ET子模块在特定事件如周期中断时触发ADC或产生中断在中断服务程序里记录关键变量。更直接的方法是使用示波器的毛刺捕获或序列触发功能捕捉故障瞬间的PWM波形和可能的故障信号如TZ。利用CCS的寄存器查看和图形化工具TI的Code Composer Studio (CCS) IDE可以实时查看和修改ePWM的所有寄存器非常直观。CCS还提供了系统分析工具可以图形化显示PWM波形基于寄存器配置虽然不如实际示波器但在初步验证配置逻辑时非常有用。通过以上步骤和技巧你应该能够驯服ePWM这头“猛兽”让它精确地生成你想要的任何PWM波形。记住理解原理是基础细心配置是关键动手调试是最终验证。