【Timer】旋转编码器
下载例程代码: 下载代码 如何使用例程【点击查看教程】
EC11旋转编码器简介
什么是旋转编码器
旋转编码器一般有增量型和绝对型
- 增量型编码器会在转动时输出脉冲,转动角度和脉冲数是线性对应的,例如每转1°产生1个脉冲。它只知道相对当前位置旋转了多少度,而不知道旋转轴的具体位置。
- 绝对型编码器会输出转轴的位置(绝对角度),可以视为一种角度传感器。
EC11就是一种增量型编码器,旋转时会输出一串脉冲信号,通过计数这些脉冲,可以推断出旋转了多少度。
旋转编码器计数原理
EC11有A、B两相输出,其规格是 20脉冲/360°
- 只看A相,每一个高脉冲都代表了360/20 = 18°,也就是说,图中的3个脉冲代表旋转了 3*18 = 54°
- 再看B相,如果B先输出脉冲A后输出脉冲(即下图),则说明是顺时针旋转。反之,则说明是逆时针旋转。
如何使用例程
下载程序,并连接硬件,即可看到效果
硬件连接
- 使用配套TYPE-C数据线,将学习板连接到计算机
程序效果
打开 波特律动 串口助手 (baud-dance.com) 在线串口调试助手,点击“选择串口”,选择USB Single Serial
拧动学习板上的编码器
- 检测到编码器旋转时会输出脉冲计数(计数从1000开始,顺时针减、逆时针加)
例程讲解
下面介绍了如何自己实现该例程的功能
1、工程配置
- 分配引脚:在Pinout&Configuration页面,将PA8、PA9分别配置为TIM1_CH1、TIM1_CH2
配置TIM1:在Pinout&Configuration -> Timers -> TIM1
Mode -> Combined Channels设为Encoder Mode,使TIM1进入“编码器模式”
Configuration -> Encoder -> Input Filter 设为 15,最大程度滤波,可以获得更稳定的效果
- 打开串口2外设:Pinout&Configuration -> Connectivity -> USART2,将Mode选择为Asynchronous
2、代码
(1) 初始化过程
// 启动编码器
HAL_TIM_Encoder_Start(&htim1, TIM_CHANNEL_ALL);
// 给TIM1的CNT赋初值1000
htim1.Instance->CNT = 1000;
赋初值1000是为了方便观察,实际应用中可以根据需求赋初值
(2) 获得脉冲计数
通过函数获取TIM1的CNT值
__HAL_TIM_GET_COUNTER(&htim1)
return
返回uint16_t整数型变量,即当前的计数值
cnt_encoder = __HAL_TIM_GET_COUNTER(&htim1);
通过脉冲计算角度
- 每个脉冲代表18°,因此将脉冲数乘以18°即可
angle = cnt_encoder * 18;