int lastEncoded = 0; // 上一个编码器的状态
int lastEncoded1 = 0; // 上一个编码器的状态
// 读取编码器的状态并更新位置
void readEncoder() {
int MSB = digitalRead(PinA); // 当前编码器A的状态
int LSB = digitalRead(PinB); // 当前编码器B的状态
// 通过比较A和B信号的变化来判断旋转的方向
int encoded = (MSB << 1) | LSB; // 将A和B的状态组合成一个二进制值
int sum = (lastEncoded << 2) | encoded; // 将前一个状态和当前状态组合
// 判断旋转方向
if (sum == 0b1101 || sum == 0b0110 || sum == 0b1011 || sum == 0b0100) {
encoderPos++; // 顺时针旋转
lastEncoded1 = 1; // 上一个编码器的状态
Serial.println(encoderPos);
Serial.println("顺时针旋转");
} else if (sum == 0b1110 || sum == 0b0001 || sum == 0b1000 || sum == 0b0111) {
encoderPos--; // 逆时针旋转
lastEncoded1 = 2; // 上一个编码器的状态
Serial.println(encoderPos);
Serial.println("逆时针旋转");
}
lastEncoded = encoded; // 更新上一个编码器状态
}
放中断执行
attachInterrupt(digitalPinToInterrupt(PinA), readEncoder, CHANGE);
attachInterrupt(digitalPinToInterrupt(PinB), readEncoder, CHANGE);