12. 正交编码器(QEI)
12.1. 概述
SWM221系列所有型号QEI操作均相同。使用前需使能对应QEI模块时钟。
正交编码器(增量式编码器或光电式编码器)用于检测旋转运动系统的位置和速度,正交编码器可以用于多种电机的闭环控制,诸如开关磁阻(SR)电机和交流感应电机(ACM)等。
12.2. 特性
可编程输入信号毛刺滤波
提供脉冲计数和计数方向的正交解码器
16位向上/向下计数器
计数方向状态
×2和×4两种计数模式
索引复位/计数匹配复位模式
通用16位计数器(正向计数或反向计数)
QEI产生的中断
A相和B相输入的交换模式
12.3. 功能描述
12.3.1. 模块结构框图
QEI 模块结构如 图 48 所示。

图 48 QEI模块结构框图
12.3.2. 功能说明
典型的增量式编码器包括一个放置在电机转动轴上的带有开槽的轮子和一个用于检测开槽的发射/接收装置,通常有三个输出,分别为 A 相、B 相和索引相(INDEX),所提供的信息可被 QEI 接口解码,用来提供电机的运动信息,包括旋转距离和旋转方向,编码盘的示意图如 图 49 所示。

图 49 增量式正交编码盘示意图
12.3.3. 时序说明
在正交编码器中 A 相(QEA)和B相(QEB)的位置关系是唯一的,如果A相超前B相,那么电机的旋转方向被认为是正向,反之则被认为是反向旋转,索引相作为基准来确定电机的绝对位置,电机每旋转一圈产生一个索引相脉冲信号,电机旋转时三个信号的相关时序如 图 50 所示。

图 50 三相信号正向/反向旋转时序关系
12.3.4. 正交解码器
如 图 51 中正交解码器工作在 x4 计数模式下,在 QEA、QEB 的上升沿和下降沿处都会计数。
计数的方向由正反转状态 UPDN 决定:
当 UPDN 为高电平时,表示电机正转,计数器在每个计数脉冲到来时累加计数结果;
当 UPDN 为低电平时,表示电机反转,计数器在每个计数脉冲到来时递减。
在电机换向旋转时若产生抖动(在 图 51 中 jitter 为抖动部分),QEI 模块会根据检测到的计数脉冲情况判断是否产生抖动,在电机抖动的情况下,计数器不工作,直到电机恢复稳定状态为止。

图 51 正交编码器 x4 计数模式示意图
如 图 52 所示:正交编码器工作在 x2 计数模式下,在该模式下,计数脉冲只在 QEA 的上升沿和下降沿处产生,QEB 只被用来判断旋转方向。

图 52 正交编码器 x2 计数模式示意图
12.3.5. 计数器复位模式
在 QEI 模块中支持两种复位模式:索引复位和计数匹配复位。
索引复位
索引复位的方式如 图 53 所示,在 INDEX 信号到来时,QEI 计数器复位,旋转方向不变时计数器每次都将在索引信号的同一位置发生复位,正向旋转和反向旋转时的复位位置相对称,将 QEI 模块配置在索引复位模式下,QEI 模块将会自动检测 INDEX 信号和电机正转/反转时索引信号的复位位置。

图 53 QEI计数器索引复位模式
匹配复位
计数匹配复位发生在计数器的累加值与预置的目标计数值相等时发生。
在电机正向旋转时,计数器的累加值与最大计数值相等时发生复位,复位后计数器的值被置 0;
在电机反向旋转时,计数器的累加值在等于零时发生复位,复位后计数器的值被复位为预置的最大计数值,计数匹配复位方式如 图 54 所示。

