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 避坑指南
最后,分享几个我踩过的坑:
- CMPA和CMPB的值不能相等——如果相等,比较事件会同时触发,可能导致输出逻辑混乱
- 注意死区设置——如果CMPA和CMPB的值太接近,加上死区后可能产生窄脉冲
- 影子寄存器加载时机——如果你在中断里修改CMPA,记得确认加载时机是否合适
重要提醒:我曾经在一个项目中,CMPA和CMPB设成了相同的值,结果PWM输出完全乱套了。检查了两天才发现这个问题。所以,务必确保CMPA和CMPB的值不同,或者至少留出足够的死区时间。
4.6 本章小结
好了,这一章的内容就到这里。比较模块是PWM波形生成的核心,理解了CMPA/CMPB、影子寄存器和比较事件,你就掌握了PWM控制的一半功力。
下一章,我们会深入动作模块,看看这些比较事件如何具体控制PWM输出电平。到时候,你会看到更精彩的波形生成技巧。