1. 项目概述与eHRPWM核心价值在电机控制、数字电源和逆变器这些对时序和精度有“强迫症”要求的领域里PWM信号的生成质量直接决定了整个系统的性能上限。很多工程师朋友刚开始接触时可能觉得PWM不就是调个占空比嘛用个通用定时器加个IO翻转也能凑合。但真到了要驱动三相电机、做交错并联电源或者需要纳秒级精度来优化效率与电磁兼容性时就会发现通用方案捉襟见肘同步怎么保证死区时间如何精确插入突发故障时如何让PWM输出立刻进入安全状态这些问题正是德州仪器C6748 DSP内部集成的增强型高分辨率PWM模块也就是eHRPWM所要系统化解决的。eHRPWM远不止是一个高级定时器。你可以把它理解为一个专为功率控制打造的“信号合成与安全管理系统”。它把时间基准生成、双路比较匹配、动作决策、死区插入、故障急停以及高精度微调这些功能全部用硬件子模块的形式固化下来并通过一套精密的寄存器网络进行配置。这意味着一旦初始化完成CPU就可以“放手”复杂的多通道、同步、带保护的PWM波形会由硬件自动、确定性地产生CPU只需关注更高层的控制算法如PID调节极大地减轻了实时中断的负担也避免了软件生成PWM可能带来的抖动和延迟。这次我们就以C6748的eHRPWM模块为蓝本彻底拆解它的工作原理、寄存器配置逻辑以及那些手册上可能一笔带过、但实际开发中至关重要的“坑”与技巧。无论你是正在评估C6748还是在使用其他厂商的类似ePWM模块理解这套设计哲学和配置流程都能让你在电力电子和电机驱动的硬件编程中拥有更清晰的思路和更强的解决问题的能力。2. eHRPWM模块架构深度解析要驾驭eHRPWM死记硬背寄存器列表是没用的必须从它的“生产线”架构理解起。整个模块可以看作一条高度自动化的波形生产流水线每个子模块负责一个特定工序最终产出两路互补或独立的精密PWM信号。2.1 核心子模块功能与信号流模块的核心信号流可以参照官方框图来理解但更重要的是理解其逻辑链条。整个流程始于时间基准子模块它是整个PWM系统的“心脏”和“节拍器”。它包含一个可向上、向下或上下计数模式的16位计数器。你设定的周期值存储在影子寄存器中可以在特定时刻安全地更新到活动寄存器从而实现在线无毛刺调整PWM频率。相位寄存器则允许你精确调整这个计数器的初始值这是实现多个PWM模块之间同步或特定相位差输出的关键。例如在交错式Boost电路中两个通道的PWM需要180度相位差就是通过配置主从模块和相位寄存器来实现的。计数器运行时其当前值会实时送到计数器比较子模块。这个子模块里有两组至关重要的寄存器CMPA和CMPB。你可以把它们理解为两条“标尺”。当计数器的值等于CMPA或CMPB的值时就会产生一个“匹配”事件。这个事件本身并不直接决定输出电平它只是一个触发器。接下来动作限定子模块登场它是整个系统的“决策中枢”。它接收来自时间基准的多个事件如计数器等于零、等于周期值、等于CMPA、等于CMPB、计数方向变化等并根据你预先在AQCTLA和AQCTLB寄存器中设定的规则来决定此时EPWMxA和EPWMxB输出引脚应该执行什么“动作”置高、置低、翻转或者保持不动。这才是PWM波形边沿产生的直接原因。比如你可以设定在计数器等于CMPA时将EPWMxA置高在计数器等于周期值时将其置低这样就产生了一个简单的PWM波形。其灵活性在于你可以为上升沿和下降沿独立选择不同的事件作为触发条件。经过动作限定器决策后的“原始”PWM信号会送入死区生成子模块。在驱动半桥或全桥电路时为了防止上下管直通短路必须在一路信号关闭后延迟一段时间再开启另一路。这个子模块就是专门干这个的。它通过DBRED和DBFED寄存器分别独立控制上升沿延迟和下降沿延迟可以生成带死区的互补信号、互补信号取反、或者仅在一边插入死区等多种模式通过DBCTL寄存器灵活配置。然后信号会经过一个可选的PWM斩波子模块。这个模块主要用于驱动需要高频脉冲变压器隔离的门极驱动电路。它可以将PWM波调制成一系列高频脉冲从而减小隔离变压器的体积。不过在现代IGBT或SiC MOSFET驱动中直接使用集成驱动芯片更为常见所以这个子模块很多时候保持禁用状态。最后也是保障系统安全的最后一道关卡故障保护子模块。它通过外部引脚TZ1-TZ6或软件强制来监控故障信号如过流、过温。一旦触发可以根据TZCTL寄存器的配置立即将PWM输出强制为高、低或高阻态并产生中断。这个响应是硬件级别的速度极快通常在几十纳秒内完成对于保护功率器件至关重要。此外事件触发子模块负责在特定时间点如计数器等于CMPA时产生中断或启动ADC转换实现控制环路中的采样与计算同步。而高分辨率PWM子模块则是精度提升的“秘密武器”它通过一个8位的微边沿定位器在普通PWM时钟周期内再进行256细分从而将边沿定位精度从几十纳秒提升到几百皮秒量级对于需要极高分辨率占空比或频率的应用如数字电源的电压纹波优化是革命性的。2.2 寄存器地图与关键寄存器速览C6748通常包含两个独立的eHRPWM模块eHRPWM0和eHRPWM1每个模块都有自己完整的一套寄存器。它们的地址空间是连续的eHRPWM1的寄存器基址通常在eHRPWM0的基础上偏移0x2000。理解寄存器分组比记忆单个地址更重要时间基准组TBCTL控制寄存器决定计数模式、同步源等、TBSTS状态寄存器、TBPHS相位寄存器、TBCNT计数器值只读、TBPRD周期寄存器有影子寄存器。计数器比较组CMPCTL比较控制如影子加载模式、CMPA、CMPB比较值寄存器有影子寄存器、CMPAHR高分辨率扩展。动作限定组AQCTLA、AQCTLB分别控制A、B输出的动作规则、AQSFRC软件强制寄存器、AQCSFRC连续软件强制。死区生成组DBCTL死区模式控制、DBRED上升沿延迟、DBFED下降沿延迟。故障保护组TZSEL选择哪些TZ引脚触发故障、TZCTL故障发生时输出动作配置、TZEINT故障中断使能、TZFLG故障标志、TZCLR清除标志、TZFRC软件强制故障。事件触发组ETSEL选择触发中断或ADC启动的事件、ETPS事件分频与计数、ETFLG事件标志、ETCLR清除标志、ETFRC软件强制事件。高分辨率PWM组HRCNFGHRPWM配置如微边沿定位器控制模式。注意在操作带有影子寄存器的寄存器如TBPRD,CMPA,CMPB时写入的值并不会立即生效而是先写入影子寄存器。影子寄存器向活动寄存器加载的时机由对应的控制寄存器如TBCTL[PRDLD],CMPCTL[LOADAMODE]配置通常发生在计数器等于零或等于周期值时。这种机制确保了PWM参数可以在波形生成的“安全期”内无缝更新避产生畸变或毛刺。3. 从零开始eHRPWM模块初始化与基础配置理解了架构我们进入实战。配置eHRPWM就像组装一台精密仪器步骤有先后逻辑要清晰。下面以一个典型的、带死区互补输出的电机驱动半桥配置为例详解每一步。3.1 时钟与引脚复用配置任何外设使用前必须先打通它的“能量”和“通道”。对于C6748的eHRPWM这分为两步第一步使能模块时钟。C6748的外设时钟通常由PLL控制器和分频器管理。你需要查阅系统配置相关的寄存器如PLL控制器和PER外设时钟使能寄存器确保eHRPWM模块所在的时钟域被使能并且时钟频率符合你的预期。例如如果系统主频是456MHz经过分频后供给eHRPWM的时钟可能是150MHz。这个时钟频率直接决定了PWM的时间基准分辨率。第二步配置GPIO复用。eHRPWM的输出引脚如EPWM0A,EPWM0B是与GPIO复用的。你需要操作引脚控制寄存器将对应引脚的功能选择位设置为eHRPWM输出模式而不是普通的GPIO模式。同时根据你的硬件设计如是否需要上拉/下拉、驱动强度配置好引脚的电特性。这一步疏忽了就算寄存器配置正确信号也出不来。// 伪代码示例配置EPWM0A引脚 (假设对应GPIO[8]) // 1. 使能GPIO Bank时钟如果未使能 // 2. 配置引脚复用控制寄存器选择eHRPWM功能模式例如模式1 PINMUX_REG-PIN_CONF_8 (PINMUX_REG-PIN_CONF_8 ~MODE_MASK) | EPWM_MODE; // 3. 配置引脚方向为输出虽然复用为外设功能但方向寄存器可能仍需配置 GPIO_REG-DIR | (1 8);3.2 时间基准子模块初始化这是定义PWM“心跳”的环节。我们的目标是配置一个向上计数的模式周期为1000个时钟节拍。// 假设eHRPWM0基地址为 EPWM0_BASE volatile struct eHRPWM_REGS *epwm0 (volatile struct eHRPWM_REGS *)EPWM0_BASE; // 1. 停止时基计数器确保安全配置 epwm0-TBCTL.bit.CTRMODE 0x0; // 设置为停止模式 // 2. 配置计数模式向上计数相位加载使能影子寄存器在CTR0时加载 epwm0-TBCTL.bit.PHSEN 0; // 先禁用相位加载我们稍后配置同步时再用 epwm0-TBCTL.bit.PRDLD 0; // 周期寄存器影子加载模式CTR0时加载 epwm0-TBCTL.bit.CTRMODE 0x2; // 计数模式向上计数 (0-停止1-向下2-向上3-上下计数) // 3. 设置PWM周期。假设时钟150MHz要生成15kHz PWM周期值 150e6 / 15e3 10000 // 这里我们先设为1000个计数周期作为示例。 epwm0-TBPRD 1000 - 1; // 注意计数器从0计数到(TBPRD)所以周期是TBPRD1 // 4. 清除计数器 epwm0-TBCNT 0; // 5. 配置同步信号如果需要多个模块同步。这里我们先配置为独立运行。 epwm0-TBCTL.bit.SYNCOSEL 0x0; // 同步输出选择禁用同步输出 epwm0-TBCTL.bit.PHSDIR 0; // 相位方向计数器向下时加载相位对于向上计数模式此位通常为0实操心得在调试初期建议将TBCTL.bit.CTRMODE设为停止模式配置完所有参数后再启动。否则计数器在运行时被修改可能导致不可预知的输出。另外TBPRD寄存器有影子寄存器上述配置下写入的值会在下一个计数器为零的周期生效。如果想立即生效可以在写入后手动触发一个软件同步epwm0-TBCTL.bit.SWFSYNC 1;。3.3 计数器比较与动作限定配置接下来我们设定PWM的占空比并定义边沿产生的规则。假设我们要在EPWM0A上产生一个占空比为30%的PWM波。// 1. 配置计数器比较子模块 epwm0-CMPCTL.bit.LOADAMODE 0x0; // CMPA影子寄存器加载模式CTR0时加载 epwm0-CMPCTL.bit.LOADBMODE 0x0; // CMPB同理如果使用 epwm0-CMPCTL.bit.SHDWAMODE 0; // CMPA影子寄存器模式使能使用影子寄存器 epwm0-CMPCTL.bit.SHDWBMODE 0; // CMPB影子寄存器模式使能 // 2. 设置比较值。对于向上计数模式占空比 CMPA / (TBPRD 1) // 30%占空比CMPA值 0.3 * 1000 300 epwm0-CMPA 300; // 3. 配置动作限定器定义输出行为 // 对于EPWM0A (AQCTLA): // - 当计数器等于CMPA且正在向上计数时 (CAU)将输出置低 (Clear) // - 当计数器等于周期值 (PRD) 时将输出置高 (Set) // 这样在周期开始时输出高电平在CMPA匹配时拉低形成正极性PWM。 epwm0-AQCTLA.bit.CAU 0x2; // CAU动作清除 (输出低) 0x1置低0x2清除0x3翻转 epwm0-AQCTLA.bit.PRD 0x1; // PRD动作置位 (输出高) 0x1置高 // 4. 对于EPWM0B我们暂时不启用或者可以配置为互补输出需结合死区模块 epwm0-AQCTLB.bit.ZRO 0x0; // 默认无动作 epwm0-AQCTLB.bit.PRD 0x0;3.4 死区生成模块配置现在我们启用EPWM0B作为EPWM0A的互补输出并插入死区时间。假设我们需要200ns的死区时间系统时钟周期T 1/150MHz ≈ 6.67ns。// 1. 配置死区控制寄存器 // 使能上升沿和下降沿延迟模式选择对A路信号进行延迟生成互补的A和B epwm0-DBCTL.bit.OUT_MODE 0x3; // 使能死区模块模式高有效互补模式AHC epwm0-DBCTL.bit.POLSEL 0x0; // 极性选择主动高有效EPWMxA为源信号 epwm0-DBCTL.bit.IN_MODE 0x0; // 输入源模式EPWMxA作为上升和下降延迟的源 // 2. 计算并设置死区延迟计数值 // 所需延迟时钟周期数 死区时间 / 时钟周期 200ns / 6.67ns ≈ 30 // 注意DBRED和DBFED寄存器值就是延迟的时钟周期数。 uint16_t deadband_ticks 30; epwm0-DBRED deadband_ticks; // 上升沿延迟从源信号上升沿到互补信号上升沿的延迟 epwm0-DBFED deadband_ticks; // 下降沿延迟从源信号下降沿到互补信号下降沿的延迟 // 3. 更新动作限定器使能EPWM0B输出现在由死区模块驱动 // 在AHC模式下死区模块会基于EPWMxA生成EPWMxA和EPWMxB。 // 因此AQCTLB对EPWMxB的直接控制通常被覆盖或禁用。确保AQCTLB配置为不干扰死区输出。 // 一种常见做法是将AQCTLB所有动作设为“无操作”。 epwm0-AQCTLB.all 0x0000; // 清除所有动作限定关键细节DBCTL.bit.OUT_MODE的选择至关重要。0x3AHC模式意味着死区模块以EPWMxA来自动作限定器作为源信号生成两路输出一路是经过上升沿延迟的EPWMxA实际输出到引脚另一路是经过下降沿延迟的EPWMxA取反后的EPWMxB。这种模式非常适合驱动一个半桥的上管和下管确保了互补信号间有死区。3.5 故障保护与中断配置安全配置不容忽视。我们配置一个外部引脚例如TZ1作为故障源触发时立即将两路PWM输出强制拉低。// 1. 选择故障源 epwm0-TZSEL.bit.OSHT1 1; // 使能一次性硬件故障触发源 TZ1 // 2. 配置故障响应动作 epwm0-TZCTL.bit.TZA 0x2; // TZ事件发生时EPWM0A动作强制为低 (0x1高0x2低0x3高阻) epwm0-TZCTL.bit.TZB 0x2; // TZ事件发生时EPWM0B动作强制为低 // 3. 配置故障中断可选用于通知CPU epwm0-TZEINT.bit.OST 1; // 使能一次性故障中断 // 注意还需要在系统中断控制器中使能eHRPWM对应的中断线并编写中断服务函数。 // 4. 清除可能存在的故障标志上电后或故障恢复后 epwm0-TZCLR.bit.OST 1; // 写1清除一次性故障标志 epwm0-TZCLR.bit.CBC 1; // 清除周期故障标志3.6 启动PWM输出所有子模块配置完毕后最后一步是启动时间基准计数器。// 将时间基准计数器从停止模式切换到向上计数模式 epwm0-TBCTL.bit.CTRMODE 0x2; // 向上计数模式 // 如果需要可以立即触发一个软件同步确保计数器从0开始并加载所有影子寄存器 epwm0-TBCTL.bit.SWFSYNC 1;至此一个带死区互补输出和硬件故障保护的基础PWM通道就配置完成了。用示波器测量EPWM0A和EPWM0B引脚应该能看到两路互补、中间有死区间隔的PWM方波。4. 高级应用与精微控制实战掌握了基础配置我们就可以挑战更复杂的应用场景了。这些高级功能正是eHRPWM区别于普通定时器的精髓所在。4.1 多模块同步与相位控制在三相逆变器或交错并联电源中需要多个PWM通道并且它们之间必须有精确的相位关系。eHRPWM的同步链功能就是为了这个而生。主从同步配置假设eHRPWM0作为主模块eHRPWM1作为从模块并且要求eHRPWM1的输出滞后于eHRPWM0 90度即1/4周期。volatile struct eHRPWM_REGS *epwm0 ...; // 主模块 volatile struct eHRPWM_REGS *epwm1 ...; // 从模块 // --- 配置主模块 (eHRPWM0) --- epwm0-TBCTL.bit.SYNCOSEL 0x1; // 同步输出选择CTR0时产生同步脉冲 // 其他配置周期、比较值等如前所述... // --- 配置从模块 (eHRPWM1) --- // 1. 配置为接收外部同步信号 epwm1-TBCTL.bit.PHSEN 1; // 使能相位加载 epwm1-TBCTL.bit.SYNCOSEL 0x3; // 同步输出选择禁用或传递输入同步 // 2. 设置相位偏移值 // 假设主从周期相同均为1000。90度偏移对应的计数值 (1000 / 360) * 90 250 epwm1-TBPHS 250; // 设置相位寄存器 // 3. 配置计数模式但先不启动 epwm1-TBCTL.bit.CTRMODE 0x2; // 向上计数 epwm1-TBPRD 1000 - 1; // 4. 关键将从模块的同步输入源连接到主模块的输出 // 这通常通过芯片级的信号路由寄存器配置或者某些器件上eHRPWM的SYNCI引脚是硬件连接的。 // 在C6748中需要检查系统控制模块的寄存器将EPWM0SYNCO连接到EPWM1SYNCI。 // 伪代码SYSTEM_CONTROL_REG-EPWM_SYNC_CFG ...; // --- 启动顺序 --- // 先启动从模块使其等待同步信号 epwm1-TBCTL.bit.CTRMODE 0x2; // 从模块进入向上计数模式但计数器被同步信号锁存不计数 // 然后启动主模块 epwm0-TBCTL.bit.CTRMODE 0x2; // 主模块开始计数 // 当主模块计数器归零时会产生一个EPWMSYNCO脉冲 // 这个脉冲到达从模块的EPWMSYNCI从模块会将自己的计数器加载为TBPHS的值250然后开始计数。 // 从而实现eHRPWM1的波形滞后eHRPWM0 250个计数时钟即90度相位差。4.2 高分辨率PWM配置与应用当标准PWM的分辨率由TBPRD决定无法满足精细的占空比调节需求时HRPWM功能就派上用场了。它通过微边沿定位器在单个时间基准时钟周期内进行细分。配置HRPWM以微边沿定位模式为例假设我们要使用CMPAHR来微调EPWM0A的上升沿位置实现更高精度的占空比。// 1. 使能HRPWM扩展功能如果模块支持 // 通常需要配置HRCNFG寄存器选择高分辨率模式和对哪个边沿进行微调。 epwm0-HRCNFG.bit.EDGMODE 0x1; // 边沿模式在CMPA上升沿使用微边沿定位MEP epwm0-HRCNFG.bit.CTLMODE 0x0; // 控制模式独立模式CMPAHR控制A路CMPBHR控制B路 epwm0-HRCNFG.bit.HRLOAD 0x0; // 加载模式在CTR0时加载影子寄存器 // 2. 配置动作限定器使用高分辨率比较事件 // 将动作事件从普通的CMPA匹配改为高分辨率CMPA匹配。 epwm0-AQCTLA.bit.CAU 0x0; // 先清除之前的CAU动作 epwm0-AQCTLA.bit.CAU 0x2; // 仍然在CAU事件清除但此时CAU事件已包含MEP调整 // 3. 设置高分辨率比较值 // CMPA寄存器存放整数部分 coarse positioningCMPAHR存放小数部分 fine positioning。 // 假设我们需要占空比为30.5%。标准计数值CMPA 300 (30%)。 // 小数部分 (0.5% * (TBPRD1)) * 256。 0.5% * 1000 5个计数周期。 // 但MEP是在一个时钟周期内细分所以我们需要将5个计数周期的小数部分转化为对单个边沿的微调。 // 更常见的用法是直接设定目标时间。例如希望边沿再提前t_delay。 // MEP步进时间 T_clk / 256。假设T_clk6.67ns则MEP步进约26ps。 // 要提前1ns则MEP值 1ns / 26ps ≈ 38。 // 注意CMPAHR是一个8位寄存器但实际有效位可能更少如8位且其值影响的是边沿位置需结合具体模式理解。 // 简化示例设置一个微调值 epwm0-CMPAHR 38; // 8位微调值 // 4. 确保CMPCTL中高分辨率影子加载使能 epwm0-CMPCTL.bit.SHDWAMODE 0; // 使能CMPA影子 epwm0-CMPCTL.bit.SHDWAFULL 1; // 使能CMPAHR影子如果存在此位或通过HRLOAD控制重要提示HRPWM的配置和有效性严重依赖于系统时钟频率和PWM频率。MEP的调节范围通常限制在一个时间基准时钟周期内。如果所需的边沿移动超过一个时钟周期你应该调整CMPA的整数值而不是只依赖CMPAHR。此外芯片的HRPWM校准数据可能存储在特定的只读存储器中需要软件读取并用于补偿以达到数据手册标称的精度。4.3 事件触发与ADC同步在数字电源的峰值电流控制或电机驱动的FOC算法中需要在PWM周期的特定时刻如占空比中点或周期结束进行电流采样。eHRPWM的事件触发模块可以精确产生这些触发信号直接启动ADC转换实现硬件级同步消除软件延迟带来的误差。配置在计数器等于CMPB时触发ADC启动// 1. 配置事件触发选择寄存器 // 选择事件源计数器等于CMPB (CTRCMPB) epwm0-ETSEL.bit.INTSEL 0x2; // 选择中断/事件源CTRCMPB (0x0禁用0x1CTRPRD, 0x2CTRCMPB...) epwm0-ETSEL.bit.INTEN 0; // 先禁用中断我们只使用事件触发ADC epwm0-ETSEL.bit.SOCASEL 0x2; // 选择ADC启动事件A (SOCA) 源CTRCMPB epwm0-ETSEL.bit.SOCAEN 1; // 使能SOCA事件 // 2. 配置事件触发预分频寄存器如果需要 // 例如每发生2次CTRCMPB事件才产生1次SOCA脉冲。 epwm0-ETPS.bit.SOCAPRD 0x1; // SOCA事件分频每1次事件源发生产生1次SOC (0x0禁用0x1单次0x22次...) // 3. 设置CMPB的值确定触发点在周期内的位置 // 假设希望在占空比50%的位置采样CMPB 500 (周期为1000) epwm0-CMPB 500; // 4. 将eHRPWM模块产生的事件输出EPWMxSOCA连接到ADC模块的启动信号。 // 这通常需要通过芯片的交叉触发或事件路由寄存器进行配置。 // 伪代码配置ADC的启动信号源为EPWM0_SOCA。 // ADC_REG-START_SRC EPWM0_SOCA_SIGNAL;这样每当PWM计数器运行到500时硬件会自动产生一个脉冲信号给ADCADC立即开始转换实现了采样与PWM的完美同步。5. 调试技巧与常见问题排查实录即使理解了所有原理实际调试中依然会遇到各种问题。下面是我在多年项目中总结的一些典型问题和排查思路希望能帮你快速定位。5.1 问题排查速查表现象可能原因排查步骤与解决方法无PWM输出1. 模块时钟未使能。2. GPIO引脚复用未配置为PWM功能。3. 时间基准计数器未启动CTRMODE停止。4. 输出被强制软件强制或故障保护强制。1. 检查外时钟使能寄存器确认eHRPWM模块时钟已开启。2. 用万用表或示波器检查引脚电压确认未处于高阻态。检查引脚复用控制寄存器。3. 读取TBCTL寄存器确认CTRMODE字段不为0。4. 检查AQCSFRC、AQSFRC、TZCTL和TZFLG寄存器看输出是否被软件或故障强制到某一固定状态。PWM频率不对1.TBPRD寄存器值计算错误或未生效。2. 时间基准时钟源频率不对。3. 计数模式设置错误如上下计数模式周期是2*TBPRD。1. 确认TBPRD写入的值。记住实际周期 (TBPRD 1) * T_clk。检查影子寄存器加载模式尝试写入后触发软件同步SWFSYNC。2. 计算所用时钟频率。检查PLL和分频器配置确认供给eHRPWM的SYSCLKOUT分频是否正确。3. 确认TBCTL.CTRMODE。0x2为向上计数0x1为向下计数0x3为上下计数此时周期为2*TBPRD。占空比不对或不可调1.CMPA/CMPB值超出TBPRD范围。2. 动作限定器AQCTL配置错误边沿触发事件选错。3. 影子寄存器未生效比较值未更新。4. 死区模块影响如果使能。1. 确保CMPA值介于0和TBPRD之间向上/向下计数模式。2. 仔细核对AQCTLA/B。对于向上计数通常用CAUCMPA Up事件清除PRD事件置位。用示波器观察结合计数器事件图分析。3. 检查CMPCTL.LOADAMODE确认影子加载时机。在调试时可先禁用影子模式SHDWAMODE1直接模式看是否正常。4. 暂时禁用死区模块DBCTL.OUT_MODE0看占空比是否恢复正常。互补输出无死区或死区时间不对1. 死区模块未使能DBCTL.OUT_MODE0。2.DBRED和DBFED寄存器值为0。3. 时钟频率计算错误导致计数值不对。4. 死区模式POLSEL和IN_MODE选择错误。1. 确认DBCTL.OUT_MODE非零。2. 确认DBRED和DBFED已写入非零值。3. 重新计算死区计数值 期望死区时间 / 时间基准时钟周期。4. 参考数据手册中的死区模式真值表确认你选择的模式能产生预期的互补和死区效果。最常见的半桥驱动模式是AHC主动高互补。故障保护不动作1. 故障源引脚TZx未正确配置或硬件连接问题。2.TZSEL寄存器未使能对应故障源。3.TZCTL配置的输出动作不符合预期。4. 故障标志未清除导致模块锁死在保护状态。1. 检查TZx引脚配置如上拉/下拉用示波器确认故障信号是否有效到达引脚低电平有效。2. 确认TZSEL中对应位如OSHT1已置1。3. 确认TZCTL.TZA和TZB配置为你期望的动作0x2为强制低。4. 在故障条件解除后向TZCLR.OST或TZCLR.CBC写1清除标志位PWM输出才能恢复。HRPWM精度达不到预期1. 未正确配置HRCNFG寄存器。2.CMPAHR值计算或写入时机错误。3. 系统时钟抖动过大影响MEP精度。4. 未使用芯片出厂校准值进行补偿。1. 确认HRCNFG.EDGMODE选择了正确的MEP控制边沿。2.CMPAHR是8位微调其单位是MEP步进。确保在影子加载点如CTR0之前写入影子寄存器。可参考TI应用笔记中的计算公式。3. 检查电源质量和时钟稳定性。HRPWM对时钟抖动非常敏感。4. 查找芯片TRM或应用笔记看是否有HRPWM校准寄存器需要在初始化时加载校准值。多个eHRPWM模块无法同步1. 同步信号EPWMSYNCI/EPWMSYNCO未正确连接或配置。2. 从模块的TBCTL.PHSEN未使能。3. 主模块未产生同步脉冲SYNCOSEL配置错误。4. 相位寄存器TBPHS值未正确设置。1. 确认系统控制寄存器中同步信号的路由配置正确。2. 从模块必须使能相位加载PHSEN1才会在同步脉冲到来时加载TBPHS。3. 主模块SYNCOSEL需配置为在特定事件如CTR0产生输出脉冲。4. 确保TBPHS值小于等于TBPRD。在上下计数模式下相位行为有所不同需注意。5.2 核心调试方法论化繁为简分层验证不要试图一次性配置所有高级功能。先从最简配置开始单通道、无死区、无同步、无中断。用示波器看到正确的PWM波形后再逐一叠加死区、互补输出、同步等功能。每加一个功能就验证一次。善用寄存器读取与软件强制在调试时经常读取关键寄存器如TBCNT,TBPRD,CMPA,CMPB的值确认它们是否如预期般变化。使用AQSFRC寄存器可以软件强制输出高或低这对于验证动作限定器和后续死区逻辑非常有用。理解影子寄存器与活动寄存器这是eHRPWM配置中最容易混淆的点。始终要问自己我修改的是影子寄存器还是活动寄存器它什么时候生效在调试复杂波形更新时可以在影子加载事件如CTR0产生中断在中断服务程序中更新比较值这是实现无毛刺调制的标准做法。示波器是关键没有比示波器更直观的调试工具了。同时测量PWM输出、故障引脚、同步信号甚至可以利用某些DSP的GPIO在特定事件发生时输出一个脉冲来标记软件执行位置从而精确定位硬件事件与软件响应的时序关系。最后再分享一个小心得在编写eHRPWM初始化函数时我习惯采用“结构体位域”的方式来定义寄存器这样代码可读性远高于直接操作十六进制地址。TI提供的C6748芯片支持包通常就有这样的定义直接使用可以避免很多低级错误。配置流程上遵循“时钟引脚 - 时基 - 比较 - 动作 - 死区 - 保护 - 中断 - 启动”的步骤并养成在每个主要步骤后添加详细注释的习惯几个月甚至几年后回头看你依然能立刻理解当时的配置意图。