4. ePWM 模块深度配置:时基、计数器、动作限定器、死区与斩波

各位工程师,欢迎来到 PWM 模块的深度配置章节。说实话,电机控制里,PWM 就是执行层的“心脏”。你算法写得再好,PWM 发不出来,或者发出来有毛刺、有死区不对称,那电机跑起来就是抖、就是响、就是发热。

我个人习惯,拿到一个新项目,第一件事不是调 PI 参数,而是先把 ePWM 的配置吃透。因为后面所有的问题——电流采样噪声、开关损耗、EMI——根源往往都在这里。

好,我们直接进入正题。

4.1 ePWM 时基模块(TB)—— 一切周期的起点

时基模块,说白了就是给 PWM 信号定“心跳”的。它决定了 PWM 的频率和计数模式。

每个 ePWM 模块都有一个自己的时基计数器(TBCTR),它从 0 开始,按照你设定的模式往上数,或者上下数。数到顶了,再重置,一个周期就完成了。

4.1.1 时基周期寄存器(TBPRD)

这个寄存器决定了计数器的“天花板”。PWM 的频率就是由它和时钟分频共同决定的。

公式很简单:

PWM 频率 = SYSCLKOUT / (TBCLK 分频系数 × (TBPRD + 1) × 2)   // 增减模式
PWM 频率 = SYSCLKOUT / (TBCLK 分频系数 × (TBPRD + 1))       // 增模式

举个例子,系统时钟 100MHz,TBCLK 不分频,TBPRD 设为 5000,增减模式:

频率 = 100,000,000 / (1 × (5000 + 1) × 2) ≈ 10kHz

嗯,这里要注意:TBPRD 的值直接影响 PWM 的分辨率。TBPRD 越大,每个周期内的计数步数越多,占空比调节就越精细。但频率就低了。这是个 trade-off。

我的习惯: 对于 10kHz 的电机 PWM,我一般把 TBPRD 设在 5000~10000 之间。这样既有足够的占空比分辨率(12~13 bit),又不会让计数器溢出太快。

4.1.2 时基计数器模式

C2000 的 ePWM 支持三种计数模式。我直接给你列个表,对比着看:

模式 计数方向 典型应用 特点
递增模式(Up) 0 → TBPRD → 0 非对称 PWM,DC-DC 频率高,但波形不对称
递减模式(Down) TBPRD → 0 → TBPRD 非对称 PWM,特殊时序 与 Up 模式互补
增减模式(Up-Down) 0 → TBPRD → 0 电机控制(对称 PWM) 波形对称,谐波小,我常用

做电机控制,我几乎只用增减模式。为什么?因为对称 PWM 产生的电流纹波更小,谐波含量低,电机跑起来更安静。我在一个风机项目里试过用递增模式,结果电机啸叫得厉害,换成增减模式,世界清净了。

4.2 动作限定器(AQ)—— 什么时候做什么事

动作限定器,就是告诉 ePWM 模块:当计数器走到某个值时,你要把输出引脚拉高、拉低,还是翻转。

它的事件源主要有这几个:

  • CTR = 0:计数器归零
  • CTR = PRD:计数器到周期值
  • CTR = CMPA:计数器等于比较值 A
  • CTR = CMPB:计数器等于比较值 B
  • CTR 递增/递减方向:配合方向判断

我画了一张图,帮你理解增减模式下,AQ 是怎么工作的:

增减模式 ePWM 动作限定器时序图 TBCTR(时基计数器) CMPA CMPB ↑ 事件1 ↑ 事件2 事件3 ↑ ePWMxA 事件1: CTR=CMPA (增) → 置低 事件2: CTR=CMPB (减) → 置高 事件3: CTR=CMPA (减) → 置高

配置 AQ 时,我建议你遵循一个原则:先清后置,或者先置后清,保持对称。比如在增减模式下,我通常这样配:

// 增减模式,对称 PWM
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR;   // 递增时遇到 CMPA,拉低
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET;     // 递减时遇到 CMPA,拉高

这样出来的波形,高电平正好在中间,两边对称。电流采样也方便,可以在计数器归零或到顶时触发 ADC。

我曾经踩过的坑: 有一次我忘了配置 CAD 事件,只配了 CAU。结果波形只有半个周期有输出,电机直接堵转。检查了半天才发现,动作事件没配全。所以,配完 AQ 一定要用示波器看波形,别偷懒。

4.3 死区插入(DB)—— 保护你的功率管

