跳到主要内容

【Timer】旋转编码器

下载例程代码: 下载代码 如何使用例程【点击查看教程】

EC11旋转编码器简介

什么是旋转编码器

旋转编码器一般有增量型绝对型

  • 增量型编码器会在转动时输出脉冲,转动角度和脉冲数是线性对应的,例如每转1°产生1个脉冲。它只知道相对当前位置旋转了多少度,而不知道旋转轴的具体位置
  • 绝对型编码器会输出转轴的位置(绝对角度),可以视为一种角度传感器。

EC11就是一种增量型编码器,旋转时会输出一串脉冲信号,通过计数这些脉冲,可以推断出旋转了多少度。

EC11旋转编码器

旋转编码器计数原理

EC11有A、B两相输出,其规格是 20脉冲/360°

  • 只看A相,每一个高脉冲都代表了360/20 = 18°,也就是说,图中的3个脉冲代表旋转了 3*18 = 54°
  • 再看B相,如果B先输出脉冲A后输出脉冲(即下图),则说明是顺时针旋转。反之,则说明是逆时针旋转
脉冲输出

如何使用例程

下载程序,并连接硬件,即可看到效果

硬件连接

  • 使用配套TYPE-C数据线,将学习板连接到计算机
连接usb线

程序效果

学习板上的EC11
  • 检测到编码器旋转时会输出脉冲计数(计数从1000开始,顺时针减、逆时针加)
串口输出信息

例程讲解

下面介绍了如何自己实现该例程的功能

1、工程配置

  • 分配引脚:在Pinout&Configuration页面,将PA8、PA9分别配置为TIM1_CH1、TIM1_CH2
配置PINOUT
  • 配置TIM1:在Pinout&Configuration -> Timers -> TIM1

    • Mode -> Combined Channels设为Encoder Mode,使TIM1进入“编码器模式”

    • Configuration -> Encoder -> Input Filter 设为 15,最大程度滤波,可以获得更稳定的效果

配置TIM1
  • 打开串口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;