1. 项目概述为什么我们需要高精度PWM在电机驱动、开关电源或者逆变器的开发中脉冲宽度调制PWM是我们最熟悉不过的老朋友了。它的核心思想很简单通过调节一个数字方波信号中“高电平”所占的时间比例即占空比来等效地输出一个连续可变的模拟量比如平均电压或电流。然而当系统对效率和动态响应要求越来越高开关频率被推到几百kHz甚至MHz级别时一个尴尬的问题就出现了——分辨率不够用。想象一下你的系统时钟是100MHz周期是10纳秒。如果你要生成一个1MHz的PWM波周期1000纳秒那么一个周期内最多有100个时钟“刻度”可以用来调节占空比。这意味着你的占空比调节精度是1%也就是大约10纳秒的步进。在控制一个精密伺服电机或者一个高效率的DC-DC变换器时这10纳秒的“粗调”可能就意味着额外的纹波、可闻的噪音或者那最后1%的效率怎么也提不上去。传统PWM的精度被系统时钟频率这个“天花板”牢牢限制住了。为了解决这个问题德州仪器TI在其C2000系列微控制器中引入了增强型高分辨率PWM也就是eHRPWM。它不仅仅是一个更快的PWM发生器而是一套集成了高精度调制、灵活波形生成、同步机制和关键故障保护于一体的完整子系统。对于从事高性能数字电源、伺服驱动、新能源逆变等领域的工程师来说吃透eHRPWM的工作原理和配置技巧是从“功能实现”迈向“性能优化”的必经之路。本文将从一个一线工程师的视角拆解eHRPWM的核心子模块特别是其实现高精度的“秘密武器”——微边沿定位器MEP以及确保系统鲁棒性的“安全卫士”——跳闸区Trip-Zone子模块并结合实际配置代码和避坑经验让你能真正将其应用到项目中去。2. eHRPWM架构全景与核心子模块解析一个完整的eHRPWM模块远不止一个计数器加一个比较器那么简单。它是一个高度模块化、可配置的信号生成与管理系统。理解其整体架构是进行有效编程和调试的基础。2.1 核心子模块功能概览eHRPWM模块可以看作由多个协同工作的专业“车间”组成每个车间负责一项特定任务共同生产出高质量、高可靠性的PWM波形。时间基准TB子模块这是整个PWM的“心跳”和“指挥中心”。它包含一个可配置的向上/向下/上下计数模式的计数器TBCNT以及周期寄存器TBPRD。它决定了PWM的基础频率和相位通过相位寄存器TBPHS并生成关键的时序事件如计数器等于零CTR0、等于周期值CTRPRD等这些事件是其他子模块动作的触发器。计数比较CC子模块这是决定PWM占空比的“雕刻师”。它包含两个比较寄存器CMPA和CMPB。当时间基准计数器的值与这些比较值匹配时就会产生事件CTRCMPA, CTRCMPB。这些事件是后续动作限定器改变输出状态的直接依据。CMPA通常用于控制主输出EPWMxA的边沿而CMPB可用于控制互补输出EPWMxB或产生更复杂的波形。动作限定器AQ子模块这是波形的“执行器”。它接收来自TB和CC子模块的事件如CTRPRD, CTRCMPA并根据我们预设的规则立即对输出引脚EPWMxA和EPWMxB执行“置高”、“拉低”或“翻转”操作。正是AQ子模块将这些抽象的数字比较事件转化为了实实在在的、具有特定占空比的物理波形。死区生成DB子模块在驱动半桥或全桥等拓扑时上下管绝不能同时导通否则会导致直通短路瞬间烧毁器件。死区子模块就是负责在互补的PWM信号中插入一段可控的“安全间隔”的“交通警察”。它可以在上升沿或下降沿插入延迟确保一个开关管完全关断后另一个才开启。PWM斩波器PC子模块这是一个为驱动脉冲变压器等磁性元件门极而设计的特殊“调制器”。它可以将原始的PWM波进行高频斩波生成一串脉冲序列。其第一个脉冲的宽度One-Shot Pulse和后续维持脉冲的占空比Sustaining Pulses Duty均可独立编程。这能确保为功率开关管如IGBT SiC MOSFET的门极提供足够强劲的初始驱动能量并在此后以合适的能量维持导通优化开关损耗和驱动效率。跳闸区TZ子模块这是系统的“紧急制动”或“安全气囊”。它监控外部故障输入引脚TZ1-TZn一旦检测到过流、过压等故障信号可以立即强制PWM输出进入预设的安全状态高、低或高阻态响应速度可达纳秒级远快于CPU中断处理。它支持“单次触发”和“逐周期”两种保护模式是构建高可靠性功率系统的基石。事件触发与中断ET子模块这是连接PWM硬件与CPU软件的“信使”。它可以对TB和CC产生的事件进行滤波和分频然后在特定时刻如每个PWM周期开始或结束、占空比更新点向CPU发出中断请求从而让软件能够同步地进行电流采样、算法计算和寄存器更新实现精准的数字控制环路。高分辨率PWMHRPWM子模块这就是eHRPWM中的“高精度”灵魂也是本文的重点。它通过微边沿定位器MEP技术将一个系统时钟周期Coarse Step进一步细分成数百个皮秒ps级的微步MEP Step从而将PWM边沿的定位精度提升数个数量级。它主要作用于CMPA和TBPHS寄存器的高8位扩展部分CMPAHR, TBPHSHR。2.2 子模块间的信号流与协作这些子模块并非孤立工作而是通过精密的内部信号网络连接。一个典型的信号流是TB子模块的计数器不断运行产生CTR0, CTRPRD等事件。CC子模块持续比较计数器值与CMPA/B产生匹配事件。这些事件被送入AQ子模块AQ根据配置规则驱动EPWMxA/B输出原始波形。该波形可依次通过DB子模块插入死区再通过PC子模块进行斩波调制最终输出到引脚。与此同时ET子模块监控着特定事件准备触发中断TZ子模块则时刻监视外部故障引脚一旦有变可以越过所有逻辑直接控制输出引脚进入安全状态。理解这个数据流在调试异常波形时至关重要。例如如果最终输出没有PWM波我们需要按顺序排查TZ是否动作强制了输出PC子模块是否被错误旁路DB子模块是否将脉宽全部“吃”掉了AQ的配置规则是否正确CC的比较值是否在合理范围内TB的时钟和计数模式是否启用这种结构化的排查思路能极大提高效率。3. 高精度之魂微边沿定位器MEP原理深度剖析传统PWM的精度瓶颈在于边沿位置只能以系统时钟周期Tbc为最小单位进行移动。例如系统时钟为100MHzTbc10ns那么PWM边沿的位置只能是10ns的整数倍。eHRPWM的HRPWM子模块引入的MEP技术打破了这一限制。3.1 MEP如何工作细分系统时钟周期MEP的核心思想是在一个系统时钟周期称为“粗调步进”内进行第二次、更精细的插值。它不是通过提高系统主频来实现的那会带来功耗和设计复杂度的飙升而是通过一个名为“微边沿定位器”的模拟/数字混合电路模块。你可以把它想象成一把高精度的游标卡尺。系统时钟周期是主尺最小刻度是10ns。MEP则是在主尺的一个刻度内增加了副尺副尺有255个刻度对应8位CMPAHR寄存器每个刻度代表一个“微步”MEP Step。微步的时间分辨率典型值在150ps左右具体值见芯片数据手册。这样边沿的定位精度就从10ns提升到了150ps实现了超过60倍的精度提升。从寄存器层面看控制PWMxA边沿的“时间戳”现在由一个24位的复合值决定[CMPA:CMPAHR]。其中低16位的CMPA寄存器决定在哪个“粗调”时钟周期边沿发生改变而高8位的CMPAHR寄存器则决定在该时钟周期内的哪个“微步”时刻发生改变。3.2 高分辨率占空比控制从理论到寄存器配置假设我们需要生成一个频率为1.25MHz周期Tpwm800ns占空比为40.5%的PWM波。系统时钟为100MHzTsysclk10ns。步骤1计算粗调步进数CMPA值PWM一个周期对应的系统时钟数 Tpwm / Tsysclk 800ns / 10ns 80。 目标高电平时间 占空比 × 周期 40.5% × 800ns 324ns。 对应的粗调时钟周期数 高电平时间 / Tsysclk 324ns / 10ns 32.4。 CMPA寄存器装载整数部分CMPA floor(32.4) 32。 此时如果只用传统PWM高电平时间将是32 * 10ns 320ns占空比40%与目标的324ns有4ns误差。步骤2计算微调步进数CMPAHR值首先计算每个粗调步进10ns内包含多少个微步MEP Step。这由MEP的步进时间Tstep决定。假设Tstep 180ps。 每个粗调步进的微步数 MEP_SF Tsysclk / Tstep 10ns / 180ps ≈ 55.56通常取整数55具体值需查表由硬件决定。 我们需要补偿的剩余时间 小数部分 × Tsysclk 0.4 × 10ns 4ns。 这部分时间需要用微步来填补。需要的微步数 剩余时间 / Tstep 4ns / 180ps ≈ 22.22取整为22。 CMPAHR寄存器的计算需要按特定格式打包。公式通常为CMPAHR (微步数 8) 0x180这里 8是因为CMPAHR的高8位才有效低8位硬件忽略。0x180是一个舍入调整的固定偏移量用于优化线性度。 计算CMPAHR (22 8) 0x180 0x1600 0x180 0x1780。 所以我们需要向CMPA:CMPAHR这个24位“联合寄存器”写入的值是CMPA32 (0x0020) CMPAHR0x1780。硬件会自动将CMPAHR的高8位0x17用于MEP控制。步骤3配置HRPWM控制寄存器仅仅写入CMPAHR还不够需要配置HRCNFG寄存器来启用高分辨率模式并选择控制方式。// 假设使用EPWM1模块 EPwm1Regs.HRCNFG.bit.EDGMODE HR_BEP; // 选择边沿模式本例为单边沿控制通常用HR_FEP下降沿或HR_REP上升沿 EPwm1Regs.HRCNFG.bit.CTLMODE HR_CMP; // 控制模式使用CMPAHR控制占空比如果是相位控制则用HR_PHS EPwm1Regs.HRCNFG.bit.HRLOAD HR_CTR_ZERO; // 影子寄存器加载时机在CTR0时加载与CMPA同步完成以上配置后PWMxA输出波形的下降沿假设为HR_FEP模式将被精确地定位在32个系统时钟周期又22个微步的时刻即 3210ns 22180ps 320ns 3.96ns 323.96ns与目标的324ns误差仅0.04ns精度得到了质的飞跃。注意MEP步进时间Tstep的非理想性数据手册给出的150ps或180ps是典型值。这个值会随着工艺、电压和温度PVT变化。因此在要求极高的应用中不能简单地将此值作为固定常数进行计算。TI的C2000芯片通常提供MEP校准功能可以通过软件测量出当前条件下的实际MEP步长时间并用此值进行动态计算以获得全温度范围内的最佳精度。3.3 高分辨率模式下的占空比范围限制与应对策略MEP逻辑并非在PWM周期的每一个点都有效。为了给MEP逻辑的建立和保持时间留出余量在PWM周期开始后的头几个系统时钟周期内MEP是不工作的。这意味着如果你试图生成一个非常小占空比例如5%的波形并且希望其边沿由MEP精确控制可能会遇到问题。例如在PWM频率为1MHz系统时钟为100MHz时一个周期有100个时钟。如果MEP在头3个时钟周期内无效那么对于由CMPAHR控制的边沿如下降沿模式其对应的CMPA值必须大于3。换算成占空比即要求(CMPA / 周期时钟数) 3%。否则即使你设置了CMPAHR边沿也会在CMPA指定的粗调时钟边沿跳变MEP不生效。应对策略设计规避在大多数电源和电机控制应用中工作点很少需要极端接近0%或100%的占空比。通常会在软件中设置一个最小占空比限幅如5%避免进入MEP无效区。模式切换对于必须实现极低占空比高精度控制的应用可以利用HRPWM的另一种模式——高分辨率相位控制。此时MEP被用于控制TBPHSHR寄存器实现输出相位的微调而占空比则由常规的CMPA在周期中间位置控制从而避开周期起始段的限制。计数模式选择上文所述限制主要发生在“递增计数”模式下。如果切换到“递减计数”模式并将MEP用于控制上升沿HR_REP那么占空比范围限制会出现在周期末尾。你可以根据应用需要选择在递增计数模式下控制下降沿或在递减计数模式下控制上升沿来规避无效区。4. 系统安全的基石跳闸区Trip-Zone子模块实战配置再精密的控制如果缺乏保护也是脆弱的。跳闸区子模块是eHRPWM硬件级别的保护机制其响应速度远快于软件中断是防止过流、短路等故障导致硬件损坏的最后防线。4.1 两种故障响应模式OSHT与CBCTZ子模块支持两种主要的故障响应模式应对不同严重程度的故障单次触发One-Shot, OSHT模式适用于严重的、不可恢复的故障如硬件短路、严重过流。一旦触发ePWM输出会立即被强制为预设的安全状态高、低或高阻并且该状态会一直保持直到软件主动清除故障标志位。这相当于一个“锁存”型的保护需要人工干预或系统复位才能恢复。逐周期Cycle-By-Cycle, CBC模式适用于可恢复的、需要限流的故障例如电机启动时的瞬时过流。一旦触发ePWM输出会在当前周期立即进入安全状态。但是在每个PWM周期开始时计数器归零时硬件会自动检查故障信号是否依然存在。如果故障消失输出会自动恢复正常工作如果故障持续则输出继续保持安全状态。这种模式允许系统在故障出现时立即保护故障消失后自动恢复非常适合实现峰值电流限制功能。4.2 关键寄存器配置详解TZ功能主要通过一组寄存器控制理解每个比特位的含义是关键。TZSELTrip-Zone Select Register故障源选择寄存器。决定本ePWM模块响应哪几个TZ输入引脚TZ1~TZn以及每个引脚触发哪种模式。TZSEL[CBCn]置1则TZn引脚上的信号被配置为逐周期CBC故障源。TZSEL[OSHTn]置1则TZn引脚上的信号被配置为单次触发OSHT故障源。一个TZn引脚可以同时被多个ePWM模块监控一个ePWM模块也可以监控多个TZn引脚。TZCTLTrip-Zone Control Register故障动作控制寄存器。决定当故障发生时EPWMxA和EPWMxB输出引脚应被强制为何种状态。TZCTL[TZA]控制EPWMxA。00高阻01强制高10强制低11无动作忽略故障。TZCTL[TZB]控制EPWMxB。选项同上。常见的安全策略是在桥式电路中将上下管驱动信号同时强制为低10使所有开关管关断避免直通。TZEINTTrip-Zone Enable Interrupt Register故障中断使能寄存器。决定是否在故障发生时向CPU产生中断。TZEINT[CBC]使能CBC故障中断。TZEINT[OST]使能OSHT故障中断。使能中断后可以在中断服务程序中记录故障类型、进行系统状态保存或尝试恢复。TZFLGTrip-Zone Flag Register故障标志寄存器。指示当前故障状态由硬件置位。TZFLG[CBC]CBC故障标志。TZFLG[OST]OSHT故障标志。TZFLG[INT]全局中断标志。TZCLRTrip-Zone Clear Register故障标志清除寄存器。通过软件写1来清除对应的故障标志。TZCLR[CBC]写1清除CBC标志。TZCLR[OST]写1清除OST标志。TZCLR[INT]写1清除INT标志。TZFRCTrip-Zone Force Register故障强制寄存器。允许软件模拟一个故障事件用于测试保护逻辑。TZFRC[CBC]写1强制产生一个CBC故障事件。TZFRC[OST]写1强制产生一个OSHT故障事件。4.3 典型配置示例与代码假设一个三相逆变器系统使用EPWM1A/B驱动A相上/下管EPWM2A/B驱动B相。我们使用TZ1引脚连接硬件过流比较器的输出作为OSHT故障源使用TZ2引脚连接电流采样ADC的比较器作为CBC故障源限流。目标TZ1严重过流触发OSHT故障立即将所有PWM输出强制拉低并锁存直到软件清除。TZ2峰值限流触发CBC故障仅将A相下管EPWM1B和B相下管EPWM2B强制拉低实现下管关断限流且每个周期自动恢复检查。配置代码// 配置 EPWM1 模块 (A相) // 选择故障源及模式 EPwm1Regs.TZSEL.bit.OSHT1 1; // TZ1 作为 EPWM1 的 OSHT 源 EPwm1Regs.TZSEL.bit.CBC2 1; // TZ2 作为 EPWM1 的 CBC 源 // 配置故障动作 EPwm1Regs.TZCTL.bit.TZA TZ_FORCE_LO; // TZ事件发生时EPWM1A 强制低 EPwm1Regs.TZCTL.bit.TZB TZ_FORCE_LO; // TZ事件发生时EPWM1B 强制低 // 使能故障中断可选 EPwm1Regs.TZEINT.bit.OST 1; // 使能 OSHT 中断 EPwm1Regs.TZEINT.bit.CBC 1; // 使能 CBC 中断 // 配置 EPWM2 模块 (B相) EPwm2Regs.TZSEL.bit.OSHT1 1; // TZ1 也作为 EPWM2 的 OSHT 源 EPwm2Regs.TZSEL.bit.CBC2 1; // TZ2 也作为 EPWM2 的 CBC 源 EPwm2Regs.TZCTL.bit.TZA TZ_FORCE_LO; // EPWM2A 强制低 EPwm2Regs.TZCTL.bit.TZB TZ_FORCE_LO; // EPWM2B 强制低 EPwm2Regs.TZEINT.bit.OST 1; EPwm2Regs.TZEINT.bit.CBC 1; // 注意对于CBC模式我们希望下管关断但上管可能不需要动作或者需要互补动作。 // 上述配置是简单地将所有输出拉低。更精细的控制可能需要结合AQ模块的软件强制功能 // 或在CBC中断服务程序中进行动态调整。这里展示的是TZ模块的基础强制功能。中断服务程序ISR示例__interrupt void epwm1TzIsr(void) { if (EPwm1Regs.TZFLG.bit.OST 1) { // 处理 OSHT 故障严重故障 SystemFaultLog | FAULT_OVER_CURRENT_OSHT; EPwm1Regs.TZCLR.bit.OST 1; // 清除OST标志在确认安全后 EPwm1Regs.TZCLR.bit.INT 1; // 可能需要执行系统停机、点亮故障灯等操作 } if (EPwm1Regs.TZFLG.bit.CBC 1) { // 处理 CBC 故障限流 CurrentLimitEventCount; EPwm1Regs.TZCLR.bit.CBC 1; // 清除CBC标志 EPwm1Regs.TZCLR.bit.INT 1; // 注意CBC标志会在每个周期开始时由硬件自动检查并可能再次置位 // 因此ISR中清除它只是为了记录事件不影响硬件保护逻辑。 } // 清除PIE中断组应答位 PieCtrlRegs.PIEACK.all PIEACK_GROUP2; }实操心得TZ引脚滤波与防误触发TZ引脚是直接连接外部模拟比较器的非常敏感。在PCB布局上这些走线应远离噪声源如开关节点。在软件上虽然TZ输入是异步的即使系统时钟丢失也能动作但为了抗噪声干扰通常建议在GPIO模块中为这些引脚配置适当的数字滤波Input Qualifier滤除短于1-2个系统时钟周期的毛刺。同时在系统初始化后、启用PWM输出前先读取一下TZFLG寄存器并手动清除任何可能的上电残留标志位是一个好习惯。5. PWM斩波器PC子模块驱动脉冲变压器的利器在高压、隔离或需要特定驱动波形的应用中我们常使用脉冲变压器来驱动功率开关管的门极。PWM斩波器子模块就是为优化这种驱动方案而生的。5.1 工作原理首脉冲与维持脉冲一个原始的PWM波直接驱动脉冲变压器可能会因为变压器磁芯复位问题导致门极电压不足。PC子模块将其转换成一个更复杂的脉冲序列首脉冲One-Shot Pulse当输入PWMEPWMxA上升沿到来时PC子模块会先产生一个宽度可编程的独立高脉冲。这个脉冲通常被设置得较宽目的是在瞬间为变压器的初级注入大量能量确保次级能产生一个足够高的电压快速、坚决地打开功率管尤其是需要较大门极电荷的IGBT或SiC MOSFET减小开通损耗。维持脉冲Sustaining Pulses在首脉冲之后直到输入PWM下降沿到来之前PC子模块会生成一串高频的、占空比可编程的脉冲序列。这些脉冲的作用是维持变压器磁通从而在功率管导通的整个期间保持其次级有稳定的驱动电压防止因磁芯复位而导致门极电压跌落。5.2 关键寄存器配置PC子模块主要由PCCTL寄存器控制。PCCTL[CHPEN]斩波器使能位。0禁用旁路输出直接等于输入1启用。PCCTL[OSHTWTH]4位字段用于设置首脉冲的宽度。宽度计算公式为T_onepulse T_sysclkout * 8 * (OSHTWTH)其中OSHTWTH取值范围为1-16。例如系统时钟10nsOSHTWTH设为4则首脉冲宽度为10ns * 8 * 4 320ns。PCCTL[CHPFREQ]3位字段用于设置维持脉冲的载波频率。该频率是系统时钟的分频。分频系数 CHPFREQ 1。例如CHPFREQ0表示1分频与系统时钟同频CHPFREQ3表示4分频。PCCTL[CHPDUTY]3位字段用于设置维持脉冲的占空比。可选值为12.5%, 25%, 37.5%, 50%, 62.5%, 75%, 87.5%。这需要根据脉冲变压器的磁芯特性、匝数比和门极电阻来优化选择通常50%是一个不错的起点。配置示例我们希望启用斩波器首脉冲宽度为400ns在100MHz系统时钟下维持脉冲频率为系统时钟的1/4即25MHz占空比为50%。// 计算 OSHTWTH: 目标宽度 T_sysclk * 8 * OSHTWTH 400ns // 10ns * 8 * OSHTWTH 400ns OSHTWTH 5 EPwm1Regs.PCCTL.bit.CHPEN 1; // 使能斩波器 EPwm1Regs.PCCTL.bit.OSHTWTH 5; // 首脉冲宽度 10ns * 8 * 5 400ns EPwm1Regs.PCCTL.bit.CHPFREQ 3; // 维持脉冲频率 SYSCLKOUT / (31) 100MHz/4 25MHz EPwm1Regs.PCCTL.bit.CHPDUTY 4; // 查寄存器定义CHPDUTY4 对应 50% 占空比 // 注意CHPDUTY的具体值需要查阅芯片数据手册的寄存器描述表确认不同型号可能编码不同。注意事项PC子模块的信号路径PC子模块通常位于信号链的末端在死区生成模块之后。这意味着最终输出到引脚EPWMxA的波形是原始PWM波经过AQ动作、DB死区插入、PC斩波调制后的结果。在调试时如果看不到预期的斩波波形需要依次检查PCCTL[CHPEN]是否使能输入到PC的EPWMxA信号来自DB模块是否正常示波器测量点是否在最终引脚上6. 事件触发与中断ET子模块实现精准的软件同步在数字控制系统中软件算法如PID调节需要与PWM硬件波形保持严格同步。例如我们希望在每个PWM周期的中心点或结束时进行电流采样和计算并在下一个周期开始前更新占空比。ET子模块就是为此设计的硬件同步机制。6.1 中断事件源与分频ET子模块可以监控多个硬件事件并选择其中一个作为中断源CTR PRD计数器达到周期值上溢点。CTR 0计数器归零下溢点。CTR CMPA当计数器递增CTRU或递减CTRD时与CMPA匹配。CTR CMPB当计数器递增或递减时与CMPB匹配。最常用的配置是在“递增-递减”计数模式下选择CTRPRD或CTR0作为中断源这样每个PWM周期都会产生一次中断非常适合进行周期性的控制计算。ET子模块还提供了一个强大的事件分频器。你可以配置为每发生1次、2次或3次所选事件才产生一次中断。这在多速率控制系统中非常有用。例如你的电流环快环每个PWM周期计算一次而速度环慢环每3个PWM周期计算一次。你可以将速度环的中断源设置为每3个事件触发一次从而用一个硬件定时器源驱动两个不同频率的控制任务简化软件设计。6.2 寄存器配置与影子寄存器加载时机ETSELEvent-Trigger Selection寄存器选择中断源和使能中断。ETSEL[INTSEL]选择中断事件源如CTRPRD。ETSEL[INTEN]中断使能位。1使能。ETPSEvent-Trigger Prescale寄存器配置事件分频和查看计数器。ETPS[INTPRD]中断周期。00禁止中断01每个事件10每2个事件11每3个事件。ETPS[INTCNT]中断事件计数器只读。显示当前已发生但尚未触发中断的事件次数。影子寄存器加载同步这是实现无毛刺PWM更新的关键。CMPA、CMPB、TBPRD等寄存器都有影子寄存器。你可以在任何时间安全地写入影子寄存器而真正的生效时刻由TBCTL[PRDLD]和TBCTL[CTRMODE]等位控制。最常见的配置是TBCTL[PRDLD] 0TBPRD在CTR0时从影子寄存器加载。CMPCTL[SHDWAMODE] 0CMPA在CTR0时从影子寄存器加载。这样我们将ET中断源设置为CTRPRD。在中断服务程序中我们读取ADC结果执行控制算法计算出新的CMPA值并写入其影子寄存器。由于加载点设置在CTR0而中断发生在CTRPRD这中间有半个PWM周期的时间CTR从PRD递减到0足够软件完成计算。新的占空比将在下一个PWM周期开始时CTR0无缝生效避免了在PWM周期中间更新比较值可能导致的脉冲宽度异常。配置示例配置EPWM1在递增-递减计数模式下于每个周期结束时CTRPRD产生中断并在CTR0时加载影子寄存器。// 时间基准配置 EPwm1Regs.TBCTL.bit.CTRMODE TB_COUNT_UPDOWN; // 上下计数模式 EPwm1Regs.TBCTL.bit.PHSEN TB_DISABLE; // 禁用相位加载 EPwm1Regs.TBCTL.bit.PRDLD TB_SHADOW; // TBPRD使用影子寄存器 EPwm1Regs.TBCTL.bit.SYNCOSEL TB_SYNC_DISABLE; // 不同步输出 EPwm1Regs.TBPRD period_value; // 设置周期值 EPwm1Regs.TBPHS.half.TBPHS 0; // 相位清零 // 影子寄存器加载点配置 EPwm1Regs.CMPCTL.bit.SHDWAMODE CC_SHADOW; // CMPA使用影子寄存器 EPwm1Regs.CMPCTL.bit.LOADAMODE CC_CTR_ZERO; // 在CTR0时加载 // CMPB配置类似... // 事件触发中断配置 EPwm1Regs.ETSEL.bit.INTSEL ET_CTR_PRD; // 选择CTRPRD作为中断源 EPwm1Regs.ETSEL.bit.INTEN 1; // 使能中断 EPwm1Regs.ETPS.bit.INTPRD ET_1ST; // 每个事件都产生中断不分频7. 实战避坑指南与常见问题排查理论配置清晰后在实际调试中仍然会遇到各种问题。以下是一些常见的坑点和排查思路。7.1 无PWM输出或波形异常检查时钟与使能确认系统时钟已正确配置并供给ePWM模块。检查PCLKCRx寄存器中对应ePWM模块的时钟使能位是否置1。检查输出引脚复用ePWM输出引脚GPIO必须配置为外设功能模式而不是普通的数字I/O。检查GPxMUX和GPxGMUX寄存器。检查跳闸区TZ状态这是最容易忽略的一点。如果TZ引脚被意外拉低如未使用的引脚浮空或者TZCTL寄存器配置为强制输出高/低PWM将无输出。首先检查TZFLG寄存器是否有故障标志并确认TZCTL配置为“无动作”TZ_NO_CHANGE或你的预期安全状态。检查动作限定器AQ配置AQ是直接控制输出的模块。确保你为EPWMxA和EPWMxB配置了正确的动作。例如在递增计数、非对称PWM模式下一个典型的配置是CTRPRD时置高CTRCMPA时拉低。如果配置反了或漏配了就没有输出。验证比较值确保CMPA的值在0到TBPRD之间。如果CMPA TBPRD在递增模式下则输出可能恒为高或恒为低。检查死区DB模块如果DB模块被启用且配置了过大的死区时间可能会导致最终输出的有效脉宽为零。尝试暂时旁路DB模块DBCTL[MODE]0看原始波形是否出现。7.2 高分辨率HRPWM模式不生效确认芯片支持并非所有C2000芯片的每个ePWM模块都支持HRPWM。查阅具体型号的数据手册确认你使用的模块如EPWM1是否包含HRPWM子模块。检查HRCNFG配置这是最常见的错误来源。必须正确设置HRCNFG[EDGMODE]边沿模式、HRCNFG[CTLMODE]控制模式和HRCNFG[HRLOAD]加载模式。确保CTLMODE与你的用途匹配占空比控制用HR_CMP相位控制用HR_PHS。确保HRLOAD与CMPA的影子寄存器加载模式一致。检查CMPAHR寄存器写入CMPAHR是一个16位寄存器但只有高8位有效。必须按照(MEP步数 8) 0x180的格式写入。直接写入MEP步数值是无效的。使用TI提供的库函数如HRPWM_setCounterCompareValue()可以避免此错误。注意占空比范围限制如前所述在低占空比区域通常前几个时钟周期MEP可能无效。确保你的目标占空比对应的CMPA值大于MEP无效区的边界通常为2或3。可以通过调整计数模式改用递减计数控制上升沿来规避。MEP校准对于精度要求极高的应用必须启用MEP校准。TI的HRPWM_cal()函数可以测量当前电压温度下的实际MEP步长时间并自动优化线性度。在系统初始化后和关键温度点调用此函数。7.3 跳闸区保护误触发或不触发TZ引脚配置与滤波TZ引脚通常配置为异步输入但噪声容易引起误触发。在GPIO模块中启用输入限定器Input Qualifier设置一个合适的采样窗口如6个周期采样5次可以滤除毛刺。TZ动作配置矛盾如果一个ePWM模块的TZCTL[TZA]和TZCTL[TZB]配置为不同的动作如一个强制高一个强制低而它们驱动的是互补信号这可能引发总线冲突。确保故障安全状态是一致的通常都是强制为低关断所有开关管。软件清除标志位时机对于OSHT故障必须在确认故障根本原因已消除如过流消失后才能清除TZFLG[OST]标志。过早清除可能导致保护失效。清除标志后输出不会自动恢复需要重新配置AQ或通过软件强制输出正常波形。CBC模式的理解CBC标志会在每个PWM周期开始CTR0时如果故障信号已消失由硬件自动清除。因此在CBC中断服务程序中我们清除TZFLG[CBC]主要是为了记录事件次数和清除中断标志位。即不手动清除只要外部故障信号消失硬件保护也会自动解除输出恢复正常。7.4 同步与相位控制问题主从模块配置在多模块同步系统中一个模块配置为主Master其他为从Slave。主模块的EPWMxSYNCO输出应配置为CTR0从模块的EPWMxSYNCI应使能并且TBPHS寄存器应设置为期望的相位偏移值。常见错误是主从的同步信号源配置不一致。相位寄存器TBPHS的使用TBPHS是24位寄存器16位TBPHS 8位TBPHSHR。在非高分辨率模式下只使用低16位。写入相位值时需要确保在计数器停止或通过软件同步时进行否则可能造成不可预测的相位跳变。通常的流程是停止从模块计数器 - 写入TBPHS - 发出主模块同步信号或软件强制同步SWFSYNC- 启动从模块计数器。高分辨率相位控制当使用HRPWM进行高分辨率相位控制时需要将HRCNFG[CTLMODE]设置为HR_PHS并通过TBPHSHR寄存器进行微调。此时占空比由常规的CMPA控制而相位由TBPHS:TBPHSHR联合控制。这种模式常用于移相全桥等拓扑。调试eHRPWM是一个系统工程从时钟、GPIO、到各个子模块的配置环环相扣。最有效的调试方法是使用TI的CCS集成开发环境中的实时调试和寄存器查看功能结合示波器观察实际波形。从一个最简单的、不带任何高级功能的PWM波开始逐步添加死区、斩波、高分辨率、同步等功能每步都验证波形这样才能快速定位问题所在。记住数据手册和寄存器定义是你的终极参考当遇到奇怪现象时回头仔细核对寄存器的每一个比特位往往能发现配置上的细微疏忽。