深入解析TI C2000 ePWM高级功能:斩波、故障保护与数字比较实战指南

1. 项目概述与核心价值

在电力电子和电机驱动的世界里,PWM(脉冲宽度调制)技术是当之无愧的基石。无论是驱动一台伺服电机精准旋转,还是将直流电高效地转换为交流电,其背后都离不开对开关器件(如MOSFET、IGBT)通断节奏的精确控制。然而,一个稳定、高效、安全的系统,远不止生成一个简单的方波那么简单。它需要应对栅极驱动的特殊需求、需要在纳秒级响应过流故障、更需要能根据实时反馈(如电流采样)动态调整行为。这正是德州仪器(TI)C2000系列微控制器中增强型PWM(ePWM)模块大显身手的地方。

今天,我们不谈基础的PWM生成,那是入门课。我们要深入的是ePWM模块里那些真正体现其“增强型”实力的高级子模块:PWM斩波(PC)、故障保护(TZ)和数字比较(DC)。如果你正在设计伺服驱动器、数字电源、光伏逆变器或任何对可靠性和动态性能有苛刻要求的系统,理解这三个功能,就如同掌握了控制系统的“安全气囊”和“神经反射弧”。PWM斩波能优化你的栅极驱动电路,让功率开关更可靠地导通与关断;故障保护模块能在硬件层面实现微秒甚至纳秒级的故障响应,防止炸管;而数字比较模块则将外部模拟信号(如电流比较器输出)直接转化为PWM的控制事件,构建起高速的硬件保护环。接下来,我将结合手册原理和实际工程调参经验,为你拆解这些功能的运作机制、配置要点以及那些数据手册上不会写的“避坑指南”。

2. PWM斩波(PC)子模块:不只是“斩波”,更是驱动优化器

很多人一看到“斩波”,可能首先想到的是改变PWM频率或电压。但在ePWM的语境下,PWM斩波子模块(PWM Chopper)服务于一个更专一且关键的目标:优化基于脉冲变压器的隔离栅极驱动电路

2.1 为什么需要PWM斩波?

在高压、高边驱动或需要电气隔离的场景中,我们常使用脉冲变压器来驱动功率开关的栅极。变压器有其磁特性,比如磁通饱和。如果施加一个长时间的单向直流脉冲,变压器会饱和,导致次级失去驱动能力,开关管可能进入线性区而过热损坏。

PWM斩波模块的解决方案很巧妙:它将原始的PWM波(EPWMxA)转换成一串高频的“斩波”脉冲序列。第一个脉冲(单次脉冲)用于建立磁通,其宽度可编程;后续的“维持脉冲”用于在PWM导通期间维持栅极电压,其占空比也可编程。这样,变压器磁芯始终在正负交替的磁化中工作,避免了饱和。

2.2 单次脉冲宽度(One-Shot Pulse)编程详解

单次脉冲的宽度是设计的起点,它决定了变压器初始磁化的能量。其计算公式为:T1stpulse = TEPWMCLK × 8 × OSHTWTH

  • TEPWMCLK:这是ePWM模块的系统时钟周期。例如,当EPWMCLK = 80MHz时,TEPWMCLK = 1 / 80MHz = 12.5 ns
  • OSHTWTH:这是一个4位控制寄存器字段(PCCTL[OSHTWTH]),取值范围是1到16(编程值0对应宽度1,F对应16)。注意,手册中的表格(Table 18-11)列出的OSHTWTH是十六进制值,其对应的脉冲宽度是(OSHTWTH值 + 1) * 100 ns。例如,OSHTWTH = 0x4,则脉冲宽度 = (4+1) * 100ns = 500ns。

实操心得:如何确定OSHTWTH值?这个值需要根据你的脉冲变压器参数和开关管栅极电荷来定。一个实用的方法是:先用一个较小的值(如200-300ns)开始测试,用示波器观察变压器次级输出的栅极电压上升沿。如果上升沿太缓,说明初始驱动能量不足,应增大OSHTWTH。如果上升沿已经很陡,则可以尝试减小该值以降低开关损耗。目标是找到一个在满载和最坏情况下都能使栅极电压快速、稳定达到平台值的最小脉宽。

