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。
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 是怎么工作的:
配置 AQ 时,我建议你遵循一个原则:先清后置,或者先置后清,保持对称。比如在增减模式下,我通常这样配:
// 增减模式,对称 PWM
EPwm1Regs.AQCTLA.bit.CAU = AQ_CLEAR; // 递增时遇到 CMPA,拉低
EPwm1Regs.AQCTLA.bit.CAD = AQ_SET; // 递减时遇到 CMPA,拉高
这样出来的波形,高电平正好在中间,两边对称。电流采样也方便,可以在计数器归零或到顶时触发 ADC。
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 | 开关极快,但死区太小容易直通 |
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%
4.4.2 什么时候用斩波?
我总结了一下,主要场景就两个:
- 脉冲变压器驱动:需要高频载波来传递能量,否则变压器会饱和
- 隔离式栅极驱动:某些数字隔离器需要边沿触发,宽脉冲无法通过
如果你用的是光耦驱动或者驱动 IC 自带死区,那斩波基本用不上。别为了炫技而加,它会让开关损耗增加。
4.5 本章小结
好,我们把这章的核心点串一下:
- 时基模块:定周期、定模式。电机控制首选增减模式。
- 动作限定器:决定什么时候拉高拉低。配完一定要用示波器确认。
- 死区插入:保护功率管,时间留余量,别卡着极限设。
- 斩波功能:脉冲变压器的专属工具,按需启用。