旋转编码开关 EC11 的工作原理
旋转编码开关 EC11 的工作原理
于 2020-07-20 21:18:51 发布3289
分类专栏:
版权
7 篇文章1 订阅
订阅专栏
9 篇文章3 订阅
订阅专栏
EC11旋转编码开关:带有左转、右转、按下三个功能。
我只需要使用左右转功能,这里只需要使用A、B引脚。
1. 引脚设置:
使用的是A B 引脚,设置为上拉输入。因为需要通过检测A、B两个引脚的电平变化,所以设置为上拉输入状态。
2.左转(逆时针)、右转(顺时针)的电平状态变化
电平变化,这里指的是一个周期中的高低电平变化情况。如下输出信号图:从左往右的第一根虚线到第三个虚线中,
A、B间的电平状态。
逆时针时(一个周期):11、01、00、10 、11、01、00、10
顺时针时(一个周期):11、10、00、01 、11、10、00、01
3.EC11 开关输出信号:
4.实现原理:
这里需要实现检测编码器到底是左转还是右转。就通过一个周期内的A、B引脚的变化情况来做判断就行了。
附上C语言代码:
我使用的定时器来检测状态,定时器中断时间 125us 执行一次下列函数。根据需要自行更改。
#define EncoderA P01
#define EncoderB P02 //A , B 两个引脚
uint8 time_cnt = 0; //用于记录次数
uint8 input_status = 0; //输入的状态
uint8 input_status0 = 0; //用于记录上一次初始状态
uint8 pulse0 = 0; //记录正旋转的状态次数
uint8 pulse1 = 0; //记录反旋转的状态次数
uint8 scanf_status = 0; //获取到的状态
uint8 fun_one = 0; //判断函数是否第一次执行
//125us
void EC11_Key_Detect(void)
{
if (++time_cnt <= 3)
{
return;
}
time_cnt = 0;
//每500us 进入一次 判断A、B引脚有无电平变化
if (EncoderA)
{
if (EncoderB)
{
//状态1
input_status = 1; //A = 1; B = 1
}
else if (!EncoderB)
{
//状态4
input_status = 4; //A = 1; B = 0
}
}
else if(!EncoderA)
{
if (EncoderB)
{
//状态2
input_status = 2; //A = 0; B = 1
}
else if (!EncoderB)
{
//状态3
input_status = 3; //A = 0; B = 0
}
}
//通过判断两个状态是否相等来 判断状态确实有变化(类似于按键消抖过程)
if (input_status == input_status0)
{
//如果第一次执行该函数
if (fun_one == 0)
{
fun_one = 1;
scanf_status = input_status;
}
input_status0 = input_status;
//如果状态为 1 因为开关旋转后 电平会停在 1 状态,在此执行所需要的东西
if (scanf_status == 1)
{
//正旋转了一个周期
if (pulse0 >= 4)
{
pulse0 = 0;
//开关正旋转一次写在这里就行了
//需要执行的语句
}
//反旋转一个周期
if (pulse1 >= 4)
{
pulse1 = 0;
//开关反旋转一次写在这里就行了
//需要执行的语句
}
//在状态1 的 前提下,判断是正旋转还是反旋转
if (input_status == 2) //正旋转
{
scanf_status = 2;
pulse0++;
}
else if (input_status == 4) //反旋转
{
scanf_status = 4;
pulse1++;
}
}
//在状态 2 的 前提下,判断是正旋转还是反旋转
if (scanf_status == 2)
{
if (input_status == 3) //正旋转
{
scanf_status = 3;
pulse0++;
}
if (input_status == 1) //反旋转
{
scanf_status = 1;
pulse1++;
}
}
//在状态 3 的 前提下,判断是正旋转还是反旋转
if (scanf_status == 3)
{
if (input_status == 4) //正旋转
{
scanf_status = 4;
pulse0++;
}
if (input_status == 2) //反旋转
{
scanf_status = 2;
pulse1++;
}
}
//在状态 4 的 前提下,判断是正旋转还是反旋转
if (scanf_status == 4)
{
if (input_status == 1) //正旋转
{
scanf_status = 1;
pulse0++;
}
if (input_status == 3) //反旋转
{
scanf_status = 3;
pulse1++;
}
}
}
else
{
input_status0 = input_status;
}
}
————————————————
版权声明:本文为CSDN博主「贾老练」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lovelijiapu/article/details/99584590