概述
EC11是一种增量型AB相旋转编码器
旋转编码器是一种可以无限旋转的旋钮,常被作为各种需要大量数据范围的情况(如收音机选台,音量选择等)
增量型是与绝对性做的区分,意味着输出的信号与当前的位置没有关系,与旋转的方向和角度有关
AB相指的是一种输出模式(也可以认为是一种协议)
有两个线输出根据相位判断方向,根据高低电平数量判断走过度数
电气连接
原理图
EC11常见额定电压是5V,实测3.3V也可以驱动,但不建议使用3.3V(会出现杂波)?
阻容是为了进行上拉输出和硬件滤波
A,B为旋转信息的输出(两相)
C为接地
SW为内部的开关,可以当作轻触按键使用(注意加软件滤波)
波形分析
数据手册的截图
实测顺时针转动一格
?
实测逆时针转动一格?
解释:
每转动一格(拿到实物自己实验下很容易理解什么叫一格),AB相会出现一个持续10-150ms的低电平,默认为高电平状态
顺时针转动时A相的低电平会比B相提前
逆时针转动时A相的低电平会比B相延后
思路?
很明显可以看出,只需要在A(或B)相的一个边沿(上升下降均可),检测另一相的电平高低即可
因此需要的外设有:
- 外部中断
- 一个输入状态的GPIO
注意:
- 因为要直接接入5V的电压,因此需要GPIO耐压为5V(即为数据手册表FT的管脚)
- 未避免干扰,输入状态和外部中断的GPIO设置为上拉模式(不知道为啥浮空输入干扰贼大)
- 外部中断上升沿和下降沿均可(这里以下降沿为例)
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://github.com/HZ1213825/HAL_STM32F4_EC11/settings百度网盘https://pan.baidu.com/s/1TTc5ARIb-szfsha9MoE_lA?pwd=cwi9?
|