图 54 计数匹配复位模式
12.3.6. 配置方式
配置方式如下:
通过 PORTX_FUNC 寄存器将引脚切换为 QEI 对应数字功能,并使能数字输入
配置 QEI 工作模式(X2、X4)、最大计数值、复位源等设置
若需要使用中断,使能 QEI 相应中断
启动 QEI,开始计数
定时读取 QEI 位置计数器和最大值计数器,从而计算电机的转动方向和速度
12.3.7. 中断配置与清除
可通过配置 IE 寄存器设置 QEI 模块对应的中断,如需清除相应的中断标志,需在 IC 寄存器相应位中将中断状态写 1 清零(R/W1C)。
12.4. 寄存器映射
名称 |
偏移 |
复位值 |
---|---|---|
QEI BASE:0x40041000 |
||
CR |
0x00 |
0x00000000 |
POSCNT |
0x04 |
0x00000000 |
MAXCNT |
0x08 |
0x00000000 |
IE |
0x20 |
0x00000000 |
IM |
0x24 |
0x00000000 |
IC |
0x28 |
0x00000000 |
IIF |
0x2C |
0x00000000 |
IFOV |
0x30 |
0x00000000 |
12.5. 寄存器描述
12.5.1. 控制/状态寄存器(CR)
偏移: 0x00 |
复位值: 0x00000000 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
QEISIDL |
INDEX |
UPDN |
|||||
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
QEIM<2> |
QEIM<1> |
QEIM<0> |
SWPAB |
TQCKPS<1:0> |
TQCS |
QEPEN |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:11 |
REVERSED |
RO |
|
10 |
QEISIDL |
R/W |
空闲模式停止位 1:模块暂停工作 0:模块继续工作 |
9 |
INDEX |
RO |
索引信号状态位(写无效) 1:索引引脚为高电平 0:索引引脚为低电平 |
8 |
UPDN |
R/W |
计数方向状态位(仅用于定时器模式) 1:正向计数 0:反向计数 |
7 |
QEIM<2> |
R/W |
工作模式选择位 1:QEI解码器模式 0:定时器模式 |
6 |
QEIM<1> |
R/W |
计数器复位模式选择位 1:索引信号复位 0:计数匹配复位 |
5 |
QEIM<0> |
R/W |
QEI计数模式选择位 1:X4计数模式 0:X2计数模式 |
4 |
SWPAB |
R/W |
B换向选择位 1:A、B以换向 0:A、B未换向 |
3:2 |
TQCKPS<1:0> |
R/W |
定时器时钟分频选择位(仅用于定时器模式) 11: 256分频 10: 64分频 01:8分频 00:不分频 |
1 |
TQCS |
R/W |
定时器时钟来源选择位(仅用于定时器模式) 1:QEA引脚(上升沿) 0:内部时钟 |
0 |
QEPEN |
R/W |
QEI模块使能(QEI、定时器功能) 1:使能 0:禁能 |
12.5.2. 位置计数器/定时器状态寄存器(POSCNT)
偏移: 0x04 |
复位值: 0x00000000 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
POSCNT |
|||||||
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
POSCNT |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:16 |
RO |
||
15:0 |
POSCNT |
RO |
位置计数器/定时器状态 |
12.5.3. 位置计数器/定时器匹配计数寄存器(MAXCNT)
偏移: 0x08 |
复位值: 0x00000000 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
MAXCNT |
|||||||
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
MAXCNT |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:6 |
RO |
||
15:0 |
MAXCNT |
R/W |
位置计数器/定时器匹配计数值 |
12.5.4. 中断使能寄存器(IE)
偏移: 0x20 |
复位值: 0x00000000 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
INTEN3 |
INTEN2 |
INTEN1 |
INTEN0 |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:4 |
REVERSED |
RO |
保留 |
3 |
INTEN3 |
R/W |
计数错误中断使能标志位 1:使能 0:禁能 |
2 |
INTEN2 |
R/W |
计数器溢出中断使能标志位 1:使能 0:禁能 |
1 |
INTEN1 |
R/W |
计数匹配/定时器中断使能标志位 1:使能 0:禁能 |
0 |
INTEN0 |
R/W |
索引信号复位中断使能使能标志位 1:使能 0:禁能 |
12.5.5. 中断状态屏蔽寄存器(IM)
偏移: 0x24 |
复位值: 0x00000000 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
MASK3 |
MASK2 |
MASK1 |
MASK0 |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:4 |
RO |
||
3 |
MASK3 |
R/W |
屏蔽计数错误中断标志位 1:未屏蔽 0:已屏蔽 |
2 |
MASK2 |
R/W |
屏蔽计数器溢出中断标志位 1:未屏蔽 0:已屏蔽 |
1 |
MASK1 |
R/W |
屏蔽计数匹配/定时器中断标志位 1:未屏蔽 0:已屏蔽 |
0 |
MASK0 |
R/W |
屏蔽索引信号复位中断标志位 1:未屏蔽 0:已屏蔽 |
12.5.6. 清除中断状态寄存器(IC)
偏移: 0x28 |
复位值: 0x00000000 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
CLR3 |
CLR2 |
CLR1 |
CLR0 |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:4 |
REVERSED |
RO |
保留 |
3 |
CLR3 |
R/W |
清除计数错误中断标志位 1:清除 0:未清除 |
2 |
CLR2 |
R/W |
清除计数器溢出中断标志位 1:清除 0:未清除 |
1 |
CLR1 |
R/W |
清除计数匹配/定时器中断标志位 1:清除 0:未清除 |
0 |
CLR0 |
R/W |
清除索引信号复位中断标志位 1:清除 0:未清除 |
12.5.7. 中断状态寄存器(IF)
偏移: 0x2C |
复位值: 0x00000000 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
INT3 |
INT2 |
INT1 |
INT0 |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:4 |
REVERSED |
RO |
保留 |
3 |
INT3 |
RO |
计数错误中断标志位 1: 有错误 0:无错误 |
2 |
INT2 |
RO |
计数器溢出中断标志位 1:以溢出 0:未溢出 |
1 |
INT1 |
RO |
计数匹配/定时器中断标志位 1:计数匹配 0:计数未匹配 |
0 |
INT0 |
RO |
索引信号复位中断标志位 1:以复位 0:未复位 |
12.5.8. 中断溢出寄存器(IFOV)
偏移: 0x30 |
复位值: 0x00000000 |
31 |
30 |
29 |
28 |
27 |
26 |
25 |
24 |
23 |
22 |
21 |
20 |
19 |
18 |
17 |
16 |
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
FLINT3 |
FLINT2 |
FLINT1 |
FLINT0 |
位域 |
名称 |
类型 |
描述 |
---|---|---|---|
31:4 |
REVERSED |
RO |
保留 |
3 |
FLINT3 |
RO |
计数错误中断溢出标志位 1:溢出 0:未溢出 |
2 |
FLINT2 |
RO |
计数器溢出中断溢出标志位 1:溢出 0:未溢出 |
1 |
FLINT1 |
RO |
计数匹配/定时器中断溢出标志位 1:溢出 0:未溢出 |
0 |
FLINT0 |
RO |
索引信号复位中断溢出标志位 1:溢出 0:未溢出 |