死区,是电机控制里绝对不能省的东西。上下桥臂的开关管,如果同时导通,那就是直通短路,瞬间炸管。

死区模块的作用,就是在 PWM 信号切换时,插入一段“都关断”的时间,让一个管子完全关断后,另一个再开通。

4.3.1 死区的工作原理

C2000 的死区模块,输入是一路 PWM 信号(比如 ePWMxA),输出是两路:ePWMxA 和 ePWMxB。通过配置,你可以实现:

  • 上升沿延迟(RED):输出信号的上升沿比输入晚一个死区时间
  • 下降沿延迟(FED):输出信号的下降沿比输入晚一个死区时间
  • 两者组合:产生互补的 PWM 对

我常用的配置是:

// 死区配置:互补模式,上升沿和下降沿都延迟
EPwm1Regs.DBCTL.bit.OUT_MODE = DB_FULL_ENABLE;   // 使能上升和下降沿延迟
EPwm1Regs.DBCTL.bit.POLSEL = DB_ACTV_HIC;        // 极性控制:ePWMxA 高有效,ePWMxB 低有效(互补)
EPwm1Regs.DBRED.bit.DBRED = 200;                 // 上升沿延迟 200 个 TBCLK
EPwm1Regs.DBFED.bit.DBFED = 200;                 // 下降沿延迟 200 个 TBCLK

死区时间怎么算?

死区时间 = DBRED / TBCLK 频率
假设 TBCLK = 100MHz,DBRED = 200
死区时间 = 200 / 100e6 = 2μs

4.3.2 死区时间的选择

死区时间不是越大越好,也不是越小越好。我一般这样选:

功率管类型 典型死区时间 说明
MOSFET(低压) 100ns ~ 500ns 开关速度快,死区可以小
IGBT(中压) 1μs ~ 3μs 拖尾电流大,死区要留足
SiC / GaN(高频) 50ns ~ 200ns 开关极快,但死区太小容易直通
我的经验: 死区时间最好留出 20%~30% 的余量。比如 IGBT 数据手册说最小死区 1μs,我会设到 1.3μs。因为温度变化、器件老化都会影响开关速度。我曾经在一个项目中死区设得太临界,高温老化时连续炸了三个驱动板,后来把死区从 1.2μs 改到 1.5μs,问题解决。

4.4 斩波功能(Chopper)—— 脉冲变压器的好帮手

斩波功能,说实话,不是每个项目都用得到。但如果你用脉冲变压器驱动 IGBT 或 SiC 管,那它就是个宝贝。

斩波的作用,是把一个宽脉冲“切”成一系列高频小脉冲。这样脉冲变压器就能通过高频信号传递能量,同时保持占空比信息。

4.4.1 斩波的工作原理

斩波模块内部有一个高频振荡器(通常 10MHz 左右),它把输入的 PWM 信号调制到高频载波上。输出就是一段一段的高频脉冲串。

配置参数主要有两个:

  • 斩波频率(CHPFREQ):决定载波频率,一般设到 10MHz 左右
  • 斩波占空比(CHPDUTY):决定每个小脉冲的宽度,通常设为 50%
// 斩波配置示例
EPwm1Regs.PCCTL.bit.CHPEN = 1;           // 使能斩波
EPwm1Regs.PCCTL.bit.CHPFREQ = 3;         // 斩波频率 = TBCLK / (1 << (CHPFREQ+1))
EPwm1Regs.PCCTL.bit.CHPDUTY = 1;         // 斩波占空比 = 50%
关键点: 斩波功能只在 ePWMxA 和 ePWMxB 输出上生效。它不影响时基和比较逻辑,只是对最终输出波形做了一次“调制”。所以,你可以在不改变占空比计算的前提下,直接使能斩波。

4.4.2 什么时候用斩波?

我总结了一下,主要场景就两个:

  1. 脉冲变压器驱动:需要高频载波来传递能量,否则变压器会饱和
  2. 隔离式栅极驱动:某些数字隔离器需要边沿触发,宽脉冲无法通过

如果你用的是光耦驱动或者驱动 IC 自带死区,那斩波基本用不上。别为了炫技而加,它会让开关损耗增加。

4.5 本章小结

好,我们把这章的核心点串一下:

  • 时基模块:定周期、定模式。电机控制首选增减模式。
  • 动作限定器:决定什么时候拉高拉低。配完一定要用示波器确认。
  • 死区插入:保护功率管,时间留余量,别卡着极限设。
  • 斩波功能:脉冲变压器的专属工具,按需启用。