STM32F103霍尔编码器测速
目录
一、编码器介绍
编码器,是一种用来测量机械旋转或位移的传感器。这种传感器能够测量机械部件在旋转或直线运动时的位移位置或速度等信息, 并将其转换成一系列电信号。
编码器是工业中常用的传感器之一,广泛应用于工业生产当中需要对机械系统进行监视或控制的场景, 包括工业控制、机器人、照相机镜头、雷达平台以及部分计算机输入设备例如轨迹球和鼠标滚轮等等。
编码器可以根据不同的方式分出很多种类型。例如:
- 根据检测原理,可分为光电编码器和霍尔编码器;
- 根据内部机械结构的运动方式,可分为线性编码器和旋转编码器;
- 根据其刻度实现方法及信号输出形式, 又可分为增量式、绝对式以及混合式三种。
线性编码器通常用于测量直线运动,而旋转编码器常被用来测量旋转运动。因此不难看出,电机转速测量应该使用的是旋转编码器。旋转编码器的原理示意图如下图所示;

1.1 按检测原理划分
1.1.1 光电编码器
光电编码器是一种通过光电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器,光电编码器内部大都由码盘、光电检测装置和信号处理电路等部分组成。
光电码盘上刻了若干圈线槽, 线槽等距并且可透光,光电码盘与电动机同轴,电动机旋转时,光电码盘就会周期性的透过和遮挡来自光电检测装置的光线,这样检测装置就会周期性的生成若干电信号。 但是这些电信号通常比较微弱,需要加入一套处理电路对信号进行放大和整形,最后把信号整形为脉冲信号并向外输出。
1.1.2 霍尔编码器
霍尔编码器是一种通过磁电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器,由霍尔码盘和霍尔元件等部分组成。
霍尔码盘是在一定直径的圆板上等分地布置有不同的磁极。霍尔码盘与电动机同轴,电动机旋转时,霍尔元件检测输出若干脉冲信号,为判断转向,一般输出两组存在一定相位差的方波信号。
1.2 按信号输出形式划分
1.2.1 增量式编码器
增量式旋转编码器是将设备运动时的位移信息变成连续的脉冲信号,脉冲个数表示位移量的大小。
只有当设备运动的时候增量式编码器才会输出信号。 编码器一般会把这些信号分为通道A
和通道B
两组输出,并且这两组信号间有90°
的相位差。同时采集这两组信号就可以知道设备的运动和方向。
除了通道A
、通道B
以外,很多增量式编码器还会设置一个额外的通道Z
输出信号,用来表示编码器特定的参考位置,传感器转一圈Z
轴信号才会输出一个脉冲。 增量式编码器只输出设备的位置变化和运动方向,不会输出设备的绝对位置。
1.2.1.1 光电增量式编码器
增量式编码器都有A
、B
两通道信号输出,这是因为增量式编码器的码盘上有两圈线槽, 两圈线槽的之间会错开一定的角度,这个角度会使得光电检测装置输出的两相信号相差1/4
周期(90°
)。码盘的具体工作方式如下图所示;



图中黑色代表透光,白色代表遮光。当码盘转动时,内圈和外圈的线槽会依次透过光线,光电检测装置检测到光线通断的变化, 就会相应的输出脉冲信号,因为内外圈遮光和透光时候存在时间差,所以也就有了A
、B
两通道信号的相位差。
这里我们将设A
相为外圈,B
相为内圈,码盘转动循环输出如下信号:11
-> 01
-> 00
- > 10
;