2.3 维持脉冲占空比(Duty Cycle Control)配置精要

单次脉冲之后,便是维持脉冲序列。其频率由PCCTL[CHPFREQ]位控制的分频器决定,而占空比则由PCCTL[CHPDUTY]位控制,提供从12.5%到87.5%共7个可选档位(1/8 到 7/8)。

维持脉冲的占空比直接影响变压器次级电压的平均值,进而影响栅极的维持电流。占空比太低,可能无法在高温或高米勒电容情况下维持栅极电压;占空比太高,又会增加变压器和驱动电路的损耗。

配置避坑指南:

  1. 频率选择CHPFREQ决定了斩波频率。频率太高,开关损耗大;频率太低,可能无法有效抑制变压器饱和。通常建议设置在200kHz到1MHz之间,需权衡损耗和磁芯尺寸。
  2. 占空比与死区时间:务必注意!斩波模块输出的高频脉冲序列,其高电平和低电平时间都会受到CHPDUTY影响。如果你的主PWM信号占空比本身已经很大(例如95%),而斩波占空比也设得很高(如87.5%),那么在一个PWM周期内,维持脉冲的“低电平”时间会非常短。这可能导致用于关断的下拉MOSFET没有足够的时间来完全泄放栅极电荷,造成关断迟缓。因此,在高占空比应用中,需要适当降低CHPDUTY,或确保你的栅极驱动电路的下拉能力足够强。
  3. 使能与旁路PCCTL[CHPEN]位用于使能整个斩波模块。在调试初期,或不需要隔离驱动的应用中,可以将其关闭(置0),此时EPWMxA信号将直接旁路通过,便于基础PWM功能的验证。

下图简化的波形有助于理解斩波动作:

PSCLK (斩波时钟) : |______| |______| |______| EPWMxA (原始输入) : |----------------------------|________ EPWMxA (斩波输出) : |_| |_| |_| |_| |_| |_| |_| |________ ↑单次脉冲 ↑维持脉冲序列

注:此图为示意,实际维持脉冲频率更高

3. 故障保护(TZ)子模块:系统的硬件“急停按钮”

故障保护,或称故障区(Trip-Zone)子模块,是ePWM的安全核心。它允许外部故障信号直接、快速地干预PWM输出,无需CPU干预,实现了硬件级的保护。

3.1 故障信号来源与映射

ePWM模块可以接收多达6路故障信号(TZ1至TZ6):

  • TZ1, TZ2, TZ3:来自GPIO复用引脚,通常连接硬件比较器、过流检测芯片或温度传感器的输出。
  • TZ4:来自EQEP模块的错误信号(如编码器断线错误),经反向后输入。
  • TZ5:连接到系统时钟失效逻辑。如果系统时钟丢失,此信号会触发,防止PWM输出乱飞。
  • TZ6:来自CPU的EMUSTOP信号,通常在仿真器暂停或严重系统错误时触发。

通过TZSEL寄存器,你可以灵活地为每个ePWM模块选择监听哪些故障源。例如,ePWM1可以只响应TZ1和TZ5,而ePWM2响应TZ2和TZ3。

3.2 两种保护模式:单次触发(OSHT)与逐周期(CBC)

这是故障保护的精髓,应对不同性质的故障:

  • 逐周期保护(Cycle-By-Cycle, CBC)

    • 行为:当CBC故障事件发生时,ePWM输出立即采取预设动作(如拉低),但仅持续当前PWM周期。如果下一个PWM周期开始时故障信号已消失,则PWM输出自动恢复正常。
    • 应用场景峰值电流限制。这是最常见的应用。当电流采样值超过设定阈值时,故障信号有效,PWM立即关断以限流。下个周期重新开始。这实现了类似“打嗝”式的连续保护。
    • 寄存器配置:使用TZSEL[CBCn]使能对应故障源为CBC模式。动作由TZCTL[TZA/TZB]配置。清除方式为自动清除(当故障信号消失,并在下一个PWM周期开始时复位)。
  • 单次触发保护(One-Shot Trip, OSHT)

    • 行为��当OSHT故障事件发生时,ePWM输出立即采取预设动作(如拉低或高阻),并且此状态将被锁存,直到软件手动清除TZCLR[OST]位。
    • 应用场景严重故障,如短路、过压、过热。这些故障需要系统彻底关断并等待人工干预或软件完成复杂故障处理流程后才能恢复。
    • 寄存器配置:使用TZSEL[OSHTn]使能对应故障源为OSHT模式。动作同样由TZCTL配置。清除需软件写TZCLR[OST]=1

