Arduino旋转编码器测试

本文介绍了一种改进的旋转编码器检测方法,通过对时序进行细致检查,解决了网上常见程序中的错误编码问题。文章提供了Arduino代码示例,演示了如何准确判断旋转方向并处理按键事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

做为旋转编码器学习过程的记录,原理就不详细介绍了,网上有很多。

先上一张时序图

正常旋转时显示
顺时针时序
CLK:1 DT:1
CLK:1 DT:0
CLK:0 DT:0
CLK:0 DT:1
CLK:1 DT:1
逆时针时序
CLK:1 DT:1
CLK:0 DT:1
CLK:0 DT:0
CLK:1 DT:0
CLK:1 DT:1

用网上找的程序测试发现会出现错误编码,于是自己修理一下检测方法,对整个时序进行检查,错误解决。

程序通过串口输出旋转方向和按键。

 1 int CLKbtn = 12;
 2 int DTbtn = A2;
 3 int SWbtn = A1;
 4 int oldA = LOW;
 5 int oldB = LOW;
 6 bool lastButtonStatus = false;
 7 unsigned char check = 0x00;
 8 void setup()
 9 {
10   Serial.begin(9600);
11   pinMode(CLKbtn, INPUT);
12   pinMode(DTbtn, INPUT);
13   pinMode(SWbtn, INPUT);
14   digitalWrite(SWbtn, HIGH);//连接按钮的引脚设为上拉
15 }
16 void loop()
17 {
18   int newA = digitalRead(CLKbtn);
19   int newB = digitalRead(DTbtn);
20   int SW = digitalRead(SWbtn);
21  
22   //按键检测
23   bool buttonStatus = !digitalRead(SWbtn);//高电平时未按下,状态为false
24   if (buttonStatus != lastButtonStatus)
25   { 
26      buttonStatus = !digitalRead(SWbtn);
27     delay(20);//去抖动
28     if (buttonStatus != lastButtonStatus)
29     {
30       Serial.println(buttonStatus ? "pressed" : "released");
31       lastButtonStatus = buttonStatus;//保存当前状态
32     }
33   }
34   //旋转检测
35   if (newA != oldA || newB != oldB)//变化时
36   {
37     check = (check << 2) + (newA << 1) + newB; //将变化的时序按位放入,用于对比。
38     if (newA == HIGH && newB == HIGH)//旋转结束
39     {
40       if (check == 0x87) //顺时针 10 00 01 11
41         Serial.println("顺时针");
42       else if (check == 0x4B) //逆时针 01 00 10 11
43         Serial.println("逆时针");
44       else
45       {
46         Serial.println("error");
47       }
48     }
49     oldA = newA;
50     oldB = newB;
51   }
52 }
View Code

 

转载于:https://www.cnblogs.com/zealot527/p/10184211.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值