跳到主要内容

【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线

程序效果

  • 打开 小智精灵 串口助手 在线串口调试助手,点击“选择串口”,选择 USB Single Serial

  • 拧动学习板上的编码器

学习板上的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;