3. PWM生成与定时器:CCU4/CCU8定时器配置、互补PWM输出、死区时间插入
各位同学,咱们今天聊点硬核的——PWM生成。说白了,电机控制的核心就是靠PWM去驱动功率管,让电机转起来。英飞凌的CCU4和CCU8定时器,就是干这个活的利器。我个人习惯把CCU4叫做“通用小能手”,CCU8则是“高性能大杀器”。
3.1 CCU4与CCU8:你该选谁?
先搞清楚这两个家伙的区别。CCU4是16位定时器,精度够用,适合常规的PWM生成。CCU8是32位定时器,分辨率更高,适合高频PWM或者需要精细控制的场合。
| 特性 | CCU4 | CCU8 |
|---|---|---|
| 位宽 | 16位 | 32位 |
| PWM频率上限 | 中等(典型20kHz-100kHz) | 高(可达MHz级别) |
| 死区插入 | 支持(硬件实现) | 支持(更灵活) |
| 适用场景 | 通用电机控制、BLDC | 高频PWM、伺服、精密控制 |
我在项目中遇到过用CCU4做20kHz的BLDC驱动,完全没问题。但如果你要做200kHz的伺服驱动,那还是老老实实上CCU8吧。
3.2 定时器配置:从零开始
配置定时器其实不复杂,但有几个坑得注意。我一般按这个步骤来:
- 时钟源选择:CCU4/CCU8可以挂在不同时钟树上。我个人习惯用系统时钟直接分频,这样频率计算最直观。
- 周期寄存器设置:决定了PWM的频率。公式很简单:
PWM频率 = 时钟频率 / (周期值 + 1)。 - 比较寄存器设置:决定了占空比。比如周期是1000,比较值是500,那就是50%占空比。
- 启动定时器:别忘了使能影子传输,否则你改了寄存器也不生效。
核心要点:CCU4/CCU8都支持影子寄存器。你修改比较值时,不会立即生效,而是在下一个周期开始才更新。这能避免PWM波形出现毛刺。
嗯,这里要注意:影子传输是默认开启的,但有些寄存器需要手动配置。我刚开始做的时候,就因为这个吃了亏——改了占空比,波形纹丝不动,折腾了半天才发现是影子传输没使能。
3.3 互补PWM输出:电机驱动的灵魂
电机驱动里,上下桥臂的功率管不能同时导通,否则就是短路。所以我们需要一对互补的PWM信号:一个高电平,另一个就是低电平。
CCU4和CCU8都支持互补输出。配置起来很简单:
- 使能通道的互补输出功能
- 指定哪个引脚输出原信号,哪个引脚输出反相信号
- 设置死区时间(下面会细说)
举个例子,你配置了CCU8的通道0,输出引脚是P10.0,互补引脚是P10.1。那么P10.0输出正常的PWM,P10.1输出完全反相的PWM。你想想看,这比用软件去翻转信号靠谱多了,硬件自动完成,零延迟。
个人经验:我建议在互补输出时,把两个引脚的驱动能力设置成一致。否则一个强一个弱,波形会不对称,影响电机运行平稳性。
3.4 死区时间插入:别让管子烧了
死区时间,说白了就是上下桥臂切换时,故意插入一段“都关断”的时间。为什么要这么做?因为功率管关断需要时间,如果上管还没完全关断,下管就导通了,那就直通短路了。
我曾经在一个项目中,死区时间设得太短,结果MOS管发热严重,差点烧了。后来把死区从100ns调到300ns,问题就解决了。
CCU4和CCU8的死区插入是硬件实现的,你只需要设置两个参数:
| 参数 | 说明 | 典型值 |
|---|---|---|
| 死区上升沿延迟 | 信号从低到高时,延迟多少时间 | 100ns - 500ns |
| 死区下降沿延迟 | 信号从高到低时,延迟多少时间 | 100ns - 500ns |
配置代码大概长这样:
// 以CCU8为例,配置死区时间
CCU8_EnableDeadTime(CCU8_CH0, CCU8_DT_ENABLE);
CCU8_SetDeadTime(CCU8_CH0, 100, 100); // 上升沿和下降沿都延迟100个时钟周期
// 假设时钟频率是100MHz,那么100个周期就是1us的死区时间
警告:死区时间不是越大越好。太大会导致PWM有效占空比损失,电机输出功率下降。我一般建议从200ns开始试,用示波器观察波形,确保没有直通,再逐步减小。
3.5 实战中的避坑指南
最后,分享几个我踩过的坑:
- 引脚复用配置:CCU4/CCU8的输出引脚,必须先配置成备用功能。我见过有人忘了这步,PWM死活出不来。
- 中断优先级:如果用了PWM中断,优先级别设太高,否则会影响其他实时任务。我习惯设成中等优先级。
- 启动顺序:先配置好所有寄存器,最后再启动定时器。别边配置边启动,容易出乱子。
好了,这一章就到这里。PWM生成是电机控制的基础,CCU4和CCU8用好了,后面的FOC、六步换相都会轻松很多。下一章咱们聊聊电流采样,那又是另一个有意思的话题了。