根据两相信号变化的先后顺序就可以判断运动方向,记录输出的脉冲个数可以知道位移量的大小,同时通过输出信号的频率就能得到速度;
通过判断B
相处于上升沿时A
相的电平状态,我们就可以知道码盘旋转的方向了;
- 当码盘正转时,在
B
相的上升沿,A
相恒为高电平; - 当码盘反转时,在
B
相的上升沿,A
相恒为低电平。
注意:
- 正/反转是相对而言的,重点在于区分不同旋转方向时的波形特征;
- 通过观察
A
相上升沿时B
相的电平亦能判旋转方向。
1.2.1.2 霍尔增量式编码器
霍尔增量式编码器在结构上和光电式几乎相同,只不过检测原理变成了霍尔效应。 内部元件也稍有不同,霍尔编码器的码盘上不是线槽,而是不同的磁极,或者有些直接把电机的旋转磁场当作码盘, 然后检测装置换成了霍尔传感器。输出和光电式相同,仍然是相位差1/4
周期的A
、B
两通道信号。
增量式编码器计数起点任意设定,可实现多圈无限累加和测量。需要提高分辨率时,可触发A
、B
两通道信号的上升沿和下降沿对原脉冲数进行倍频。 但是当接收设备停机重启后,增量式编码器需要重新寻找参考零点。
1.2.2 绝对式编码器
绝对式旋转编码器是将设备运动时的位移信息通过二进制编码的方式变成数字量直接输出。 这种编码器与增量式编码器的区别主要在内部的码盘。
绝对式编码器的码盘利用若干透光和不透光的线槽组成一套二进制编码, 这些二进制码与编码器转轴的每一个不同角度是唯一对应的,读取这些二进制码就能知道设备的绝对位置,所以叫它绝对式编码器。 绝对式编码器一般常用自然二进制、格雷码或者BCD
码等编码方式。
1.2.3 混合式绝对式编码器
混合式绝对式编码器,它输出两组信息:一组信息用于检测磁极位置,带有绝对信息功能;另一组则和增量式编码器的输出信息完全相同。
1.3 编码器基本参数
编码器基本参数:
- 分辨率:指编码器能够分辨的最小单位;
- 对于增量式编码器,其分辨率表示为编码器转轴旋转一圈所产生的脉冲数, 即脉冲数/转(
Pulse Per Revolution
或PPR
); - 对于绝对式编码器,内部码盘所用的位数就是它的分辨率,单位是位(
bit
),具体还分单圈分辨率和多圈分辨率;
- 对于增量式编码器,其分辨率表示为编码器转轴旋转一圈所产生的脉冲数, 即脉冲数/转(
- 精度:首先明确一点,精度与分辨率是两个不同的概念。精度是指编码器每个读数与转轴实际位置间的最大误差,通常用角度、角分或角秒来表示。 例如有些绝对式编码器参数表里会写
±20′′
,这个就表示编码器输出的读数与转轴实际位置之间存在正负20
角秒的误差,精度由码盘刻线加工精度、 转轴同心度、材料的温度特性、电路的响应时间等各方面因素共同决定; - 最大响应频率:指编码器每秒输出的脉冲数,单位是
Hz
。计算公式:最大响应频率 = 分辨率 * 轴转速/60
。; - 信号输出形式:增量式、绝对式以及混合式;
- 对于增量式编码器,每个通道的信号独立输出,输出电路形式通常有集电极开路输出、推挽输出、差分输出等;
- 对于绝对式编码器,由于是直接输出几十位的二进制数,为了确保传输速率和信号质量,一般采用串行输出或总线型输出,也有一部分是并行输出,输出电路形式与增量式编码器相同。
二、霍尔编码器测速
2.1 霍尔编码器
这里我在淘宝购买的霍尔编码器为:霍尔磁性编码器3系5系7系8系直流电机码盘马达测速度测方向传感器。
具体型号信息:775/795/895
霍尔编码器(整套)。

2.1.1 接口定义

输出端子定义,从PCB
板正面从左到右依次为1
,2
,3
,4
,5
,6
;
序号 | 颜色 | 引脚 | 功能 |
---|---|---|---|
1 | 白色 | OutB | 编码器B相输出 |
2 | 黄色 | OutA | 编码器A相输出 |
3 | 蓝色 | VCC | 编码器电源正(5V) |
4 | 绿色 | GND | 编码器电源负(地) |
5 | 黑丝 | M2 | 电机电源2(和M1(红线)对调电机可正反转) |
6 | 红色 | M1 | 电机电源1(和M1(红线)对调电机可正反转) |
2.1.2 电机安装
电机上安装编码器要求电机必须具有双出轴,这里我们采用标准安装方式;

注意编码器磁栅极在安装的时候需要和线路板之间有点间距,不要贴的太近。
2.1.3 转速计算
假如编码器码盘旋转一周A/B
相输出的脉冲数目为N
,在时间T
内统计到的有效脉冲数目为S
(正转脉冲数+ 1
,反转脉冲数- 1
),那么转速为:
使用的编码器码盘旋转一周输出的脉冲个数为16
,即分辨率为,假如1s
内统计得到的有效脉冲数目为 500
,代入上式:
2.1.4 测试
这里我们使用逻辑分析器去测量霍尔传感器A
、B
相的输出,接线如下:
- 通道
1
连接A
相; - 通道
2
连接B
相; - 逻辑分析器的地连接编码器电源负(地),注意这个必须连接;
这里我们给电机通电,通过条件PWM
占空比调节电机转速,当占空比为13%
时查看霍尔编码器A
、B
相波形如下:

可以看到此时波形的频率为284Hz
,即1s
内统计得到的有效脉冲数目为 284
,此时计算转速:
2.2 STM32
编码器测速原理
在带霍尔传感器的直流电机的条件下,电机转动一圈,通过霍尔传感器的A
、B
两相输出一定数量的脉冲,我们可以根据一定时间内的脉冲数计算出电机的瞬时转速。
记脉冲数有两种方式:
- 我们通过
GPIO
引脚的外部中断来检测边沿变化,以此来检测脉冲数,但是会有毛刺,也就是错误的脉冲信号; - 我们以
STM32
芯片作为主控,利用STM32
的定时器外设的输入捕获功能,配置相关输入通道为编码器接口模式,就可以进行脉冲数的计数。
在第二种方式中,错误的脉冲信号会被输入滤波器过滤掉,所以更推荐也更常用。
2.2.1 输入捕获模式
我们在《STM32F103
捕获配置》介绍了输入捕获的原理;我们利用STM32
的输入捕获功能,可以测量外部信号的频率、周期或脉冲宽度。
其工作原理:
- 定时器在输入捕获模式下,会捕获外部信号的边沿(上升沿、下降沿或两者);
- 当捕获事件发生时,定时器的当前计数值(
TIMx_CNT
)会被记录到捕获寄存器(TIMx_CCR1
)中; - 通过比较两次捕获事件的计数值,可以计算出信号的周期或脉冲宽度;(当然了,如果脉冲持续时间较长,可能会触发更新(溢出)中断买这种就需要特殊处理)
在这种工作模式下:
- 定时器的计数器(
TIMx_CNT
)通常以固定的频率(计数频率是由通预分频寄存器TIMx_PSC
)控制的递增或递减; - 捕获事件发生时,计数器的值会被保存到捕获寄存器(
TIMx_CCRx
),但计数器本身不会停止或重置;
2.2.2 编码器模式
STM32
芯片内部有专门用来采集增量式编码器方波信号的接口,这些接口实际上是STM32
定时器的其中一种功能。 不过编码器接口功能只有高级定时器TIM1
、TIM8
和通用定时器TIM2~TIM5
才有,编码器接口用到了定时器的输入捕获部分。
其工作原理:
- 定时器在编码器模式下,会同时捕获两个相位差为
90°
的信号(即A
相和B
相); - 根据
A
相和B
相的边沿变化,定时器会自动判断旋转方向,并递增或递减计数器; - 每个脉冲的上升沿和下降沿都会触发计数。
在这种工作模式下:
- 定时器的计数器(
TIMx_CNT
)会根据编码器的旋转方向自动递增或递减; - 计数器的值直接反映了编码器的位置或脉冲数;
这里我们来介绍一下STM32
的编码器模式,这里我们需要结合定时器框图来分析;

假如我们将:
- 编码器
A
相输出信号连接到定时器通道1
,上图TIMx_CH1
; - 编码器
B
相输出信号连接到定时器通道2
,上图TIMx_CH2
;
如果要实现编码器工作模式,我们需要需要进行如下配置;
(1) TIMx
时钟使能:通过配置RCC_APB1ENR/RCC_APB2ENR
寄存器使能TIMx
时钟;
(2)GPIO
口配置:以TIM4_CH1
(PB6
)、TIM4_CH2
(PB7
)为例;
- 配置
PB6
、PB7
为下拉输入; GPIOB
时钟使能;
(3) 配置TIMx
时基单元;
- 配置
TIMx_ARR
寄存器自动重装载的值(0xFFFF
); - 配置
TIMx_PSC
寄存器预分频系数(0
);
(4) 配置捕获/比较模式寄存器寄存器TIMx_CCMRx
;
-
输入捕获预滤波器(
ICxF
):配置采样频率和数字滤波器长度,用于消除输入信号的抖动; -
输入捕获/比较输出选择(
CCxS
):设置输入捕获映射关系:-
TIMx_CH1
捕捉到的信号可以连接到IC1
; -
TIMx_CH2
捕捉到的信号可以连接到IC2
;
-
II1
、TI2
经过输入滤波器和边沿检测器产生TI1FP1
,TI2FP2
。
(5) 配置从模式控制寄存器TIMx_SMCR
;
- 配置从模式选择(
SMS
):配置为编码器模式3
,根据另一个信号的输入电平,计数器在TI1FP1
、TI2FP2
的边沿向上/向下计数;
亲爱的读者和支持者们,自动博客加入了打赏功能,陆陆续续收到了各位老铁的打赏。在此,我想由衷地感谢每一位对我们博客的支持和打赏。你们的慷慨与支持,是我们前行的动力与源泉。
日期 | 姓名 | 金额 |
---|---|---|
2023-09-06 | *源 | 19 |
2023-09-11 | *朝科 | 88 |
2023-09-21 | *号 | 5 |
2023-09-16 | *真 | 60 |
2023-10-26 | *通 | 9.9 |
2023-11-04 | *慎 | 0.66 |
2023-11-24 | *恩 | 0.01 |
2023-12-30 | I*B | 1 |
2024-01-28 | *兴 | 20 |
2024-02-01 | QYing | 20 |
2024-02-11 | *督 | 6 |
2024-02-18 | 一*x | 1 |
2024-02-20 | c*l | 18.88 |
2024-01-01 | *I | 5 |
2024-04-08 | *程 | 150 |
2024-04-18 | *超 | 20 |
2024-04-26 | .*V | 30 |
2024-05-08 | D*W | 5 |
2024-05-29 | *辉 | 20 |
2024-05-30 | *雄 | 10 |
2024-06-08 | *: | 10 |
2024-06-23 | 小狮子 | 666 |
2024-06-28 | *s | 6.66 |
2024-06-29 | *炼 | 1 |
2024-06-30 | *! | 1 |
2024-07-08 | *方 | 20 |
2024-07-18 | A*1 | 6.66 |
2024-07-31 | *北 | 12 |
2024-08-13 | *基 | 1 |
2024-08-23 | n*s | 2 |
2024-09-02 | *源 | 50 |
2024-09-04 | *J | 2 |
2024-09-06 | *强 | 8.8 |
2024-09-09 | *波 | 1 |
2024-09-10 | *口 | 1 |
2024-09-10 | *波 | 1 |
2024-09-12 | *波 | 10 |
2024-09-18 | *明 | 1.68 |
2024-09-26 | B*h | 10 |
2024-09-30 | 岁 | 10 |
2024-10-02 | M*i | 1 |
2024-10-14 | *朋 | 10 |
2024-10-22 | *海 | 10 |
2024-10-23 | *南 | 10 |
2024-10-26 | *节 | 6.66 |
2024-10-27 | *o | 5 |
2024-10-28 | W*F | 6.66 |
2024-10-29 | R*n | 6.66 |
2024-11-02 | *球 | 6 |
2024-11-021 | *鑫 | 6.66 |
2024-11-25 | *沙 | 5 |
2024-11-29 | C*n | 2.88 |

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2022-02-10 linux驱动移植-LED字符设备驱动
2022-02-10 linux驱动移植-DM9000网卡驱动以及NFS文件系统