深入解析TI C2000 eHRPWM:从寄存器到电机控制实战

📅 2026/7/21 11:20:58
深入解析TI C2000 eHRPWM:从寄存器到电机控制实战
1. 项目概述与eHRPWM核心价值在嵌入式系统尤其是电机控制、数字电源和逆变器这些对时序精度要求近乎苛刻的领域脉冲宽度调制PWM信号的生成质量直接决定了整个系统的性能上限。我们常说的“调占空比”听起来简单但背后涉及到时钟同步、边沿对齐、死区保护、故障响应等一系列复杂且环环相扣的硬件逻辑。德州仪器TI在其C2000系列微控制器中集成的增强型高分辨率PWMeHRPWM模块正是为了解决这些复杂需求而生的利器。它不是一个简单的定时器加比较器而是一套高度模块化、可编程的PWM信号生成“流水线”。很多工程师初次接触eHRPWM的数百页技术手册时往往会被密密麻麻的寄存器表格和信号流图劝退。大家更习惯于调用高层API但一旦遇到波形畸变、同步失锁、保护误触发等棘手问题如果对底层寄存器的映射关系和子模块间的信号交互没有透彻理解调试就会像盲人摸象。本文的目的就是带你穿透API的封装层直接深入到eHRPWM的寄存器与子模块架构层面。我们将以TI官方技术手册SPRUH80C为蓝本但不止于翻译我会结合自己多年在电机驱动项目中的实际调试经验为你拆解每个关键寄存器位域的真实含义并厘清时间基准TB、计数比较CC、动作限定AQ等子模块是如何像精密齿轮一样协同工作的。理解这些不仅是编写稳健底层驱动的基础更是进行系统级优化如实现多模块精确同步、设计复杂保护逻辑的前提。2. eHRPWM模块整体架构与寄存器地图解析2.1 模块化设计思想与信号流eHRPWM模块的精妙之处在于其流水线式的子模块设计。它不是将所有的功能塞进一个复杂的控制寄存器而是将其分解为七个或八个含HRPWM功能相对独立又紧密衔接的子模块。这种设计使得配置逻辑清晰且不同功能间的影响可控。我们可以将其想象为一个PWM信号的“加工厂”时间基准TB子模块这是工厂的“心脏”和“节拍器”。它产生一个不断循环计数的核心时钟TBCNT决定了PWM波的周期和频率。所有其他子模块的动作时机都基于这个计数器的值来触发。计数比较CC子模块这是“模具车间”。它内部有两个比较器CMPA和CMPB持续将TBCNT的值与预设的CMPA/CMPB值进行比较。当匹配时就产生“CTRCMPA”和“CTRCMPB”这两个关键事件信号。这两个值直接决定了PWM脉冲的上升沿和下降沿位置即占空比。动作限定AQ子模块这是“执行车间”。它接收来自TB子模块的“CTRPRD”周期匹配、“CTR0”零匹配事件以及来自CC子模块的“CTRCMPA/B”事件。AQ子模块根据配置决定当这些事件发生时对最终的输出引脚EPWMxA和EPWMxB采取什么“动作”——置高、拉低、翻转或保持。正是这里将“时间事件”转化为了具体的“电平动作”。死区生成DB子模块这是“安全调度室”。在驱动上下桥臂如半桥或全桥时必须防止两者同时导通导致短路。DB子模块对AQ输出的原始信号进行加工插入可编程的上升沿延迟RED和下降沿延迟FED从而生成一对互补且带有死区的信号。故障保护TZ子模块这是“紧急制动系统”。当外部故障信号如过流、过压触发时TZ子模块可以无视当前所有逻辑强制将PWM输出设置为预定安全状态高、低或高阻实现硬件级快速保护。事件触发ET子模块这是“生产报告员”。它监控特定事件如周期匹配、比较匹配的发生并可以据此产生CPU中断让软件能够及时介入处理例如更新下一个周期的比较值以实现闭环控制。PWM斩波PC子模块这是一个“附加加工站”用于生成高频载波对PWM信号进行调制主要用于驱动门极变压器等特殊场景。高分辨率PWMHRPWM子模块部分型号具备这是“微雕车间”。它通过微边沿定位MEP技术在系统时钟的一个周期内进行插值将PWM边沿的控制精度提升到皮秒级远超传统计数器的分辨率。这些子模块通过内部总线共享TBCNT值和配置寄存器并通过一系列事件信号如CTRPRD, CTRCMPA进行连锁触发构成了一个完整的、可配置的PWM信号生成链。2.2 寄存器映射详解与寻址规则eHRPWM的寄存器是理解其工作的钥匙。手册中的Table 15-1提供了完整的寄存器地图但我们需要理解其组织逻辑。核心要点一模块化与实例化。所有寄存器按子模块分组排列TB、CC、AQ、DB、TZ、ET、PC、HRPWM。每个eHRPWM模块实例例如ePWM1, ePWM2…都拥有完全相同的一套这样的寄存器组。它们在内存中的基地址Start Address由芯片的数据手册定义通常是连续的内存块。例如ePWM1的寄存器可能从0x6800开始ePWM2的从0x6900开始。核心要点二偏移地址Offset。每个寄存器在它所属的ePWM实例内的相对位置是固定的由表中的“Offset”列定义。例如TBCTL寄存器的偏移总是0x0CMPA寄存器的偏移总是0x12。因此要访问ePWM2的CMPA寄存器地址就是ePWM2基地址 0x12。核心要点三影子寄存器Shadow Register机制。这是eHRPWM实现无毛刺、同步更新的关键设计务必深刻理解。表中“Shadow”列标识了该寄存器是否有影子寄存器。有影子寄存器Yes如TBPRD周期寄存器、CMPA/B比较寄存器。软件平时读写的是“影子寄存器”它像一个缓冲区。硬件在运行中实际使用的是“活动寄存器Active Register”。只有在特定的、安全的时刻例如计数器归零CTR0或到达周期值CTRPRD时影子寄存器的内容才会一次性加载到活动寄存器中。这确保了在一个PWM周期内控制参数是稳定不变的避免了在计数器运行中途更新参数可能导致的脉冲宽度异常。无影子寄存器No如TBCTL控制寄存器、TBCNT计数器值寄存器。对这些寄存器的写操作会立即生效。这意味着在配置它们时需要更加小心通常需要在PWM输出禁用或计数器停止时进行。核心要点四HRPWM扩展寄存器。表中带有(2)注释的寄存器如TBPHSHR, CMPAHR, HRCNFG是可选的高分辨率扩展寄存器。只有支持HRPWM功能的ePWM实例才会存在这些寄存器。在编程前必须查阅具体芯片的数据手册确认当前使用的ePWM模块是否支持HRPWM否则访问这些保留地址可能导致不可预知的行为。注意在初始化ePWM时一个良好的习惯是先配置好所有带影子寄存器的参数如TBPRD, CMPA最后再使能计数器或输出。这样可以确保第一个PWM周期开始前所有参数都已就绪。3. 核心子模块深度剖析与配置实战3.1 时间基准TB子模块PWM节拍器的核心TB子模块是整个eHRPWM的时序之源。其核心是一个16位的向上/向下计数器TBCNT以及控制其运行模式的寄存器组。3.1.1 关键寄存器与信号TBCTL控制寄存器核心中的核心。你需要通过它设置CTRMODE[1:0]计数器模式。00停止01向上计数10向下计数11向上向下计数。这是决定PWM波形对称性的关键。PHSEN相位使能。决定是否在同步信号到来时将相位寄存器TBPHS的值加载到计数器TBCNT。PRDLD周期加载模式。0影子模式在CTR0时加载1立即加载模式。强烈建议在大多数应用中使用影子模式以保证同步更新。SYNCOSEL[1:0]同步输出选择。决定本模块产生同步输出信号EPWMxSYNCO的事件源可以是输入同步SYNCI、CTR0或CTRCMPB。用于构建主从同步链。HSPCLKDIV和CLKDIV高速时钟预分频和时钟预分频。两者级联共同决定时间基准时钟TBCLK相对于系统时钟SYSCLKOUT的频率。TBCLK SYSCLKOUT / (HSPCLKDIV * CLKDIV)。TBPRD周期寄存器设定PWM周期的计数值。计数器TBCNT将在0和TBPRD之间循环。PWM频率的计算公式取决于计数模式向上计数模式T_pwm (TBPRD 1) * T_tbclkF_pwm 1 / T_pwm向下计数模式与向上计数模式公式相同。向上向下计数模式T_pwm 2 * TBPRD * T_tbclkF_pwm 1 / T_pwm其中T_tbclk 1 / F_tbclkF_tbclk即TBCLK的频率。TBPHS相位寄存器用于实现多个ePWM模块之间的相位差。当PHSEN1且同步事件发生时TBPHS的值会加载到TBCNT中从而实现从模块与主模块之间固定的相位偏移。关键事件信号CTRPRD计数器等于周期值。在向上计数和向上向下计数模式中产生。CTR0计数器等于零。在向下计数和向上向下计数模式中产生。EPWMxSYNCI/SYNCO同步输入/输出信号用于模块间级联。3.1.2 同步机制与相位控制实战多模块同步是工业应用中的常见需求例如三相逆变器需要三个相位互差120度的PWM波。场景使用ePWM1作为主模块ePWM2和ePWM3作为从模块输出三相互差120度的对称PWM波。主模块ePWM1配置设置TBCTL[SYNCOSEL] CTR0使其在每次计数器归零时产生同步输出脉冲EPWM1SYNCO。配置为向上向下计数模式设定好TBPRD和TBCLK分频。从模块ePWM2, ePWM3配置设置TBCTL[PHSEN]1使能相位加载。设置TBCTL[SYNCOSEL] SYNCI将同步输出传递给下一个模块可选构成链式。关键步骤计算并设置TBPHS寄存器。对于对称PWM向上向下计数一个完整周期是2*TBPRD个时钟。要使ePWM2滞后ePWM1 120度则相位差对应的计数值为(120/360) * 2 * TBPRD (2/3) * TBPRD。同理ePWM3滞后240度计数值为(4/3) * TBPRD。将计算值取整写入各自的TBPHS。将ePWM1的EPWM1SYNCO连接到ePWM2和ePWM3的EPWMxSYNCI具体连接方式由芯片的输入多路选择器决定。全局时钟同步启动为了避免各模块的TBCLK相位随机TI推荐了标准的启动流程// 1. 使能ePWM模块的时钟通过PSC模块 SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM1); // 2. 停止所有ePWM的时基时钟 SysCtl_disableTBCLKSync(SYSCTL_TBCLK_SYNC_DISABLE); // 3. 分别配置各个ePWM模块的TBCTL等寄存器包括分频器HSPCLKDIV/CLKDIV EPWM_setTimeBasePeriod(epwm1Base, periodValue); EPWM_setPhaseShift(epwm2Base, phase120); // ... 其他配置 // 4. 同步启动所有ePWM的时基时钟 SysCtl_enableTBCLKSync(SYSCTL_TBCLK_SYNC_ENABLE);这个流程确保了所有ePWM模块的TBCLK第一个上升沿是对齐的为精确的相位控制奠定了基础。实操心得在调试同步系统时如果发现相位关系不对首先检查TBCLK的分频设置HSPCLKDIV/CLKDIV在所有模块中是否一致。不一致的分频会导致即使同步信号对齐计数器步进速度也不同相位差会逐渐漂移。其次用示波器同时抓取主模块的SYNCO信号和从模块的SYNCI信号确认同步脉冲是否准确送达。3.2 计数比较CC子模块占空比的直接塑造者CC子模块接收TB子模块的实时计数值TBCNT并与CMPA和CMPB寄存器进行比较产生决定PWM边沿的关键事件。3.2.1 影子寄存器加载机制详解CMPA和CMPB寄存器都带有影子寄存器。其加载行为由CMPCTL寄存器控制SHDWAMODE/SHDWBMODE选择CMPA/CMPB的工作模式。0影子模式1立即加载模式。为保障PWM波形连续无毛刺必须使用影子模式。LOADAMODE/LOADBMODE[1:0]选择影子寄存器加载到活动寄存器的时机。这是实现PWM参数实时无扰更新的关键。00(CTR0)在计数器等于0时加载。01(CTRPRD)在计数器等于周期值时加载。10(CTR0或CTRPRD)在以上两个事件任一发生时加载。11禁用加载立即模式时。加载时机的选择策略向上计数或向下计数模式由于每个周期只有一个CTR0或CTRPRD事件选择哪个时机加载都可以效果一样。通常选择CTRPRD加载。向上向下计数模式这是重点。一个PWM周期内CTR0和CTRPRD事件各发生一次。选择不同的加载时机会影响新比较值生效的对称性。若选择CTRPRD加载则新值将在计数器到达峰值后开始下降时生效。若选择CTR0加载则新值将在计数器到达谷底后开始上升时生效。若选择CTR0或CTRPRD则新值可能在周期的任一个端点生效取决于软件写入影子寄存器的时机这可能导致不对称的波形通常不推荐。最佳实践对于对称PWM为了实现中心对齐且参数更新平滑通常将LOADAMODE设置为CTRPRDLOADBMODE也设置为CTRPRD或根据需求一致。然后在中断服务程序中在CTRPRD事件发生后即计数器开始下降时更新CMPA/CMPB的影子寄存器值。这样新参数将在下一个完整周期生效且关于中心点对称。3.2.2 占空比计算与CMP值设定占空比Duty Cycle定义为高电平时间与整个周期的比值。CMPA/B寄存器的值决定了事件触发点进而通过AQ子模块决定边沿。向上计数模式非对称PWM假设我们希望EPWMxA输出一个在计数器等于CMPA时拉高在CTRPRD时拉低的波形这是常见配置。那么高电平时间 (TBPRD - CMPA) * T_tbclk占空比 (TBPRD - CMPA) / (TBPRD 1)因此CMPA TBPRD - Duty * (TBPRD 1)。向上向下计数模式对称PWM假设我们希望EPWMxA输出一个在CTRCMPA上升沿时拉高在CTRCMPA下降沿时拉低的波形AQ配置为在CTRCMPA且计数器向上时置高向下时拉低。那么高电平时间 2 * (TBPRD - CMPA) * T_tbclk占空比 (TBPRD - CMPA) / TBPRD因此CMPA TBPRD - Duty * TBPRD。注意事项CMPA/B的值必须在0到TBPRD之间对于向上向下计数模式。如果设置值等于0或TBPRD比较事件在周期中只会发生一次在波峰或波谷这会影响AQ的动作次数。如果设置值超出范围在向上/向下模式下可能永远不会触发比较事件。3.3 动作限定AQ子模块事件到动作的翻译官AQ子模块是连接“时间事件”和“引脚动作”的桥梁。它接收来自TB的CTRPRD、CTR0事件和来自CC的CTRCMPA、CTRCMPB事件并根据当前计数器的方向CTR_dir按照AQCTLA和AQCTLB寄存器的配置对输出EPWMxA和EPWMxB执行操作。3.3.1 AQCTLA/AQCTLB寄存器配置逻辑每个寄存器控制A输出或B输出包含6个2位字段分别对应6个事件CBUCTR CMPB且计数器向上 (CTR_dirUP)CBDCTR CMPB且计数器向下 (CTR_dirDOWN)CAUCTR CMPA且计数器向上CADCTR CMPA且计数器向下PRDCTR PRDZROCTR 0每个字段可以配置为00无动作。01在事件发生时清除输出置为低电平。10在事件发生时置位输出置为高电平。11在事件发生时翻转输出。通过灵活组合这些事件和动作可以生成极其丰富的PWM波形。3.3.2 典型波形生成配置示例假设我们需要在ePWM1上生成一对互补带死区的PWM信号A和B采用向上向下计数模式中心对齐。配置TB子模块设置为向上向下计数模式设定TBPRD。配置CC子模块设定CMPA和CMPB的值用于控制占空比和死区死区由DB模块添加此处CMPAB可用于对称情况。配置AQ子模块这是核心我们希望EPWM1A在计数器向上过程中达到CMPA时置高在计数器向下过程中达到CMPA时拉低。这对应CAUSET (10)CADCLEAR (01)。我们希望EPWM1B与EPWM1A完全互补死区由后续DB模块添加。那么EPWM1B应该在CAU事件时拉低在CAD事件时置高。即CAUCLEAR (01)CADSET (10)。对于PRD和ZRO事件我们通常不直接操作输出而是用于触发中断或同步。可以设置为无动作(00)。因此EPWM_setActionQualifierAction(epwm1Base, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, // CAU EPWM_AQ_EVENT_COUNTER_UP_CMPA); EPWM_setActionQualifierAction(epwm1Base, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, // CAD EPWM_AQ_EVENT_COUNTER_DOWN_CMPA); EPWM_setActionQualifierAction(epwm1Base, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_LOW, // CAU EPWM_AQ_EVENT_COUNTER_UP_CMPA); EPWM_setActionQualifierAction(epwm1Base, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_HIGH, // CAD EPWM_AQ_EVENT_COUNTER_DOWN_CMPA);配置DB子模块在AQ输出的原始互补信号基础上插入死区时间。3.3.3 软件强制输出AQSFRC和AQCSFRC寄存器提供了通过软件直接强制输出电平的能力这在调试或特定控制序列中非常有用。AQSFRC是单次强制AQCSFRC是连续强制直到被清除。但要注意故障保护TZ子模块的优先级高于软件强制。3.4 死区生成DB与故障保护TZ子模块安全与可靠的保障3.4.1 死区生成DB模块死区时间是防止桥臂直通的生命线。DB模块对来自AQ的一对信号通常假设为互补的A和B进行处理。关键寄存器DBCTL控制寄存器用于使能/禁用死区、选择输入信号极性、选择输出模式例如对A路信号插入延迟生成A和B两路输出。DBRED上升沿延迟计数值。指定在输入信号上升沿后延迟多少个TBCLK周期才让输出信号上升。DBFED下降沿延迟计数值。指定在输入信号下降沿后延迟多少个TBCLK周期才让输出信号下降。工作模式常见的是“主动高互补模式”。AQ输出的EPWMxA作为源信号DB模块生成两路输出EPWMxA_DB通常作为上管驱动在源信号上升沿延迟DBRED后变高在下降沿延迟DBFED后变低。EPWMxB_DB通常作为下管驱动在源信号下降沿延迟DBFED后变高在上升沿延迟DBRED后变低。 这样就确保了一路关断后另一路要经过一段死区时间才会开通。计算死区时间死区时间 DBRED * T_tbclk或DBFED * T_tbclk通常两者设成相同值。例如TBCLK100MHz (10ns)DBRED50则死区时间为500ns。3.4.2 故障保护TZ模块TZ模块是硬件安全屏障响应速度远快于软件中断。关键寄存器TZSEL选择哪些外部故障引脚TZ1~TZn可以触发本ePWM模块的保护动作。TZCTL配置当故障发生时EPWMxA和EPWMxB输出应被强制为何种状态高、低、高阻Hi-Z或忽略。TZEINT使能故障触发CPU中断。TZFLG故障标志位指示哪个故障源发生了。TZCLR用于清除故障标志。TZFRC软件强制触发故障用于测试。工作模式单次触发One-Shot故障信号有效后输出立即被强制到安全状态并且锁存。即使故障信号消失输出也保持安全状态直到软件通过TZCLR清除标志。周期逐次Cycle-By-Cycle故障信号有效期间每个PWM周期输出都会被强制到安全状态。一旦故障信号消失下一个PWM周期输出即恢复正常。这种模式适用于过流保护等需要快速响应的场景。配置实战假设我们使用TZ1引脚连接过流比较器输出希望触发周期逐次保护将输出强制拉低。// 选择TZ1作为故障源并配置为周期逐次模式 EPWM_enableTripZoneSignals(epwm1Base, EPWM_TZ_SIGNAL_1); EPWM_setTripZoneAction(epwm1Base, EPWM_TZ_ACTION_EVENT_TZB, // 这里TZB代表周期逐次模式 EPWM_TZ_ACTION_LOW); // 动作强制输出为低 // 使能TZ中断如果需要 EPWM_enableTripZoneInterrupt(epwm1Base);避坑指南故障保护配置后一定要在硬件上模拟一个故障信号例如拉低TZ引脚用示波器验证输出是否按预期被强制。同时确保在软件中断服务程序如果使能了中正确清除故障标志TZFLG否则可能导致保护无法退出或中断持续触发。4. 高级功能与系统集成考量4.1 事件触发ET与中断管理ET子模块负责将PWM周期内的关键事件转化为CPU中断是实现软件实时控制如电流环、电压环的基石。关键寄存器ETSEL选择触发中断INT或ADC启动SOC的事件源。事件源包括CTRPRD,CTR0,CTRCMPA上/下,CTRCMPB上/下。ETPS事件预分频。可以配置为在第N次1st, 2nd, 3rd事件发生时才产生中断脉冲。这对于降低CPU中断负载非常有用。例如在CTRPRD事件处产生中断来更新占空比但可以设置为每2个周期中断一次。ETFLG中断标志位。ETCLR清除中断标志。ETFRC软件强制触发中断事件。标准中断初始化流程手册15.2.2节强调了一个关键流程旨在避免因ePWM时钟刚使能时寄存器状态不确定而产生的伪中断。禁用全局中断操作CPU的INTM位。禁用ePWM模块中断清除ETSEL[INTEN]。初始化所有ePWM配置寄存器TB, CC, AQ, DB等。清除所有可能已置位的伪中断标志ETFLG。使能ePWM模块中断设置ETSEL[INTEN]。使能全局中断。 这个流程是保证中断系统稳定运行的黄金法则。4.2 高分辨率PWMHRPWM扩展对于需要极高精度如功率因数校正PFC、谐振变换器的应用传统PWM的边沿分辨率受限于TBCLK周期。HRPWM通过微边沿定位MEP技术在TBCLK的一个周期内进行亚周期级的延时可将分辨率提高8-12倍。核心思想利用芯片内部的一个数字延迟线对传统的PWM边沿进行微调。调整的步进可以达到150ps左右远小于一个TBCLK周期例如10ns。关键寄存器CMPAHR这是CMPA的高分辨率扩展寄存器。其低8位MEP用于微调。TBPHSHR相位寄存器的高分辨率扩展。HRCNFGHRPWM配置寄存器用于选择操作模式如微调CMPA还是相位、边沿选择等。使用方式通常我们通过特定的HRPWM校准API获取当前芯片的MEP标定因子然后通过公式计算CMPAHR的值。TI提供了库函数来简化这一过程。重要提示HRPWM功能对温度、电压和工艺敏感通常需要在不同工作点进行校准并将校准数据存储在非易失性存储器中上电时加载。4.3 多模块协同与系统级设计要点当设计一个包含多个ePWM模块的复杂系统如三相逆变器、交错并联LLC时需考虑时钟同步务必使用SysCtl_enableTBCLKSync()函数同步启动所有模块的TBCLK确保时序基准一致。相位关系利用TBPHS寄存器精确设定模块间的相位差。计算时注意计数模式向上向下模式需用2*TBPRD作为周期基准。中断分配合理规划各模块的中断源。例如让主桥臂的ePWM在CTRPRD时中断用于更新所有桥臂的占空比让从桥臂仅在故障时中断。利用ETPS预分频减轻CPU负担。故障保护联动可以将多个ePWM模块的故障输入TZn连接到同一个硬件故障信号并配置相同的保护动作实现全局快速关断。影子寄存器更新策略在中断服务程序中更新CMPA/B影子寄存器时要确保在正确的加载事件CTR0或PRD之前完成写入。通常在中断发生后立即更新是安全的因为计数器到达事件点与加载动作发生之间有一个时钟周期的延迟。5. 常见问题排查与调试技巧实录即使理解了所有原理实际调试中依然会遇到各种问题。以下是我在项目中积累的一些常见问题与排查思路问题1PWM完全没有输出。检查清单时钟与使能确认系统时钟SYSCLKOUT正常ePWM模块的时钟通过PSC模块已使能。GPIO复用确认EPWMxA/B对应的引脚已正确配置为PWM输出功能而非普通的GPIO。输出使能检查AQ子模块是否配置了有效的动作SET/CLEAR/TOGGLE。如果所有事件都配置为“无动作”输出将保持默认状态通常是高阻。计数器状态读取TBCNT寄存器看它是否在循环计数。如果TBCTL[CTRMODE]被误设为FREEZE冻结模式计数器不会运行。强制输出测试尝试使用AQSFRC寄存器软件强制输出高或低看引脚是否有响应。这可以快速隔离是配置问题还是时钟/引脚问题。问题2PWM频率或占空比与计算值不符。检查清单TBCLK计算双重检查TBCTL[HSPCLKDIV]和TBCTL[CLKDIV]的分频系数。TBCLK SYSCLKOUT / (HSPCLKDIV * CLKDIV)。一个常见的错误是忽略了高速预分频器HSPCLKDIV。计数模式与公式确认使用的频率/占空比公式与TBCTL[CTRMODE]设置的计数模式匹配。向上向下计数模式的周期是2*TBPRD*T_tbclk而非(TBPRD1)*T_tbclk。影子寄存器确认你修改的是否是影子寄存器以及加载时机LOADAMODE是否设置正确。如果你在计数器运行中更新了CMPA的影子寄存器但加载时机未到新值不会立即生效。读取CMPA寄存器活动值和影子寄存器值通过特定方式进行对比。CMPA/B值范围确保CMPA/B的值在0到TBPRD之间。超出范围的值在向上/向下模式下可能导致比较事件永不发生。问题3多个ePWM模块无法同步或相位差不对。检查清单同步信号路径用示波器或代码读取EPWMxSYNCI输入状态确认主模块的SYNCO脉冲是否到达从模块。检查TBCTL[SYNCOSEL]配置。相位加载使能确认从模块的TBCTL[PHSEN]位已置1。TBCLK分频一致性这是最容易被忽略的一点所有需要同步的ePWM模块其TBCTL[HSPCLKDIV]和CLKDIV必须设置为完全相同的值。否则即使同时启动计数器累加速度不同相位也会很快错开。TBPHS值计算重新计算相位寄存器值。对于向上向下模式相位差对应的计数值是(相位差/360) * 2 * TBPRD。问题4插入死区后波形异常或死区时间不对。检查清单DB模块输入源检查DBCTL寄存器中IN_MODE位的配置确认DB模块接收的是来自AQ的哪两路信号。配置错误会导致输出混乱。输出极性检查DBCTL[POLSEL]确保生成的互补信号极性符合你的功率级驱动要求例如上管高有效下管低有效。DBRED/DBFED值确认写入的延迟计数值。死区时间 计数值 *T_tbclk。用示波器测量上升沿和下降沿之间的实际延迟与计算值对比。AQ输出与DB输入关系在使能DB模块前先验证AQ子模块输出的原始信号是否正确。可以临时旁路DB模块DBCTL[MODE]DISABLE直接观察AQ的输出。问题5故障保护TZ不动作或误动作。检查清单故障源选择检查TZSEL寄存器确认你关心的故障引脚如TZ1已被使能。动作配置检查TZCTL寄存器确认为指定的故障事件配置了正确的强制动作如拉低。工作模式确认配置的是单次触发OSHT还是周期逐次CBC模式。TZSEL寄存器中分别有对应的使能位。引脚状态检查故障输入引脚的实际电平。可能是外部比较器电路问题或者引脚内部上拉/下拉配置冲突。标志位清除如果是单次触发模式故障发生后输出会锁存。必须在处理完故障原因后手动向TZCLR寄存器的对应位写1来清除故障标志TZFLG否则输出将一直保持强制状态。调试eHRPWM最强大的工具是结合代码仿真观察寄存器值和示波器观察实际波形。当遇到问题时系统地按照“时钟源 - 计数器 - 比较器 - 动作器 - 输出整形 - 引脚”这条信号链进行分段排查总能定位到问题的根源。理解本文所述的寄存器与子模块架构正是为了让你在调试时能清晰地知道该去检查哪个环节的哪个寄存器。