旋转编码器的引脚
- CLK(A相)
- DATA(B相)
- SWITCH
- VCC
- GND
工作原理
旋转编码器的工作原理以及如何在Arduino中使用 https://www.yiboard.com/thread-1001-1-1.html
为了更加清楚的理解这个辨别方向的过程我把我的理解用波形图画出来
判断AB两相的相位差就可以判断出正反转
斜体样式核心的思想就是在A产生下降沿的时候判断B的电平状态,如果为高电平状态则说明顺时针反之逆时针
代码实现
const int clkPin = 2;/*A相接口*/
const int dtPin = 3;/*B相接口*/
const int swPin = 4;/*按键接口*/
int encoderVal = 0; /*记录当前的编码器值,为正顺时针方向,为负逆时针方向*/
int getEncoderTurn(void)
{
static int oldA = HIGH;/*初始化A波形*/
static int oldB = HIGH;/*初始化B波形*/
int result = 0; /*定义一个结果变量记录顺时针还是逆时针*/
int newB = digitalRead(dtPin);
int newA = digitalRead(clkPin);
if(newA != oldB || newB != oldB)/*判断AB波形是否发生变化,有任意一个变化则满足条件,确认旋转*/
{
if(oldA == HIGH && newA == LOW)/*两个条件同时为真,A波形图产生一个下降沿11发生变化10*/
{
result = (oldB*2-1); /*顺时针返回1*2-1=1,逆时针返回0*2-1=-1*/
}
}
oldA = newA;/*更新A波形值*/
oldB = newB;/*更新B波形值*/
return result;
}
void setup()
{
pinMode(clkPin,INPUT); /*信号输入单片机*/
pinMode(dtPin,INPUT); /*信号输入单片机*/
pinMode(swPin,INPUT); /*信号输入单片机*/
digitalWrite(swPin,HIGH); /*默认按键不触发*/
Serial.begin(9600); /*串口监视器波特率9600*/
}
void loop()
{
int change = getEncoderTurn();/*反馈信号子函数*/
encoderVal = encoderVal + change;
if(digitalRead(swPin) == LOW)
{
encoderVal = 0; /*按键被按下*/
}
Serial.println(encoderVal);/*打印编码器的值*/
}
这里loop循环里不能添加延时函数,否则会发生不可预测的错误(有点儿坑)
这种写法可以验证编码器的工作原理,但是不适合和其他函数整合到一块儿使用
应该是加入了延时会影响波形的判断,程序需要进一步改进和优
实验现象
顺时针旋转串口监视器输出正数逐渐增大
逆时针旋转串口监视器输出数逐渐减小会出现负数