深入解析TI C2000 ePWM寄存器:从电机控制到数字电源的实战指南

📅 2026/7/18 11:48:50
深入解析TI C2000 ePWM寄存器:从电机控制到数字电源的实战指南
1. ePWM模块从寄存器视角看电机控制的“心脏”在嵌入式电机控制和数字电源领域PWM脉冲宽度调制信号就像是驱动系统的“脉搏”。而德州仪器TIC2000系列微控制器中的增强型PWMePWM模块则是这颗“心脏”的核心引擎。很多工程师在初次接触ePWM时往往被其庞大的寄存器手册和复杂的子模块交互搞得晕头转向。他们可能会直接调用TI提供的驱动库函数虽然能快速上手但一旦遇到需要精细调优、解决异常波形或者实现非标准PWM模式时就会感到力不从心因为不理解寄存器底层的行为逻辑调试就像在黑暗中摸索。我经历过这个阶段深知仅仅知道设置“周期”和“比较值”是远远不够的。真正的掌控力来源于对寄存器每一位Bit功能的透彻理解。从时基计数器TB的启动与同步到比较器CC的影子模式更新再到动作限定器AQ对边沿的精确操纵以及死区DB和跳闸区TZ的安全保护每一个环节都由特定的寄存器控制。本文将带你深入TI ePWM模块的寄存器世界从最基础的TBCTL开始一直剖析到复杂的TZSEL。我们不只讲每个位是干什么的更会结合我在电机驱动和电源项目中的实际踩坑经验告诉你为什么这么配置以及配置不当会导致什么后果。无论你是正在学习C2000的新手还是希望优化现有PWM性能的老手这篇基于寄存器手册的深度解析都将为你提供一张清晰的“电路图”。2. 时基子模块TB寄存器PWM节拍的起源时基子模块是整个ePWM的节拍器它产生的时基计数器TBCTR的计数循环定义了PWM的周期和频率。所有其他子模块比较、动作、死区都以此节拍为基准进行工作。因此对TB相关寄存器的理解是重中之重。2.1 TBCTL_TBSTS全局控制与状态枢纽TBCTL_TBSTS寄存器是一个复合寄存器高16位TBSTS反映状态低16位TBCTL用于控制。它是配置ePWM工作模式的起点。TBCTL[1:0] - CTRMODE计数器模式这是第一个关键决策点。它决定了TBCTR的计数方式00递增模式Up-Count。TBCTR从0开始每个TBCLK时钟加1直到等于周期值TBPRD然后归零重新开始。此模式产生不对称PWM常用于简单的LED调光或蜂鸣器。01递减模式Down-Count。TBCTR从TBPRD开始递减至0然后重新加载TBPRD。同样产生不对称PWM。10递增-递减模式Up-Down-Count。TBCTR从0递增到TBPRD然后立即递减回0如此循环。这是电机控制和数字电源中最常用的模式因为它能产生中心对称的PWM波形。对称PWM在功率转换中能显著降低谐波分量提高效率并且便于实现双更新在周期开始和中间点更新比较值这对于电流环等快速控制算法至关重要。11停止模式。计数器冻结通常用于调试或紧急停止。实操心得在电机FOC控制中务必选择10递增-递减模式。我曾在一个项目中误设为递增模式导致电流采样时刻不对齐引发严重的电流谐波和电机噪音排查了很久才发现是这个基础配置错误。TBCTL[12:10] - CLKDIV 与 [9:7] - HSPCLKDIV时钟预分频这两个字段共同决定时基时钟TBCLK的频率。公式为TBCLK SYSCLKOUT / (HSPCLKDIV * CLKDIV)。SYSCLKOUT是系统时钟。HSPCLKDIV称为高速预分频默认值为/2CLKDIV是低速预分频默认值为/1。这意味着默认情况下TBCLK是系统时钟的一半。配置解析假设系统时钟为100MHz需要产生一个20kHz的PWM周期50us。在递增-递减模式下PWM周期Tpwm (2 * TBPRD) / TBCLK。如果我们设置TBPRD为1000则Tpwm (2 * 1000) / TBCLK 20kHz可反推出需要的TBCLK 40MHz。因此分频系数应为100MHz / 40MHz 2.5这不是整数。我们需要调整TBPRD或分频比。一个更优解是设置HSPCLKDIV/2,CLKDIV/1则TBCLK50MHz。再令TBPRD (Tpwm * TBCLK) / 2 (50e-6 * 50e6) / 2 1250。这样就能得到精确的20kHz频率。TBCTL[3] - PRDLD周期寄存器加载模式0影子模式Shadow。对TBPRD的写入操作实际是写入其影子寄存器只有当TBCTR0时影子寄存器的值才会加载到活跃寄存器中生效。这是默认且推荐的方式因为它能确保在PWM周期边界同步更新周期值避免在计数中途更新导致的脉冲宽度畸变。1立即模式Active。写入TBPRD直接修改活跃寄存器立即生效。这可能会打断正在进行的计数周期产生一个“毛刺”周期通常只在特殊调试场景下使用。TBCTL[2] - PHSEN 与 TBPHS寄存器相位控制这是实现多路PWM同步的关键。PHSEN置1后当该模块接收到同步信号SYNCI时其TBCTR会立即被加载为TBPHS寄存器中设定的值。应用场景在多相交错并联电源中需要多个ePWM模块产生相同频率但相位依次错开的PWM波。例如三个模块驱动三相逆变器。设置主模块Master的TBPHS0从模块1Slave1的TBPHS TBPRD/3从模块2Slave2的TBPHS 2*TBPRD/3。当主模块在TBCTR0时发出同步信号通过SYNCO从模块接收到后立即将各自计数器设为预设相位从而实现120度相位差。TBCTL[5:4] - SYNCOSEL同步输出选择决定本模块的同步输出信号SYNCO来源。可以来自输入同步SYNCI、本模块计数器归零CTR0或等于CMPB等。通常级联同步链时从模块设置为00直通SYNCI主模块设置为01在CTR0时产生SYNCO。TBSTS位域如CTRMAX计数器是否曾达到最大值、SYNCI是否发生过外部同步、CTRDIR当前计数方向等主要用于状态监控和事件捕获在调试时非常有用。2.2 TBCTR与TBPRD周期与计数的核心TBCTR是16位只读也可写但不推荐的当前计数器值寄存器它实时反映了时基计数器的状态。TBPRD是16位的周期寄存器它定义了PWM的周期。在递增-递减模式下PWM频率Fpwm TBCLK / (2 * TBPRD)。这里有一个关键细节TBCTR和TBPRD在内存映射中共享同一个地址偏移0x08。具体访问哪一个取决于TBCTL[PRDLD]位和访问时机。在影子模式下CPU写入的是TBPRD的影子寄存器读取时手册规定也是读影子寄存器。而TBCTR的读写都是直接针对活跃寄存器。这种设计节省了地址空间但要求程序员在概念上必须清晰区分“影子”和“活跃”寄存器。避坑指南不要在中断服务程序或高优先级任务中频繁读取TBCTR来获取“精确”的计时因为它的值在每个TBCLK周期都在变化读取瞬间可能正值跳变导致读取值不稳定。对于高精度计时应结合TBCTR和周期事件中断来估算。3. 计数比较子模块CC寄存器脉宽的定义者时基子模块决定了脉冲的“骨架”周期而计数比较子模块则负责在骨架上“雕刻”出脉冲的宽度。它通过将TBCTR与用户设定的比较值CMPA、CMPB进行实时比较产生比较匹配事件。3.1 CMPCTL比较器行为的导演CMPCTL寄存器控制着CMPA和CMPB这两个比较值如何被加载和生效是理解影子模式运作的核心。CMPCTL[20] - SHDWAMODE 与 [22] - SHDWBMODE分别控制CMPA和CMPB的工作模式。0影子模式。这是绝大多数闭环控制应用的标准配置。CPU写入的CMPA/CMPB值先存入影子寄存器不会立即影响正在输出的PWM占空比。这提供了一个安全的“缓冲”允许控制器在任何时刻计算并更新下一个PWM周期的占空比指令而不会干扰当前周期。1立即模式。写入操作直接修改活跃比较寄存器PWM占空比立即改变。这可能导致脉冲宽度突变在电机控制中会引起转矩脉动甚至过流通常仅在开环测试或特定保护场景中使用。CMPCTL[17:16] - LOADAMODE 与 [19:18] - LOADBMODE这两个字段仅在影子模式下有意义定义了影子寄存器值加载到活跃寄存器的时机。00在TBCTR 0递增或递增-递减模式的周期起点时加载。01在TBCTR TBPRD递增-递减模式的周期中点时加载。10在TBCTR 0或TBCTR TBPRD时加载即双加载点。11冻结不加载。核心应用解析在电机FOC的电流环控制中计算出的新电压矢量对应新的CMPA/CMPB值需要被及时应用。采用递增-递减模式时设置LOADAMODE 10双加载是最优选择。这样在每个PWM周期的开始CTR0和中间CTRTBPRD都可以更新比较值。结合对称采样在CTR0和CTRTBPRD时触发ADC采样可以实现“计算-更新”的流水线操作将电流环的计算延迟从整个PWM周期缩短到半个周期显著提升控制带宽和动态响应。这是高性能电机驱动软件的标配技巧。CMPCTL[24] - SHDWAFULL 与 [25] - SHDWBFULL这两个状态位指示CMPA/CMPB的影子寄存器FIFO是否已满。在影子模式下如果你在影子寄存器被加载到活跃寄存器之前再次写入该寄存器新值会覆盖影子寄存器中的旧值。通过检查SHDWxFULL位可以确保你的更新指令没有被意外覆盖。在高速实时控制中这是一个重要的完整性检查点。3.2 CMPA与CMPB占空比指令的载体CMPA和CMPB是两个16位的比较值寄存器。在影子模式下我们操作的是它们的影子寄存器。它们的值直接决定了PWM脉冲的边沿位置。在递增模式下当TBCTR从0增加到CMPA时可以触发一个动作如置高当TBCTR增加到TBPRD时归零形成一个周期。占空比 CMPA / TBPRD。在递增-递减模式下情况更复杂因为计数器会上下滚动。通常CMPA和CMPB会分别控制一个输出通道EPWMxA和EPWMxB的两次比较事件递增匹配和递减匹配从而生成对称的PWM波形。此时占空比的计算公式为占空比 (TBPRD - CMPA_value) / TBPRD假设在递增匹配时清除递减匹配时置位。务必根据AQCTL的配置来理解CMP值的实际物理意义。经验之谈永远不要在中断或主循环中直接进行CMPA new_value这样的赋值。应该使用TI的驱动库函数如EPWM_setCounterCompareValue()或确保在影子模式下操作。我曾因为直接操作寄存器地址忽略了影子/活跃寄存器的区别导致PWM输出出现随机性的占空比跳变问题极其隐蔽。4. 动作限定子模块AQ寄存器边沿事件的指挥官比较器只负责发出“时间到了”的信号CMPA/CMPB匹配事件、CTRPRD事件、CTRZRO事件而具体对这个信号做什么——是让输出变高、变低还是翻转——则由动作限定子模块决定。AQCTLA和AQCTLB寄存器就是指挥这两个输出通道EPWMxA和EPWMxB的指挥官手册。4.1 AQCTLA与AQCTLB输出动作的规则手册这两个寄存器结构完全一样分别控制EPWMxA和EPWMxB。每个寄存器包含6个2位的字段对应6种特定事件发生时采取的动作ZRO: 当TBCTR 0x0000。PRD: 当TBCTR TBPRD。CAU: 当TBCTR CMPA且计数器在递增。CAD: 当TBCTR CMPA且计数器在递减。CBU: 当TBCTR CMPB且计数器在递增。CBD: 当TBCTR CMPB且计数器在递减。每个字段可以配置为00: 无操作。01: 清除输出强制低。10: 置位输出强制高。11: 翻转。经典配置案例互补对称PWM生成假设我们要用EPWMxA和EPWMxB生成一对带死区的互补PWM信号常用于驱动半桥的上下管采用递增-递减模式。配置AQCTLA(控制EPWMxA)CAU 01(Clear): 递增匹配CMPA时EPWMxA变低。CAD 10(Set): 递减匹配CMPA时EPWMxA变高。其他事件设为00。这样在一个周期内EPWMxA在计数器从CMPA递减到CMPA的过程中为高电平其余时间为低电平。注意这产生的是一个“高有效”的脉冲其中心对称于周期中点。配置AQCTLB(控制EPWMxB)为了实现互补我们希望EPWMxB在EPWMxA为低时高为高时低假设为低有效。CAU 10(Set): 递增匹配CMPA时EPWMxB变高。CAD 01(Clear): 递减匹配CMPA时EPWMxB变低。其他事件设为00。此时EPWMxB的波形与EPWMxA正好相反。但这样生成的互补信号是“理想”的上下管的开关瞬间完全重合在实际功率电路中会导致“直通”短路烧毁器件。因此我们需要引入死区。4.2 AQSFRC软件强制干预AQSFRC寄存器允许软件直接强制输出特定的电平而不依赖于计数器事件。这在某些保护或测试场景下非常有用。OTSFA/OTSFB一次性软件强制位。写1会产生一个单次的强制事件动作由ACTSFA/ACTSFB字段定义清除、置位、翻转。该位会自动清零。CSFA/CSFB连续软件强制位。可以强制输出持续为高、低或禁用强制。这在故障安全状态下非常有用例如当检测到过流时可以立即通过CSFA1和CSFB1将两个输出都强制为低关断所有开关管。注意事项软件强制事件的优先级通常高于常规的AQ事件。一旦使能了连续强制常规的PWM生成逻辑将被覆盖。在退出强制状态前需要妥善清理这些位。5. 死区子模块DB寄存器安全卫士死区子模块接收来自AQ的原始PWM信号EPWMxA_In, EPWMxB_In并对它们的上升沿和/或下降沿插入可编程的延迟生成最终的EPWMxA_Out和EPWMxB_Out从而防止互补信号同时导通直通。5.1 DBCTL死区工作模式总开关DBCTL寄存器是配置死区的核心。OUT_MODE[1:0]输出模式控制。这是首先要配置的。00直通模式。死区功能被完全旁路输入直接到输出。用于不需要死区的场景。01仅使能下降沿延迟。EPWMxA_In直通到EPWMxA_OutEPWMxB_Out是EPWMxB_In经过下降沿延迟后的信号。不常用。10仅使能上升沿延迟。EPWMxA_Out是EPWMxA_In经过上升沿延迟后的信号EPWMxB_In直通到EPWMxB_Out。不常用。11全使能模式经典模式。EPWMxA_Out是EPWMxA_In经过上升沿延迟后的信号EPWMxB_Out是EPWMxB_In经过下降沿延迟后的信号。这是最常用的配置可以为上下管同时插入死区时间。IN_MODE[1:0]输入源选择。决定哪个信号作为上升沿和下降沿迟的输入。00默认模式。EPWMxA_In同时作为上升沿和下降沿延迟的输入源。这是最典型的用法配合AQ生成的互补信号可以产生带死区的对称PWM对。其他模式如01, 10, 11用于更复杂的非对称或独立边沿控制场景例如需要单独调整两个通道死区时。POLSEL[1:0]输出极性选择。可以对延迟后的信号进行取反。00Active High (AH)。两个输出都不取反。01Active Low Complementary (ALC)。EPWMxA_Out取反。常用于上管驱动需要低电平有效的情况。10Active High Complementary (AHC)。EPWMxB_Out取反。常用于下管驱动需要低电平有效的情况。11Active Low (AL)。两个输出都取反。硬件连接对照这个配置必须与实际的功率器件驱动芯片如隔离栅极驱动器的输入逻辑相匹配。如果驱动芯片是低电平有效使能那么通常需要将PWM输出配置为“有效低”模式并通过POLSEL进行取反确保在故障时MCU输出高电平被取反为低电平来关断驱动。5.2 DBRED与DBFED死区时间的量化DBRED上升沿延迟和DBFED下降沿延迟是两个10位的寄存器用于设置延迟的计数值。死区时间 延迟计数值 * TBCLK周期。 例如TBCLK 50MHz (20ns)需要插入500ns的死区时间则延迟值应设置为500ns / 20ns 25。计算与权衡死区时间必须足够长以覆盖功率器件如IGBT、MOSFET的关断存储时间和驱动电路的传播延迟防止直通。但死区时间过长会降低输出电压基波幅值引入非线性畸变尤其在低速时影响大。需要根据器件手册和实验来折中选取。一个经验值是对于常见的IGBT死区时间通常在1us到3us之间对于高速MOSFET可以降到几百纳秒。6. 跳闸区子模块TZ与数字比较DC寄存器系统的安全气囊跳闸区是ePWM的最后一道安全防线。当外部故障信号如过流、过压、过热触发TZ引脚或内部数字比较器DC产生故障事件时TZ模块可以强制PWM输出进入预设的安全状态高阻、拉高或拉低。6.1 TZSEL故障源的选择器TZSEL寄存器用于使能或禁用哪些信号可以作为故障源。故障分为两种类型一次性跳闸One-Shot Trip, OST当故障事件发生时ePWM输出立即被强制到安全状态并且锁存。即使故障信号消失输出也保持安全状态直到软件通过写TZCLR寄存器明确清除该故障标志。适用于严重的、不可自恢复的故障如硬件过流。周期逐周期跳闸Cycle-By-Cycle Trip, CBC当故障事件发生时ePWM输出被强制到安全状态但仅持续当前PWM周期。下一个PWM周期开始时如果故障信号已消失输出会自动恢复正常工作如果故障依然存在则再次关断。适用于需要限流或逐周期保护的场景。TZSEL寄存器的高字节TZDCSEL用于选择数字比较事件DCAEVT1/2, DCBEVT1/2作为故障源的条件例如当某个ADC结果高于/低于某个阈值时。低字节的TZSEL位则用于使能具体的TZ引脚TZ1-TZ6或数字比较事件作为OST或CBC的源。配置示例假设我们将硬件过流比较器的输出连接到TZ1引脚希望它触发一次性跳闸。设置TZSEL.OSHT1 1使能TZ1作为OST源。在TZCTL寄存器中配置当OST事件发生时EPWMxA和EPWMxB输出采取什么动作例如都置为高阻态Hi-Z。在TZEINT寄存器中使能OST中断以便在故障发生时CPU能进入中断服务程序进行记录和处理。当TZ1引脚出现低电平假设低有效时ePWM输出立即进入安全状态并锁存。CPU在中断服务程序中读取TZFLG寄存器确认故障源进行系统停机、报警等操作最后通过写TZCLR.OST1 1来清除故障标志才能重新使能PWM输出。6.2 数字比较DC与TZ的联动数字比较子模块是C2000的一个强大特性它允许不经过CPU直接由硬件比较器将ADC结果或其它信号与预设值比较并产生事件DCAEVT/DCBEVT直接送给ePWM的TZ模块或作为同步信号。这实现了纳秒级的硬件保护响应。 例如在电机控制中可以将电流采样的ADC结果通过DAC送到片上的CMPSS比较器子系统CMPSS的输出连接到DCAEVT。在TZSEL中配置当DCAH高即电流超过上限时触发CBC跳闸。这样一旦过流在当前PWM周期内就能立即关断输出响应速度远快于CPU中断处理。7. 寄存器配置实战构建一个完整的电机相PWM驱动让我们整合以上所有知识为一个三相逆变器的一个桥臂假设是A相使用EPWM1A和EPWM1B驱动配置PWM。目标中心对称PWM带死区影子模式双更新支持CBC过流保护。步骤1初始化时基子模块// 假设系统时钟 SYSCLKOUT 100MHz 目标PWM频率 20kHz EPWM_setClockPrescaler(EPWM1_BASE, EPWM_CLOCK_DIVIDER_2, EPWM_HSCLOCK_DIVIDER_1); // HSPCLKDIV2, CLKDIV1 - TBCLK50MHz EPWM_setTimeBasePeriod(EPWM1_BASE, 1250); // TBPRD (Ftbclk / (2 * Fpwm)) 50e6/(2*20e3)1250 EPWM_setPhaseShift(EPWM1_BASE, 0); // TBPHS 0 主模块 EPWM_setTimeBaseCounter(EPWM1_BASE, 0); // TBCTR 从0开始 EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_UP_DOWN); // CTRMODE 10 递增-递减模式 EPWM_setTimeBaseLoadMode(EPWM1_BASE, EPWM_PERIOD_SHADOW_LOAD); // PRDLD 0 周期寄存器影子模式 EPWM_enablePhaseShiftLoad(EPWM1_BASE); // PHSEN 1 使能相位加载虽然主模块为0但为同步链准备 EPWM_setSyncOutPulseMode(EPWM1_BASE, EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO); // SYNCOSEL 01 在CTR0时产生同步脉冲步骤2配置计数比较子模块EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, 1000); // 初始化CMPA影子寄存器 EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_B, 1000); // 初始化CMPB影子寄存器可与CMPA相同或不同 EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO_OR_PERIOD); // LOADAMODE 10 双加载点 EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE, EPWM_COUNTER_COMPARE_B, EPWM_COMP_LOAD_ON_CNTR_ZERO_OR_PERIOD); // LOADBMODE 10 // SHDWAMODE/SHDWBMODE 默认为影子模式无需额外设置步骤3设定动作限定规则// 配置 EPWM1A 递增过CMPA时清除变低递减过CMPA时置位变高 - 高有效脉冲 EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, // 递减过CMPA时置高 EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA); EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, // 递增过CMPA时置低 EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); // 其他事件ZRO, PRD, CBU, CBD保持默认无操作 // 配置 EPWM1B 与A互补假设为低有效。递增过CMPA时置高递减过CMPA时清除。 EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_LOW, // 递减过CMPA时置低 EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA); EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_HIGH, // 递增过CMPA时置高 EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);步骤4插入死区EPWM_setDeadBandDelayMode(EPWM1_BASE, EPWM_DB_RED, true); // 使能上升沿延迟 EPWM_setDeadBandDelayMode(EPWM1_BASE, EPWM_DB_FED, true); // 使能下降沿延迟 EPWM_setDeadBandDelayPolarity(EPWM1_BASE, EPWM_DB_POLARITY_ACTIVE_HIGH, EPWM_DB_POLARITY_ACTIVE_LOW); // 根据驱动芯片设置极性此处示例A高有效B低有效 EPWM_setDeadBandDelay(EPWM1_BASE, 25, 25); // 设置上升沿和下降沿延迟均为25个TBCLK周期假设20ns*25500ns // DBCTL寄存器底层配置为 OUT_MODE11, IN_MODE00, POLSEL01 (ALC模式B取反)步骤5配置跳闸保护// 假设过流信号连接至 TZ1 我们希望触发周期逐周期保护 EPWM_enableTripZoneSignals(EPWM1_BASE, EPWM_TZ_SIGNAL_CBC1, EPWM_TZ_SIGNAL_OSHT1); // 使能TZ1为CBC和OST源 EPWM_setTripZoneAction(EPWM1_BASE, EPWM_TZ_ACTION_EVENT_CBC, EPWM_TZ_OUTPUT_A, EPWM_TZ_OUTPUT_HIGH_Z); // CBC事件时A输出高阻 EPWM_setTripZoneAction(EPWM1_BASE, EPWM_TZ_ACTION_EVENT_CBC, EPWM_TZ_OUTPUT_B, EPWM_TZ_OUTPUT_HIGH_Z); // CBC事件时B输出高阻 EPWM_setTripZoneAction(EPWM1_BASE, EPWM_TZ_ACTION_EVENT_OSHT, EPWM_TZ_OUTPUT_A, EPWM_TZ_OUTPUT_HIGH_Z); // OST事件时A输出高阻 EPWM_setTripZoneAction(EPWM1_BASE, EPWM_TZ_ACTION_EVENT_OSHT, EPWM_TZ_OUTPUT_B, EPWM_TZ_OUTPUT_HIGH_Z); // OST事件时B输出高阻 EPWM_enableTripZoneInterrupt(EPWM1_BASE, EPWM_TZ_INTERRUPT_OST); // 使能OST中断用于处理严重故障步骤6启动计数器EPWM_startCounter(EPWM1_BASE); // 本质上是通过TBCTL寄存器启动计数器8. 调试技巧与常见问题排查即使配置看起来正确实际硬件调试中PWM输出仍可能出问题。以下是一些基于寄存器视角的排查思路问题1无PWM输出或输出恒定电平。检查TBCTL[1:0] (CTRMODE)确认不是处于11停止模式。检查TBCTR是否在计数在调试器中实时观察TBCTR寄存器的值看它是否在0和TBPRD之间循环。如果不循环检查时钟分频CLKDIV/HSPCLKDIV是否设置过大导致计数极慢或者同步输入SYNCI是否将计数器锁住了。检查AQCTL配置确认至少有一个事件如CAU/CAD被配置为SET或CLEAR动作。如果所有事件都是DO NOTHING输出自然没变化。检查输出引脚复用确保GPIO MUX寄存器已正确配置为ePWM功能而非普通的GPIO。问题2PWM频率不对。公式复核再次确认Fpwm TBCLK / (2 * TBPRD)递增-递减模式。计算TBCLK SYSCLKOUT / (HSPCLKDIV * CLKDIV)。示波器测量用示波器测量实际周期与计算值对比。偏差大可能是时钟源如PLL配置不正确。影子寄存器未加载在影子模式下如果你修改了TBPRD但频率没变检查TBCTL[PRDLD]是否为0并确保TBCTR有经过0点对于LOAD ON ZERO模式。可以在修改TBPRD后手动触发一个软件同步SWFSYNC来强制加载。问题3占空比控制不线性或乱跳。影子模式与更新时机这是最常见的原因。确保在影子模式下更新CMPA/CMPB并且LOADAMODE/LOADBMODE设置正确。在中断中更新比较值时最好检查一下CMPCTL[SHDWAFULL]位确保上次写入的值已被加载避免覆盖。数值溢出确保CMPA/CMPB的值始终在0到TBPRD之间对于递增-递减模式。如果计算出的值大于TBPRD硬件会将其截断为TBPRD导致占空比突然变为100%或0%。中断冲突如果PWM更新中断和ADC采样中断等服务例程执行时间过长可能会错过更新窗口。优化代码或使用DMA传输比较值。问题4死区时间不生效或波形异常。确认DBCTL[OUT_MODE]必须设置为11全使能才能同时生效上升沿和下降沿延迟。检查输入源DBCTL[IN_MODE]在典型的互补PWM生成中应使用00模式即两个延迟都以EPWMxA_In为输入。如果你的AQ配置不是标准的互补模式可能需要调整IN_MODE。测量方法用示波器两个通道分别测量EPWMxA和EPWMxB输出使用上升沿/下降沿触发并打开时间测量功能直接读取两个边沿之间的时间差即为死区时间。确保测量值符合DBRED/DBFED * TBCLK的计算值。问题5跳闸保护不动作。确认TZ引脚电平使用万用表或示波器检查TZ输入引脚的电平是否达到触发阈值通常是低电平有效。注意硬件滤波电路可能造成的延迟。检查TZSEL使能位确认你期望的TZ引脚或DC事件已在TZSEL寄存器中被使能为OST或CBC源。检查TZCTL动作配置确认当跳闸事件发生时输出被配置为期望的安全状态如高阻Hi-Z。有时配置为强制高或低但外部电路逻辑相反导致表现异常。检查TZ标志位在调试器中查看TZFLG寄存器当故障发生时对应的标志位OSTFLG, CBCFLG应该被置1。如果没有说明故障信号未被ePWM模块识别。通过这种自底向上、从寄存器到功能的深入理解你就能真正驾驭TI的ePWM模块不仅能让它跑起来更能根据复杂的应用场景进行精准调优和故障诊断。记住寄存器手册是你的地图示波器是你的眼睛而理解背后的原理则是连接两者的桥梁。