公司动态

深入解析TI ePWM:从寄存器映射到电机驱动实战

📅 2026/7/22 10:43:34
深入解析TI ePWM:从寄存器映射到电机驱动实战
1. 项目概述从寄存器表到可运行的PWM波形如果你曾经在嵌入式项目中用过PWM大概率接触过那种简单的定时器PWM外设——设置一个周期寄存器再设置一个比较寄存器一个通道的PWM波形就出来了。这种简单PWM在控制LED亮度、驱动蜂鸣器时够用但一旦涉及到电机驱动、数字电源、逆变器这类需要多路精确同步、带死区互补、还要有快速故障保护的应用就显得力不从心了。TI的增强型PWM模块也就是ePWM就是为了解决这些复杂需求而生的。它不是“一个”PWM发生器而是一个高度模块化、可编程的PWM“系统”。我第一次接触ePWM时面对那几十个寄存器感觉就像拿到了一张复杂机器的零件清单每个零件寄存器都知道是干嘛的但怎么把它们组装成一个能精准运转的整体却毫无头绪。官方技术手册提供了详尽的寄存器映射和子模块框图但如何将这些静态信息转化为动态、可配置的代码逻辑中间缺了最关键的一环——“为什么”要这么配置以及“如何”根据需求组合这些模块。本文的目的就是帮你补上这一环。我不会再重复手册里已有的寄存器位定义列表而是以一个资深嵌入式工程师的视角带你深入ePWM的“车间”从寄存器映射这张“蓝图”出发拆解每个子模块的“工作原理”和“装配逻辑”。我们会聚焦于最核心的时间基准TB、**计数器比较CC和动作限定AQ**这三个子模块因为它们是构建任何PWM波形的基石。通过理解它们如何协同工作你就能举一反三轻松驾驭死区、故障保护等高级功能。最终你将获得的不只是知识而是一种能够根据具体应用需求比如生成一对带死区的互补PWM或者实现多路相位同步的SPWM自主设计并配置ePWM的能力。2. ePWM架构总览与寄存器映射解析在深入每个子模块之前我们必须先建立起对ePWM整体架构的宏观认识。ePWM模块的寄存器组织方式非常清晰它完全按照其功能子模块进行分组映射。这种设计并非随意而是体现了其“模块化、流水线”的工作思想。2.1 寄存器映射模块化的地址空间视图手册中的表19-1是整个ePWM的“户口本”。它告诉我们每个ePWM实例例如EPWM1, EPWM2...都拥有一套完全相同的寄存器组这些寄存器按子模块整齐排列。这种“每个实例一份完整拷贝”的设计保证了各个ePWM通道的独立性和可配置性。这里有一个关键细节常被忽略“Shadow”和“Privileged Mode Write Only”这两个属性。以TBPRD周期寄存器和CMPA/CMPB比较寄存器为例它们被标记为“Shadowed”有影子寄存器。这意味着你软件写入的值并非直接作用于硬件计数器而是先存入一个缓冲寄存器影子寄存器然后在某个特定的、安全的时刻如计数器为零或等于周期值时自动加载到“活动寄存器”中。这个机制至关重要它能防止在PWM周期中间更新比较值或周期值导致输出波形出现毛刺或畸变。想象一下在电机高速运转时如果比较值在计数器递增过程中被突然改变可能会导致功率管桥臂直通后果严重。因此对于任何会在PWM周期内动态调整的参数如占空比、频率必须使用影子寄存器模式。而像TZSEL故障区选择寄存器这类标记为“Privileged Mode Write Only”的寄存器通常与系统安全相关只能在特权模式下写入这为关键的保护功能增加了一层软件防护。2.2 核心信号流数据如何在子模块间传递ePWM的八个子模块并非孤立工作它们通过一系列内部信号串联成一条处理流水线。理解这条信号流是灵活配置ePWM的关键。核心流程可以概括为以下几步时钟与节拍Time-Base, TBTB子模块是心脏它产生最基础的TBCLK时钟和TBCTR计数器。TBCTR的计数模式递增、递减、先增后减决定了PWM的基本周期和对称性。它产生两个核心事件CTRPRD计数器等于周期值和CTRZERO计数器等于零。这两个事件是PWM周期的天然边界。刻下标记点Counter-Compare, CCCC子模块是标尺。它持续将TBCTR的值与CMPA和CMPB寄存器进行比较。当TBCTR等于CMPA或CMPB时就产生CTRCMPA和CTRCMPB事件。这两个事件本质上就是PWM输出跳变的“时间戳”。占空比的调节就是通过改变CMPA/CMPB的值来实现的。执行动作Action-Qualifier, AQAQ子模块是决策中心。它接收来自TB和CC的四个事件CTRPRD,CTRZERO,CTRCMPA,CTRCMPB并根据配置决定在每一个事件发生时对输出引脚EPWMxA和EPWMxB执行什么“动作”置高、拉低、翻转或保持不动。PWM波形就是在这里被“画”出来的。后续处理生成的原始PWM信号会依次经过DB死区发生器插入上升沿/下降沿延迟防止桥臂直通、PC斩波器生成高频载波用于驱动隔离器件如IGBT、TZ故障区在故障信号到来时强制输出安全状态。ET事件触发子模块则负责在特定事件如CTRPRD发生时产生中断或触发ADC启动转换实现精准的采样控制。一个重要的思维转变不要孤立地看待每个寄存器而要把它们看作这条流水线上的“控制阀门”。配置TBCTL是设定心脏的跳动节奏配置CMPA是设定跳变点配置AQCTLA是规定在跳变点执行什么操作。接下来我们就深入最核心的三个“车间”看看它们具体如何运作。3. 时间基准TB子模块PWM的心脏与节拍器时间基准子模块是整个ePWM的节奏之源。它定义了PWM波形的“时间尺子”所有其他事件都基于这个尺子来定位。其核心是一个16位的计数器TBCTR和它相关的控制逻辑。3.1 核心寄存器与信号解读TB子模块的寄存器虽少但每个都至关重要TBCTL控制寄存器这是大脑。它决定计数器模式CTRMODE、时钟预分频HSPCLKDIV,CLKDIV、相位加载使能PHSEN、影子寄存器加载模式PRDLD等。TBPRD周期寄存器这是尺子的总长度。它决定了TBCTR计数到多少为一个周期。TBPRD的值直接决定了PWM的频率。TBCTR计数器寄存器这是尺子的当前刻度。它随着TBCLK的节拍递增或递减软件可读但通常不直接写写操作主要用于同步或强制复位。TBPHS相位寄存器用于多个ePWM模块同步时设定从模块相对于主模块的相位偏移。TBSTS状态寄存器主要包含CTR_MAX标志位计数器达到最大值0xFFFF用于监控。关键信号CTRPRDCTRZERO这两个事件信号是PWM周期的“起止符”不仅用于内部状态机也是触发影子寄存器加载、产生中断/ADC触发的重要源。CTR_dir计数器方向信号。高电平表示递增低电平表示递减。这个信号对AQ子模块至关重要因为它允许我们为计数器的上升沿和下降沿分别定义不同的动作。EPWMxSYNCI/EPWMxSYNCO同步输入/输出信号。用于将多个ePWM模块的计数器在时间上对齐是实现多相PWM如三相逆变器的基础。3.2 计数模式与频率计算三“心跳”方式TBCTR有三种基本计数模式对应三种不同的PWM波形类型递增计数模式Up-Count行为TBCTR从0开始每个TBCLK加1直到等于TBPRD然后瞬间归零重新开始。波形特征产生非对称PWM。波形在一个周期内只有一次比较事件如果使用CMPA跳变沿不对称。频率公式FPWM 1 / TPWM 1 / [(TBPRD 1) * TTBCLK]。这里TTBCLK是TBCLK的周期。注意是TBPRD1因为计数器从0计数到TBPRD总共是TBPRD1个时钟 ticks。应用场景普通开关电源、简单的LED调光。递减计数模式Down-Count行为TBCTR从TBPRD开始每个TBCLK减1直到等于0然后瞬间重载为TBPRD重新开始。波形特征同样产生非对称PWM但波形相位与递增模式相反。频率公式与递增模式相同FPWM 1 / [(TBPRD 1) * TTBCLK]。应用场景某些特定的拓扑结构或控制算法中可能需要。递增-递减计数模式Up-Down-Count行为TBCTR从0开始递增到TBPRD然后立即转为递减回到0如此循环。波形特征产生对称中心对齐PWM。这是电机控制和数字音频D类功放中最常用的模式。因为波形关于中心对称谐波特性更好且在每个PWM周期内CTRCMPA和CTRCMPB事件会发生两次一次在递增沿一次在递减沿为AQ模块提供了更灵活的控制点。频率公式FPWM 1 / TPWM 1 / [2 * TBPRD * TTBCLK]。注意这里是2 * TBPRD因为一个完整的周期包含了递增和递减两个阶段。应用场景电机FOC控制、逆变器、高性能D类音频放大器。实操心得频率计算中的“坑”很多新手在计算PWM频率时容易出错根源在于混淆了“计数值”和“时钟周期数”。务必记住在递增/递减模式下计数器从A到B经历的时钟 ticks 数是|A - B| 1。而在递增-递减模式下一个完整周期是2 * TBPRD个 ticks。在编程时我习惯先根据系统时钟SYSCLK和期望的PWM频率反推出需要的TBCLK频率和TBPRD值。例如系统时钟150MHz想要20kHz的中心对齐PWM如果选择TBCLK SYSCLK / 2 75MHz则TBPRD (TBCLK / FPWM) / 2 (75e6 / 20e3) / 2 1875。将这个值写入TBPRD即可。3.3 同步机制让多个心脏同频共振在驱动三相电机或交错并联电源时我们需要多个ePWM模块输出相位精确相关的PWM。TB子模块的同步功能就是为此而生。硬件同步链如图19-6所示EPWM1的同步输入EPWM1SYNCI通常来自外部引脚或其它外设如eCAP。EPWM1的同步输出EPWM1SYNCO连接到EPWM2的同步输入EPWM2SYNCI以此类推形成一个链。当主模块如EPWM1产生一个同步脉冲例如在CTRZERO时这个脉冲会沿着链传递触发后续从模块的同步事件。相位控制当从模块的TBCTL[PHSEN]位使能时在同步事件发生时从模块的TBCTR计数器会被强制加载TBPHS寄存器中的值。通过设置不同的TBPHS值可以精确控制从模块波形相对于主模块的相位差。例如在三相逆变器中设置三个ePWM模块的TBPHS分别为0、TBPRD/3、2*TBPRD/3即可生成相位互差120度的三相PWM。全局时钟同步TBCLKSYNC这是一个更底层的同步。通过设置IOMM模块中的TBCLKSYNC位可以确保所有ePWM模块的TBCLK时钟沿精确对齐。正确的初始化顺序至关重要先使能各ePWM模块的时钟然后置TBCLKSYNC0停止所有时基时钟接着配置所有ePWM的预分频器和模式最后再置TBCLKSYNC1同时启动所有时钟。这避免了因模块使能时间不同步导致的初始相位随机。4. 计数器比较CC子模块PWM波形的雕刻刀如果说TB模块定义了画布时间轴的大小那么CC模块就是那把在画布上做标记的雕刻刀。它本身不产生输出而是精确地定义在时间轴的哪些“刻度”上需要触发后续的动作。4.1 工作原理与影子寄存器机制CC子模块的核心是两个16位的数字比较器分别将TBCTR与CMPA和CMPB进行比较。当相等时产生CTRCMPA和CTRCMPB事件。这里最精妙的设计是影子寄存器机制。CMPA和CMPB都有对应的影子寄存器。在影子模式下CMPCTL[SHDWAMODE]0你通过软件写入CMPA寄存器的值实际上是写入了它的影子寄存器。这个值不会立即生效去影响正在进行的PWM周期。只有当特定的“加载事件”发生时由CMPCTL[LOADAMODE]位配置通常是CTRPRD或CTRZERO影子寄存器的内容才会被安全地传输到活动寄存器中从而影响下一个PWM周期。为什么需要这个机制想象一下你正在用PWM控制电机的电流。当前周期内TBCTR正在从0向TBPRD递增。如果在递增到一半时你的控制算法更新了CMPA值为了调节电流并且这个新值立即生效。此时可能出现两种情况1) 新值大于当前TBCTR那么本周期内不会再产生CTRCMPA事件导致输出异常2) 新值小于当前TBCTR则会立即触发一个CTRCMPA事件导致在当前周期内产生一个额外的、非预期的跳变。无论哪种情况都会导致输出波形出现严重毛刺在功率应用中可能引发灾难性后果。影子寄存器机制完美避免了这个问题确保了PWM参数更新的平滑和安全。4.2 不同计数模式下的比较事件特性CC子模块的行为与TB的计数模式紧密耦合在递增或递减模式下TBCTR单向变化。因此CTRCMPA事件在一个PWM周期内最多发生一次。只有当CMPA的值在0到TBPRD之间且不等于0或TBPRD时才会发生。如果CMPA等于0或TBPRD事件会在周期边界CTRZERO或CTRPRD与其他事件同时发生需要AQ模块的优先级逻辑来处理。在递增-递减模式下TBCTR先增后减。因此只要CMPA的值在0到TBPRD之间不包括边界CTRCMPA事件每个PWM周期会发生两次一次在递增过程中一次在递减过程中。这是生成对称PWM波形的关键。如果CMPA等于0或TBPRD则事件只在CTR0或CTRPRD时发生一次。图19-13至19-16的波形图清晰地展示了这一点。特别注意图19-13的注释外部同步事件EPWMxSYNCI可能导致TBCTR序列不连续从而“跳过”一次比较事件。这不是错误而是正常现象。在设计同步系统时必须考虑这种可能性避免依赖单个周期内必然发生的比较事件来做关键逻辑。注意事项CMPA/CMPB的取值范围虽然CMPA/CMPB是16位寄存器理论上可以设置为0x0000到0xFFFF之间的任何值但其有效工作范围受TBPRD限制。在递增/递减模式下如果CMPATBPRD则在整个计数过程中TBCTR永远不会等于CMPACTRCMPA事件永远不会发生输出将保持恒定高或低取决于AQ配置。在递增-递减模式下如果CMPATBPRD同样不会发生比较事件。通常在初始化时应确保CMPA/CMPB≤TBPRD。动态调整时也需注意此边界。5. 动作限定AQ子模块波形的最终决策者AQ子模块是ePWM的“指挥官”。它接收来自TB和CC的四个核心事件CTRPRD,CTRZERO,CTRCMPA,CTRCMPB并根据当前的计数器方向CTR_dir决定对两个输出引脚EPWMxA和EPWMxB执行何种操作置高Set High、拉低Clear Low、翻转Toggle或无视Do Nothing。5.1 事件-动作映射与优先级逻辑AQ的配置寄存器AQCTLA和AQCTLB的结构本质上是一个查找表。对于每个输出A和B独立你可以为上述四个事件在计数器递增Up和递减Down时分别指定一个动作。例如要生成一个简单的、高电平有效的PWM波形在EPWMxA上通常这样配置在CTRPRD事件递增模式下周期结束递减模式下周期开始时动作 Clear拉低。在CTRCMPA事件时动作 Set置高。这样在每个周期开始时或结束时取决于模式输出先被拉低当计数器增长到CMPA值时输出被置高。占空比 CMPA / TBPRD递增模式。优先级问题如果多个事件在同一时刻发生例如在递增-递减模式下CMPA TBPRD那么CTRCMPA和CTRPRD会在同一时刻发生AQ模块有固定的硬件优先级来处理冲突。优先级从高到低通常是CTRPRDCTRZEROCTRCMPBCTRCMPA具体需查手册。了解优先级对于配置边界条件占空比0%或100%和复杂波形至关重要。5.2 生成互补对称PWM波形一个经典案例在电机驱动和全桥电源中我们经常需要一对互补的、带死区的PWM信号例如EPWMxA和EPWMxB。仅使用AQ模块不加DB死区模块就可以生成基础的互补信号。假设使用递增-递减模式希望EPWMxA和EPWMxB互补且中心对称。配置思路如下EPWMxA配置在递增过程中当CTRCMPA时Set High在CMPA点置高。在递减过程中当CTRCMPA时Clear Low在CMPA点拉低。这样EPWMxA会在CMPA点产生一个上升沿并在对称的CMPA点产生一个下降沿形成一个中心对称的脉冲。EPWMxB配置我们需要EPWMxB与EPWMxA互补。一种方法是利用CTRCMPB事件并设置CMPB TBPRD - CMPA。在递增过程中当CTRCMPB时Clear Low在CMPB点拉低。在递减过程中当CTRCMPB时Set High在CMPB点置高。这样EPWMxB的脉冲中心与EPWMxA的脉冲中心对齐但电平相反形成互补。通过精细设置CMPA和CMPB并配合AQ的双边沿独立动作我们可以创造出非常复杂的多电平PWM波形这对于某些高级调制算法如空间矢量调制SVPWM的实现是基础。5.3 软件强制与连续强制AQSFRC和AQCSFRC寄存器提供了软件强制输出状态的能力。这在某些调试或安全场景下非常有用。AQSFRC可以一次性强制EPWMxA或EPWMxB为高、低或翻转。强制操作发生后输出控制权会立即交还给AQ逻辑。AQCSFRC提供“连续强制”模式。在此模式下你可以配置输出被强制为高或低并锁定在该状态无视AQ的正常事件-动作映射直到你清除强制状态。这常用于实现紧急停机或测试模式。避坑指南AQ配置的常见错误忘记配置计数器方向相关的动作在递增-递减模式下必须分别为Up和Down配置事件动作。如果只配置了Up时的动作那么Down时就会执行默认的“Do Nothing”导致波形不对称。CMPA/CMPB值为0或TBPRD时的行为此时比较事件与周期/零事件同时发生。务必查清硬件优先级并测试输出是否符合预期。有时需要利用优先级有时则需要避免这种边界情况。影子寄存器未生效导致波形错误在动态更新CMPA/CMPB后如果忘记检查影子寄存器的加载事件是否已发生或加载模式配置错误新的占空比可能不会立即生效导致控制环路出现滞后或错误。一个良好的习惯是在更新影子寄存器后等待一个PWM周期结束的标志如ET模块的中断再进行下一次计算。6. 从寄存器到代码配置一个完整的ePWM通道理论说得再多不如一行代码。下面我将以TI C2000系列DSP的典型配置为例展示如何从零配置一个ePWM通道生成一个频率20kHz、占空比30%、中心对齐的PWM波。假设系统时钟SYSCLK 150MHz。6.1 初始化步骤与参数计算时钟与周期配置TB子模块选择TBCLK SYSCLK / 2 75MHz通过配置TBCTL[HSPCLKDIV]和TBCTL[CLKDIV]。目标为中心对齐PWM频率FPWM 20kHz。计算TBPRDTBPRD (TBCLK / FPWM) / 2 (75e6 / 20e3) / 2 1875。设置TBCTL[CTRMODE] 2递增-递减模式。使能TBPRD影子寄存器TBCTL[PRDLD]0在CTRZERO时加载默认。占空比配置CC子模块占空比30%则高电平时间占整个周期的30%。对于中心对齐模式CMPA的值决定了脉冲的宽度。计算CMPACMPA TBPRD * DutyCycle 1875 * 0.3 562.5取整为562。设置CMPCTL[SHDWAMODE] 0使能CMPA影子寄存器。设置CMPCTL[LOADAMODE] 0在CTRZERO时加载影子寄存器到活动寄存器。波形生成配置AQ子模块我们希望EPWM1A输出中心对称的PWM。配置AQCTLA在递增过程中当CTRCMPA时AQCTLA[CAD] 1(Set High)。在递减过程中当CTRCMPA时AQCTLA[CBU] 2(Clear Low)。注意这里寄存器字段名是简写实际需根据手册位域配置。EPWM1B暂时不用可以保持默认Do Nothing。6.2 示例代码片段C语言风格// 假设寄存器已通过头文件映射为结构体 void EPWM1_ConfigForCenterAlignedPWM(void) { // 1. 停止时基时钟配置前的好习惯 EALLOW; // 解除寄存器保护 SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC 0; // 停止所有ePWM时钟 EDIS; // 2. 配置TB子模块 EPwm1Regs.TBCTL.bit.CTRMODE 2; // 递增-递减模式 EPwm1Regs.TBCTL.bit.PHSEN 0; // 禁止相位加载主模块 EPwm1Regs.TBCTL.bit.PRDLD 0; // TBPRD使用影子寄存器在CTRZERO加载 EPwm1Regs.TBCTL.bit.SYNCOSEL 0; // 同步输出选择用自己的CTRZERO EPwm1Regs.TBCTL.bit.HSPCLKDIV 0; // 高速时钟分频 /1 EPwm1Regs.TBCTL.bit.CLKDIV 1; // 时钟分频 /2 (最终 TBCLK SYSCLK/2) EPwm1Regs.TBPRD 1875; // 设置周期值对应20kHz中心对齐PWM // 3. 配置CC子模块 EPwm1Regs.CMPCTL.bit.SHDWAMODE 0; // CMPA使用影子寄存器 EPwm1Regs.CMPCTL.bit.SHDWBMODE 0; // CMPB使用影子寄存器 EPwm1Regs.CMPCTL.bit.LOADAMODE 0; // CTRZERO时加载CMPA影子 EPwm1Regs.CMPCTL.bit.LOADBMODE 0; // CTRZERO时加载CMPB影子 EPwm1Regs.CMPA.bit.CMPA 562; // 设置比较值A占空比约30% // 4. 配置AQ子模块生成EPWM1A中心对称波形 // 清零相关配置位 EPwm1Regs.AQCTLA.all 0; // 递增过程中当CTRCMPA时将EPWM1A置高 EPwm1Regs.AQCTLA.bit.CAU 2; // CAU: Action on Counter equal to CMPA when counting Up // 递减过程中当CTRCMPA时将EPWM1A拉低 EPwm1Regs.AQCTLA.bit.CAD 1; // CAD: Action on Counter equal to CMPA when counting Down // 5. 启动时基时钟 EALLOW; SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC 1; // 启动所有ePWM时钟 EDIS; }6.3 调试与验证技巧配置完成后如何验证除了用示波器看输出软件调试也很关键。寄存器查看在调试器中实时查看TBCTR寄器的值它应该在0到1875之间循环往复。观察CMPA的值是否在影子寄存器和活动寄存器之间正确加载。事件触发与中断可以配置ET事件触发子模块在CTRPRD或CTRZERO时产生中断。在中断服务程序中可以安全地更新CMPA影子寄存器以实现占空比动态调节同时也可以打印计数器值验证周期。强制输出测试使用AQSFRC寄存器在代码中手动强制EPWM1A为高或低验证GPIO输出功能是否正常排除硬件连接问题。死区与故障保护测试在基础PWM工作正常后再逐步使能DB和TZ模块。务必先设置安全的故障默认动作如强制输出低电平再连接功率电路。7. 高级主题与故障排查实录掌握了基础配置后你可以探索更高级的功能如死区插入、故障保护联动、数字比较事件等。这些高级功能都建立在TB、CC、AQ这三个核心子模块的理解之上。7.1 死区生成器DB的集成死区是防止桥式电路上下管直通的关键。DB模块接收来自AQ的原始PWM信号EPWMxA和EPWMxB并对其上升沿和下降沿分别插入可编程的延迟生成最终的EPWMxA_OUT和EPWMxB_OUT。DBRED上升沿延迟控制从输入信号有效边沿到输出信号上升沿的延迟。DBFED下降沿延迟控制从输入信号有效边沿到输出信号下降沿的延迟。DBCTL控制寄存器配置输入信号极性、输出模式例如将AQ生成的一个PWM信号通过DB模块生成一对互补带死区的信号。配置要点死区时间通常以TBCLK周期为单位。例如TBCLK75MHz周期约13.33ns。若要插入100ns的死区则需要设置DBRED或DBFED约为100ns / 13.33ns ≈ 7.5取整为8实际死区约106.7ns。需根据功率器件的开关特性仔细计算。7.2 故障保护TZ的紧急处理TZ模块是ePWM的安全卫士。它监控外部故障引脚如过流、过温或内部数字比较事件。一旦触发可以立即强制PWM输出进入预设的安全状态高、低、高阻无需CPU干预响应速度极快。TZSEL选择哪些故障源能触发本ePWM模块。TZCTL配置触发故障后EPWMxA和EPWMxB的输出动作强制高、强制低、高阻。TZEINT使能故障中断以便CPU记录故障事件。TZFRC软件强制触发故障用于测试。安全第一原则在初始化任何ePWM模块驱动功率器件之前必须先配置好TZ模块将故障动作设置为安全状态通常是将所有输出强制拉低并确保故障输入引脚已正确上拉/下拉避免误触发。这是一个血泪教训我曾因疏忽此步骤在调试时导致MOSFET直通烧毁。7.3 常见问题排查速查表现象可能原因排查步骤无PWM输出1. ePWM模块时钟未使能。2. GPIO复用功能未配置到PWM模式。3.TBCTR未启动TBCLKSYNC0或CTRMODE0冻结模式。4.AQ模块所有动作均配置为“Do Nothing”。1. 检查PCLKCR0寄存器中对应ePWM时钟使能位。2. 检查GPIOxMUX/GPIOxGMUX寄存器将引脚配置为EPWM模式。3. 检查TBCTL[CTRMODE]不为0并确认TBCLKSYNC已置1。4. 检查AQCTLA/AQCTLB寄存器确保至少有一个事件配置了Set/Clear/Toggle动作。PWM频率不对1.TBCLK预分频计算错误。2.TBPRD值计算错误混淆了计数模式。3. 影子寄存器未生效实际使用的仍是旧周期值。1. 核对TBCTL[CLKDIV]和[HSPCLKDIV]配置。2. 重新计算递增/递减模式Fpwm TBCLK / (TBPRD1)递增-递减模式Fpwm TBCLK / (2*TBPRD)。3. 检查TBCTL[PRDLD]位确认在更新TBPRD后等待了CTRZERO事件。占空比不可控或不变1.CMPA/CMPB值超出TBPRD范围。2. 影子寄存器模式使能但加载事件未发生或配置错误。3.AQ模块配置错误比较事件未绑定到输出动作。1. 确保动态更新的CMPA值始终 ≤TBPRD。2. 检查CMPCTL[LOADAMODE]确认加载事件如CTRPRD是否会发生。在中断中更新CMPA后可读取CMPA活动寄存器值验证是否加载。3. 检查AQCTLA寄存器确认CAU/CAD或CBU/CBD字段已正确配置为Set或Clear。互补输出不对称或有毛刺1. 在递增-递减模式下只配置了Up或只配置了Down的动作。2. 死区模块DB配置错误输入极性弄反。3.CMPA和CMPB的值设置不当未满足互补关系。1. 检查AQCTLA和AQCTLB确保为CAU/CAD、CBU/CBD都配置了动作。2. 检查DBCTL寄存器中的IN_MODE和POLSEL位确保输入信号极性正确。3. 对于中心对齐互补PWM应满足CMPA CMPB TBPRD。用示波器双通道同时测量观察波形。多路ePWM不同步1. 同步链EPWMxSYNCI/SYNCO未正确配置或连接。2. 从模块的TBCTL[PHSEN]未使能或TBPHS值设置错误。3. 各模块TBCLK分频不一致导致TBCLKSYNC同步后频率不同。1. 确认主模块的SYNCO源如CTRZERO已选择且从模块的SYNCI已使能PHSEN1。2. 检查从模块TBPHS寄存器的值计算其与主模块的期望相位差对应的计数值。3. 确保所有需要同步的ePWM模块其TBCTL[CLKDIV]和[HSPCLKDIV]设置完全相同。回顾整个ePWM的学习与应用过程其核心思想在于“解耦”与“联动”。八个子模块各司其职通过清晰的寄存器接口和内部信号流松散耦合。这种设计赋予了它极大的灵活性。从简单的单路PWM到复杂的多相变频控制其底层逻辑都是一致的用时基定义节奏用比较设定时刻用动作绘制波形再用死区、故障保护等模块进行修饰和加固。真正掌握ePWM不在于背下所有寄存器位而在于理解这套“信号流”哲学并能根据目标波形在脑海中清晰地规划出数据在这条流水线上的传递与转化路径。当你拿到一个新的电机驱动或电源拓扑需求时能够迅速将其分解为ePWM各个子模块的配置参数那才算是真正驾驭了这颗强大的心脏。