核心经验:动作配置的“方向感知”从TMS320F28004x开始,ePWM的故障动作支持更精细的“方向感知”控制。通过TZCTL2TZCTLDCATZCTLDCB寄存器,你可以分别配置在计数器递增(Up)和递减(Down)阶段,发生故障时输出采取的不同动作。这有什么用?想象一个峰值电流模式控制:我们可能只希望在计数器递增阶段(电流上升阶段)进行CBC限流,而在递减阶段(电流下降阶段)则忽略该故障或采取其他动作。这为实现更复杂的控制算法提供了硬件支持。要使能此功能,必须设置TZCTL2[ETZE] = 1

3.3 故障响应动作与配置示例

当故障发生时,每个PWM输出通道(EPWMxA和EPWMxB)可以独立配置为以下四种动作之一(通过TZCTL的2个位域):

  • 00:高阻态(High-Impedance)。这是最安全的关断方式,常用于半桥或全桥,防止上下管直通。
  • 01:强制输出高(Force to High)。
  • 10:强制输出低(Force to Low)。这是最常见的关断动作。
  • 11:无动作(No Change)。用于忽略某些非关键故障源。

配置示例解析(对应手册Example 18-1):

假设系统有两个功率桥臂,分别由ePWM1A/B和ePWM2A/B驱动。我们设计如下保护策略:

  1. TZ1(严重过流):触发OSHT保护,让两个桥臂都进入安全状态(ePWM1拉低,ePWM2高阻)。
  2. TZ5(轻微过流/限流):触发CBC保护,仅限制ePWM1的电流。

ePWM1配置:

  • TZSEL[OSHT1] = 1:使能TZ1为OSHT源。
  • TZSEL[CBC5] = 1:使能TZ5为CBC源。
  • TZCTL[TZA] = 2(0b10):TZA动作配置为“强制低”。
  • TZCTL[TZB] = 2(0b10):TZB动作配置为“强制低”。 这意味着,无论TZ1(OSHT)还是TZ5(CBC)触发,ePWM1A和1B都会被拉低。

ePWM2配置:

  • TZSEL[OSHT1] = 1:使能TZ1为OSHT源。(注意:ePWM2不关心TZ5)
  • TZCTL[TZA] = 0(0b00):TZA动作配置为“高阻态”。
  • TZCTL[TZB] = 3(0b11):TZB动作配置为“无变化”。 这意味着,当TZ1触发时,ePWM2A变为高阻(安全关断),而ePWM2B不受影响(可能因为它控制的是一个不关键的电路)。

