深入解析TI C2000 eHRPWM模块:从架构到电机控制实战
1. 项目概述与eHRPWM核心价值在电机控制、开关电源或者数字功放这些需要精确控制功率的领域我们工程师打交道最多的可能就是PWM信号了。简单来说PWM就是通过快速开关用数字信号“模拟”出一个可变的模拟量比如电机的转速或者LED的亮度。但真正到了项目里特别是用到像TI C2000这类高性能微控制器时你会发现一个基础的定时器加比较器生成的PWM往往不够用。这时候增强型高分辨率PWM也就是eHRPWM模块就成了我们的得力武器。它不是一个简单的定时器而是一个高度集成、可编程的波形生成“流水线”把时间基准、比较、动作决策、死区保护这些功能都做成了独立的子模块让我们能像搭积木一样灵活配置出复杂且可靠的PWM波形。这篇文章我就结合自己这些年调电机、做电源的实际经验带你彻底拆解eHRPWM。我们不只停留在手册里的寄存器列表而是要搞清楚每个子模块到底在干什么、寄存器里每个比特位背后的设计意图以及在实际配置时那些容易踩坑的细节。无论是刚接触C2000的新手还是想优化现有PWM逻辑的老手相信这些从寄存器映射到子模块架构的深入解析都能让你在下次配置ePWM时更加得心应手。2. eHRPWM整体架构与子模块职责解析当你拿到一块TI的C2000系列芯片打开它的技术参考手册找到eHRPWM章节可能会被那一长串的寄存器列表和框图吓到。别慌我们先把视角拉高看看它的整体架构。你可以把整个eHRPWM模块想象成一个高度专业化的波形生产车间每个子模块就是车间里的一道工序各司其职协同工作。2.1 核心子模块流水线这个“车间”的核心流水线通常包含以下几个关键工序子模块时间基准Time-Base, TB子模块这是整个车间的节拍器。它决定PWM波的周期和频率。内部有一个计数器TBCNT按照设定的时钟TBCLK递增或递减并在计数到特定值如零或周期值时发出“节拍”事件。它还能接受外部同步信号让多个ePWM模块的“节拍”对齐这在多相电机驱动或交错式电源中至关重要。计数器比较Counter-Compare, CC子模块这是设定具体“动作时间点”的岗位。它持续对比时间基准计数器的值和两个用户设定的比较值寄存器CMPA和CMPB。当计数值等于CMPA或CMPB时它就发出一个事件信号告诉下一道工序“时间到了该干活了”。占空比的控制本质上就是通过设置CMPA/CMPB的值来实现的。动作限定Action-Qualifier, AQ子模块这是车间的“决策中心”。它接收来自TBCTRPRD, CTR0和CCCTRCMPA, CTRCMPB的事件并根据当前计数器的方向向上还是向下决定对最终的输出引脚EPWMxA和EPWMxB采取什么动作置高、拉低、翻转或者什么都不做。PWM波形边沿的精确产生就发生在这里。死区生成Dead-Band, DB子模块这是安全员尤其在驱动桥式电路如H桥时不可或缺。它接收AQ子模块输出的原始信号并对其中的一对互补信号通常用于控制上下桥臂的上升沿和/或下降沿插入可编程的延迟。这个延迟就是“死区时间”用于防止上下桥臂直通造成短路烧毁功率管。错误联防Trip-Zone, TZ子模块这是紧急制动按钮。当外部故障信号如过流、过温触发时它能以最高优先级强制PWM输出进入预定安全状态高、低或高阻完全绕过软件干预实现硬件级别的保护。事件触发Event-Trigger, ET子模块这是车间的“通知系统”。它监控特定事件如周期中断、比较匹配中断的发生并能配置在事件发生一次、两次或三次后向CPU发起中断让软件有机会在关键时刻进行干预比如更新下一个周期的比较值以实现闭环控制。PWM斩波PWM-Chopper, PC子模块这是一个可选的特殊工序主要用于驱动栅极需要高频脉冲来维持导通的功率器件如某些IGBT。它能把原始的PWM波“斩”成一系列高频脉冲。高分辨率PWMHRPWM扩展这不是一个独立的子模块而是对TB和CC模块的精度增强。通过微边沿定位MEP技术它可以将时间控制精度从系统时钟周期级别提升到皮秒级对于需要极高分辨率的应用如数字电源的电压纹波优化是利器。这八个部分通过内部信号线紧密连接构成了eHRPWM强大的波形生成与控制能力。理解这个流水线是进行任何复杂配置的基础。2.2 寄存器映射与硬件对话的窗口理解了架构我们就要通过寄存器来配置它。手册中的Table 16-1就是我们的“配置地图”。它按子模块对寄存器进行了分组非常清晰。这里有几个关键点需要特别注意地址偏移与实例化每个ePWM模块如ePWM1, ePWM2都有一套完全相同的寄存器组它们通过不同的基地址来区分。表格中的“Offset”是相对于该模块基地址的偏移量。在编程时我们通常通过芯片头文件定义的宏如EPWM1_BASE来访问。影子寄存器Shadow Register这是eHRPWM设计精妙之处也是新手最容易困惑的地方。注意表格中“Shadow”一列标记为“Yes”的寄存器如TBPRD、CMPA、CMPB。它们都有“影子寄存器”和“活动寄存器”之分。活动寄存器直接控制硬件实时参与比较、生成波形。影子寄存器是软件写入的缓冲区。软件平时修改的是影子寄存器不会立即影响波形。只有在特定的“加载点”如计数器为零或达到周期值时影子寄存器的值才会一次性、同步地装载到活动寄存器中。为什么需要影子寄存器想象一下你正在用PWM控制电机电机全速运行。如果在PWM波形的任意时刻软件突然更改了比较值CMPA可能会导致当前周期内产生一个极窄或极宽的脉冲造成电流尖峰甚至损坏电机或功率管。影子寄存器机制确保了参数更新只发生在周期边界如计数器归零时从而保证了波形切换的平滑和安全。这是一个至关重要的安全特性在电机和电源控制中必须启用。3. 核心子模块深度配置与实战指南知道了整体架构和寄存器地图我们现在深入几个最核心的子模块看看具体怎么配置以及有哪些实战技巧。3.1 时间基准TB子模块设定节奏的心脏TB子模块是所有时序的源头。配置它主要就是设定PWM的周期、频率和同步方式。3.1.1 周期与频率的计算这是最基础的步骤但必须算对。PWM的频率Fpwm和周期Tpwm由时间基准周期寄存器TBPRD和计数器模式共同决定。系统时钟SYSCLKOUT经过预分频后得到TBCLK它是计数器每个计数的步长时间。向上/向下计数模式Asymmetric PWM计数器从0计数到TBPRD向上或从TBPRD计数到0向下。周期 Tpwm (TBPRD 1) * Ttbclk频率 Fpwm 1 / Tpwm*例如SYSCLKOUT100MHz预分频设为2TBCLK50MHz周期20nsTBPRD设为2499。则Tpwm (24991)20ns 50usFpwm 20kHz。向上-向下计数模式Symmetric PWM计数器从0计数到TBPRD再折返计数回0。期 Tpwm 2 * TBPRD * Ttbclk频率 Fpwm 1 / Tpwm使用同样的时钟和TBPRDTpwm 2249920ns 99.96us ≈ 100usFpwm ≈ 10kHz。注意在向上-向下模式下一个完整的电周期内计数器会两次经过同一个值一次上行一次下行。这会导致比较事件CTRCMPx在一个PWM周期内发生两次从而影响占空比计算和中断触发逻辑。在配置动作限定器和事件触发器时必须考虑这一点。3.1.2 同步与相位控制多模块协同工作时同步是关键。ePWM模块通过EPWMxSYNCI同步输入和EPWMxSYNCO同步输出信号链式连接。配置为同步跟随者设置TBCTL[PHSEN]1并使能相位加载。当该模块检测到同步输入信号EPWMxSYNCI时会立即将TBPHS相位寄存器的值加载到计数器TBCNT中。这样你就可以精确控制该模块的PWM波形相对于同步源通常是主模块的相位差。这在实现多相交错并联电源时非常有用可以错开各相开关时刻降低输入电流纹波。配置为同步主设备或独立运行设置TBCTL[PHSEN]0则忽略同步输入可以独立运行或仅将同步信号传递给下一级。一个关键配置步骤为了确保所有ePWM模块的时基时钟TBCLK完全同步启动避免初始相位混乱TI推荐以下初始化顺序使能ePWM模块的时钟。将系统模块中的TBCLKSYNC全局位设为0停止所有ePWM的TBCLK。配置所有ePWM模块的TBCTL包括预分频器、计数模式等。将TBCLKSYNC全局位设为1同时启动所有ePWM的TBCLK。3.1.3 时间基准计数器模式波形解读手册中的图16-8至图16-11展示了不同模式下计数器、同步事件和相位加载的时序关系。这里我强调一个极易出错的点在计数器运行过程中一个同步输入脉冲会导致计数器立即加载TBPHS值这可能会“跳过”本该在正常计数序列中发生的CTRPRD或CTRCMPx事件。例如在向上计数模式中计数器正在从0向TBPRD计数在计数值为2时来了一个同步脉冲计数器被强制加载为TBPHS假设为5。那么计数值2到4这个过程就被跳过了本应在计数值等于CMPA假设为3时产生的比较事件就不会发生。在依赖这些事件进行中断处理或动作触发的应用中必须考虑同步事件导致的这种事件“丢失”并在软件逻辑上做好容错。3.2 计数器比较CC子模块占空比的画笔CC子模块的核心是CMPA和CMPB两个寄存器。它们决定了PWM波形中高电平和低电平的切换点。3.2.1 占空比计算占空比Duty Cycle定义为高电平时间在一个周期内的比例。向上计数模式占空比 CMPA / (TBPRD 1)向下计数模式占空比 (TBPRD - CMPA) / (TBPRD 1)假设动作限定器配置为计数值等于CMPA时清除输出向上-向下计数模式情况稍复杂。通常我们配置动作限定器在向上计数匹配CMPA时清除向下计数匹配CMPA时置位这样可以生成中心对称的PWM。此时占空比 CMPA / TBPRD。注意这里分母是TBPRD而不是TBPRD1。3.2.2 影子寄存器加载机制详解CMPA和CMPB的影子寄存器加载时机由CMPCTL[LOADAMODE]和CMPCTL[LOADBMODE]控制。选项通常有CTR0时加载在计数器归零时更新。适用于向上计数和向上-向下计数模式。CTRPRD时加载在计数器达到周期值时更新。适用于向下计数模式。CTR0或CTRPRD时加载在两者任一事件时更新。这提供了更大的灵活性。配置心得在电机FOC控制中我们通常在一个PWM周期结束时CTR0中断中计算下一个周期所需的电压矢量并更新CMPA/CMPB。此时将加载模式设置为CTR0可以确保新的占空比参数在下一个周期开始时立即生效实现平滑的波形切换。如果设置错误可能会导致参数更新延迟一个周期引起控制环路震荡。3.2.3 不同计数模式下的比较事件在向上-向下计数模式下如果CMPA的值在0和TBPRD之间那么CTRCMPA事件在一个PWM周期内会发生两次一次在向上计数过程一次在向下计数过程。动作限定器可以利用这两个事件来生成对称波形。如果CMPA等于0或TBPRD则事件只发生一次。这在配置动作限定器和中断时至关重要。3.3 动作限定AQ子模块波形的导演AQ子模块是赋予PWM波形形状的关键。它根据TB和CC子模块产生的事件CTRPRD,CTR0,CTRCMPA,CTRCMPB并结合当前的计数方向CTR_dir来决定对输出引脚EPWMxA和EPWMxB执行何种操作。3.3.1 输出动作配置每个事件在每个方向上都可以独立配置四种动作之一AQ_NO_ACTION无操作。AQ_CLEAR将输出置为低电平假设有效电平为高。AQ_SET将输出置为高电平。AQ_TOGGLE将输出电平翻转。通过组合这些配置可以生成各种PWM波形。最常见的配置是生成一对互补带死区的PWM信号用于驱动H桥假设我们希望EPWMxA为主信号EPWMxB为其互补信号后期由DB模块插入死区。向上计数模式配置CTRPRD时对EPWMxA执行AQ_CLEAR。配置CTRCMPA时对EPWMxA执行AQ_SET。这样当CMPA从0向TBPRD变化时占空比从0%向100%变化。对于EPWMxB通常配置为与EPWMxA相反的逻辑或者通过AQ的独立配置实现更复杂的互补关系。向上-向下计数模式中心对称PWM常用于电机控制以减少谐波配置向上计数CTRCMPA时对EPWMxA执行AQ_CLEAR。配置向下计数CTRCMPA时对EPWMxA执行AQ_SET。这样输出波形将以周期中心为对称轴高电平脉冲位于中心。3.3.2 软件强制输出AQSFRC和AQCSFRC寄存器允许软件直接强制输出为高、低或翻转而不依赖于计数器事件。这在某些测试、保护或特殊控制序列中非常有用。例如在系统启动初始化阶段你可能需要强制所有PWM输出为低安全状态就可以通过AQSFRC寄存器一次性完成。3.4 死区生成DB子模块安全的守护者死区时间是防止桥式电路上下管直通的必须手段。DB子模块接收来自AQ的原始信号并生成两路带有可编程延迟的输出信号。3.4.1 死区工作模式DBCTL[MODE]位控制死区的工作模式禁用模式信号直通无死区。使能上升沿延迟对其中一路信号的上升沿进行延迟另一路信号不变。使能下降沿延迟对其中一路信号的下降沿进行延迟。完全使能模式最常用对两路互补信号的上升沿和下降沿分别插入延迟生成最终的两路输出。通常我们会将EPWMxA作为输入源生成EPWMxA_DB和EPWMxB_DB两路带死区的输出。3.4.2 死区时间计算死区时间由DBRED上升沿延迟和DBFED下降沿延迟寄存器控制。延迟的时钟基准是TBCLK。死区时间 DBRED或DBFED的值 * Ttbclk例如TBCLK周期为20ns50MHz需要插入500ns的死区时间则DBRED或DBFED应设置为500ns / 20ns 25。重要提示DBRED和DBFED寄存器的值必须小于当前PWM半周期的计数值对于向上-向下模式应小于TBPRD对于向上/向下模式应小于TBPRD1。否则延迟可能会“吃掉”整个脉冲导致没有有效输出。在计算占空比极限时必须预留出死区时间。3.5 错误联防TZ子模块硬件保险丝TZ子模块是最后的安全防线。当外部故障引脚TZ1-TZ6被触发时它可以绕过所有软件配置在几个时钟周期内强制PWM输出进入预定状态。3.5.1 错误响应配置TZSEL寄存器选择哪些故障引脚对本模块有效。TZCTL寄存器则配置每个引脚触发时对EPWMxA和EPWMxB采取的动作TZ_FORCE_HI强制为高。TZ_FORCE_LO强制为低最常用的安全状态关断所有开关管。TZ_HIZ强制为高阻态。TZ_NO_CHANGE无变化不推荐用于安全保护。3.5.2 单次触发与周期循环触发TZSEL还可以配置故障响应模式单次触发One-Shot故障发生后输出被强制到安全状态并锁存直到软件通过TZCLR寄存器清除错误标志后PWM输出才能恢复。周期循环触发Cycle-By-Cycle故障发生时强制PWM输出进入安全状态但仅持续当前PWM周期。下一个周期开始时如果故障信号已消失PWM自动恢复正常运行如果故障依然存在则再次强制。这种模式适用于过流保护等需要逐周期限流的场景。实战经验对于关键的硬件保护如短路、母线过压务必配置为单次触发模式并连接到可靠的故障信号源。同时在中断服务程序中不仅要清除TZ标志更要彻底调查故障根源否则盲目清除标志可能导致设备反复损坏。4. 从零配置一个eHRPWM模块以电机控制为例理论说了这么多我们动手配置一个用于有刷直流电机或BLDC方波驱动的ePWM实例。假设我们需要一个20kHz的中心对称PWM向上-向下计数死区时间2us并能在每个周期结束时产生中断以运行控制算法。4.1 初始化步骤与代码示例以下是基于TI C2000芯片的标准外设库DriverLib风格的伪代码并附有详细注释。// 1. 初始化时钟和GPIO略过假设已完成 // 2. 配置ePWM1模块 // 禁用全局中断防止配置过程中被意外打断 DINT; // 步骤A: 配置时间基准TB子模块 // 假设系统时钟SYSCLKOUT 100MHz目标PWM频率 20kHz采用向上-向下计数模式。 // 周期公式: Tpwm 2 * TBPRD * Ttbclk, Fpwm 1/Tpwm。 // 先设定TBCLK预分频。为了有足够的计数分辨率我们选择不分频HSPCLKDIV和CLKDIV均设为1。 // Ttbclk 1 / (100MHz) 10ns。 // 计算TBPRD: TBPRD (SYSCLKOUT / (2 * Fpwm * CLKDIV)) - 1? 更直观Fpwm SYSCLKOUT / (2 * CLKDIV * (TBPRD 1)) // 这里CLKDIV1所以 TBPRD (SYSCLKOUT / (2 * Fpwm)) - 1 (100e6 / (2 * 20e3)) - 1 2500 - 1 2499。 uint16_t tbprd_value 2499; // 配置TBCTL寄存器 // CTRMODE 2 (向上-向下计数) // PHSEN 0 (禁用相位加载作为主模块) // PRDLD 0 (TBPRD使用影子寄存器模式在CTR0时加载) // SYNCOSEL 3 (禁止同步输出或根据需要配置) // HSPCLKDIV 0, CLKDIV 0 (预分频均为1) EPWM_setTimeBasePeriod(EPWM1_BASE, tbprd_value); EPWM_setPhaseShift(EPWM1_BASE, 0); // 相位偏移设为0 EPWM_setTimeBaseCounter(EPWM1_BASE, 0); // 计数器从0开始 EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_UP_DOWN); EPWM_disablePhaseShiftLoad(EPWM1_BASE); EPWM_setClockPrescaler(EPWM1_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_CLOCK_DIVIDER_1); // 步骤B: 配置计数器比较CC子模块 // 初始化占空比为50%。对于向上-向下模式占空比 CMPA / TBPRD。 // 所以 CMPA 0.5 * TBPRD 1249.5取整1249或1250。 uint16_t cmp_a_value tbprd_value / 2; EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, cmp_a_value); EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_B, 0); // CMPB暂未使用 // 配置CMPCTL: 影子寄存器加载模式 // 我们希望在新的PWM周期开始时CTR0更新CMPA的值以确保波形平滑。 EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTER_ZERO); EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE, EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTER_ZERO); // 步骤C: 配置动作限定AQ子模块 // 生成中心对称PWM。我们希望 // - 在向上计数过程中当TBCNT等于CMPA时将EPWM1A输出清零AQ_CLEAR。 // - 在向下计数过程中当TBCNT等于CMPA时将EPWM1A输出置位AQ_SET。 // 这样输出高电平脉冲将位于PWM周期的中心。 EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA, EPWM_AQ_OUTPUT_LOW); // CTR上升且CMPA时拉低 EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA, EPWM_AQ_OUTPUT_HIGH); // CTR下降且CMPA时拉高 // 步骤D: 配置死区DB子模块 // 目标死区时间 2us。Ttbclk 10ns。 // 所需计数值 2us / 10ns 200。 uint16_t db_count 200; // 配置为完全使能模式对上升沿和下降沿都插入延迟输入源为EPWM1A生成互补对。 EPWM_setDeadBandDelayMode(EPWM1_BASE, EPWM_DB_FULL_ENABLE, EPWM_DB_RED, db_count); EPWM_setDeadBandDelayMode(EPWM1_BASE, EPWM_DB_FULL_ENABLE, EPWM_DB_FED, db_count); EPWM_setDeadBandControlSignal(EPWM1_BASE, EPWM_DB_INPUT_EPWMA, EPWM_DB_OUTPUT_EPWMA_DB, EPWM_DB_OUTPUT_EPWMB_DB); // 步骤E: 配置事件触发ET子模块 // 我们希望在每个PWM周期结束时CTR0产生一个中断以便在中断服务程序中更新CMPA进行闭环控制。 EPWM_enableInterrupt(EPWM1_BASE); // 使能ePWM1中断 EPWM_setInterruptSource(EPWM1_BASE, EPWM_INT_TBCTR_ZERO); // 中断源设为计数器归零事件 EPWM_setInterruptEventCount(EPWM1_BASE, 1); // 每发生1次该事件触发一次中断 // 步骤F: 配置错误联防TZ子模块可选但强烈推荐 // 假设TZ1引脚连接了过流保护电路配置为单次触发触发时强制所有输出低。 EPWM_enableTripZoneSignals(EPWM1_BASE, EPWM_TZ_SIGNAL_1); // 使能TZ1信号 EPWM_setTripZoneAction(EPWM1_BASE, EPWM_TZ_ACTION_EVENT_TZA, EPWM_TZ_ACTION_FORCE_HI); // 可根据需要配置为FORCE_LO EPWM_setTripZoneAction(EPWM1_BASE, EPWM_TZ_ACTION_EVENT_TZB, EPWM_TZ_ACTION_FORCE_HI); EPWM_setTripZoneCycleByCycleMode(EPWM1_BASE, EPWM_TZ_CBC_PULSE_CLR_OST); // 配置清除单次触发标志的模式 // 步骤G: 全局启动时钟同步如果使用多个ePWM模块 // 按照TI推荐步骤在配置完所有ePWM的TBCTL后再统一启动TBCLK。 // 假设这是最后一个配置的ePWM模块则执行 SysCtl_enableTBCLKSync(SYSCTL_TBCLK_SYNC_ENABLE); // 最后重新使能全局中断 EINT;4.2 中断服务程序ISR要点在PWM周期中断中我们通常执行控制算法并更新比较值。__interrupt void epwm1_isr(void) { // 1. 读取反馈如ADC采样值 // 2. 运行控制算法如PID计算出新的占空比指令 // 3. 将新的占空比指令转换为CMPA值 // 对于向上-向下模式new_cmpa (uint16_t)(new_duty_cycle * TBPRD); // 注意限制new_cmpa的范围避免大于TBPRD或小于0。 uint16_t new_cmpa calculate_new_cmpa(); // 你的控制算法函数 // 4. 更新CMPA的影子寄存器注意这里写的是影子寄存器 EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, new_cmpa); // 5. 清除ePWM中断标志否则会持续进入中断 EPWM_clearInterruptFlag(EPWM1_BASE); // 6. 确认中断已处理某些芯片需要 Interrupt_clearACKGroup(INTERRUPT_ACK_GROUP3); // 假设ePWM1中断属于ACK Group 3 }5. 高级主题与常见问题排查5.1 高分辨率PWMHRPWM微边沿定位当标PWM的分辨率由TBCLK频率和TBPRD值决定无法满足要求时HRPWM功能可以通过微边沿定位技术将边沿定位的精度提高到皮秒级别。它主要扩展了CMPA和TBPHS寄存器增加了高分辨率域HRMEP。配置关键点确保所用ePWM模块支持HRPWM查看芯片数据手册。启用HRPWM扩展配置HRCNFG寄存器中的HRPE高分辨率周期使能和HRPE高分辨率占空比使能位。使用扩展寄存器CMPAHR是CMPA的高分辨率部分TBPHSHR是TBPHS的高分辨率部分。实际的比较值/相位值 (主寄存器值 8) | 高分辨率字节。MEP步长校准HRPWM的精度依赖于工厂校准的MEP步长该值存储在芯片的特定存储区域如OTP。软件启动时需要读取此校准值并配置到HRMSTEP寄存器中否则精度无法保证。5.2 多模块同步与相位控制实战在三相逆变器驱动中需要三个相位互差120度的PWM。使用eHRPWM可以轻松实现。设定主从关系将ePWM1配置为主模块TBCTL[PHSEN]0SYNCOSEL选择CTR0输出同步脉冲。将ePWM2和ePWM3配置为从模块TBCTL[PHSEN]1它们的同步输入EPWMxSYNCI分别连接到前一个模块的同步输出。设置相位差在从模块的TBPHS寄存器中设置相位偏移值。对于向上-向下计数模式一个完整的电气周期对应计数器从0到TBPRD再到0。120度相位差对应的计数值偏移量为相位偏移 (TBPRD * 相位角度) / 180。例如TBPRD2499则120度偏移量 (2499 * 120) / 180 1666。将ePWM2的TBPHS设为1666ePWM3的TBPHS设为3332或-1666取决于方向。同步启动按照前述的TBCLKSYNC流程确保所有模块的时基时钟同步启动。然后通过软件或外部信号向主模块ePWM1发送一个同步脉冲或使用其SWFSYNC位所有从模块的计数器将在下一个TBCLK边沿加载各自的TBPHS值从而建立起精确的120度相位关系。5.3 典型问题排查速查表在实际调试中你可能会遇到以下问题现象可能原因排查步骤与解决方案无PWM输出1. ePWM模块时钟未使能。2. GPIO引脚未正确复用为ePWM功能。3. 输出被错误联防TZ模块强制。4. 动作限定器AQ配置错误所有事件均设置为“无操作”。1. 检查外设时钟控制寄存器确认ePWM时钟已开启。2. 检查GPIO MUX配置确保引脚功能选择正确。3. 检查TZ子模块状态寄存器TZFLG确认是否有故障标志。检查TZCTL配置是否为强制输出。4. 逐行检查AQCTLA/AQCTLB寄存器配置确保在预期的事件上有SET或CLEAR动作。PWM频率不对1. TBPRD值计算错误。2. 时间基准时钟预分频器TBCTL[CLKDIV/HSPCLKDIV]配置错误。3. 计数器模式向上/向下/上下选择错误导致周期公式用错。1. 根据所选计数器模式重新计算TBPRD。使用示波器测量周期反推实际TBPRD。2. 核对TBCTL寄存器的分频位设置。默认可能是分频状态。3. 确认TBCTL[CTRMODE]位设置是否符合预期。占空比无法改变或变化不线性1. CMPA/CMPB的影子寄存器未正确加载。2. 在错误的时间点更新了CMPA/CMPB如更新了活动寄存器导致波形畸变。3. 在向上-向下模式下AQ配置错误导致只有上升沿或下降沿受CMPA控制。1. 检查CMPCTL[LOADAMODE]配置确保在正确的时刻如CTR0加载影子寄存器到活动寄存器。2. 确保在中断中更新的是CMPA的影子寄存器通过API函数而不是直接写寄存器地址。在更新前后读取CMPA值验证。3. 检查AQCTL配置确保CTRCMPA事件在向上和向下计数方向上都配置了相应的动作如一个CLEAR一个SET。死区时间无效或异常1. 死区模块未使能DBCTL[MODE]0。2.DBRED/DBFED值设置过大超过了有效脉冲宽度。3. 输入信号选择错误死区模块未接收到正确的源信号。1. 确认DBCTL[MODE]位已设置为使能模式如0x3。2. 测量输出波形计算实际死区时间。确保DBRED/FED值 (最小期望脉冲宽度对应的计数值)。3. 检查DBCTL[IN_MODE]和[POLSEL]位确保死区模块的输入源是来自AQ的正确信号。中断无法进入1. ePWM模块中断未使能ETSEL[INTEN]0。2. 中断事件预分频ETPS[INTPRD]配置为不产生中断如0x0。3. PIE/CPU级中断未正确配置向量表、使能位。4. 中断标志未清除导致后续中断被屏蔽。1. 检查ETSEL和ETPS寄存器配置。2. 确认PIE控制器中对应ePWM中断的使能位和ACK位已设置。3.最常用方法在调试器中单步运行完初始化代码后查看ETFLG寄存器看预期的事件标志位是否被置起。如果置起但没进中断问题在PIE或CPU如果没置起问题在ePWM事件配置。多模块同步相位不准1. 各模块的TBCLK预分频不一致。2. 从模块的TBCTL[PHSEN]未使能。3. 同步链信号EPWMxSYNCO配置错误。4. 未使用TBCLKSYNC同步启动时钟导致各模块初始相位随机。1. 检查所有同步模块的TBCTL[CLKDIV/HSPCLKDIV]是否完全相同。2. 确认从模块的TBCTL寄存器PHSEN位应为1。3. 检查主模块的TBCTL[SYNCOSEL]确保它产生了同步脉冲如选择CTR0。4. 严格按照3.1.2节的时钟同步启动流程操作。调试eHRPWM最有力的工具是芯片的寄存器查看窗口和示波器。首先通过寄存器查看确认所有配置位与你的软件设定一致。然后用示波器观察EPWMxA动作限定器后、EPWMxA_DB死区后等关键节点的波形逐步定位问题出现在哪个子模块之后。理解了这个“流水线”上每个环节的信号变换任何PWM问题都能迎刃而解。