的实现STM32F4系列 HAL库下的EC11旋转编码器实现

目录

概述

电气连接

波形分析

思路 

HAL初始化

代码

 成品


概述

EC11是一种增量型AB相旋转编码器

旋转编码器是一种可以无限旋转的旋钮,常被作为各种需要大量数据范围的情况(如收音机选台,音量选择等)

增量型是与绝对性做的区分,意味着输出的信号与当前的位置没有关系,与旋转的方向和角度有关

AB相指的是一种输出模式(也可以认为是一种协议)

有两个线输出根据相位判断方向,根据高低电平数量判断走过度数

电气连接

原理图

 

EC11常见额定电压是5V,实测3.3V也可以驱动,但不建议使用3.3V(会出现杂波) 

阻容是为了进行上拉输出和硬件滤波

A,B为旋转信息的输出(两相)

C为接地

SW为内部的开关,可以当作轻触按键使用(注意加软件滤波)

波形分析

数据手册的截图

实测顺时针转动一格

 

实测逆时针转动一格 

解释:

每转动一格(拿到实物自己实验下很容易理解什么叫一格),AB相会出现一个持续10-150ms的低电平,默认为高电平状态

顺时针转动时A相的低电平会比B相提前

逆时针转动时A相的低电平会比B相延后

思路 

很明显可以看出,只需要在A(或B)相的一个边沿(上升下降均可),检测另一相的电平高低即可

因此需要的外设有:

  1. 外部中断
  2. 一个输入状态的GPIO

注意:

  1. 因为要直接接入5V的电压,因此需要GPIO耐压为5V(即为数据手册表FT的管脚)
  2. 未避免干扰,输入状态和外部中断的GPIO设置为上拉模式(不知道为啥浮空输入干扰贼大)
  3. 外部中断上升沿和下降沿均可(这里以下降沿为例)

HAL初始化

外部中断和NVIC

GPIO

代码

为了便于后期的调用,这边做了一个回调函数,可以在触发顺时针或者逆时针的旋转的时候自动调用这个函数

头文件

//外部中断
#define EC11_A_GPIO_Group GPIOA
#define EC11_A_GPIO_PIN GPIO_PIN_0

// GPIO输入
#define EC11_B_GPIO_Group GPIOA
#define EC11_B_GPIO_PIN GPIO_PIN_1
void EC11_Decode(void (*Clockwise)(void), void (*Anticlockwise)(void));

C文件

void EC11_Decode(void (*Clockwise)(void), void (*Anticlockwise)(void))
{
    //Delay_ms(1);
    if (HAL_GPIO_ReadPin(EC11_B_GPIO_Group, EC11_B_GPIO_PIN) == GPIO_PIN_SET)
    {
        Anticlockwise();
    }
    else
    {
        Clockwise();
    }
}

 成品

GitHubhttps://pan.baidu.com/s/1TTc5ARIb-szfsha9MoE_lA?pwd=cwi9%C2%A0

物联沃分享整理
物联沃-IOTWORD物联网 » 的实现STM32F4系列 HAL库下的EC11旋转编码器实现

发表评论