1. 深入解析ePWM模块:从PWM斩波到故障保护与数字比较
在电机驱动、数字电源或者任何需要精密功率控制的嵌入式系统里,PWM(脉冲宽度调制)是核心的执行语言。但很多时候,标准的PWM输出就像一把只有“开”和“关”两种状态的钝刀,面对复杂的实际工况,比如驱动脉冲变压器栅极、应对瞬间过流故障,或者需要根据模拟量实时调整开关逻辑时,就显得力不从心了。
德州仪器(TI)C2000系列微控制器中的增强型PWM(ePWM)模块,正是为了解决这些高级需求而设计的。它不仅仅是一个简单的定时器比较输出,而是一个集成了时间基准、动作限定、死区控制、故障保护、事件触发和数字比较等多个子模块的精密控制系统。今天,我们就抛开手册上那些冰冷的框图,从一个实际开发者的角度,深入聊聊ePWM里三个非常关键但又容易让人困惑的高级功能:PWM斩波(PC)、故障保护(Trip-Zone, TZ)和数字比较(DC)。理解它们,你才能真正玩转高性能的实时控制。
1.1 为什么需要这些高级功能?
在动手配置寄存器之前,我们得先明白为什么要用它们。想象一下你在设计一个电机驱动器:
PWM斩波(PC):当你使用隔离型的脉冲变压器来驱动高压侧的IGBT或SiC MOSFET栅极时,直接施加一个长周期的PWM方波会导致变压器磁芯饱和,失去驱动能力。PWM斩波功能能将一个长脉冲“切碎”成一系列高频短脉冲,既能传递能量维持栅极电压,又能通过调节第一个脉冲的宽度和后续脉冲的占空比来优化变压器的磁化过程,防止饱和。这是保障驱动可靠性的底层细节。
故障保护(Trip-Zone, TZ):系统运行时,过流、过压、过热等故障随时可能发生。这些故障信号需要以最短的路径、最低的延迟去关断PWM输出,保护功率器件。TZ子模块就是这条“紧急制动”通道。它支持多种触发源(如GPIO引脚、比较器错误、时钟失效等)和多种响应模式(单次触发、逐周期限流),并能强制将PWM输出置为高、低或高阻态。这是系统安全的生命线。
数字比较(DC):传统的PWM动作(如置高、置低)通常只依赖于时间基准计数器(TBCTR)与比较寄存器(CMPA/CMPB)的匹配。但在峰值电流控制等高级算法中,你需要在电流采样值(通过ADC转换为数字量,或直接来自模拟比较器)超过某个阈值的瞬间,立即改变PWM状态。DC子模块就是将外部模拟比较器(CMPSS)的数字输出信号,直接引入到PWM动作决策逻辑的核心桥梁,实现了模拟信号到PWM行为的超低延迟联动。
理解了这些应用场景,我们再去看手册里的寄存器描述,就不再是一堆抽象的位域,而是一个个为解决实际问题而设计的工具。
2. PWM斩波(PC)子模块:精细化的栅极驱动艺术
PWM斩波子模块,常被用于驱动脉冲变压器门极驱动电路。它的核心任务不是改变主PWM波的频率和占空比,而是对最终输出的EPWMxA和EPWMxB信号进行“二次加工”,将其转换成更适合变压器传输的脉冲串。
2.1 工作原理与信号流
斩波模块位于ePWM信号链的末端,在动作限定器(AQ)和死区发生器(DB)之后。它接收原始的EPWMxA/B信号,并对其进行调制。
其工作流程可以拆解为以下几个关键环节,参考手册中的图17-38,其逻辑如下:
- 时钟与使能:模块由系统时钟
EPWMCLK驱动。PCCTL[CHPEN]位是总开关,置1使能斩波功能。 - 第一脉冲(One-Shot)生成:当输入信号
EPWMxA/B出现上升沿(即PWM周期开始)时,会触发一个宽度可编程的“第一脉冲”。这个脉冲的宽度由PCCTL[OSHTWTH](4位)控制,计算公式为:T1stpulse = T_EPWMCLK × 8 × OSHTWTH其中T_EPWMCLK是系统时钟周期。例如,当EPWMCLK=80MHz(周期12.5ns),OSHTWTH=4时,第一脉冲宽度为12.5ns × 8 × 4 = 400ns。这个较宽的第一个脉冲用于在变压器次级建立初始的、足够强度的栅极电压。 - 持续脉冲(Sustaining Pulses)生成:第一脉冲结束后,模块会生成一系列高频的“持续脉冲”,直到输入信号
EPWMxA/B变为低电平(PWM周期结束)。这些脉冲的作用是在PWM导通期间,持续为变压器的励磁电感补充能量,维持栅极电压稳定。 - 持续脉冲的占空比控制:持续脉冲的占空比(高电平时间与脉冲周期的比值)是可编程的,由
PCCTL[CHPDUTY](3位)控制,提供从12.5%到87.5%共7个选项。选择合适的占空比可以优化变压器的伏秒积,避免磁芯饱和。 - 斩波频率设置:持续脉冲的频率由
PCCTL[CHPFREQ](3位)控制,它实际上是对EPWMCLK进行分频。分频系数可选1、2、3…等,从而得到不同频率的斩波时钟PSCLK。PSCLK直接决定了持续脉冲的频率。
注意:斩波功能通常只应用于需要隔离驱动的桥臂上管。对于下管或低侧驱动,直接使用原始的PWM信号即可。因此,在配置时,需要仔细规划哪个ePWM通道启用斩波。
2.2 关键配置与计算实例
假设我们要为一个开关频率为20kHz的电机驱动器配置上管栅极驱动斩波。系统时钟EPWMCLK = 100 MHz(周期10ns)。
- 确定斩波频率:通常斩波频率选择在几百kHz到几MHz之间,太高会增加开关损耗,太低则可能无法维持栅极电压。我们选择
CHPFREQ=2,即对EPWMCLK进行2分频,得到斩波时钟PSCLK = 50 MHz(周期20ns)。 - 设定第一脉冲宽度:我们希望第一个脉冲有足够能量建立栅极电压。设
OSHTWTH = 8。则第一脉冲宽度T1stpulse = 10ns × 8 × 8 = 640ns。 - 设定持续脉冲占空比:为了防止脉冲变压器饱和,通常选择一个适中的占空比,例如50%。查表或计算可知,
CHPDUTY = 3(二进制011)对应4/8,即50%占空比。 - 寄存器配置代码片段(C语言):
配置完成后,原本一个完整的20kHz PWM波,在输出端就会变成以一个640ns宽脉冲开头,后跟一系列50MHz(周期20ns)、占空比50%的高频脉冲串,直到PWM周期结束。// 假设使用 ePWM1A 通道进行斩波 EPwm1Regs.PCCTL.bit.CHPEN = 1; // 使能斩波器 EPwm1Regs.PCCTL.bit.OSHTWTH = 0x8; // 第一脉冲宽度控制字:8 EPwm1Regs.PCCTL.bit.CHPDUTY = 0x3; // 持续脉冲占空比:50% (4/8) EPwm1Regs.PCCTL.bit.CHPFREQ = 0x2; // 斩波时钟分频:2分频 (PSCLK = EPWMCLK/2)
2.3 实操心得与避坑指南
- 示波器观察是关键:配置完斩波参数后,务必用示波器同时观察原始的PWM信号(可在动作限定器后、斩波器前的内部测试点模拟输出)和最终的
EPWMxA输出。确认第一脉冲宽度、持续脉冲频率和占空比是否符合预期。 - 磁芯饱和的权衡:如果持续脉冲占空比过高(如87.5%),虽然维持电压的能力强,但变压器磁芯更容易朝单方向饱和。占空比过低(如12.5%)又可能无法维持足够的栅极电荷。通常需要在实际电路中进行测试,观察栅极电压波形是否在PWM导通期间保持平坦稳定,来调整
CHPDUTY值。 - 与死区时间的协调:斩波发生在死区插入之后。这意味着死区时间内,
EPWMxA和EPWMxB均为低电平,斩波器不工作。这符合预期,因为死区期间桥臂上下管都应关闭。无需特别协调,但需理解这个顺序。
3. 故障保护(Trip-Zone)子模块:系统的紧急制动系统
TZ子模块是ePWM的安全卫士。它监控多达6个外部故障输入(TZ1~TZ6)以及来自数字比较子模块的内部事件,并在故障发生时,以硬件级别的速度对PWM输出采取强制措施。
3.1 故障输入源与映射
每个ePWM模块都可以独立选择响应哪些故障源。故障源非常丰富:
TZ1~TZ3:来自GPIO引脚,通常连接硬件过流、过压保护电路的输出。TZ4:来自正交编码器(eQEP)的错误信号,用于电机失步等故障。TZ5:连接系统时钟失效逻辑,当检测到时钟故障时触发。TZ6:连接CPU的EMUSTOP信号,在仿真器暂停时安全关断PWM。DCAEVT1/2,DCBEVT1/2:来自数字比较子模块的内部事件,可以实现基于模拟比较结果的快速保护。
通过配置TZSEL寄存器,你可以像搭积木一样,为当前ePWM模块选择需要监控的故障源。例如,你可以让ePWM1只响应TZ1(硬件过流)和DCAEVT1(比较器过流),而让ePWM2响应TZ5(时钟失效)。
3.2 两种核心保护模式:CBC与OSHT
这是TZ模块最核心的概念,决定了故障响应的“节奏”。
逐周期限流(Cycle-By-Cycle, CBC):
- 行为:当CBC故障事件发生时,ePWM输出立即被强制为预设的安全状态(高、低或高阻)。关键在于,这个强制状态仅持续到当前PWM周期结束。在下一个PWM周期开始时,如果故障信号已经消失,ePWM输出会自动恢复正常工作;如果故障依然存在,则再次强制。
- 应用场景:峰值电流限制。例如,在每一个PWM周期内,一旦电流采样值超过阈值(通过比较器产生
DCAEVT2事件),立即关断当前周期剩余的PWM,限制电流峰值。下个周期重新开始。这实现了动态的、每个周期都进行的限流保护。 - 相关寄存器:
TZSEL[CBCx]使能对应源为CBC模式;TZCTL[TZA/TZB]设置强制动作;TZCLR[CBCPULSE]通常配置为在周期结束时自动清除CBC锁存。
单次触发(One-Shot, OSHT):
- 行为:当OSHT故障事件发生时,ePWM输出立即被强制为预设的安全状态,并且这个状态会一直保持(锁存),直到软件手动清除故障标志(
TZCLR[OST])。 - 应用场景:严重故障保护,如短路、严重过流、过热。这种故障需要系统彻底停机,等待人工干预或软件进行完整的安全检查后才能复位。
- 相关寄存器:
TZSEL[OSHTx]使能对应源为OSHT模式;TZCTL[TZA/TZB]设置强制动作。
- 行为:当OSHT故障事件发生时,ePWM输出立即被强制为预设的安全状态,并且这个状态会一直保持(锁存),直到软件手动清除故障标志(
3.3 高级配置:基于计数方向的独立动作
一个非常强大的功能是,你可以为计数器递增(UP)和递减(DOWN)阶段分别配置不同的故障强制动作。这通过TZCTL2寄存器(需使能ETZE位)以及TZCTLDCA、TZCTLDCB(用于数字比较事件)来实现。
为什么需要这个?考虑一个峰值电流控制的应用。在PWM周期的上升段(计数器递增),我们希望当电流超限(CBC事件)时,立即将PWM输出拉低以关断开关管。但在下降段(计数器递减),同样的电流超限事件可能不需要动作,或者需要不同的动作。这种精细控制可以优化系统的动态响应。
3.4 配置实例与代码
场景:ePWM1驱动一个半桥。TZ1引脚连接硬件过流保护,作为严重故障(OSHT)。DCAEVT1来自模拟比较器,用于逐周期峰值电流限制(CBC)。我们希望:
- OSHT故障时,将两个输出
EPWM1A和EPWM1B都强制为低(安全关断)。 - CBC故障时,仅在计数器递增阶段将
EPWM1A强制为低,EPWM1B不动作。
// 1. 选择故障源 EPwm1Regs.TZSEL.bit.OSHT1 = 1; // TZ1 作为 OSHT 源 EPwm1Regs.TZSEL.bit.DCAEVT1 = 1; // DCAEVT1 作为 CBC 源 (注意:DCAEVT1通常映射为OSHT,这里假设我们通过TZDCSEL将其配置为触发CBC) // 更常见的做法是使用 DCAEVT2 作为CBC源。此处仅为示例逻辑。 EPwm1Regs.TZSEL.bit.DCBEVT1 = 0; // 不使用 // 2. 配置OSHT故障动作 (对所有情况生效的基础动作) EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LO; // OSHT或CBC时,TZA强制低 (值=2) EPwm1Regs.TZCTL.bit.TZB = TZ_FORCE_LO; // OSHT时,TZB强制低 // 3. 启用基于方向的精细控制,并配置CBC在递增阶段的特殊动作 EPwm1Regs.TZCTL2.bit.ETZE = 1; // 使能TZCTL2, TZCTLDCA, TZCTLDCB寄存器 // 对于DCAEVT1 (CBC源),我们希望在计数器递增时强制TZA低,递减时不动作。 EPwm1Regs.TZCTLDCA.bit.DCAEVT1U = TZ_FORCE_LO; // Up阶段: 强制低 EPwm1Regs.TZCTLDCA.bit.DCAEVT1D = TZ_NO_CHANGE; // Down阶段: 无变化 // 对于TZB,在CBC事件(DCAEVT1)发生时,我们希望它始终不动作 EPwm1Regs.TZCTL.bit.TZB = TZ_NO_CHANGE; // 基础动作覆盖为无变化 // 但注意,OSHT事件(TZ1)发生时,我们仍希望TZB为低。由于OSHT优先级可能更高,且会锁存,此配置需仔细测试。 // 4. 配置中断 EPwm1Regs.TZEINT.bit.OST = 1; // 使能OSHT中断 EPwm1Regs.TZEINT.bit.DCAEVT1 = 1; // 使能DCAEVT1中断 (若其为CBC源,也可用CBC中断) // 5. 配置CBC自动清除(在每个PWM周期结束时自动复位CBC锁存,如果故障已消失) EPwm1Regs.TZCLR.bit.CBCPULSE = TZ_CLR_ON_PRD; // 在周期点清除 // 6. 在PIE中使能EPWM1_TZINT中断...重要提示:故障信号的滤波与同步。
TZ1~TZ3等来自GPIO的信号,可以在GPIO MUX模块中配置数字滤波(输入限定)和时钟同步,以消除毛刺。确保故障信号的有效低电平脉冲宽度大于3 * TBCLK,否则可能无法被ePWM模块可靠锁存。异步故障路径保证了即使系统时钟丢失,故障信号仍能关断PWM,这是关键的安全设计。
4. 数字比较(DC)子模块:连接模拟世界与PWM的桥梁
数字比较子模块是ePWM与片上模拟比较器(CMPSS)或其他数字故障源之间的直接硬件链路。它跳过了软件中断处理的延迟,实现了纳秒级别的模拟量到PWM动作的响应。
4.1 核心信号与逻辑
DC模块有两组主要的输入比较对:
- DCAH / DCAL:数字比较A的高电平有效和低电平有效信号。它们通常可以配置为来自同一个源(如CMPSS1输出)的正反逻辑。
- DCBH / DCBL:数字比较B的高电平有效和低电平有效信号。
这些信号的来源通过DCTRIPSEL寄存器灵活选择,可以是:
- 特定的
TZ1~TZ3引脚。 - 片上模拟比较器模块(CMPSS)的输出。
- 甚至是通过“组合输入(Trip Combination Input)”逻辑,将多达15个外部故障源进行“或”运算后的结果。
DC模块根据DCAH/L和DCBH/L的逻辑状态,生成四个关键事件信号:
DCAEVT1,DCAEVT2DCBEVT1,DCBEVT2
这些事件信号可以被分别路由到:
- Trip-Zone子模块:作为
DCAEVT1/2和DCBEVT1/2故障源,触发CBC或OSHT保护。 - 事件触发(ET)子模块:作为
DCAEVT1.soc或DCBEVT1.soc,触发ADC启动转换。 - 时间基准(TB)子模块:作为同步信号,复位ePWM计数器。
4.2 消隐窗口(Blanking Window):抗干扰利器
在开关电源或电机驱动中,功率器件开关瞬间会产生巨大的电压电流尖峰和噪声,可能误触发比较器。DC模块内置的消隐窗口功能就是为了解决这个问题。
工作原理:你可以定义一个时间窗口(基于ePWM的时间基准计数器TBCTR),在这个窗口内,DCAEVT和DCBEVT事件被强制屏蔽(忽略),即使比较器输出跳变也不会产生动作。窗口通常设置在PWM开关切换的时刻附近。
配置要点:
DCBLANK寄存器:设置消隐窗口的起始事件(如CTR=0或CTR=PRD)和窗口长度(多少个TBCLK周期)。DCFILT寄存器:配置数字滤波器,对输入信号进行周期采样和多数表决,进一步滤除窄脉冲噪声。
4.3 应用实例:峰值电流模式控制
这是DC模块的经典应用。目标是实现每个PWM周期,当电感电流上升到设定峰值时,立即关断PWM。
- 信号连接:将电流采样信号接入CMPSS模块的同相输入端,峰值参考电压接入反相端。CMPSS输出(高电平表示电流超限)连接到ePWM模块的DC子模块输入源(例如映射到
DCAH)。 - DC模块配置:
// 选择信号源:假设CMPSS1输出连接到 DCAH EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL = DC_TRIP_INPUT_COMBINATION; // 或具体选择CMPSS1 // 使能消隐窗口,在PWM开通后一段时间内忽略比较器信号,防止开通尖峰误触发 EPwm1Regs.DCBLANK.bit.DCBLANKEN = 1; EPwm1Regs.DCBLANK.bit.DCBLANKWIN = 10; // 消隐窗口长度为10个TBCLK周期 EPwm1Regs.DCBLANK.bit.DCBLANKPRD = DC_BLANK_START_AT_CTR_ZERO; // 从计数器为0开始消隐 // 配置数字滤波器(可选) EPwm1Regs.DCFILT.bit.DCFILTEN = 1; EPwm1Regs.DCFILT.bit.DCFILTINSEL = DC_FILT_CLK; // 使用TBCLK采样 EPwm1Regs.DCFILT.bit.DCFILTCNT = 3; // 连续3个周期一致才认为有效 - Trip-Zone配置:将
DCAEVT1或DCAEVT2配置为CBC故障源。EPwm1Regs.TZSEL.bit.DCAEVT1 = TZ_EVENT_CBC; // DCAEVT1作为CBC源 EPwm1Regs.TZCTL.bit.TZA = TZ_FORCE_LO; // 触发时强制输出低 // 注意:这里通常使用DCAEVT2作为CBC,DCAEVT1作为OSHT。具体需参考手册和TZDCSEL寄存器配置。 - 结果:当电流超过峰值,CMPSS输出变高 ->
DCAH有效 -> 产生DCAEVT1事件 -> 立即触发CBC保护,强制PWM输出低电平,关断开关管。整个过程完全由硬件完成,延迟极短(通常在几十到一百纳秒内),实现了精准的峰值电流控制。
4.4 避坑指南:防止故障信号跨周期残留
手册第17.11.3节专门警告了一个关键问题:在使用CMPSS进行逐周期限流时,如果故障信号(比较器输出)在PWM周期结束前N个时钟周期内仍保持有效(N为滤波器或消隐窗口引入的延迟周期数),那么这个故障状态可能会被锁存,并一直持续到下一个PWM周期开始,导致新的周期一开始就误触发关断。
解决方案:
- 系统设计:确保电流在周期结束前足够早地回落到阈值以下。
- 利用消隐窗口:在PWM周期结束前(例如在
CTR=PRD-2时)启动消隐窗口,并持续到下一个周期开始后一段时间,强制屏蔽周期末尾的故障信号。 - 使用CMPSS锁存清除:如果CMPSS配置为锁存模式,需要在每个PWM周期结束前(提前
N个时钟)通过软件(COMPSTSCLR)或硬件事件(如利用HRPCTL在CMPC/CMPD匹配时产生PWMSYNCPER信号)来清除锁存器。
5. 事件触发(ET)子模块:精准的定时与同步引擎
事件触发子模块是ePWM的“计时员”和“发令员”。它监控着时间基准(TB)、计数器比较(CC)和数字比较(DC)子模块产生的各种事件,并可以对这些事件进行“分频”计数,然后在指定的第N次事件发生时,精准地发出中断请求(EPWMx_INT)或ADC启动转换(EPWMx_SOCA/SOCB)脉冲。
5.1 核心功能:事件选择与分频
ET子模块的核心寄存器是ETSEL(事件选择)和ETPS(事件预分频)。
ETSEL[INTSEL]/ETSEL[SOCASEL]/ETSEL[SOCBSEL]:选择触发中断或SOC的事件源。可选事件极其丰富,包括:TBCTR = 0:计数器归零。TBCTR = TBPRD:计数器等于周期值。TBCTR = CMPA:计数器等于CMPA值(还可细分为递增时匹配CTRU=CMPA或递减时匹配CTRD=CMPA)。TBCTR = CMPB/CMPC/CMPD:同上。DCAEVT1.soc/DCBEVT1.soc:来自数字比较子模块的事件。
ETPS[INTPRD]/ETPS[SOCAPRD]/ETPS[SOCBPRD]:设置分频系数。例如,设置INTPRD=2,意味着“每发生2次选定的事件,才产生1次中断”。这允许你以PWM周期的整数倍来触发中断,减轻CPU负担。ETPS[INTCNT]寄存器可以实时读取当前事件计数器的值。增强功能
ETINTPS:对于中断,还有一个增强寄存器ETINTPS,它提供了更灵活的分频器(INTCNT2和INTPRD2),支持从1到15次事件的分频,并且可以在同步事件(EPWMxSYNCI)或软件强制下,用ETCNTINIT[INTINIT]的值来初始化计数器INTCNT2。这对于多个ePWM模块间精确同步中断触发非常有用。
5.2 应用场景:同步ADC采样
在电机控制FOC算法中,需要在PWM周期的特定时刻(通常是中点或零点)进行相电流采样,以最小化开关噪声影响。
典型配置:我们希望在每个PWM周期计数器等于CMPA值时(这通常对应着PWM占空比的中点),触发ADC采样。
// 假设PWM为向上-向下计数模式,CMPA的值设置为TBPRD的一半,以实现对称PWM。 // 目标:在计数器递增到等于CMPA时(CTRU=CMPA)触发ADC SOCA。 // 1. 选择事件源 EPwm1Regs.ETSEL.bit.SOCASEL = ET_CTRU_CMPA; // SOCA 事件源:CTR = CMPA when counting up // 2. 设置分频。每个事件都触发SOC,即不分频。 EPwm1Regs.ETPS.bit.SOCAPRD = ET_1ST; // SOCAPRD = 1, 每1个事件产生一个SOC脉冲 // 3. 使能SOCA发生器 EPwm1Regs.ETSEL.bit.SOCAEN = 1; // 使能 SOCA // 4. (可选)配置ADC模块,接收 EPwm1Regs.ETSOCA 信号作为启动转换源。配置完成后,在每个PWM周期的上升沿中点,EPWM1_SOCA引脚就会产生一个高电平脉冲,这个脉冲可以直接连接到ADC模块,启动一次精确同步的转换。
5.3 实操心得
- 中断与SOC的区分:中断是通知CPU处理事件,SOC是直接触发外设(ADC)。
ETPS寄存器对两者是独立配置的。你可以用同一个事件(如CTR=PRD)同时触发中断和SOC,但分频设置可以不同。 - 软件强制调试:
ETFRC寄存器允许你通过软件强制产生一个中断或SOC事件,这在调试阶段非常有用,可以手动触发ADC转换或中断服务程序,而不必等待实际的事件发生。 - 事件标志管理:产生中断或SOC后,相应的标志位
ETFLG[INT]或ETFLG[SOCA]会被置位。必须在中断服务程序(ISR)中手动清除这些标志位(通过写ETCLR寄存器),否则后续事件无法触发新的中断。SOC脉冲是硬件自动生成的,但标志位仍需软件清除以识别新的脉冲。
6. 系统集成与调试技巧
将PC、TZ、DC、ET这些子模块组合起来,才能构建一个健壮、高效的控制系统。以下是一些系统级的思考和调试建议。
6.1 配置流程 checklist
- 全局时钟与同步:首先确认
EPWMCLK和TBCLK的时钟源和分频设置正确。如果使用多个ePWM模块,规划好同步链(EPWMxSYNCI/SYNCO)。 - 时间基准(TB):设置计数模式(增、减、增-减)、周期值(
TBPRD)和相位(TBPHS)。 - 计数器比较(CC):根据你的PWM模式(对称、不对称)设置
CMPA和CMPB的映射关系及影子加载模式。 - 动作限定器(AQ):配置
CTR=PRD,CTR=CMPA等事件时,EPWMxA/B的输出动作(置高、置低、翻转)。 - 死区(DB):如果需要,配置死区时间和极性。
- PWM斩波(PC):如果需要驱动脉冲变压器,在此配置。
- 数字比较(DC)与故障保护(TZ):
- 配置
DCTRIPSEL选择信号源。 - 配置消隐窗口
DCBLANK和滤波器DCFILT。 - 配置
TZSEL选择故障源及模式(CBC/OSHT)。 - 配置
TZCTL、TZCTL2等设置故障动作。 - 使能所需的中断
TZEINT。
- 配置
- 事件触发(ET):配置中断和SOC的事件源及分频。
- 使能PWM输出:最后,才将
GPIO引脚复用为EPWMxA/B功能,并可能设置输出极性。
6.2 常见问题排查
- 问题:PWM无输出。
- 检查:
GPIO复用配置是否正确?EPWM模块时钟是否使能(PCLKCR0/2寄存器)?TBCTL[CTRMODE]是否不为停止模式?AQCTLA/B寄存器是否配置了有效的动作?TZ模块是否意外强制了输出(检查TZFLG寄存器)?
- 检查:
- 问题:故障保护不动作。
- 检查:故障输入引脚
TZn的电平是否正确(低有效)?TZSEL寄存器是否使能了对应故障源?TZ输入是否经过了过度的数字滤波(导致脉宽小于3*TBCLK)?对于DC事件,DCTRIPSEL映射是否正确?消隐窗口是否意外屏蔽了故障信号?
- 检查:故障输入引脚
- 问题:ADC采样时刻不准。
- 检查:
ETSEL[SOCASEL]选择的事件是否确实在预期时刻发生?用示波器观察EPWMx_SOCA信号。ETPS[SOCAPRD]分频设置是否正确?ADC模块是否配置为接收正确的SOC触发源?
- 检查:
- 问题:峰值电流控制不稳定,偶尔误关断。
- 检查:重点检查消隐窗口和滤波器设置。开关噪声是否在采样时刻附近?考虑调整消隐窗口的起始点和长度。检查CMPSS比较器的参考电压和滞回设置。确认没有发生手册中警告的“故障信号跨周期残留”问题。
6.3 性能优化建议
- 最小化中断延迟:对于关键的保护中断(如OSHT),将其分配到高优先级的PIE中断组。在ISR中只做最必要的标志清除和全局状态设置,复杂的处理放到后台循环。
- 利用硬件加速:尽可能使用DC模块和TZ模块的硬件联动来实现保护,而不是等到ADC采样再经软件判断。硬件反应的延迟是纳秒级,软件是微秒级。
- 合理使用影子寄存器:对于
CMPA、CMPB、TBPRD等频繁在运行时修改的寄存器,务必使用影子寄存器,并在CTR=0或CTR=PRD时自动加载,以避免PWM波形出现毛刺。 - 同步多个ePWM:对于多相逆变器,使用
EPWMxSYNCI/SYNCO链确保所有PWM模块的计数器同步启动,这对于生成严格互锁的PWM波形至关重要。
ePWM模块的深度和灵活性,正是C2000系列在实时控制领域保持领先的基石。从精细的栅极驱动调制(PC),到纳秒级的硬件故障保护(TZ+DC),再到精准的时序事件管理(ET),它提供了一个完整的硬件解决方案。掌握这些高级功能,意味着你能从“让PWM输出波形”进阶到“让PWM安全、精准、智能地控制功率”,从而设计出性能更强、可靠性更高的电力电子系统。调试过程虽然繁琐,但当你看到系统在各种边界条件下依然稳定运行时,这一切都是值得的。记住,多看示波器波形,多结合寄存器手册和实际信号分析,是理解这些复杂子模块交互的最佳途径。