4. 比较模块CC详解:比较寄存器CMPA/CMPB、影子寄存器与立即加载模式、比较事件产生

各位工程师朋友,欢迎来到第四章。今天咱们聊聊PWM波形生成里最核心的环节——比较模块。

说实话,我刚开始接触C2000的时候,觉得PWM不就是设个周期、调个占空比嘛,有什么难的?直到有一次做电机控制,波形总是不对,电机嗡嗡响就是不转。查了两天,最后发现是CMPA的加载时机出了问题。嗯,从那以后,我再也不敢小看这个比较模块了。

4.1 比较寄存器CMPA和CMPB

先说说这两个寄存器。CMPA和CMPB,说白了就是两个计数器比较值。时基计数器TBCTR一直在跑,从0跑到TBPRD,再跑回来。在这个过程中,TBCTR会不停地和CMPA、CMPB做比较。

一旦相等,就会产生一个事件。这个事件可以用来干什么?

  • 控制PWM输出电平翻转
  • 触发ADC采样
  • 触发中断
  • 触发其他模块的同步操作

我个人的习惯是,CMPA用来控制占空比,CMPB用来做特殊事件触发。比如在数字电源项目中,我用CMPA控制主开关管的导通时间,用CMPB在周期中间触发ADC采样,这样刚好能采到电感电流的中间值。

关键点:CMPA和CMPB都是16位的寄存器,取值范围是0到TBPRD。注意,它们不能大于TBPRD,否则比较事件永远不会发生。

4.2 影子寄存器——为什么需要它?

你想想看,如果PWM正在运行,你突然改了CMPA的值,会发生什么?

答案是:立刻生效。这在某些场景下是好事,但在大多数PWM应用里,这是个灾难。

举个例子。你在一个PWM周期中间改了CMPA,那么从这一刻开始,比较值就变了。这个周期的波形就会变得不完整——前半段是旧占空比,后半段是新占空比。这在电机控制里,意味着电流波形会出现毛刺,电机就会抖动。

所以,C2000引入了影子寄存器机制。

每个比较寄存器都有一个对应的影子寄存器。你写CMPA的时候,实际上写的是影子寄存器。真正的比较值,会在特定时刻从影子寄存器加载过来。

寄存器 影子寄存器 加载时机
CMPA CMPA影子 由CMPALOAD决定
CMPB CMPB影子 由CMPBLOAD决定

这个加载时机,就是我们接下来要说的重点。

4.3 立即加载模式 vs 影子加载模式

C2000给了你两种选择:立即加载和影子加载。

立即加载模式:

  • 你写CMPA,它立刻生效
  • 适合动态调整,比如故障保护
  • 风险:波形可能不完整

影子加载模式:

  • 你写影子寄存器,在指定时刻统一加载
  • 加载时刻可以是:时基计数器等于0、等于周期值、或者两者都行
  • 保证每个PWM周期波形完整

我个人强烈建议,除非你有特殊需求,否则都用影子加载模式。我曾经在一个项目中偷懒用了立即加载,结果EMC测试死活过不了,最后发现是PWM波形毛刺太多。改成影子加载后,问题迎刃而解。

小技巧:配置影子加载模式时,记得设置CMPALOAD和CMPBLOAD寄存器。这两个寄存器控制着加载时刻。我一般设为TBCTR等于0时加载,这样每个周期开始的时候,新值就生效了。

4.4 比较事件的产生

比较事件是怎么产生的?很简单:

  • 当TBCTR递增到等于CMPA时,产生CAU事件(Compare A Up)
  • 当TBCTR递减到等于CMPA时,产生CAD事件(Compare A Down)
  • CMPB同理,产生CBU和CBD事件

这四个事件,就是PWM波形生成的基础。你可以用它们来控制:

  • EPWMxA和EPWMxB的输出电平
  • 触发ADC转换
  • 触发中断
  • 触发其他PWM模块的同步

举个例子,在对称PWM模式下:

// 假设TBPRD = 1000, CMPA = 300
// 递增时:TBCTR从0到1000
// 当TBCTR == 300时,产生CAU事件,输出翻转为高
// 当TBCTR == 1000时,周期结束,输出翻转为低
// 递减时:TBCTR从1000到0
// 当TBCTR == 300时,产生CAD事件,输出翻转为高
// 当TBCTR == 0时,周期结束,输出翻转为低

你看,这样每个周期就有两个脉冲。这在某些应用中很有用,比如LLC谐振变换器。

4.5 避坑指南

最后,分享几个我踩过的坑:

  1. CMPA和CMPB的值不能相等——如果相等,比较事件会同时触发,可能导致输出逻辑混乱
  2. 注意死区设置——如果CMPA和CMPB的值太接近,加上死区后可能产生窄脉冲
  3. 影子寄存器加载时机——如果你在中断里修改CMPA,记得确认加载时机是否合适

重要提醒:我曾经在一个项目中,CMPA和CMPB设成了相同的值,结果PWM输出完全乱套了。检查了两天才发现这个问题。所以,务必确保CMPA和CMPB的值不同,或者至少留出足够的死区时间。

4.6 本章小结

好了,这一章的内容就到这里。比较模块是PWM波形生成的核心,理解了CMPA/CMPB、影子寄存器和比较事件,你就掌握了PWM控制的一半功力。

下一章,我们会深入动作模块,看看这些比较事件如何具体控制PWM输出电平。到时候,你会看到更精彩的波形生成技巧。

比较模块CC核心逻辑 时基计数器TBCTR 比较寄存器 CMPA / CMPB 影子寄存器 (缓冲加载) 加载控制 立即/影子模式 比较事件 CAU/CAD/CBU/CBD 输出控制 PWM电平翻转 触发功能 ADC/中断/同步 核心流程:TBCTR与CMPA/CMPB比较 → 产生事件 → 控制输出或触发其他功能 立即加载:直接写入比较寄存器,立刻生效 影子加载:写入影子寄存器,在指定时刻统一加载

专注资料整理