做为旋转编码器学习过程的记录,原理就不详细介绍了,网上有很多。
先上一张时序图
正常旋转时显示
顺时针时序
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 }