深入解析C2000 eHRPWM模块:从基础原理到电机控制实战应用 1. 项目概述从“定时器”到“精密波形发生器”的蜕变在嵌入式系统尤其是电机控制、数字电源和逆变器这些对时序和功率精度要求极高的领域我们工程师打交道最多的外设之一就是PWM脉冲宽度调制模块。你可能用过简单的定时器输出比较模式来生成PWM但当项目复杂度上升需要多路同步、高分辨率、带死区互补或者复杂波形时一个功能强大的专用PWM模块就成了刚需。德州仪器TIC2000系列DSP中的增强型高分辨率PWMeHRPWM模块就是为应对这些挑战而生的利器。它绝不是一个简单的“计数器比较器”。你可以把它理解为一个高度专业化、可编程的“波形合成引擎”。这个引擎的核心工作流非常清晰首先一个可配置的“心脏”——时间基准TB子模块按照你设定的节拍时钟和计数模式稳定跳动然后计数器比较CC子模块像两个精准的“闹钟”在计数器到达你预设的CMPA和CMPB值时发出“叮”的事件信号最后动作限定器AQ子模块扮演“总指挥”的角色它根据这些事件信号以及当前的计数方向向上还是向下决定最终输出引脚EPWMxA和EPWMxB是置高、拉低还是翻转。今天我们就抛开数据手册那些冰冷的框图深入eHRPWM的这三个核心子模块结合我这些年调试电机驱动和电源的实际经验把它的工作原理、配置要点和那些容易踩坑的细节掰开揉碎了讲清楚。无论你是刚开始接触C2000的新手还是想优化现有PWM逻辑的老手相信这篇从一线实战中总结出来的解析都能给你带来启发。2. 核心模块深度解析与设计哲学eHRPWM模块的设计体现了硬件模块化与灵活配置的完美结合。它不是一个大而全的单一逻辑块而是由多个职责分明的子模块协同工作。理解这种架构是灵活运用它的前提。2.1 时间基准TB子模块系统节拍的发生器时间基准子模块是整个eHRPWM的“时钟源”和“节拍器”。它的核心是一个16位的向上/向下计数器TBCNT以及一组控制其行为的寄存器。2.1.1 计数模式与波形周期TB子模块支持三种核心计数模式这直接决定了你生成的PWM波形的对称性向上计数模式Up-Count计数器从0开始递增到周期值TBPRD然后归零如此循环。这种模式产生非对称PWM波形。一个完整的PWM周期TPWM计算公式为TPWM (TBPRD 1) * TTBCLK。这里的TTBCLK是经过预分频后的时间基准时钟周期。例如系统时钟SYSCLK为100MHzTB时钟预分频设为1即TBCLKSYSCLKTTBCLK就是10ns。若设置TBPRD 999则PWM周期为(9991)*10ns 10us对应PWM频率为100kHz。向下计数模式Down-Count计数器从周期值TBPRD开始递减到0然后重新装载TBPRD如此循环。同样产生非对称PWM波形周期公式与向上计数模式相同TPWM (TBPRD 1) * TTBCLK。向上-向下计数模式Up-Down-Count计数器从0开始递增到TBPRD然后立即递减回0如此循环。这种模式产生对称PWM波形波形关于中心点对称。其周期公式为TPWM 2 * TBPRD * TTBCLK。注意这里没有1因为计数器从0到TBPRD再到0经历了2 * TBPRD个计数步长。要生成同样频率的对称PWM所需的TBPRD值大约是单向计数模式的一半。实操心得模式选择背后的考量选择哪种模式并非随意。在电机控制的电压空间矢量调制SVPWM中对称PWM能显著降低谐波含量是首选。而在一些简单的开关电源或LED调光中非对称PWM可能因为其简单的单边调制逻辑而更易实现。一个关键细节在向上-向下模式下计数器会在TBPRD值处“折返”这意味着如果你在计数器等于TBPRD时设置了动作这个动作在一个PWM周期内会触发两次一次在递增到顶时一次在递减开始时这在配置动作限定器时必须特别注意。2.1.2 影子寄存器与同步机制稳定性的基石这是eHRPWM设计中最精妙的部分之一直接关系到系统运行时更改参数是否会引发“毛刺”或“撕裂”现象。影子寄存器Shadow Register以周期寄存器TBPRD为例它对应一个“影子寄存器”和一个“活动寄存器”。上电后你通过软件写入的值默认是进入影子寄存器。活动寄存器则直接控制硬件计数器的周期。影子寄存器的作用是在一个安全的时刻如计数器归零时将其内容一次性更新到活动寄存器。这个机制确保了你在任意时刻修改TBPRD比如动态调整PWM频率都不会打断当前正在进行的PWM周期更新会平滑地发生在下一个周期开始点从而避免了输出波形出现非预期的窄脉冲或中断。同步链Synchronization Chain在多模块协作时例如六个eHRPWM模块驱动三相全桥同步至关重要。eHRPWM1的同步输入EPWM1SYNCI通常来自外部引脚或特定内部信号作为主时钟源。其同步输出EPWM1SYNCO可以连接到eHRPWM2的同步输入以此类推形成一个同步链。当同步事件发生时从模块的计数器TBCNT会被强制加载为主模块设定的相位值TBPHS。这就允许你精确地设置各个PWM通道之间的相位差例如在交错并联电源中错开各相的开关时机以减小输入电流纹波或者在电机驱动中设置死区时间。避坑指南同步事件与比较事件丢失数据手册里有一个非常重要的“NOTE”当外部同步事件EPWMxSYNCI发生时可能导致计数器序列不连续进而跳过skip一个比较事件。例如计数器正在从5向6计数此时一个同步事件强行将其重置为TBPHS比如0那么本应在计数器等于6时触发的CMPA匹配事件就被跳过了。这在设计同步逻辑时必须考虑。如果你的PWM波形对某个边沿位置极其敏感就需要避免在可能发生比较匹配的时段产生同步信号或者采用其他同步策略如软件同步SWFSYNC。2.2 计数器比较CC子模块精准的时刻触发器如果说TB模块决定了“节奏”那么CC模块就负责定义“音符”出现的时刻。它包含两个独立的比较寄存器CMPA和CMPB。2.2.1 比较事件生成逻辑CC模块持续将时间基准计数器TBCNT的值与CMPA和CMPB寄存器的值进行比较。当两者相等时就会产生对应的事件信号CTR CMPATBCNT等于CMPA值。CTR CMPBTBCNT等于CMPB值。这两个事件是后续动作限定器AQ生成波形边沿最直接的来源。CMPA/CMPB的值直接决定了PWM脉冲的上升沿或下降沿在周期内的位置也就是占空比。2.2.2 影子寄存器与加载时机与TBPRD类似CMPA和CMPB也拥有影子寄存器机制且加载时机更加灵活由CMPCTL[LOADAMODE]和[LOADBMODE]控制在CTR0时加载在计数器归零时更新。这是最常用的方式确保一个新的PWM周期使用全新的比较值。在CTRPRD时加载在计数器达到周期值时更新。在向上-向下计数模式下这通常用于在计数方向改变时更新比较值。在CTR0或CTRPRD时加载在上述两个时刻都会更新。适用于某些需要在一个PWM周期内更新两次比较值的特殊调制模式。关键点在向上-向下计数模式下如果你在CTR0时加载CMPA那么为了确保每个PWM周期内都能产生有效的脉冲CMPA的值应大于等于1。如果你在CTRPRD时加载则CMPA的值应小于等于TBPRD - 1。这是为了避免比较值等于边界值时可能产生的脉冲宽度为0即不可控的极窄脉冲的情况。2.3 动作限定器AQ子模块波形的最终雕塑家AQ模块是连接“事件”和“最终输出波形”的桥梁。它接收来自TB模块的CTR0、CTRPRD事件以及来自CC模块的CTRCMPA、CTRCMPB事件。2.3.1 事件到动作的映射对于每一个输出引脚EPWMxA和EPWMxBAQ模块都可以独立配置当某个特定事件发生时要执行何种“动作”置高Set High强制输出为高电平。拉低Clear Low强制输出为低电平。翻转Toggle输出电平取反。无操作Do Nothing保持当前输出电平不变。注意即使配置为无操作该事件仍然可以用于触发中断。更强大的是这些事件还可以根据计数器当前的方向CTR_dir向上或向下进行进一步“限定”。例如你可以配置仅在计数器向上计数过程中CTR_dirUP且发生CTRCMPA事件时才对EPWMxA执行“置高”动作而在计数器向下计数过程中CTR_dirDOWN发生CTRCMPA事件时执行“拉低”动作。正是这个“方向限定”功能使得仅用CMPA一个寄存器就能在对称PWM模式下生成一个完整的脉冲上升沿和下降沿各触发一次。2.3.2 事件优先级仲裁当多个事件在同一时刻严格说是同一个TBCLK时钟沿发生时AQ模块依据固定的硬件优先级进行仲裁软件强制事件最高通过AQSFRC寄存器异步触发的事件。计数器比较事件CMPB/CMPA通常CMPB事件优先级高于CMPA。计数器周期/零值事件CTRPRD, CTR0优先级最低。这个优先级机制在配置复杂波形时非常重要。例如如果你同时配置了CTRPRD时拉低和CTRCMPA且CMPATBPRD时置高由于CTRCMPA事件优先级更高最终动作将是置高。3. 核心波形生成实战与配置详解理论说得再多不如看几个实实在在的配置案例。下面我们通过几种最典型的PWM波形来拆解TB、CC、AQ三个模块是如何协同工作的。我会给出具体的寄存器配置代码以TI的C2000 DriverLib库函数风格为例和关键参数计算。3.1 案例一非对称PWM向上计数高电平有效这是最简单的PWM模式常用于LED调光、蜂鸣器驱动等。需求生成一个频率为100kHz占空比可调0%-100%的PWM波高电平有效。设计思路TB模块采用向上计数模式。设定系统时钟为100MHz预分频为1则TBCLK周期为10ns。要得到100kHz频率周期TPWM 1/100kHz 10us。根据公式TPWM (TBPRD 1) * TTBCLK可得TBPRD (TPWM / TTBCLK) - 1 (10us / 10ns) - 1 999。CC模块使用CMPA寄存器控制占空比。占空比Duty (CMPA / (TBPRD 1)) * 100%。例如需要50%占空比则CMPA 0.5 * (999 1) - 1 499。注意有些库或公式习惯用CMPA Duty * (TBPRD1)需根据动作点微调此处为通用理解。AQ模块在计数器归零CTR0时设置EPWMxA输出为高AQ_SET。这定义了脉冲的起点。在计数器向上计数等于CMPACTRCMPACAU时清除EPWMxA输出为低AQ_CLEAR。这定义了脉冲的结束点。C2000 DriverLib 配置代码示例#include driverlib.h void EPWM_AsymmetricHigh_Config(uint32_t epwmBase, uint32_t sysClkFreq, uint32_t pwmFreq, float duty) { uint32_t tbprd, cmpA; // 1. 计算TBPRD和CMPA tbprd (sysClkFreq / pwmFreq) - 1; // 假设TBCLK SYSCLK预分频为1 cmpA (uint32_t)(duty * (float)(tbprd 1)) - 1; // 根据动作点调整计算 // 2. 禁用影子寄存器加载直接配置活动寄存器初始化阶段 EPWM_disablePeriodShadowLoadMode(epwmBase); EPWM_setTimeBasePeriod(epwmBase, tbprd); EPWM_setCounterCompareValue(epwmBase, EPWM_COUNTER_COMPARE_A, cmpA); // 3. 配置时间基准 EPWM_setTimeBaseCounter(epwmBase, 0); // 计数器从0开始 EPWM_setTimeBaseCounterMode(epwmBase, EPWM_COUNTER_MODE_UP); // 向上计数 EPWM_disablePhaseShiftLoad(epwmBase); // 禁用相位加载 EPWM_setClockPrescaler(epwmBase, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1); // 时钟预分频设为1 // 4. 配置计数器比较模块的加载模式运行时使用影子寄存器 EPWM_enableCounterCompareShadowLoadMode(epwmBase, EPWM_COUNTER_COMPARE_A); EPWM_setCounterCompareShadowLoadMode(epwmBase, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTER_ZERO); // 5. 配置动作限定器 - 这是核心 // 在CTR0时设置EPWMxA为高 EPWM_setActionQualifierAction(epwmBase, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); // 在CTRCMPA且向上计数时清除EPWMxA为低 EPWM_setActionQualifierAction(epwmBase, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); // 6. 重新使能影子寄存器模式如果需要动态更新 EPWM_enablePeriodShadowLoadMode(epwmBase); }3.2 案例二对称PWM向上-向下计数互补带死区这是电机驱动和全桥/半桥电源中最经典的配置用于驱动一对互补的开关管如MOSFET的上下桥臂并插入死区时间防止直通。需求生成一对互补的对称PWM波EPWMxA和EPWMxB频率50kHz占空比可调且两路信号之间具有可编程的死区时间。设计思路TB模块采用向上-向下计数模式。TPWM 2 * TBPRD * TTBCLK。设TTBCLK10nsTPWM1/50kHz20us则TBPRD TPWM / (2 * TTBCLK) 20us / (2 * 10ns) 1000。CC模块通常使用CMPA控制主占空比。在对称PWM中占空比Duty CMPA / TBPRD。例如50%占空比时CMPA 0.5 * 1000 500。CMPB可用于独立控制另一路占空比或结合死区模块使用。AQ模块这是实现互补波形的关键。对于EPWMxA假设为高侧驱动在计数器向上计数等于CMPACAU时清除为低。在计数器向下计数等于CMPACAD时设置为高。对于EPWMxB低侧驱动与A互补在计数器向上计数等于CMPACAU时设置为高。在计数器向下计数等于CMPACAD时清除为低。死区时间上述配置产生的两路信号是理想互补的边沿完全对齐这在现实中会导致上下管同时导通直通而烧毁。必须插入死区时间。eHRPWM有独立的死区DB子模块可以自动在EPWMxA和EPWMxB的边沿后插入一段延迟。例如配置上升沿延迟则EPWMxA的上升沿会被延迟EPWMxB的下降沿会被延迟确保在任何切换瞬间两路信号都有一个同时为低的“死区”时间。配置要点与代码片段void EPWM_ComplementaryWithDeadband_Config(uint32_t epwmBase, uint32_t sysClkFreq, uint32_t pwmFreq, float duty, uint32_t deadband_ns) { uint32_t tbprd, cmpA; uint32_t dbFrac; // 死区时间对应的TBCLK周期数 // 1. 计算TBPRD和CMPA (对称模式) tbprd (sysClkFreq / (2 * pwmFreq)); // 注意公式不同 cmpA (uint32_t)(duty * (float)tbprd); // 2. 配置时间基准为向上-向下模式 EPWM_setTimeBaseCounterMode(epwmBase, EPWM_COUNTER_MODE_UP_DOWN); EPWM_setTimeBasePeriod(epwmBase, tbprd); EPWM_setCounterCompareValue(epwmBase, EPWM_COUNTER_COMPARE_A, cmpA); // 3. 配置动作限定器实现互补输出 // EPWMxA: CAU清除 CAD置高 EPWM_setActionQualifierAction(epwmBase, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); EPWM_setActionQualifierAction(epwmBase, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA); // EPWMxB: CAU置高 CAD清除 (与A互补) EPWM_setActionQualifierAction(epwmBase, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); EPWM_setActionQualifierAction(epwmBase, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA); // 4. 配置死区模块 (以上升沿延迟为例) EPWM_enableDeadBand(epwmBase); // 使能死区 EPWM_setDeadBandDelayMode(epwmBase, EPWM_DB_RED, EPWM_DB_MODE_DELAY); // A路上升沿延迟 EPWM_setDeadBandDelayMode(epwmBase, EPWM_DB_FED, EPWM_DB_MODE_DELAY); // B路下降沿延迟 // 计算死区时钟周期数 dbFrac (deadband_ns * sysClkFreq) / 1000000000U; // 假设TBCLKSYSCLK EPWM_setDeadBandDelayPolarity(epwmBase, EPWM_DB_POLARITY_ACTIVE_HIGH, EPWM_DB_POLARITY_ACTIVE_HIGH); EPWM_setDeadBandDelay(epwmBase, dbFrac, dbFrac); // 设置延迟值 }核心经验死区时间的计算与测量死区时间通常需要几十到几百纳秒具体取决于功率器件的开关特性。计算时死区TBCLK数 所需死区时间(秒) * TBCLK频率(Hz)。务必用示波器实际测量插入死区后的波形确保在切换瞬间存在一个确信的“共同关断”区域。过短的死区无法防止直通过长的死区则会降低输出电压有效值增加谐波。3.3 案例三中心对齐PWM与移相控制在多相交错并联或三相逆变器中我们经常需要多路PWM它们频率相同但彼此之间存在固定的相位差。需求eHRPWM1作为主模块产生50kHz对称PWM。eHRPWM2作为从模块产生同频率的PWM但相位滞后于主模块60度电角度。设计思路主模块(eHRPWM1)配置与案例二类似配置为对称PWM模式。关键将其同步输出EPWM1SYNCO使能并配置为在CTR0时产生同步脉冲。从模块(eHRPWM2)配置TB模块模式、周期与主模块完全相同。使能同步输入设置TBCTL[PHSEN]1使其接受来自EPWM1SYNCO的同步信号。设置相位寄存器相位差由TBPHS寄存器控制。一个PWM周期对应360度。对于对称PWM计数器从0到TBPRD再到0一个完整周期是2 * TBPRD个计数步长。因此相位差对应的计数值PhaseCount (PhaseDelay / 360) * (2 * TBPRD)。60度相位滞后PhaseCount (60/360) * (2 * TBPRD) (1/3) * TBPRD。注意在同步事件发生时从模块的计数器会被加载为TBPHS值然后根据TBCTL[PHSDIR]位决定接下来是向上还是向下计数从而实现“滞后”或“超前”的效果。同步与相位配置代码片段// 配置主模块 ePWM1 同步输出 EPWM_setSyncOutPulseMode(EPWM1_BASE, EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO); // 配置从模块 ePWM2 同步输入和相位 EPWM_setSyncInputPulseSource(EPWM2_BASE, EPWM_SYNC_IN_PULSE_SRC_EXTERNAL); // 使用外部同步源 EPWM_enablePhaseShiftLoad(EPWM2_BASE); // 使能相位加载 EPWM_setPhaseShift(EPWM2_BASE, phaseCount); // 设置相位计数值 // 设置同步后计数方向例如希望滞后则在同步后向上计数从相位值开始递增 EPWM_setCountModeAfterSync(EPWM2_BASE, EPWM_COUNT_MODE_UP_AFTER_SYNC);4. 高级应用与疑难问题排查实录掌握了基础配置后我们来看看一些更高级的应用场景和那些调试时让人头疼的“坑”。4.1 高分辨率PWMHRPWM的使能与精度提升标准的eHRPWM分辨率受限于系统时钟频率。例如100MHz系统时钟下产生10kHz PWM周期计数值为10000理论分辨率是1/100000.01%。但若想微调占空比比如改变0.1%CMPA的最小步进是1即0.01%这有时仍不够精细。HRPWM扩展模块通过微边沿定位MEP技术利用系统时钟的“亚周期”抖动可以将时间分辨率提高到惊人的皮秒ps级别相当于将PWM的有效位数从16位提升到近20位。使能HRPWM的关键步骤确认硬件支持并非所有ePWM实例都包含HRPWM需查阅芯片数据手册。配置HRMSTEP寄存器这个寄存器定义了每个TBCLK周期内MEP逻辑可以插入的“微步”数量。需要根据芯片特定的MEP标定值进行设置。使用CMPAHR寄存器高分辨率下的占空比由CMPA:CMPAHR这个24位或32位的联合寄存器控制。CMPA是整数部分CMPAHR是小数部分。使能HRPWM控制通过HRPCTL寄存器使能对应通道的HRPWM模式。踩坑记录HRPWM的“非线性”与校准HRPWM的精度并非完全线性尤其是在微步范围的边界。TI通常会提供校准例程。务必运行一次校准获取当前电压、温度下的最佳HRMSTEP值并写入。忽略校准直接使用默认值可能导致高分辨率下的占空比严重失真。另一个常见问题是使能HRPWM后输出引脚必须配置为异步路径否则高频微调无法体现在引脚上。4.2 动态改变PWM频率与占空比在电机控制中我们经常需要在线改变PWM频率变频或占空比调压。改变占空比这是最安全的操作。你只需要在新的PWM周期开始前通过影子寄存器机制更新CMPA或CMPB的值即可。确保将加载模式LOADAMODE设置为在CTR0或CTRPRD时加载然后在中断服务程序或主循环中安全地更新影子寄存器。改变频率周期TBPRD危险操作直接修改TBPRD会立即改变当前计数器的模值可能导致计数器值瞬间大于新的TBPRD从而引发不可预知的比较事件和输出紊乱。安全做法首先停止时间基准计数器通过TBCLKSYNC全局停止或禁用模块时钟。然后修改TBPRD和所有依赖于TBPRD的比较寄存器CMPA, CMPB。最后重置计数器为0再重新启动时钟。如果应用不允许PWM输出长时间停止则需要更复杂的同步切换算法例如在计数器归零的瞬间同时切换两组预配置的寄存器。4.3 常见问题排查速查表在实际调试中PWM出不来或者波形不对是家常便饭。下面这个表格总结了我遇到过的典型问题及排查思路现象可能原因排查步骤与解决方法完全没有PWM输出1. 模块时钟未使能。2. 输出引脚未正确复用为EPWM功能。3. 时间基准计数器未启动TBCLKSYNC0。4. 动作限定器所有事件均配置为“无操作”。1. 检查外设时钟控制寄存器PCLKCRx。2. 检查GPIO MUX配置寄存器确保引脚功能选择正确。3. 检查CFGCHIP1.TBCLKSYNC位确保在配置完成后置1。4. 逐行检查AQCTLA/B寄存器确保至少有一个事件配置了SET/CLEAR/TOGGLE动作。PWM频率不对1. 系统时钟率计算错误。2. TBPRD计算错误或写入值不对。3. 时间基准预分频器TBCTL[CLKDIV]配置错误。4. 计数模式选择错误Up vs Up-Down公式不同。1. 确认系统时钟SYSCLK频率。2. 根据所选模式重新计算TBPRDUp/Down模式用(Freq_clk / Freq_pwm) - 1Up-Down模式用Freq_clk / (2 * Freq_pwm)。3. 核对TBCTL寄存器的HSPCLKDIV和CLKDIV字段。4. 用示波器测量周期反向推算模式。占空比不可调或调节异常1. CMPA/CMPB值计算错误或超出范围TBPRD。2. 影子寄存器未使能且运行时直接写入了活动寄存器导致毛刺。3. 加载时机LOADAMODE配置错误新值未在预期周期生效。4. 在对称模式下CMPA值等于0或TBPRD导致脉冲宽度为0或满占空比。1. 确保CMPA值在0到TBPRD之间对称模式建议1到TBPRD-1。2. 检查CMPCTL[SHDWAMODE]位确保使能了影子模式。3. 确认LOADAMODE设置是否符合预期CTR0或CTRPRD。4. 在对称PWM应用中避免将CMPA设置为边界值。互补输出出现重叠直通风险1. 未配置死区时间。2. 死区时间配置过短。3. 死区模块未使能或极性配置错误。4. AQ模块配置错误两路输出不是真正的互补。1.立即检查并配置死区DB模块2. 根据功率器件数据手册计算并设置足够的死区时间并用示波器验证。3. 检查DBCTL寄存器确认死区模式上升沿延迟、下降沿延迟、双边延迟和极性正确。4. 回顾AQ配置确保EPWMxA和EPWMxB对同一事件如CAU的动作是相反的一个SET一个CLEAR。多路PWM不同步1. 同步链未正确连接或使能。2. 主从模块的TBPRD或时钟分频设置不一致。3. 从模块的相位寄存器TBPHS配置错误。4. 同步事件发生在不安全的时刻如计数器中途导致从模块计数器跳变。1. 检查EPWMxSYNCI和EPWMxSYNCO的配置确保信号链畅通。2. 确保所有需要同步的模块其TBCTL[CLKDIV]和TBPRD值完全相同。3. 重新计算相位值并检查TBCTL[PHSDIR]方向设置。4. 考虑使用软件强制同步SWFSYNC在计数器为0时进行同步或调整主模块的同步输出时机。HRPWM精度不达标1. HRPWM未校准使用默认的HRMSTEP值。2. CMPAHR寄存器未正确写入小数部分。3. 输出引脚未配置为异步路径。4. 系统时钟或供电不稳定。1.运行TI提供的HRPWM校准例程获取并写入校准后的HRMSTEP值。2. 使用联合访问如EPWM_setCounterCompareValue带HR扩展的函数或分别写入CMPA和CMPAHR。3. 检查GPIO的QUALPRD配置对于HRPWM输出引脚通常需要设置为异步不分频。4. 检查电源质量和时钟源稳定性。调试PWM示波器是你最好的朋友。一定要同时观察时间基准计数器如果支持、比较事件信号和最终的引脚输出波形理清从计数器到比较器再到动作限定器的整个信号链问题往往就迎刃而解了。