4. ePWM 高级应用:HRPWM 高精度 PWM、移相控制、载波调制、峰值电流模式控制
好,咱们接着聊 ePWM 的高级玩法。前面几章我们把 ePWM 的基础功能讲透了,什么时基、比较、死区、触发,这些是基本功。但说实话,真正让 C2000 在数字电源和电机控制领域站稳脚跟的,是它这些高级特性。
我个人习惯把 ePWM 的高级应用分成四个方向:高精度(HRPWM)、移相控制、载波调制、峰值电流模式控制。今天咱们一个一个啃。
4.1 HRPWM:把 PWM 精度做到皮秒级
先问个问题:普通 ePWM 的精度是多少?
以 100MHz 的系统时钟为例,一个计数周期是 10ns。也就是说,你调整占空比的最小步长是 10ns。对于 100kHz 的开关频率,这个精度大概能到 0.1%。
够用吗?
做普通电机驱动,够了。但做数字电源,尤其是 LLC 谐振变换器、高精度 Buck 变换器,0.1% 的精度远远不够。输出电压纹波、动态响应都会受影响。
HRPWM 就是干这个的。
它利用芯片内部的微延时单元(MEP,Micro Edge Positioner),把一个系统时钟周期再细分。细分多少?C2000 的 HRPWM 通常能做到 55 到 150 步的细分。以 100MHz 时钟为例,10ns 除以 150,大约 67ps 的精度。
67ps 是什么概念?光在 1ps 内只能走 0.3mm。这个精度,在功率变换领域基本是天花板级别的。
核心要点:HRPWM 不是独立的外设,它是在普通 ePWM 模块上叠加的增强功能。你只需要配置几个寄存器,就能让 ePWM 的边沿位置精度从 10ns 提升到 67ps。
配置上,我建议你关注这几个寄存器:
- HRCNFG:HRPWM 的使能和模式配置。这里要选好是上升沿微调还是下降沿微调,还是双边沿都微调。
- HRMSTEP:MEP 的步长校准值。这个值不是随便写的,芯片出厂时会有校准值,建议从 TI 提供的校准库中读取。
- CMPAHR / CMPBHR:高精度比较值寄存器。普通 CMPA 是整数部分,CMPAHR 是小数部分。
个人经验:我在做一款 1MHz 开关频率的 Buck 变换器时,发现输出电压纹波始终降不下来。用示波器一看,PWM 的占空比抖动有 ±2ns。开了 HRPWM 之后,抖动直接降到 ±100ps 以内。嗯,效果立竿见影。
4.2 移相控制:多路 PWM 的相位配合
移相控制,说白了就是让多个 ePWM 模块之间保持固定的相位差。这在多相交错并联变换器、全桥变换器、LLC 谐振变换器中非常常见。
C2000 的 ePWM 模块之间是通过 同步信号(SYNCI / SYNCO) 来建立相位关系的。你只需要配置好主模块和从模块的相位偏移值,硬件会自动完成同步。
具体怎么做?
- 选择一个 ePWM 模块作为主模块(Master),配置它的时基。
- 其他模块作为从模块(Slave),在 TBPHS 寄存器中写入相位偏移值。
- 使能同步输入,让从模块的时基计数器在主模块的同步信号到来时加载 TBPHS 的值。
举个例子,四相交错并联 Buck,每相之间相位差 90°:
// 主模块 ePWM1 配置
EPwm1Regs.TBCTL.bit.PHSEN = 0; // 主模块不加载相位
EPwm1Regs.TBCTL.bit.SYNCOSEL = 2; // 产生同步输出信号
// 从模块 ePWM2 配置(相位偏移 90°,即 TBPRD 的 1/4)
EPwm2Regs.TBPHS.bit.TBPHS = TBPRD_VALUE / 4;
EPwm2Regs.TBCTL.bit.PHSEN = 1; // 使能相位加载
EPwm2Regs.TBCTL.bit.SYNCOSEL = 1; // 同步输出 = 同步输入
// 从模块 ePWM3 配置(相位偏移 180°)
EPwm3Regs.TBPHS.bit.TBPHS = TBPRD_VALUE / 2;
// ... 类似配置
// 从模块 ePWM4 配置(相位偏移 270°)
EPwm4Regs.TBPHS.bit.TBPHS = 3 * TBPRD_VALUE / 4;
// ... 类似配置
避坑指南:我曾经在一个项目中,从模块的相位值写对了,但输出波形始终不对。查了半天,发现是同步信号的传播延迟导致的。主模块和从模块之间如果距离较远(比如跨了多个时钟域),同步信号可能会有 1-2 个时钟周期的延迟。解决办法是在从模块的 TBPHS 中补偿这个延迟。
4.3 载波调制:让 PWM 频率动起来
载波调制,很多人第一反应是「这不就是变频吗?」
对,但也不全对。载波调制的核心是 让 PWM 的载波频率按照某种规律变化。为什么要这么做?
两个原因:
- 降低 EMI:固定频率的 PWM 会产生固定频率的谐波,这些谐波能量集中,容易超标。通过载波调制,把能量分散到更宽的频带上,EMI 峰值可以降低 10-15dB。
- 改善音频噪声:电机在低速运行时,固定频率的 PWM 会产生刺耳的啸叫声。载波调制可以让噪声变成「白噪音」,人耳感觉更舒适。
C2000 实现载波调制,最直接的方式是 动态修改 TBPRD 寄存器。你可以在每个 PWM 周期或者每隔几个周期,更新一次 TBPRD 的值。
常用的调制方式有:
- 三角波调制:频率在中心频率附近线性变化,上下对称。
- 随机调制:频率在一定范围内随机跳变,EMI 抑制效果最好。
- 伪随机序列调制:用 LFSR(线性反馈移位寄存器)生成伪随机序列,控制频率变化。
我建议:如果你对 EMI 有严格要求,优先考虑伪随机序列调制。它的频谱分布更均匀,而且实现起来只需要一个 LFSR 和几个加法器,不占用太多 CPU 资源。
代码实现上,你可以在 ePWM 的时基周期中断中更新 TBPRD:
// ePWM 时基周期中断服务函数
interrupt void epwm1_tz_isr(void) {
// 计算新的载波周期值
uint16_t new_prd = base_prd + modulation_amplitude * sin(phase);
EPwm1Regs.TBPRD = new_prd;
// 更新相位,用于下一次调制
phase += phase_step;
if(phase >= 2 * PI) phase -= 2 * PI;
// 清除中断标志
EPwm1Regs.ETCLR.bit.INT = 1;
}
个人经验:做载波调制时,要注意 TBPRD 的变化不能太剧烈。我曾经把调制幅度设得太大,结果 PWM 频率瞬间从 100kHz 掉到 50kHz,电感直接饱和了。嗯,教训深刻。一般建议调制幅度控制在中心频率的 ±10% 以内。
4.4 峰值电流模式控制:硬件实现的电流环
峰值电流模式控制,是数字电源中最常用的控制方式之一。它的原理很简单:
每个开关周期开始时,开关管导通,电感电流上升。当电流达到设定的参考值时,开关管关断。这样,电流就被限制在参考值附近。
传统的实现方式是用比较器 + 触发器,纯模拟电路。但在 C2000 上,我们可以用 ePWM 的数字比较器(DC,Digital Compare)模块来实现。
具体怎么做?
- 用 ADC 采样电感电流,或者用片上的比较器(CMPSS)直接检测电流信号。
- 将电流信号与 DAC 输出的参考值进行比较。
- 比较结果触发 ePWM 的 DC 事件,强制 PWM 输出翻转(关断开关管)。
关键配置点:
- DCTRIPSEL:选择触发源,可以是 CMPSS 的输出,也可以是 GPIO 输入。
- DCACTL / DCBCTL:配置事件触发后的动作,比如强制高、强制低、或者翻转。
- TZSEL:将 DC 事件映射到 TZ(Trip Zone)模块,实现硬件级的快速关断。
// 配置 ePWM 的数字比较器实现峰值电流控制
// 假设使用 CMPSS1 的输出作为电流比较信号
// 1. 配置 CMPSS
Cmpss1Regs.COMPCTL.bit.COMPDACE = 1; // 使能 DAC
Cmpss1Regs.DACVAL.bit.DACVAL = ref_value; // 设置电流参考值
// 2. 配置 ePWM 的 DC 模块
EPwm1Regs.DCTRIPSEL.bit.DCAHCOMPSEL = 1; // DCAH 选择 CMPSS1 输出
EPwm1Regs.DCACTL.bit.EVT1SRCSEL = 1; // 事件源选择 DCAH
EPwm1Regs.DCACTL.bit.EVT1FRCSYNCSEL = 0; // 选择同步后的信号
// 3. 配置 TZ 模块,当 DC 事件触发时强制 PWM 输出低
EPwm1Regs.TZSEL.bit.DCAEVT1 = 1; // DCAEVT1 触发 TZ
EPwm1Regs.TZCTL.bit.TZA = 2; // TZ 事件时强制输出低
核心优势:用硬件实现的峰值电流控制,响应速度是纳秒级的。相比之下,如果用 ADC 采样 + 软件比较,至少需要几百纳秒的延迟。对于高频开关电源(500kHz 以上),硬件实现几乎是唯一的选择。
避坑指南:峰值电流模式控制有一个固有的问题——次谐波振荡。当占空比超过 50% 时,电流环会变得不稳定。解决办法是加入斜率补偿(Slope Compensation)。C2000 的 CMPSS 模块支持在 DAC 参考值上叠加一个斜坡信号,你可以利用这个功能实现斜率补偿,而不需要额外的软件开销。
好了,这一章的内容就到这里。HRPWM 让你把精度做到极致,移相控制让你玩转多路协同,载波调制帮你搞定 EMI,峰值电流控制让你实现硬件级的快速响应。这四个高级应用,基本覆盖了数字电源和电机控制中最核心的需求。
下一章,咱们聊聊 eCAP 和 eQEP,这两个模块在位置检测和速度测量中非常关键。到时候见。