深入解析C2000 eHRPWM高级功能:死区、斩波与故障保护实战
1. 项目概述:为什么我们需要关注eHRPWM的“高级”功能?
在电力电子和电机驱动的世界里,PWM(脉冲宽度调制)是那个我们每天都在用,但可能很少深究其内部细节的“老朋友”。我们通常只关心它的频率和占空比,就像开车只关心油门和刹车。然而,当你从简单的LED调光、风扇调速,进入到伺服驱动、大功率数字电源、车载充电器(OBC)或者光伏逆变器这些领域时,你会发现,一个“裸奔”的PWM信号是远远不够的。它就像一个没有安全气囊、没有ABS、没有ESP的汽车,在平坦的城市道路或许可以,一旦上了高速或者遇到复杂路况,就危机四伏。
这就是德州仪器(TI)C2000系列微控制器中增强型高分辨率PWM(eHRPWM)模块的价值所在。它不仅仅是一个简单的定时器比较输出单元,而是一个集成了死区控制、斩波调制、故障保护、高分辨率边缘定位等高级功能的完整PWM生态系统。今天,我们不谈基础的TB(时基)和CC(计数器比较)模块,那是PWM的“发动机”。我们来深入拆解它的“主动安全系统”——死区生成(DB)、斩波(PC)和故障保护(TZ)模块。理解它们,你才能真正驾驭eHRPWM,设计出既高效又可靠的功率控制系统。
简单来说:
- 死区生成(DB):防止H桥或半桥的上下管“打架”(直通短路)的交通警察。它通过在互补的PWM信号之间插入一个可控的“安全间隙”。
- PWM斩波(PC):为基于脉冲变压器的隔离栅极驱动“量身定制”的调制器。它把PWM信号调制成高频脉冲串,解决变压器磁复位和驱动能量的问题。
- 故障保护(TZ):系统的紧急制动和断电开关。当检测到过流、过压、过热时,能在纳秒级内强制PWM输出进入安全状态(拉高、拉低或高阻)。
- 高分辨率PWM(HRPWM):给PWM边缘装上“微调旋钮”,实现皮秒级的时间精度,在追求极致效率和纹波性能的高频电源中至关重要。
如果你正在设计电机驱动器、UPS、太阳能逆变器或任何需要精密功率控制的设备,那么掌握eHRPWM的这些高级功能,将从“能跑”升级到“跑得稳、停得准、刹得住”。
2. 核心模块深度解析与设计考量
2.1 死区生成模块:不仅仅是延迟
死区,顾名思义,就是在互补的一对PWM信号(如EPWMxA和EPWMxB)的跳变沿之间插入的一段两者都为无效状态(通常为低电平)的时间。其根本目的是防止在桥式电路中,由于开关管(如MOSFET、IGBT)的开启和关断存在延迟,导致上下管同时导通,形成低阻通路,瞬间产生巨大的直通电流,烧毁器件。
2.1.1 模块工作原理与寄存器精讲
eHRPWM的死区模块非常灵活,远不止是简单的双边延迟。它的核心是一个可配置的信号路径,如下图所示(概念简化):
EPWMxA In (来自AQ模块) ---> [S0] ---> [上升沿延迟RED] ---> [S2] ---> [极性选择S4] ---> EPWMxA Out | | | | +---> [下降沿延迟FED] ---> [S3] ---> [极性选择S5] ---> EPWMxB Out注:S0-S5为内部多路选择器,由寄存器控制。
关键控制寄存器只有三个,但组合出的模式非常强大:
DBCTL (Dead-Band Control Register - 地址偏移 0x1E):这是大脑。
IN_MODE[1:0]:输入源选择。这是最容易被忽略但极其有用的功能。它决定了哪个信号作为RED和FED的输入源。00:默认模式。EPWMxA In同时作为RED和FED的输入。这是最经典的用法,用一个输入生成带死区的互补输出。01:EPWMxA In给FED,EPWMxB In给RED。这允许你对两个独立生成的信号分别进行下降沿和上升沿延迟,实现非对称或更复杂的死区关系。10:EPWMxA In给RED,EPWMxB In给FED。与上一种类似,方向互换。11:EPWMxB In同时作为RED和FED的输入。用EPWMxB作为主信号生成互补对。
OUT_MODE[1:0]:输出模式控制。决定延迟块是否被旁路。00:RED和FED均被旁路。EPWMxA/B Out直接等于EPWMxA/B In。相当于关闭死区功能。01:仅使能下降沿延迟(FED)。EPWMxA Out = EPWMxA In(或经RED,取决于POLSEL),EPWMxB Out = EPWMxA In 经过FED延迟。10:仅使能上升沿延迟(RED)。EPWMxA Out = EPWMxA In 经过RED延迟,EPWMxB Out = EPWMxA In(或经FED)。11:使能RED和FED。这是最常用的“完全死区”模式。
POLSEL[1:0]:输出极性选择。决定经过延迟后的信号是否取反。00:EPWMxA Out不取反,EPWMxB Out不取反。01:EPWMxA Out取反,EPWMxB Out不取反。10:EPWMxA Out不取反,EPWMxB Out取反。11:EPWMxA Out取反,EPWMxB Out取反。
DBRED (Dead-Band Rising Edge Delay Count Register - 地址偏移 0x20):10位寄存器,无影子寄存器。设置上升沿延迟的时钟周期数。延迟时间 = DBRED值 × TBCLK周期。TBCLK是系统时钟SYSCLKOUT经过时基模块分频后的时钟。
DBFED (Dead-Band Falling Edge Delay Count Register - 地址偏移 0x22):10位寄存器,无影子寄存器。设置下降沿延迟的时钟周期数。延迟时间 = DBFED值 × TBCLK周期。
2.1.2 经典模式与实战配置
手册中列出了7种模式,但实践中我们主要用到模式2-5,它们对应了驱动芯片常见的输入逻辑。
| 模式 | 描述 | POLSEL | OUT_MODE | 对应驱动芯片需求 | 典型应用场景 |
|---|---|---|---|---|---|
| 2 | 高电平有效互补 (AHC) | 01 | 11 | 输入INH/INL均为高有效,输出互补 | 很多半桥驱动芯片(如IR21xx) |
| 3 | 低电平有效互补 (ALC) | 10 | 11 | 输入INH/INL均为低有效,输出互补 | 某些集成驱动模块 |
| 4 | 高电平有效 (AH) | 00 | 11 | 单一高有效信号,死区在内部处理 | 需要自己外搭逻辑电路时 |
| 5 | 低电平有效 (AL) | 11 | 11 | 单一低有效信号,死区在内部处理 | 需要自己外搭逻辑电路时 |
实战配置示例(模式2,AHC):假设我们需要一对互补、高电平有效的PWM信号,死区时间为1µs,系统时钟SYSCLKOUT为100MHz,时基分频器TBCTL[HSPCLKDIV, CLKDIV]设置为/1,即TBCLK=SYSCLKOUT=100MHz,周期为10ns。
// 假设使用ePWM1模块 // 1. 配置死区时间 EPwm1Regs.DBRED.all = 100; // 上升沿延迟:100 * 10ns = 1000ns = 1µs EPwm1Regs.DBFED.all = 100; // 下降沿延迟:100 * 10ns = 1µs // 2. 配置死区控制寄存器为AHC模式 // POLSEL = 01 (A取反,B不取反), OUT_MODE=11 (使能RED&FED), IN_MODE=00 (默认,A作为源) EPwm1Regs.DBCTL.bit.IN_MODE = 0; // EPWM1A作为源 EPwm1Regs.DBCTL.bit.POLSEL = DB_CTL_POLSEL_ACTIVE_HIC; // 即值1,AHC模式 EPwm1Regs.DBCTL.bit.OUT_MODE = DB_CTL_OUT_MODE_ENABLE; // 即值3,使能双边延迟这样,如果AQ模块产生的EPWM1A是一个占空比为D的普通PWM波,经过DB模块后,EPWM1A输出将是原信号取反后,再在上升沿插入1µs延迟(实际是原信号的下降沿后延迟);EPWM1B输出将是原信号在下降沿插入1µs延迟。最终得到一对中心对齐、带有1µs死区的互补高有效信号。
关键经验:死区时间计算与选择死区时间并非越大越好。过大的死区会降低最大可用占空比,增加输出波形畸变,导致电机转矩脉动或电源输出电压误差。过小则起不到保护作用。其最小值必须大于功率管的最大关断延迟时间(Turn-off delay)与最小开启延迟时间(Turn-on delay)之差,并留有一定裕量(通常20%-50%)。例如,某MOSFET的
t_off(max)=100ns,t_on(min)=50ns,则理论最小死区需> 100ns - 50ns = 50ns,建议设置为80ns ~ 120ns。务必查阅你所使用的功率器件和驱动芯片的数据手册来确定这个值。
2.2 PWM斩波模块:驱动脉冲变压器的“编码器”
PWM斩波模块(PC)是一个相对小众但至关重要的功能,主要用于基于脉冲变压器的隔离栅极驱动。在高压、高隔离要求的场合(如多电平逆变器、高压变频器),脉冲变压器因其简单、可靠、成本低而被广泛使用。但它有一个核心问题:变压器需要交变的磁通来传递能量,直流或单极性脉冲会导致变压器磁芯饱和。
2.2.1 模块工作原理:单脉冲与维持脉冲
PC模块的核心思想是:将原始的PWM信号(来自DB模块输出)用一个频率高得多的载波(PSCLK)进行调制,将其转换成一串高频脉冲。
- 载波生成:载波频率由
PCCTL[CHPFREQ]位域控制,来源于系统时钟SYSCLKOUT的分频。分频系数可选1/1到1/16。 - 单脉冲(One-Shot):在调制后的脉冲串开始时,第一个脉冲的宽度可以独立设置,通常比后续的维持脉冲宽得多。这个宽脉冲提供了更大的能量,确保功率管能够快速、可靠地开启(克服米勒平台,快速给栅极电容充电)。其宽度由
PCCTL[OSHTWTH](4位)控制,公式为:单脉冲宽度 = 8 × OSHTWTH × T_SYSCLKOUT。例如,OSHTWTH=4,SYSCLKOUT=100MHz,则单脉冲宽度 = 8 * 4 * 10ns = 320ns。 - 维持脉冲(Sustaining Pulses):在单脉冲之后,是一系列占空比可调的维持脉冲。这些脉冲的作用是在功率管导通期间,持续提供能量以维持栅极电压,补偿栅极电荷的泄漏。其占空比由
PCCTL[CHPDUTY](3位)控制,可选12.5%, 25%, 37.5%, 50%, 62.5%, 75%, 87.5%七档。 - 旁路:通过
PCCTL[CHPEN]位可以完全旁路该模块,当不使用脉冲变压器驱动时,应关闭此模块以节省功耗。
2.2.2 实战配置与磁设计考量
配置PC模块相对直接,但难点在于与脉冲变压器设计的配合。
// 假设使用ePWM1模块,SYSCLKOUT = 100MHz // 1. 使能斩波器 EPwm1Regs.PCCTL.bit.CHPEN = 1; // 使能PWM斩波模块 // 2. 配置载波频率。假设我们希望载波频率为 100MHz / 8 = 12.5MHz EPwm1Regs.PCCTL.bit.CHPFREQ = 3; // 二进制011,即分频系数为8 // 3. 配置单脉冲宽度。假设需要320ns的单脉冲。 // 计算:所需系统时钟周期数 = 320ns / 10ns = 32个周期。 // 根据公式:宽度 = 8 * OSHTWTH * T_sysclk -> OSHTWTH = 宽度 / (8 * T_sysclk) = 32 / 8 = 4 EPwm1Regs.PCCTL.bit.OSHTWTH = 4; // 4. 配置维持脉冲占空比。假设选择50%占空比以平衡磁复位和驱动能力。 EPwm1Regs.PCCTL.bit.CHPDUTY = 4; // 二进制100,对应50%占空比核心陷阱:变压器饱和与占空比选择这是使用斩波模块最容易出问题的地方。脉冲变压器传递的是伏秒积(电压×时间)。如果维持脉冲的占空比设置得过高(如87.5%),在一个PWM周期内,施加在变压器原边的正向伏秒积可能远大于负向伏秒积(因为信号有正有负才能复位),导致磁芯累积直流偏磁,最终饱和。饱和的变压器阻抗急剧下降,会烧毁驱动电路或MCU的IO口。解决方案:
- 对称设计:确保变压器原边绕组能够双向施加电压(例如采用H桥或推挽电路驱动变压器),使得正负半周的伏秒积相等。
- 谨慎选择占空比:如果驱动电路是单端的(只有一端开关到VCC,另一端接地),那么负向复位能力有限。此时必须选择较低的维持脉冲占空比(如25%-37.5%),并精确计算,确保在一个PWM周期内,磁通能够复位到零。这需要根据变压器磁芯参数(Ae, Bmax)和绕组匝数进行详细计算。强烈建议在实际硬件上用电流探头观察变压器原边电流波形,确认其峰值不会持续增长(饱和迹象)。
2.3 故障保护模块:系统的“紧急制动与安全气囊”
故障保护(Trip-Zone, TZ)模块是eHRPWM的“看门狗”和“急停按钮”。它通过外部引脚(TZ1-TZ6,具体数量依芯片而定)实时监控系统状态(如过流、过压、过热),一旦发生故障,无需CPU干预,硬件自动强制PWM输出进入预设的安全状态,响应时间极短(纳秒级)。
2.3.1 两种保护模式:OSHT与CBC
这是TZ模块的精髓,对应不同的故障严重程度和处理逻辑:
单次触发(One-Shot Trip, OSHT):用于处理严重的、不可恢复的故障,如负载短路、严重过流、IGBT直通。一旦触发,ePWM输出会立即被锁存到安全状态(由TZCTL定义),并且只有通过软件手动清除TZFLG[OST]标志位,PWM输出才能恢复。这相当于汽车的“安全气囊引爆”,故障解除后需要“维修复位”。
- 应用场景:硬件过流保护、硬件短路保护、紧急停机按钮。
- 寄存器配置:
TZSEL[OSHTn]位使能对应TZn引脚的OSHT功能。
逐周期触发(Cycle-By-Cycle Trip, CBC):用于处理可恢复的、需要限流的故障,例如电机的峰值电流限制。当故障发生时,ePWM输出立即进入安全状态,但在每个PWM周期开始时(TBCTR=0),硬件会自动检查TZ引脚状态。如果故障消失,PWM输出自动恢复正常;如果故障持续,则输出继续保持安全状态。这相当于汽车的“ABS防抱死系统”,动态干预,故障解除即恢复。
- 应用场景:峰值电流限制、逐周期过流保护。
- 寄存器配置:
TZSEL[CBCn]位使能对应TZn引脚的CBC功能。
2.3.2 寄存器详解与配置流程
TZ模块的寄存器较多,但逻辑清晰:
- TZSEL (Trip-Zone Select Register - 0x24):故障源选择寄存器。决定本ePWM模块响应哪些TZ引脚,以及每个引脚是OSHT还是CBC模式。例如,
TZSEL.bit.OSHT1 = 1表示TZ1引脚上的低电平信号将触发本模块的OSHT保护。 - TZCTL (Trip-Zone Control Register - 0x28):动作控制寄存器。定义当故障发生时,EPWMxA和EPWMxB输出引脚应该被强制为何种状态。
TZA[1:0],TZB[1:0]: 每个通道有4种选择:00:强制为高阻态(High-Z)。这是最安全、最常用的方式,因为它让功率桥的驱动输入悬空,通常会导致其内部下拉电阻将功率管关闭。01:强制为高电平。10:强制为低电平。11:无动作(忽略故障)。
- TZEINT (Trip-Zone Enable Interrupt Register - 0x2A):中断使能寄存器。可以分别使能OSHT和CBC事件触发CPU中断,以便在故障发生后进行日志记录、状态上报或复杂恢复。
- TZFLG (Trip-Zone Flag Register - 0x2C):标志寄存器。只读,指示OSHT或CBC事件是否发生。
- TZCLR (Trip-Zone Clear Register - 0x2E):标志清除寄存器。向
CBC或OST位写1,可清除TZFLG中对应的标志位。对于OSHT事件,必须在故障物理消除后,手动清除OST标志,PWM输出才会恢复。 - TZFRC (Trip-Zone Force Register - 0x30):软件强制触发寄存器。通过软件写
CBC或OST位为1,可以模拟一个故障事件,用于测试保护逻辑是否正常工作。
2.3.3 实战配置:一个完整的过流保护例子
假设我们有一个三相电机驱动器,使用ePWM1/2/3驱动三个半桥。我们使用一个比较器监控直流母线电流,当电流超过阈值时,比较器输出低电平到MCU的TZ1引脚。我们希望实现逐周期限流(CBC),并在严重过流时完全关断(OSHT)。我们将TZ1配置为CBC源,TZ2配置为OSHT源(例如来自另一个更高速的硬件保护电路)。
// 配置 ePWM1, ePWM2, ePWM3 对 TZ1 和 TZ2 的响应 // 1. 选择故障源和模式 EPwm1Regs.TZSEL.bit.CBC1 = 1; // TZ1 作为 ePWM1 的 CBC 源 EPwm1Regs.TZSEL.bit.OSHT2 = 1; // TZ2 作为 ePWM1 的 OSHT 源 // 对 ePWM2, ePWM3 做同样配置,确保一个故障关断所有桥臂 EPwm2Regs.TZSEL.bit.CBC1 = 1; EPwm2Regs.TZSEL.bit.OSHT2 = 1; EPwm3Regs.TZSEL.bit.CBC1 = 1; EPwm3Regs.TZSEL.bit.OSHT2 = 1; // 2. 配置故障动作:发生任何故障时,将所有PWM输出置为高阻态(最安全) EPwm1Regs.TZCTL.bit.TZA = TZ_CTL_TZA_HIZ; // 0,高阻 EPwm1Regs.TZCTL.bit.TZB = TZ_CTL_TZB_HIZ; // 0,高阻 EPwm2Regs.TZCTL.bit.TZA = TZ_CTL_TZA_HIZ; EPwm2Regs.TZCTL.bit.TZB = TZ_CTL_TZB_HIZ; EPwm3Regs.TZCTL.bit.TZA = TZ_CTL_TZA_HIZ; EPwm3Regs.TZCTL.bit.TZB = TZ_CTL_TZB_HIZ; // 3. 使能故障中断(可选,用于记录和恢复) EPwm1Regs.TZEINT.bit.CBC = 1; // 使能 CBC 中断 EPwm1Regs.TZEINT.bit.OST = 1; // 使能 OSHT 中断 // ... 同样配置 ePWM2, ePWM3 // 4. 在中断服务程序 (ISR) 中处理故障 __interrupt void epwm1TzIsr(void) { if (EPwm1Regs.TZFLG.bit.CBC == 1) { // 逐周期过流发生 g_fault_log.cbc_count++; EPwm1Regs.TZCLR.bit.CBC = 1; // 清除CBC标志(硬件在下一个周期会自动重新评估) // 可以在这里降低电流指令或采取其他限流措施 } if (EPwm1Regs.TZFLG.bit.OST == 1) { // 严重故障发生!系统必须停机 g_fault_log.ost_occurred = 1; System_Halt(); // 执行系统停机程序 // 注意:OST标志必须在故障物理消除后,由软件手动清除才能恢复PWM // EPwm1Regs.TZCLR.bit.OST = 1; // 这步在安全重启流程中做 } EPwm1Regs.TZCLR.bit.INT = 1; // 清除中断标志 PieCtrlRegs.PIEACK.all = PIEACK_GROUP2; // 应答PIE中断 }生死攸关的注意事项:异步Trip与滤波TZ输入是异步的,这意味着即使系统时钟(SYSCLKOUT)丢失,只要引脚上有低电平故障信号,保护依然会动作。这是硬件安全的最后防线。但这也带来了风险:噪声毛刺可能误触发保护,导致系统频繁误停机。解决方案:
- 硬件滤波:在TZ输入引脚前端增加RC低通滤波电路,滤除高频噪声。时间常数需要仔细计算,既要滤除噪声,又不能影响对真实故障的响应速度。
- 软件去抖:虽然TZ是硬件动作,但可以在中断服务程序中加入简单的状态机或计数器,只有连续检测到多次故障才判定为真实故障,并执行系统级关机(如关闭使能信号)。但这只能防止软件误报,无法阻止硬件最初的强制动作。
- PCB布局:TZ走线应远离高频、大电流的开关节点,并采用包地或差分走线(如果可能)以减少耦合噪声。
2.4 高分辨率PWM模块:突破数字PWM的精度极限
当PWM频率升高时,传统PWM的分辨率会急剧下降。分辨率(比特数)计算公式为:分辨率(bit) = log2(PWM周期 / 系统时钟周期)。例如,在100MHz系统时钟下,产生一个100kHz的PWM,其周期有1000个时钟周期,分辨率约为log2(1000) ≈ 10位。但如果要产生1MHz的PWM,周期只有100个时钟,分辨率就降到约6.6位,这意味着占空比调节的步进将超过1%,在很多精密控制中是无法接受的。
HRPWM模块通过微边沿定位器(MEP)技术解决了这个问题。它能在一个系统时钟周期(Coarse Step)内,再进行最多255次细分(Fine Step),将时间分辨率提升到皮秒级(例如150ps)。
2.4.1 核心原理:CMPAHR寄存器
HRPWM通常只作用于EPWMxA通道(有些器件支持B通道)。其核心是一个8位的扩展寄存器CMPAHR。传统的16位CMPA寄存器决定了PWM边沿的“粗调”位置(在哪个系统时钟周期跳变),而CMPAHR寄存器则负责“微调”,决定在该系统时钟周期内的具体哪个“微步(MEP Step)”跳变。
占空比的高精度计算公式(以增计数模式为例):
- 计算目标时间:
目标时间 = 期望占空比 * PWM周期 (以秒为单位)。 - 转换为系统时钟周期数:
总周期数 = 目标时间 / T_SYSCLKOUT。 - 分离整数和小数部分:
CMPA = floor(总周期数)// 整数部分,写入16位CMPA寄存器。小数部分 = 总周期数 - CMPA。
- 计算MEP步数:
MEP步数 = 小数部分 * MEP比例因子。- MEP比例因子是关键:它表示一个系统时钟周期内包含多少个MEP步。这个值不是固定的,它与SYSCLKOUT频率和工艺有关,需要通过HRPWM模块的自校准逻辑或查表获得。TI的库函数通常提供了获取该因子的API(如
HRPWM_cal())。
- 写入CMPAHR:
CMPAHR = (MEP步数 << 8) + 0x80。这里的0x80(十进制128)是一个四舍五入的偏移量,用于提高精度。
2.4.2 配置模式与实战步骤
HRPWM有三种边沿控制模式,通过HRCNFG[EDGMODE]配置:
00:高分辨率模式禁用(传统PWM)。01:高分辨率仅作用于上升沿(MEP on Rising Edge)。用于占空比控制。10:高分辨率仅作用于下降沿(MEP on Falling Edge)。用于占空比控制。11:高分辨率作用于双边沿(MEP on Both Edges)。用于相位控制(如移相全桥)。
配置流程示例(占空比控制,上升沿高分辨率):
#include "hrpwm.h" // 使用TI的HRPWM库 // 1. 初始化ePWM模块为常规模式,设置频率、计数模式等。 InitEPwm1(); // 假设这个函数配置了TB, CC, AQ模块 // 2. 使能并配置HRPWM模块 EPwm1Regs.HRCNFG.bit.EDGMODE = HR_EDGMODE_RISING_EDGE; // 上升沿高分辨率 EPwm1Regs.HRCNFG.bit.CTLMODE = HR_CTLMODE_CMPA; // 由CMPAHR控制(占空比模式) EPwm1Regs.HRCNFG.bit.HRLOAD = HR_LOAD_CTR_ZERO; // 在CTR=0时加载影子寄存器(与CMPA同步) // 3. (关键!)运行HRPWM校准,获取当前SYSCLKOUT下的MEP比例因子。 // 这个函数会测量MEP步的实际时间,并更新内部比例因子。 HRPWM_cal(EPWM1_BASE); // 4. 使用高精度函数设置占空比 // 假设我们需要50.123%的占空比,PWM周期为1000个TBCLK(CMPA周期值=1000) float desired_duty = 0.50123; uint16_t tbprd = EPwm1Regs.TBPRD; uint32_t cmpahr_value = (uint32_t)(desired_duty * (float)tbprd * 256.0); // 计算扩展值 // 更规范的做法是使用TI提供的宏或函数,它会自动处理MEP比例因子和舍入。 // 例如:HRPWM_setCounterCompareValue(EPWM1_BASE, HRPWM_COUNTER_COMPARE_A, cmpahr_value); // 5. 分离高低位写入寄存器 EPwm1Regs.CMPA.half.CMPA = (uint16_t)(cmpahr_value >> 8); // 高16位给CMPA EPwm1Regs.CMPA.half.CMPAHR = (uint16_t)(cmpahr_value & 0xFF); // 低8位给CMPAHRHRPWM的“坑”:MEP范围与频率限制MEP的细分能力不是无限的。每个系统时钟周期内能插入的MEP步数(MEP比例因子)受限于硅工艺和时钟频率。在很高的SYSCLKOUT频率下,一个时钟周期很短,能容纳的MEP步数就少,高分辨率提升的效果会打折扣。TI的手册会给出一个类似“MEP Steps per SYSCLKOUT”的表格。务必确保你计算出的MEP步数小于���个最大值,否则精度会失效。此外,HRPWM功能在非常高的PWM频率下(例如接近SYSCLKOUT/2)可能无法使用。在设计高频电源时,需要仔细查阅芯片数据手册中HRPWM章节的频率-精度曲线。
3. 模块联动与系统级设计实战
在实际系统中,这些模块很少独立工作,而是协同运作。以一个典型的数字电源半桥LLC谐振变换器为例:
- 时基与比较模块:产生固定频率、可变占空比(或变频)的原始PWM脉冲。
- 死区模块:为半桥的上下管(EPWMxA和EPWMxB)插入精确的死区时间,防止直通。通常采用AHC模式。
- 故障保护模块:
- TZ1(CBC):连接电流采样比较器,实现初级侧峰值电流限制。一旦过流,立即关断当前周期,下个周期自动恢复。
- TZ2(OSHT):连接输出电压过压保护(OVP)电路或温度传感器。发生严重故障时,永久关断PWM,直到软件复位。
- PWM斩波模块:如果LLC的变压器驱动采用脉冲变压器隔离,则启用此模块,将PWM调制成高频脉冲串,并设置合适的单脉冲宽度和维持脉冲占空比,确保变压器磁平衡。
- 高分辨率PWM:在追求轻载高效率的变频控制中,使用HRPWM对频率或相位进行微调,可以实现更平滑的模式切换和更低的输出电压纹波。
- 事件触发模块:配置在计数器等于CMPA或CMPB时产生中断,用于在ADC采样窗口中心点触发ADC采样,实现精准的电流、电压反馈采样。
初始化顺序建议:
- 先配置GPIO MUX,将引脚功能切换到ePWM。
- 配置时基(TB)模块:设置时钟、周期、计数模式。
- 配置计数器比较(CC)模块:设置CMPA/CMPB初始值。
- 配置动作限定(AQ)模块:定义比较匹配时的输出动作。
- 配置死区(DB)模块:根据驱动芯片需求设置模式和延迟时间。
- 配置故障保护(TZ)模块:配置引脚、模式、动作,这是安全关键步骤,应尽早配置。
- (可选)配置PWM斩波(PC)模块。
- (可选)配置高分辨率PWM(HRPWM)模块并执行校准。
- 配置事件触发(ET)模块,使能所需中断。
- 最后,使能时基计数器(TBCTL[CTRMODE]),让PWM开始运行。
4. 调试技巧与常见问题排查
调试eHRPWM,尤其是多个模块联动时,逻辑分析仪或高端示波器是必不可少的。
4.1 死区时间不对或没有死区
- 检查DBCTL寄存器:确认
OUT_MODE是否为11(使能双边延迟)。POLSEL是否与驱动芯片逻辑匹配?IN_MODE是否是你期望的输入源? - 检查DBRED/DBFED值:确认写入的值是否正确。计算一下:
期望时间(ns) / TBCLK周期(ns)。确保结果没有超过10位寄存器最大值(1023)。 - 检查TBCLK频率:死区时间基于TBCLK,而非SYSCLKOUT。确认
TBCTL[HSPCLKDIV, CLKDIV]的分频设置是否正确。 - 示波器测量:用示波器同时测量EPWMxA和EPWMxB输出,使用上升沿/下降沿延时测量功能,确认死区时间是否符合预期。
4.2 故障保护不动作或误动作
- 确认TZ引脚电平:用万用表或示波器检查故障发生时,TZ引脚是否确实被拉低(低电平有效)。
- 检查TZSEL寄存器:确认你期望响应的TZn引脚是否已使能(
OSHTn或CBCn位为1)。 - 检查TZCTL寄存器:确认故障动作
TZA/TZB是否设置为你期望的状态(如高阻00)。 - 检查TZFLG标志位:在故障发生时,读取
TZFLG寄存器,看CBC或OST标志是否置位。这能区分是信号问题还是配置问题。 - 噪声问题:如果频繁误触发,检查TZ走线,增加硬件RC滤波(如1kΩ + 100pF),并考虑在软件中断中加入去抖逻辑。
4.3 PWM斩波输出异常(变压器发热、驱动不足)
- 确认PCCTL[CHPEN]已使能。
- 测量载波频率:用示波器测量EPWMxA输出,看是否出现了高频调制。频率应为
SYSCLKOUT / (CHPFREQ分频系数)。 - 检查单脉冲宽度:第一个脉冲是否明显宽于后续脉冲?宽度是否符合
8 * OSHTWTH * T_SYSCLKOUT的计算? - 检查维持脉冲占空比:后续脉冲的占空比是否与
CHPDUTY设置一致? - 变压器饱和:这是最隐蔽的问题。用电流探头观察变压器原边电流波形。如果电流波形在每个PWM周期结束时没有回到零附近,而是基线持续上升,说明磁芯正在累积直流偏磁,即将饱和。立即降低维持脉冲占空比(CHPDUTY),或者检查变压器驱动电路是否为双向励磁。
4.4 HRPWM精度达不到预期
- 运行校准函数:确保在系统时钟稳定后,调用了
HRPWM_cal()函数。该函数必须在PWM开始运行前调用。 - 检查MEP范围:计算你需要的MEP步数。确保
(期望的小数部分 * MEP比例因子) < 255。如果超过,说明你要求的精度超出了该SYSCLKOUT频率下HRPWM的能力,需要降低PWM频率或提高系统时钟。 - 确认控制模式:
HRCNFG[CTLMODE]设置是否正确?占空比控制用HR_CMPA,相位控制用HR_PHS。 - 影子寄存器加载点:
HRCNFG[HRLOAD]的设置是否与主CMPA寄存器的加载点(CMPCTL[LOADAMODE])一致?通常都设置为在CTR=0时加载。
4.5 软件强制与调试善用TZFRC(强制故障)和ETFRC(强制事件)寄存器。你可以在调试时,通过软件模拟一个故障或事件,而不需要真的制造一个硬件故障,这能非常安全地验证你的保护逻辑和中断服务程序是否正确。
最后,也是最关键的一点:在给功率部分上高压电之前,务必在低压、小电流(甚至断开功率部分)的情况下,用示波器完整地验证所有PWM波形、死区、保护响应逻辑。将硬件保护作为最后防线,但不要依赖它来弥补设计缺陷。eHRPWM的这些高级功能是强大的工具,理解其原理并谨慎配置,才能构建出坚固可靠的电力电子系统。