旋转编码开关 EC11 的工作原理

旋转编码开关 EC11 的工作原理

dayou1024于 2020-07-20 21:18:51 发布3289 已收藏 13

分类专栏: 单片机 电子技术

版权

​编辑单片机同时被 2 个专栏收录正在上传…重新上传取消

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 执行一次下列函数。根据需要自行更改。

 
  1. #define EncoderA  P01

  2. #define EncoderB  P02         //A ,  B 两个引脚

  3. uint8 time_cnt = 0;                //用于记录次数

  4. uint8 input_status = 0;            //输入的状态

  5. uint8 input_status0 = 0;        //用于记录上一次初始状态

  6. uint8 pulse0 = 0;                //记录正旋转的状态次数

  7. uint8 pulse1 = 0;                //记录反旋转的状态次数

  8. uint8 scanf_status = 0;            //获取到的状态

  9. uint8 fun_one = 0;                //判断函数是否第一次执行

  10. //125us

  11. void EC11_Key_Detect(void)

  12. {

  13.     if (++time_cnt <= 3)        

  14.     {

  15.         return;

  16.     }

  17.     time_cnt = 0;

  18.     

  19.     //每500us 进入一次 判断A、B引脚有无电平变化

  20.     if (EncoderA)

  21.     {

  22.         if (EncoderB)

  23.         {

  24.              //状态1

  25.             input_status = 1;        //A = 1; B = 1

  26.         }

  27.         else if (!EncoderB)

  28.         {

  29.              //状态4

  30.             input_status = 4;        //A = 1; B = 0

  31.         }

  32.     }

  33.     else if(!EncoderA)

  34.     {

  35.         if (EncoderB)

  36.         {

  37.              //状态2

  38.             input_status = 2;        //A = 0; B = 1

  39.         }

  40.         else if (!EncoderB)

  41.         {

  42.              //状态3

  43.             input_status = 3;        //A = 0; B = 0

  44.         }

  45.     }

  46.     //通过判断两个状态是否相等来 判断状态确实有变化(类似于按键消抖过程)

  47.     if (input_status == input_status0)

  48.     {

  49.         //如果第一次执行该函数

  50.         if (fun_one == 0)

  51.         {

  52.             fun_one = 1;

  53.             scanf_status = input_status;

  54.         }

  55.         input_status0 = input_status;

  56.         

  57.         //如果状态为 1 因为开关旋转后 电平会停在 1 状态,在此执行所需要的东西

  58.         if (scanf_status == 1)

  59.         {

  60.             //正旋转了一个周期

  61.             if (pulse0 >= 4)

  62.             {

  63.                 pulse0 = 0;

  64.                 //开关正旋转一次写在这里就行了

  65.                 //需要执行的语句

  66.             }

  67.             //反旋转一个周期

  68.             if (pulse1 >= 4)

  69.             {

  70.                 pulse1 = 0;

  71.                 //开关反旋转一次写在这里就行了

  72.                 //需要执行的语句

  73.             }

  74.             //在状态1 的 前提下,判断是正旋转还是反旋转

  75.             if (input_status == 2)        //正旋转

  76.             {

  77.                 scanf_status = 2;

  78.                 pulse0++;

  79.             }

  80.             else if (input_status == 4)        //反旋转

  81.             {

  82.                 scanf_status = 4;

  83.                 pulse1++;

  84.             }

  85.         }

  86.         //在状态 2 的 前提下,判断是正旋转还是反旋转 

  87.         if (scanf_status == 2)

  88.         {

  89.             if (input_status == 3)        //正旋转

  90.             {

  91.                 scanf_status = 3;

  92.                 pulse0++;

  93.             }

  94.             if (input_status == 1)        //反旋转

  95.             {

  96.                 scanf_status = 1;

  97.                 pulse1++;

  98.             }

  99.         }

  100.         //在状态 3 的 前提下,判断是正旋转还是反旋转

  101.         if (scanf_status == 3)

  102.         {

  103.             if (input_status == 4)        //正旋转

  104.             {

  105.                 scanf_status = 4;

  106.                 pulse0++;

  107.             }

  108.             if (input_status == 2)        //反旋转

  109.             {

  110.                 scanf_status = 2;

  111.                 pulse1++;

  112.             }

  113.         }

  114.         //在状态 4 的 前提下,判断是正旋转还是反旋转

  115.         if (scanf_status == 4)

  116.         {

  117.             if (input_status == 1)        //正旋转

  118.             {

  119.                 scanf_status = 1;

  120.                 pulse0++;

  121.             }

  122.             if (input_status == 3)        //反旋转

  123.             {

  124.                 scanf_status = 3;

  125.                 pulse1++;

  126.             }

  127.         }

  128.     }

  129.     else

  130.     {

  131.         input_status0 = input_status;

  132.     }

  133. }


————————————————
版权声明:本文为CSDN博主「贾老练」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lovelijiapu/article/details/99584590

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_20312079

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值