深入解析C2000 eHRPWM:高精度PWM与故障保护在电机驱动与电源中的应用
1. 项目概述为什么我们需要eHRPWM如果你做过电机驱动或者开关电源肯定对PWM不陌生。简单说PWM就是通过调节一个方波信号“开”和“关”的时间比例来控制平均电压或电流。比如一个5V的电源用50%占空比的PWM去驱动一个电机电机两端的平均电压就是2.5V。这个原理听起来简单但魔鬼藏在细节里。当你把开关频率推到几百kHz甚至MHz级别或者需要实现极其精细的电压调节比如在数字电源中实现0.1%的精度时传统PWM的局限性就暴露无遗了。传统PWM的分辨率直接受限于系统时钟。举个例子如果你的系统时钟是100MHz周期10ns要生成一个1MHz的PWM波周期1000ns那么一个周期内最多有100个计数点1000ns / 10ns。这意味着你的占空比最小调节步长是1%分辨率大约是6.6位log₂(100)。对于很多精密应用比如高性能伺服驱动器、通信电源模块这个精度是远远不够的。你可能会遇到“死区”、控制环路振荡、效率低下等问题本质上都是因为PWM边沿“太粗糙”无法精确匹配控制算法计算出的理想开关时刻。这就是德州仪器TI在其C2000系列微控制器中引入增强型高分辨率脉宽调制器eHRPWM的背景。eHRPWM不是一个简单的PWM发生器它是一个集成了时间基准、比较、动作限定、死区、斩波、故障保护和高分辨率调制等完整子系统的片上外设。它的核心价值在于两个“增强”一是通过微边沿定位器MEP技术将PWM边沿的调节精度从纳秒级提升到了皮秒10⁻¹²秒级二是内置了强大且灵活的故障保护Trip-Zone机制能够对过流、过压等故障做出纳秒级的响应直接硬件干预PWM输出无需CPU介入这对于保护昂贵的功率器件如IGBT、SiC MOSFET至关重要。我经手过不少从通用MCU迁移到C2000的项目开发者最大的感受就是eHRPWM带来的“控制质感”提升。以前需要复杂软件补偿的纹波现在通过硬件高分辨率就能平滑掉以前提心吊胆的短路保护现在可以配置为硬件自动拉低输出响应时间快了几个数量级。接下来我们就拆开这个“黑盒子”看看它到底是怎么工作的。2. eHRPWM架构全景与核心子模块解析一个完整的eHRPWM模块远不止一个计数器加一个比较器。你可以把它想象成一个高度专业化的“PWM生成与保护流水线”。下图展示了其核心子模块及其数据流理解这个架构是灵活运用的前提。[时间基准 (TB)] -- 同步输入/输出相位控制 | v [计数器比较 (CC)] -- CMPA/CMPB寄存器高分辨率扩展 | v [动作限定器 (AQ)] -- 决定计数事件如何改变输出电平 | v [死区生成器 (DB)] -- 生成互补PWM对的死区时间 | v [PWM斩波器 (PC)] -- 为栅极驱动优化PWM波形 | v [故障保护区 (TZ)] -- 接收外部故障信号强制输出安全状态 | v [输出引脚] (EPWMxA/B)2.1 时间基准TB子模块一切节拍的起源时间基准子模块是整个PWM的“心脏”它产生核心的时基计数器TBCNT。这个计数器可以配置为递增、递减或递增-递减模式从而生成不同中心对齐方式的PWM波形。TB子模块的关键在于其同步链EPWMxSYNCI 和 EPWMxSYNCO和相位控制功能。同步链允许多个ePWM模块的计数器同步启动。例如在多相交错并联的Buck电路中你可以让所有模块的计数器同时从0开始计数但为每个模块设置不同的相位偏移通过TBPHS寄存器从而实现各相之间均匀的相位差有效降低输入电流纹波。这是软件模拟难以实现的精准硬件同步。相位控制通过TBPHS寄存器直接设置计数器的初始值实现精确的相位偏移。结合高分辨率扩展寄存器TBPHSHR甚至可以实现亚时钟周期的相位微调对于移相全桥等拓扑至关重要。实操心得在配置多模块同步时务必理清同步信号的流向。通常指定一个模块为“主模块”Master将其EPWMxSYNCO输出连接到其他“从模块”Slave的EPWMxSYNCI输入。要小心避免形成同步环路否则会导致不可预测的行为。一个稳妥的做法是在系统初始化时先配置所有从模块的同步源最后再使能主模块的计数器。2.2 计数器比较CC与动作限定器AQ子模块决定波形形状CC子模块包含CMPA和CMPB两个比较寄存器。当TBCNT的值与CMPA或CMPB的值匹配时会产生一个“事件”。但事件本身并不直接改变输出引脚的电平改变电平的是AQ子模块。AQ子模块定义了当特定事件发生时输出引脚应该执行什么“动作”。主要事件包括CTR CMPA 计数器等于CMPA递增或递减时。CTR CMPB 计数器等于CMPB。CTR PRD 计数器达到周期值。CTR ZERO 计数器归零。对于每个事件你可以为EPWMxA和EPWMxB分别独立配置动作置高Set、清零Clear、翻转Toggle或无操作Do nothing。通过巧妙组合这些事件和动作可以生成对称、不对称、带死区的互补PWM等各种复杂波形而无需CPU频繁干预。2.3 死区DB子模块功率开关的“安全卫士”在驱动半桥或全桥电路时上下两个开关管绝对不能同时导通否则会造成直通短路瞬间烧毁器件。死区时间就是在互补的PWM信号中插入的一段两个开关管都保持关断的时间。DB子模块接收来自AQ的原始信号并对其上升沿或下降沿进行可编程的延迟从而生成带死区的两路输出。它支持多种模式有效高电平互补模式对一路信号的下降沿和另一路信号的上升沿插入延迟。有效低电平互补模式与上述相反。独立上升沿/下降沿延迟更灵活的控制。注意事项死区时间并非越长越好。太短起不到保护作用太长则会降低有效占空比影响输出电压精度尤其是在高频应用中。死区时间需要根据你所使用的功率器件MOSFET/IGBT的开关特性开通延迟、关断延迟、存储时间来精确计算。通常会在器件数据手册推荐值的基础上再增加一定的裕量。2.4 PWM斩波PC子模块优化栅极驱动的“脉冲变压器伴侣”这个子模块非常具有针对性主要是为了优化使用脉冲变压器进行隔离栅极驱动的场景。脉冲变压器有磁芯饱和的问题如果施加长时间的直流电压变压器会饱和失效。因此需要将PWM波“斩”成一系列高频脉冲来传递开关信息。PC子模块的工作流程如下单次脉冲One-Shot Pulse当输入PWM信号来自DB子模块的上升沿到来时PC模块会先产生一个宽度可编程的强脉冲。这个脉冲能量较高目的是为了快速、可靠地打开功率开关管提供大的栅极充电电流。持续脉冲Sustaining Pulses单次脉冲结束后模块会生成一系列频率和占空比均可编程的高频脉冲。这些脉冲的作用是在PWM信号的有效期内维持功率开关管的导通状态补偿栅极电荷的泄漏。单次脉冲宽度OSHTWTH由PCCTL[OSHTWTH]位控制宽度 8 * OSHTWTH * T_sysclkout。你需要根据功率器件的栅极电荷Qg和驱动电路的电流能力来设置确保能快速达到开启阈值。载波频率CHPFREQ由PCCTL[CHPFREQ]位控制决定持续脉冲的频率。频率太高会增加开关损耗太低则可能无法维持栅极电压。持续脉冲占空比CHPDUTY由PCCTL[CHPDUTY]位控制可在12.5%到87.5%之间选择。这个占空比需要与脉冲变压器的伏秒积平衡防止磁芯饱和。避坑指南如果不使用脉冲变压器栅极驱动务必通过设置PCCTL[CHPEN] 0来旁路Bypass整个斩波子模块。否则你的PWM波形会被意外地调制导致功率开关工作异常。这是我早期调试时最容易忽略的一点。2.5 故障保护TZ子模块系统的“紧急制动”这是eHRPWM的安全核心。TZ子模块通过专用的GPIO引脚TZ1~TZn接收外部故障信号通常是过流、过压、过温传感器的输出。一旦触发它能以最快的速度硬件级无需CPU干预强制PWM输出进入预设的安全状态。它支持两种触发模式单次触发One-Shot, OSHT适用于严重的、不可恢复的故障如直通短路。一旦触发PWM输出将被锁定在安全状态直到软件手动清除故障标志位TZCLR[OST]。逐周期触发Cycle-By-Cycle, CBC适用于可恢复的限流保护。当故障发生时当前PWM周期立即被强制为安全状态但下一个PWM周期会正常开始。如果故障仍然存在则再次触发。这实现了每个PWM周期的电流峰值限制。触发后每个PWM输出引脚EPWMxA/B可以独立配置为四种安全动作之一强制高、强制低、高阻态关闭驱动或保持原状。通常对于桥式电路我们会将上下桥臂的PWM都强制为低或高阻态确保所有开关管关断。2.6 高分辨率PWMHRPWM子模块精度的飞跃这是eHRPWM的“王牌”。它通过微边沿定位器MEP技术将一个系统时钟周期Coarse Step进一步细分成最多255个更小的时间步进MEP Step。每个MEP步进的时间分辨率可以达到150ps量级具体值见芯片数据手册。其核心是CMPAHR这个8位扩展寄存器。传统的16位CMPA寄存器决定了PWM边沿落在哪个“粗时钟”周期上而CMPAHR寄存器则决定了边沿在这个粗时钟周期内的精确位置。工作流程控制算法计算出一个理想占空比例如40.5%。根据PWM频率和系统时钟计算出对应的“粗”计数点写入CMPA例如32。计算出粗计数点内的“微”偏移量写入CMPAHR例如22。硬件结合CMPA和CMPAHR在精确的时刻翻转输出电平。重要限制HRPWM的微调功能并非在整个PWM周期都有效。在周期开始后的头几个系统时钟周期通常是3或6个内MEP逻辑未就绪。这意味着对于非常小的占空比接近0%或非常大的占空比接近100%无法实现高分辨率控制。如果你的应用需要在这个极端区域进行精密控制可以考虑使用递减计数模式并将MEP用于控制上升沿从而规避低占空比的限制。3. 核心环节实现从配置到波形生成理解了架构我们来看如何一步步配置eHRPWM生成一个带高分辨率、死区和故障保护的完整PWM信号。这里以TI的C2000芯片为例使用寄存器级配置进行说明库函数原理相同。3.1 基础PWM波形生成假设我们需要生成一个频率为1MHz占空比为40.5%的PWM波EPWMxA采用递增-递减计数模式对称PWM系统时钟SYSCLKOUT 100MHz。第一步配置时间基准TB// 假设使用ePWM1模块 EPwm1Regs.TBCTL.bit.CTRMODE TB_COUNT_UPDOWN; // 递增-递减模式 EPwm1Regs.TBPRD 80; // PWM周期 (TBPRD 1) * 2 * T_sysclk? 注意对于UPDOWN模式周期是2*TBPRD*T_sysclk // 对于100MHz时钟1MHz频率在UPDOWN模式下PWM Period 2 * TBPRD * 10ns 1000ns TBPRD 50 // 更正上面计算有误。对于UPDOWN模式PWM频率 SYSCLKOUT / (2 * TBPRD) // 所以1MHz 100MHz / (2 * TBPRD) TBPRD 50。 EPwm1Regs.TBPRD 50; // 正确值 EPwm1Regs.TBCTL.bit.PHSEN TB_DISABLE; // 本例不同步其他模块 EPwm1Regs.TBPHS.half.TBPHS 0; // 相位寄存器清零 EPwm1Regs.TBCTL.bit.HSPCLKDIV TB_DIV1; // 高速时钟预分频 EPwm1Regs.TBCTL.bit.CLKDIV TB_DIV1; // 时钟预分频第二步配置计数器比较CC和动作限定器AQ// 计算CMPA值。目标占空比40.5%在UPDOWN对称模式下高电平时间对应计数器从0递增到CMPA再从CMPA递减到0。 // 高电平时间 Duty * Period 0.405 * 1000ns 405ns // 由于是UPDOWN模式CMPA值 (高电平时间 / 2) / T_sysclk (405ns / 2) / 10ns 20.25 // 取整数部分作为CMPA的“粗”值。 EPwm1Regs.CMPA.half.CMPA 20; // 整数部分对应40%占空比400ns高电平 // 配置AQ在CTRCMPA时清零EPWMxA在CTR0时置高EPWMxA对称模式中心对齐波形 EPwm1Regs.AQCTLA.bit.CAU AQ_CLEAR; // 递增到CMPA时清零输出 EPwm1Regs.AQCTLA.bit.CAD AQ_SET; // 递减到CMPA时置高输出另一种常见配置是ZRO点置高CAU点清零取决于极性 // 更常见的对称PWM配置是 // - CTRPRD: 无动作 // - CTRZRO: 置高 (AQ_SET) // - CTRCMPA: 清零 (AQ_CLEAR) // 这样会产生一个从周期中心开始宽度由CMPA控制的低脉冲需要根据实际需要的有效电平调整。 // 我们以生成一个正脉冲为例有效电平为高 EPwm1Regs.AQCTLA.bit.ZRO AQ_SET; // 计数器为零时置高 EPwm1Regs.AQCTLA.bit.CAU AQ_CLEAR; // 递增到CMPA时清零 EPwm1Regs.AQCTLA.bit.CAD AQ_SET; // 递减到CMPA时置高恢复高电平 // 这样波形会在0到CMPA区间为高CMPA到PRD区间为低然后对称。 // 高电平时间 2 * CMPA * T_sysclk。要得到405ns CMPA 405ns / 2 / 10ns 20.25此时我们得到了一个占空比约为40%CMPA20的对称PWM波但精度只有10ns一个系统时钟。3.2 启用高分辨率HRPWM实现40.5%占空比现在我们使用MEP来修正那0.25个计数器的误差实现精确的40.5%占空比。第三步配置HRPWM子模块// 1. 首先必须确保ePWM时钟使能并且HRPWM模块可用查看芯片手册。 // 2. 配置HRPWM控制寄存器HRCNFG EPwm1Regs.HRCNFG.bit.EDGMODE HR_FEP; // 控制下降沿因为我们在CAU点清零 // HR_BEP 双边沿, HR_FEP 下降沿, HR_REP 上升沿 EPwm1Regs.HRCNFG.bit.CTLMODE HR_CMP; // 使用CMPAHR控制占空比模式。如果选择HR_TBPHS则是相位控制模式。 EPwm1Regs.HRCNFG.bit.HRLOAD HR_CTR_ZERO; // 在CTR0时加载影子寄存器与CMPA的加载点一致 // 3. 计算并设置CMPAHR值 // 已知PWMDuty 0.405, PWMperiod (in coarse steps) TBPRD * 2 100, T_sysclk 10ns, MEP步长假设为180ps需查表 // MEP每粗步的步数 MEP_SF T_sysclk / T_mep 10ns / 0.18ns ≈ 55.56取整55实际值需查芯片数据手表 int MEP_SF 55; // 示例值 float desired_counts 0.405 * 100; // 40.5 个粗步计数高电平时间对应的总计数 int CMPA_coarse (int)desired_counts; // 40 (注意这里与之前计算不同因AQ配置方式变了) // 之前AQ配置的高电平时间是2*CMPA所以 desired_counts 2 * CMPA_desired CMPA_desired 20.25 // 我们保持之前的AQ逻辑那么CMPA的粗值应为整数部分20。 CMPA_coarse 20; // 对应40个粗步高电平因为2*20 float fraction desired_counts - (2 * CMPA_coarse); // 40.5 - 40 0.5 // 这个fraction代表超出整数个粗步的“分数”部分。但注意我们的单位是“粗步”而MEP用于细分一个粗步。 // 所以需要细分的量是 (fraction * MEP_SF) 个MEP步。 float mep_steps_f fraction * MEP_SF; // 0.5 * 55 27.5 Uint16 mep_steps (Uint16)(mep_steps_f 0.5); // 四舍五入28个MEP步 // CMPAHR寄存器的格式高8位是MEP步数低8位是固定的舍入常数0x80有时是0x180需查手册。 Uint16 CMPAHR_value (mep_steps 8) | 0x0080; // 假设舍入常数为0x80 EPwm1Regs.CMPA.half.CMPAHR CMPAHR_value; // 4. 写入CMPA的粗值影子寄存器 EPwm1Regs.CMPA.half.CMPA CMPA_coarse; // 20现在PWM的下降沿将被精确地定位在20个粗步计数加上28个MEP步的位置实现了40.5%的占空比精度远高于10ns。3.3 配置死区与故障保护第四步添加死区假设我们需要为互补信号EPWMxA和EPWMxB插入100ns的死区时间EPWMxA为主动信号EPWMxB为互补信号。// 1. 首先配置AQ生成互补的原始信号假设EPWMxB在CTRPRD时置高CTRZERO时清零与EPWMxA反相 EPwm1Regs.AQCTLB.bit.PRD AQ_SET; // CTRPRD时EPWMxB置高 EPwm1Regs.AQCTLB.bit.ZRO AQ_CLEAR; // CTRZERO时EPWMxB清零 // 2. 配置死区模块 EPwm1Regs.DBCTL.bit.OUT_MODE DB_FULL_ENABLE; // 使能死区生成对两路输出都生效 EPwm1Regs.DBCTL.bit.POLSEL DB_ACTV_HIC; // 主动高互补模式AHC。即EPWMxA高有效EPWMxB低有效且插入死区。 EPwm1Regs.DBCTL.bit.IN_MODE DBA_ALL; // 死区输入源为EPWMxA由AQCTLA产生 // 计算死区时间对应的计数。死区时间 100ns, T_sysclk10ns所以需要10个计数。 // 死区周期寄存器是10位DBRED和DBFED最大1023。 EPwm1Regs.DBRED 10; // 上升沿延迟对于EPWMxA是下降沿延迟需根据模式确认 EPwm1Regs.DBFED 10; // 下降沿延迟 // 在AHC模式下DBRED延迟EPWMxB的上升沿相对于EPWMxA的下降沿DBFED延迟EPWMxA的上升沿相对于EPWMxB的下降沿。第五步配置故障保护Trip-Zone假设我们使用TZ1引脚作为过流保护信号低电平有效希望触发时立即将EPWMxA和EPWMxB都强制拉低安全状态并产生中断。// 1. 选择Trip-Zone信号源 EPwm1Regs.TZSEL.bit.OSHT1 1; // 使能TZ1作为单次触发(OSHT)源 // EPwm1Regs.TZSEL.bit.CBC1 1; // 如果要用逐周期触发则使能这一位 // 2. 配置触发后的动作 EPwm1Regs.TZCTL.bit.TZA TZ_FORCE_LO; // TZ事件发生时强制EPWMxA为低 EPwm1Regs.TZCTL.bit.TZB TZ_FORCE_LO; // TZ事件发生时强制EPWMxB为低 // 3. 使能Trip-Zone中断 EPwm1Regs.TZEINT.bit.OST 1; // 使能单次触发中断 // EPwm1Regs.TZEINT.bit.CBC 1; // 使能逐周期触发中断 // 4. 在PIE中断控制器中使能对应的EPWMx_TZINT中断。当TZ1引脚变为低电平时硬件会在几个时钟周期内强制PWM输出为低并置位TZFLG[OST]标志位同时产生中断。在中断服务程序中你需要检查故障源处理故障并手动清除标志位TZCLR[OST] 1后才能恢复PWM输出。4. 高级应用与配置技巧4.1 多模块同步与移相控制在交错并联Boost或三相逆变器中需要多个PWM模块同步运行且具有固定的相位差。eHRPWM的同步链和相位寄存器使之变得简单。配置步骤选择主模块例如ePWM1。将其TBCTL[PHSEN]设置为禁用TBCTL[SYNCOSEL]设置为CTR_zero这样当它的计数器归零时会产生一个同步输出脉冲EPWM1SYNCO。配置从模块例如ePWM2和ePWM3。将它们的同步输入源EPWMxSYNCI连接到主模块的输出可能是外部引脚也可能是内部信号取决于芯片。设置TBCTL[PHSEN] TB_ENABLE使能相位加载。设置相位差为每个从模块的TBPHS寄存器写入不同的值。例如对于三相交错相位差应为120度。如果PWM周期对应360度那么TBPHS值可以设置为TBPRD * (相位差/360)。结合TBPHSHR可以实现更精细的相位调整。启动当主模块计数器归零时它会发出同步脉冲所有从模块在下一个时钟沿加载各自的TBPHS值从而实现精确的同步与移相。实操心得务必注意同步脉冲的传播延迟。在高速系统中可能需要考虑从模块接收到同步信号到实际加载相位之间的时钟周期数。TI的参考手册中会有详细的时序图。最好的验证方法是使用示波器同时测量多个PWM输出的相位关系。4.2 HRPWM的校准与MEP缩放因子MEP的步进时间如180ps是一个典型值但会随工艺、电压和温度PVT变化。为了获得最佳精度TI提供了HRPWM校准功能。芯片出厂时或在应用初始化时可以通过特定的校准流程来测量实际的MEP步进时间并计算出一个更精确的MEP缩放因子MEP_SF。校准的基本思路是利用HRPWM本身产生一个非常精细的边沿移动通过测量实际输出波形的占空比变化反推出每个MEP步进对应的真实时间。TI的C2000ware库中通常提供名为HRPWM_measureMEPslope()或类似的函数来完成此操作。获取到准确的MEP_SF后再代入前述的CMPAHR计算公式可以显著提升高分辨率模式下的绝对精度。4.3 结合ADC触发实现精准采样在数字电源或电机控制的闭环中需要在PWM周期的特定时刻如占空比中点或周期结束点对电流、电压进行ADC采样以获得最稳定的反馈值。eHRPWM的事件触发ET子模块可以完美实现这一点。配置ADC采样触发选择触发事件在ETSEL寄存器中选择ADC转换启动SOC的触发源。常见选择有CTRZERO 周期开始点适合计算新占空比后立即更新。CTRPRD 周期结束点。CTRCMPA或CTRCMPB 占空比中点此时功率电感电流的纹波通常最小采样值最具代表性。设置事件分频在ETPS寄存器中可以设置每N个事件才产生一次触发INTPRD。例如设置为ET_3RD则每3个PWM周期才触发一次ADC采样用于降低CPU开销。连接ADC将ePWM模块的EPWMxSOCA或EPWMxSOCB信号由ET模块产生连接到ADC模块的SOC触发输入。这样ADC采样与PWM波形就实现了硬件级的严格同步消除了软件触发的随机延迟对提高控制环路带宽和稳定性至关重要。5. 常见问题、调试技巧与避坑指南在实际项目中配置eHRPWM时总会遇到一些“坑”。以下是我总结的常见问题及解决方法。问题1PWM完全没有输出。检查时钟确认系统时钟SYSCLKOUT是否正确配置ePWM外设时钟是否使能PCLKCRx寄存器。检查引脚复用确认GPIO引脚是否已正确配置为ePWM功能GPxMUX寄存器。检查输出使能有些芯片的ePWM输出默认是禁止的需要检查AQCTL寄存器中是否有输出强制FORCE位被意外设置或者TZ模块是否强制输出了特定电平。检查计数器确认TBCTL.CTRMODE不是“停止”模式TBPRD不为0且计数器正在运行可以读取TBCNT观察是变化。问题2PWM频率或占空比不对。计算错误反复核对TBPRD、CMPA/CMPB的计算公式。特别注意递增模式、递减模式和递增-递减模式下周期和占空比的计算方式截然不同。递增模式Period (TBPRD 1) * T_tbclk递减模式Period (TBPRD 1) * T_tbclk递增-递减模式Period 2 * TBPRD * T_tbclk影子寄存器CMPA、CMPB、TBPRD等寄存器可能有影子寄存器。如果你在计数器运行时更新了它们但未配置正确的加载时机CTRPRD或CTRZERO则新值可能不会立即生效。检查CCCTL和TBCTL中的加载模式位LOADMODE。HRPWM影响如果使能了HRPWM但CMPAHR计算或配置错误会导致边沿位置严重偏移。尝试暂时禁用HRPWMHRCNFG.bit.EDGMODE HR_DISABLE看基础PWM是否正确。问题3死区时间不生效或效果异常。模式选择错误DBCTL.POLSEL和OUT_MODE配置错误是最常见原因。仔细阅读手册确认你的功率桥是“高有效”还是“低有效”需要上升沿延迟还是下降沿延迟。用示波器同时观察DB模块前后的信号如果芯片支持输出原始信号和死区后信号到不同引脚。输入源错误DBCTL.IN_MODE配置错误死区模块可能收到了错误的源信号。寄存器位宽DBRED和DBFED是10位寄存器确保你写入的值没有溢出。问题4故障保护Trip-Zone不动作。引脚配置确认TZn引脚已正确配置为输入功能并且外部故障电路能产生有效的低电平信号TZ是低有效。可以用软件强制故障TZFRC寄存器来测试。滤波与同步TZ输入可能有数字滤波GLTFLT和同步选项。如果故障信号是毛刺可能被滤掉如果是异步信号需要确保同步设置正确。对于需要极快响应的场合建议使用异步路径TZCTL[TZA/TZB]的配置是立即生效的。动作配置检查TZCTL寄存器确认为TZA和TZB配置了非“无操作”的动作如强制高、低或高阻。标志位未清除如果是OSHT模式触发后输出会被锁存。必须在故障排除后在中断服务程序中手动写入TZCLR.bit.OST 1来清除标志位否则输出会一直保持强制状态。问题5HRPWM精度达不到预期。未进行MEP校准直接使用数据手册中的典型MEP步长如180ps进行计算在实际芯片上必然有误差。务必在系统初始化时运行HRPWM校准程序获取本芯片在当前工作条件下的精确MEP缩放因子。工作点超出范围HRPWM在非常低或非常高的占空比下可能失效见前文“占空比范围限制”。确保你的目标占空比在有效范围内例如避开最开始的3-6个系统时钟周期。可以通过调整PWM计数模式如用递减计数控制上升沿来扩展有效范围。CMPAHR计算错误CMPAHR的计算公式涉及移位和舍入常数。确保你使用的公式和常数与芯片型号和参考手册完全一致。一个常见的错误是忽略了8移位操作导致MEP步数写入到了错误的寄存器位。调试技巧寄存器查看在调试器中实时查看关键寄存器TBCNT, CMPA, CMPAHR, TZFLG, ETFLG的值这是最直接的诊断方法。利用强制功能AQCTL寄存器有输出强制位FORCE可以手动将输出置高或拉低用于隔离是配置问题还是后端驱动问题。TZFRC和ETFRC可以软件强制产生故障或事件用于测试。分步调试不要一次性配置所有复杂功能。建议的配置顺序是先让基础PWM输出TBCCAQ然后加死区再加同步最后才上HRPWM和故障保护。每步都用示波器验证。关注时序图TI的参考手册中有大量精美的时序图。遇到复杂功能如影子寄存器加载、同步事件、HRPWM边沿生成时反复对照时序图理解是解决问题的捷径。eHRPWM是一个功能极其强大的外设其深度和灵活性足以应对绝大多数高精度、高可靠性的数字功率控制挑战。初学时会觉得寄存器繁多但一旦理解了其模块化架构和“事件-动作”的设计哲学就能游刃有余地将其运用到各种拓扑中。记住关键不是死记硬背每个寄存器位而是理解每个子模块要解决什么问题以及数据是如何在它们之间流动的。剩下的就是根据你的具体应用场景像搭积木一样组合这些功能了。