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 定时器配置:从零开始

配置定时器其实不复杂,但有几个坑得注意。我一般按这个步骤来:

  1. 时钟源选择:CCU4/CCU8可以挂在不同时钟树上。我个人习惯用系统时钟直接分频,这样频率计算最直观。
  2. 周期寄存器设置:决定了PWM的频率。公式很简单:PWM频率 = 时钟频率 / (周期值 + 1)
  3. 比较寄存器设置:决定了占空比。比如周期是1000,比较值是500,那就是50%占空比。
  4. 启动定时器:别忘了使能影子传输,否则你改了寄存器也不生效。

核心要点: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、六步换相都会轻松很多。下一章咱们聊聊电流采样,那又是另一个有意思的话题了。