第三章 CCU6模块详解:捕获/比较单元、霍尔传感器接口、正交编码器接口、多通道PWM生成

各位同学,今天我们来聊聊AURIX里一个非常核心的外设——CCU6模块。说实话,我在做电机控制项目时,和这个模块打交道的时间最多。它就像是一个多面手,既能做捕获比较,又能接霍尔传感器,还能生成复杂的PWM波形。咱们一个一个来看。

3.1 CCU6捕获/比较单元

捕获/比较单元,说白了就是用来测量信号或者产生精确时序的。我个人习惯把它分成两部分理解:捕获是“看”,比较是“做”。

3.1.1 捕获模式

捕获模式用来测量外部信号的频率、周期或占空比。它的工作原理很简单:当检测到信号边沿时,把定时器的当前值“抓”下来存到寄存器里。

我举个例子。你想测量一个PWM信号的频率,可以这样配置:

// 配置CCU6的捕获通道0
CCU6_CCU6CON = 0x01;  // 使能捕获功能
CCU6_CC60S = 0x01;    // 上升沿捕获
CCU6_T12PR = 0xFFFF;  // 定时器T12预分频

嗯,这里要注意一点:捕获到的值是两个边沿之间的差值,不是绝对时间。你需要根据定时器的时钟频率去换算。

我的经验: 在高速信号捕获时,记得把定时器预分频设大一点。我曾经遇到过捕获值溢出的情况,排查了半天才发现是分频比太小了。

3.1.2 比较模式

比较模式就更有意思了。你可以设定一个比较值,当定时器计数到这个值时,输出引脚会自动翻转。这就是生成PWM的基础。

看一个简单的PWM生成配置:

// 配置CCU6比较通道0输出PWM
CCU6_T12PR = 1000;     // 周期寄存器
CCU6_CC60SR = 500;     // 比较寄存器,占空比50%
CCU6_CCU6CON = 0x02;   // 使能比较输出
CCU6_T12CTR = 0x01;    // 启动定时器T12

你想想看,这个配置是不是很简单?但实际项目中,比较值的更新时机很重要。我建议在定时器溢出中断里更新比较值,这样可以避免输出毛刺。

3.2 霍尔传感器接口

做无刷直流电机控制的朋友,对霍尔传感器肯定不陌生。CCU6模块专门为霍尔传感器设计了接口,可以自动捕获三个霍尔信号的状态变化。

为什么需要专门的接口?因为霍尔传感器在电机换向时会产生中断,你需要快速响应。用软件轮询的话,CPU就被占死了。

核心配置:
  • 使能霍尔传感器模式:CCU6_CCU6CON |= 0x10
  • 配置霍尔输入引脚:CCU6_PISEL = 0x03
  • 设置换向延迟时间:CCU6_DEADTIME = 100

我记得有一次做电动工具项目,霍尔信号干扰特别大。后来发现是没加硬件滤波,CCU6内部虽然有数字滤波,但对付不了那种尖峰脉冲。最后我在霍尔信号线上加了RC滤波,问题就解决了。

3.2.1 换向逻辑

霍尔传感器接口最强大的地方在于,它可以自动计算换向时刻。你只需要配置好换向表,CCU6会根据霍尔状态自动切换输出相位。

换向表长这样:

霍尔状态 (H3,H2,H1) 输出相位 换向角度
001 A+ B-
011 A+ C- 60°
010 B+ C- 120°
110 B+ A- 180°
100 C+ A- 240°
101 C+ B- 300°

3.3 正交编码器接口

正交编码器接口,简称QEI。它用来读取旋转编码器的位置和速度信息。CCU6的QEI接口支持A、B、Z三相信号。

说白了,A相和B相是正交的,相位差90度。通过判断哪个相先变化,就能知道旋转方向。Z相是零位信号,每转一圈产生一个脉冲。

注意: 编码器接口的输入频率不能太高。我见过有人把编码器直接接到CCU6上,结果转速一高就丢脉冲。后来加了施密特触发器整形,才稳定下来。

3.3.1 位置计数

CCU6内部有一个位置计数器,每检测到一个编码器脉冲就加1或减1。你可以通过读取这个计数器来获得当前位置。

// 读取编码器位置
uint32_t position = CCU6_POSITION;
// 读取编码器速度(单位:脉冲/秒)
uint32_t speed = CCU6_SPEED;

这里有个坑:位置计数器是32位的,但如果你用16位模式,记得处理溢出。我曾经在项目中没注意这个,结果电机转了几圈后位置就乱套了。

3.4 多通道PWM生成

CCU6可以同时生成多路PWM信号,而且每路的占空比和相位都可以独立控制。这对于三相电机控制来说太重要了。

多通道PWM的核心是定时器T12和T13。T12负责生成三对互补PWM,T13可以生成额外的PWM信号。

3.4.1 互补PWM与死区时间

互补PWM就是一对信号,一个高电平另一个就低电平。但为了防止上下桥臂直通,需要在切换时插入死区时间。

死区时间怎么设?我一般这样算:

// 死区时间 = 2us,时钟频率100MHz
// 死区计数值 = 2us * 100MHz = 200
CCU6_DEADTIME = 200;

你想想看,死区时间设大了会影响效率,设小了又可能炸管子。我建议先按器件手册的最小值设,然后逐步调大,直到波形没有毛刺为止。

3.4.2 中心对齐与边沿对齐

PWM有两种对齐方式:中心对齐和边沿对齐。中心对齐的PWM在定时器向上和向下计数时都会更新输出,适合电机控制。边沿对齐则简单一些,适合开关电源。

我个人习惯在电机控制中用中心对齐,因为谐波更小。但要注意,中心对齐模式下,比较值的更新时机要选在定时器溢出时,而不是在匹配时。

小技巧: 如果你需要生成三相PWM,建议把三路的比较值放在一个结构体里,一次性更新。这样可以避免三相不同步的问题。

知识体系总览

下面这张图展示了CCU6模块的核心功能及其关系,帮你快速建立整体认知:

CCU6模块知识体系 CCU6核心单元 捕获/比较单元 信号测量 / 时序生成 霍尔传感器接口 BLDC换向控制 正交编码器接口 位置 / 速度检测 多通道PWM生成 互补PWM · 死区控制 · 中心/边沿对齐 电机控制 电源转换 传感器测量 CCU6模块是AURIX运动控制的核心外设,集成了多种功能

好了,这一章的内容就到这里。CCU6模块的功能确实很丰富,但只要你理解了捕获、比较、霍尔、编码器和PWM这几个核心概念,用起来就会得心应手。下一章我们会深入讲解GTM模块,它是AURIX里另一个重量级的外设。

专注资料整理