关键警告(来自手册Note): 在配置GPIO和输入X-BAR/EPWM X-BAR时,更改输入选择可能会导致意外故障事件。因此,务必遵循以下顺序:

  1. 在使能ePWM故障保护(即配置TZSEL之前,先完成GPIO和X-BAR的输入配置。
  2. 如果必须在ePWM故障保护使能后更改X-BAR配置,必须先清除TZSEL寄存器(禁用所有故障源),更改X-BAR配置,最后再重新配置TZSEL。这个顺序错误是导致系统异常触发保护的常见原因。

4. 数字比较(DC)子模块:连接模拟与数字世界的桥梁

数字比较子模块是ePWM与片上模拟比较器(CMPSS)或其他数字信号联动的枢纽。它不直接生成PWM,而是将外部信号(主要是模拟比较器的数字输出)转化为可以触发ePWM内部动作(Trip或Event)的事件。

4.1 核心功能与信号流

DC模块的核心输入是四组信号:

  • DCAH / DCAL:数字比较A的高电平有效和低电平有效信号。
  • DCBH / DCBL:数字比较B的高电平有效和低电平有效信号。

这些信号的来源通过DCTRIPSEL寄存器灵活选择,可以是:

  • 直接的Trip输入引脚(TZ1, TZ2, TZ3)。
  • 来自模拟比较器子系统(CMPSS)的输出。
  • 来自EPWM X-BAR的其他内部信号(如其他ePWM的故障信号)。
  • 甚至是一些系统错误信号(如ECC错误、PIE向量错误)。

这些输入信号经过组合逻辑(在DCAHTRIPSEL等寄存器中配置)后,生成最终的事件信号:DCAEVT1,DCAEVT2,DCBEVT1,DCBEVT2。这些事件可以直接作为故障源送入TZ子模块,也可以作为SOC(Start of Conversion)触发源送入ET子模块,还可以作为同步信号送给TB子模块。

4.2 消隐窗口(Blanking Window):抗干扰利器

在电机控制或电源中,功率器件开关瞬间会产生巨大的电压电流尖峰和噪声,可能误触发比较器。DC模块内置的消隐窗口功能就是为了过滤掉这些干扰脉冲。

其原理是:在PWM开关事件(如计数器等于0或等于CMPC/CMPD时)前后的一段时间内,强制忽略DCAH/L和DCBH/L信号的变化。这段时间就是“消隐窗口”,其起始点和宽度可以通过DCBLANKDCFOFFSET等寄存器进行精确编程。

调试技巧:设置消隐窗口假设你的MOSFET在开通后200ns内会产生严重的开关噪声。你可以将消隐窗口设置为从PWM周期开始(CTR=0)后的0ns开始,持续250ns。这样,在这250ns内,无论比较器输出如何跳变,都不会产生DC事件,完美避开了噪声区。具体设置需要根据你的硬件布局和开关速度用示波器仔细测量确定。

4.3 高级应用:利用CMPSS实现逐周期峰值电流保护

这是数字比较子模块最经典的应用之一。我们将电流采样信号接入CMPSS的比较器,当电流超过设定阈值时,CMPSS输出变高。这个输出通过X-BAR路由到ePWM的DCAH输入。

配置步骤:

  1. 信号路由:在DCTRIPSEL寄存器中,将DCAH的来源选择为对应的CMPSS输出(例如CMPSS1.COMPH)。
  2. 事件生成:配置TZDCSEL寄存器,定义当DCAH为高时,产生DCAEVT2事件(用于CBC保护)。
  3. 故障关联:在TZSEL寄存器中,使能DCAEVT2作为该ePWM模块的CBC故障源。
  4. 动作配置:在TZCTL中配置当CBC故障发生时,PWM输出强制为低。
  5. 消隐设置:根据开关噪声情况,配置DCBLANK寄存器,在开关瞬间屏蔽误触发。

完成以上配置后,就构建了一个纯硬件的峰值电流保护环。电流超限 → CMPSS翻转 → DCAEVT2事件 → ePWM立即拉低输出。整个响应链路在几十纳秒内完成,远超软件中断的响应速度,极大地提升了系统的可靠性。

重要提醒:防止故障事件跨周期残留手册第18.11.3节专门警告了这个问题。由于CMPSS的数字滤波器或ePWM DC模块本身的消隐/滤波会引入延迟(N个时钟周期),如果一个故障信号在PWM周期末尾才出现,并持续到下一个周期开始,它可能会在下一个周期一开始就立即触发保护,导致系统无法正常启动。解决方案

  • 设计规避:确保故障信号在周期结束前N个周期内已恢复。
  • 使用消隐窗口:在周期结束前至少2个时钟周期开启消隐,并持续到下一个周期开始后至少N个周期。
  • 使用锁存与清除:如果使用CMPSS的锁存(Latch)功能,需要在每个PWM周期结束前至少N个时钟周期,通过软件(COMPSTSCLR)或硬件事件(如利用HRPCTL在CMPC/CMPD匹配时产生PWMSYNCPER信号)来清除锁存器。这确保了每个周期都是从“干净”的状态开始。

5. 事件触发(ET)子模块:精准的定时与同步引擎

事件触发子模块是ePWM模块的“计时员”和“发令员”。它负责管理由时基(TB)、计数比较(CC)和数字比较(DC)子模块产生的各种事件,并以可编程的分频频率,产生中断(INT)和ADC启动转换(SOC)信号。

5.1 中断与SOC事件源

ET模块可以监控多种事件来触发中断或启动ADC:

  • 时基事件CTR = 0,CTR = PRD(周期匹配)。
  • 计数比较事件CTR = CMPA,CTR = CMPB,CTR = CMPC,CTR = CMPD。并且可以区分计数器递增(Up)和递减(Down)阶段。
  • 数字比较事件DCAEVT1.soc,DCBEVT1.soc

通过ETSEL[INTSEL]ETSEL[SOCASEL]等寄存器,你可以为中断和SOC选择不同的事件源。例如,可以用CTR=CMPA触发中断进行软件计算,同时用CTR=0触发SOCA启动电流采样。

5.2 事件分频与计数器初始化

这是ET模块的灵活之处。你不需要每个PWM事件都产生中断或启动ADC,那样会给CPU或ADC带来太大负担。

  • 分频设置:通过ETPS[INTPRD]ETSOCPS[SOCAPRD]等寄存器,可以设置“每N个事件触发一次”。例如,设置INTPRD = 2,则每2次CTR=PRD事件才会产生一次中断。
  • 增强分频ETINTPSETSOCPS寄存器提供了更精细的控制,支持最多每15个事件触发一次(INTPRD2最大值为15)。
  • 计数器初始化ETCNTINITETCNTINITCTL寄存器允许你在特定的同步事件(EPWMxSYNCI)或软件强制下,将中断或SOC的事件计数器初始化为一个预设值。这在多ePWM模块同步且需要错相触发ADC采样的系统中非常有用。例如,你可以让ePWM2的SOC计数器在收到同步信号后,从5开始计数,这样它的ADC启动就会比ePWM1晚5个事件周期。

5.3 典型应用:交错并联PWM的ADC采样同步

在多相交错并联的DC-DC变换器中,各相的PWM需要错相180°/N度,同时ADC采样也需要在各自相位的特定时刻(如PWM波形的中点)进行。

实现方案:

  1. 时基同步:将主ePWM1的EPWMxSYNCO输出连接到从ePWM2的EPWMxSYNCI输入,并配置从模块的相位偏移(TBPHS),实现PWM波形错相。
  2. SOC触发:在每个ePWM模块中,配置ET模块,选择CTR=CMPA(假设CMPA设置在了PWM周期中点)作为SOCA事件源。
  3. 错相采样:在从模块ePWM2中,使能ETCNTINITCTL[SOCAINITEN],并设置ETCNTINIT[SOCAINIT]为一个非零值(例如,对应半个事件周期的计数值)。同时,配置ETCNTINITCTL[SOCAINITFRC]由同步事件(EPWMxSYNCI)触发初始化。
  4. 结果:当同步事件发生时,ePWM2的SOC事件计数器被初始化为设定值。因此,尽管两个模块都在自己的CTR=CMPA时刻“想要”触发SOC,但ePWM2的计数器需要更长时间才能达到周期值,从而实现了ADC采样时刻的精确错相。

6. 实战配置流程与常见问题排查

理解了原理,最终要落到代码和寄存器配置上。以下是一个基于C2000 DriverLib库函数的典型配置流程框架,以及常见问题的排查思路。

6.1 综合配置流程示例(以峰值电流保护为例)

假设我们要配置ePWM1模块,实现基于CMPSS1的逐周期峰值电流保护,并在每个PWM周期中点触发ADC采样。

// 1. 初始化 ePWM1 时基 (TB) 模块 EPWM_setTimeBasePeriod(EPWM1_BASE, 1000); // 设置周期值 EPWM_setPhaseShift(EPWM1_BASE, 0); EPWM_setTimeBaseCounter(EPWM1_BASE, 0); EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_UP_DOWN); // 上下计数模式 EPWM_setClockPrescaler(EPWM1_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1); // 2. 初始化比较器 (CC) 模块 EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, 500); // 设置占空比50%,也是ADC采样点 EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_B, 0); // 可能用于其他用途 // 3. 配置动作限定器 (AQ) 模块,生成对称PWM EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMER_ZERO); EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMER_COMPARE_A_UP); // ... 类似配置EPWMxB,形成互补对称PWM // 4. 配置数字比较 (DC) 和故障保护 (TZ) // 4.1 选择故障信号源:将CMPSS1输出映射到DCAH EPWM_selectDigitalCompareTripInput(EPWM1_BASE, EPWM_DC_TRIP_TRIPIN1, EPWM_DC_TRIP_INPUT_CMPSS1); EPWM_setDigitalCompareTripInputSignal(EPWM1_BASE, EPWM_DC_TYPE_DCAH, EPWM_DC_TRIP_TRIPIN1); // 4.2 配置消隐窗口(假设开关噪声持续约200ns) uint16_t blanking_clocks = (uint16_t)(200.0e-9 * DEVICE_SYSCLK_FREQ); // 计算对应时钟周期数 EPWM_setDigitalCompareBlankingWindow(EPWM1_BASE, EPWM_DC_COMBINATION_BLANKING, 0, blanking_clocks); EPWM_setDigitalCompareBlankingEvent(EPWM1_BASE, EPWM_DC_EVENT_1, EPWM_DC_BLANKING_EVENT_CTR_ZERO); // 从计数器为零开始消隐 // 4.3 配置数字比较事件:DCAH高 -> 生成DCAEVT2事件 EPWM_setDigitalCompareEventSource(EPWM1_BASE, EPWM_DC_MODULE_A, EPWM_DC_EVENT_2, EPWM_DC_EVENT_SOURCE_DCAH_HIGH); // 4.4 配置故障区:将DCAEVT2事件作为CBC故障源,并设置动作为强制低 EPWM_enableTripZoneSignals(EPWM1_BASE, EPWM_TZ_SIGNAL_DCAEVT2, EPWM_TZ_ACTION_CBC); EPWM_setTripZoneAction(EPWM1_BASE, EPWM_TZ_ACTION_EVENT_DCAEVT2, EPWM_TZ_OUTPUT_A, EPWM_TZ_ACTION_FORCE_LOW); EPWM_setTripZoneAction(EPWM1_BASE, EPWM_TZ_ACTION_EVENT_DCAEVT2, EPWM_TZ_OUTPUT_B, EPWM_TZ_ACTION_FORCE_LOW); // 5. 配置事件触发 (ET) 模块,在CTR=CMPA时触发ADC SOC EPWM_setInterruptSource(EPWM1_BASE, EPWM_INT_TBCTR_ZERO); // 中断源可以另设,例如用于软件保护 EPWM_enableADCTrigger(EPWM1_BASE, EPWM_SOC_A); EPWM_setADCTriggerSource(EPWM1_BASE, EPWM_SOC_A, EPWM_SOC_TBCTR_U_CMPA); // 在递增计数且CTR=CMPA时触发 EPWM_setADCTriggerEventPrescale(EPWM1_BASE, EPWM_SOC_A, 1); // 每个事件都触发 // 6. 使能ePWM模块 // 注意:使能TZ保护应在所有GPIO/X-BAR配置完成后最后进行

6.2 常见问题与排查技巧实录

问题1:配置了故障保护,但故障发生时PWM输出无反应。

  • 排查步骤
    1. 检查信号通路:用示波器测量故障输入引脚(如TZ1)的电平,确认故障信号确实到达了MCU引脚,并且极性(低有效)正确。
    2. 检查GPIO复用:确认该引脚已正确配置为ePWM故障输入功能,而非普通的GPIO。
    3. 检查X-BAR配置:如果故障源来自内部(如CMPSS),务必检查INPUTXSELECT和DCTRIPSEL寄存器的配置,信号是否被正确路由到ePWM模块。
    4. 检查TZSEL寄存器:用调试器读取TZSEL寄存器,确认你期望的故障源(例如CBC5DCAEVT1)的使能位确实被置1。
    5. 检查动作配置:读取TZCTL寄存器,确认为对应故障事件配置的输出动作不是“无变化(11)”。
    6. 检查异步路径:故障保护有异步路径以确保即使时钟失效也能动作。但如果系统时钟正常,故障信号脉宽必须大于3个TBCLK周期才能被锁存。检查你的故障信号脉宽是否足够。

问题2:使用CMPSS进行逐周期限流,但偶尔会在新的PWM周期开始时误触发。

  • 这就是手册18.11.3节提到的“跨周期残留”问题。
  • 解决方案
    1. 启用并合理设置消隐窗口:在PWM开关时刻附近设置消隐,屏蔽噪声。确保消隐窗口覆盖了开关噪声期,并在周期结束前足够早地关闭(或确保故障信号在消隐结束后已稳定为无效状态)。
    2. 使用CMPSS锁存并手动清除:配置CMPSS使用锁存模式,并在每个PWM周期结束前(例如在CTR=PRD的中断服务程序中),通过写COMPSTSCLR寄存器来清除锁存器。这确保了每个周期都是从“无故障”状态开始。
    3. 调整电流环参数:检查你的电流环控制器,确保不会在周期末尾产生一个使电流急剧上升的指令,从而导致比较器在周期末临界点触发。

问题3:PWM斩波功能使能后,驱动变压器发热严重或栅极波形畸变。

  • 排查步骤
    1. 测量斩波波形:用示波器高频档直接测量EPWMxA输出引脚,观察斩波后的脉冲序列是否正常。第一个单次脉冲宽度是否明显?维持脉冲的幅值和频率是否正确?
    2. 调整单次脉冲宽度:如果变压器次级栅极电压上升缓慢,尝试增大OSHTWTH。如果上升沿已经很陡,尝试减小它以降低损耗。
    3. 调整维持脉冲占空比:如果栅极电压在导通期间无法维持稳定平台(有跌落),尝试增大CHPDUTY。如果变压器和驱动芯片明显发热,尝试减小CHPDUTY
    4. 检查死区时间兼容性:如果使用了死区模块(DB),确保死区时间与斩波脉冲的最小低电平时间兼容。极端情况下,斩波的低电平可能被死区进一步拉宽,导致有效驱动时间不足。

问题4:ADC SOC触发时刻不准确或丢失。

  • 排查步骤
    1. 确认事件源:检查ETSEL[SOCASEL]寄存器,确认SOC触发事件是你期望的(例如CTR=CMPA)。
    2. 检查比较值:确认CMPA寄存器的值在你期望的计数点(例如周期中点)。
    3. 检查分频设置:确认ETPS[SOCAPRD]没有设置为0(禁用)或太大的值(导致不触发)。
    4. 检查计数器模式:如果你选择的是CTRU=CMPA(递增时匹配),但计数器工作在递减模式,事件将不会发生。确保事件选择与计数器方向匹配,或选择不分方向的事件(如CTR=CMPA)。
    5. 使用ETFLG寄存器调试:使能SOC后,监控ETFLG[SOCA]标志位。如果该标志位能置位,说明ET模块内部已产生触发脉冲。问题可能出在ePWM到ADC模块的连接或ADC本身的配置上。如果该标志位不置位,则问题在ET模块配置本身。

通过以上从原理到实践,从配置到排查的完整梳理,ePWM模块的这三个高级子模块不再是数据手册里冰冷的框图和数据,而是你手中构建高可靠性、高性能电力电子系统的强大工具。记住,所有的配置最终都要服务于具体的硬件电路和控制目标,结合示波器观察关键节点的波形,进行耐心细致的调试,是掌握这些复杂功能的唯一捷径。