30位旋转编码器EC11输出30脉冲 --Arduino
手上的旋转编码器是30位的,网上搜到的大都说30位15脉冲,我从网上也找来一个示例下载后运行,果然是只能输出15个脉冲,觉得不解,那其他的15位不就浪费了?而且每旋转2位才输出一个脉冲,那个无输出的位就显得很不合理。直到在B站看了一个UP(机电匠)的介绍视频,请教过后才找到解决这个问题的想法。

网上找来的示例,能实现15脉冲输出,且支持正反转计数。在此基础上,通过B站UP提示的 对A脚的上升沿和下降沿都需要检测 我对示例进行了调整,示例中其实只对下降沿做了判断,上升沿并没有处理。源程序没有使用中断,我也不会使用。就想着,如果AB脚被上拉了,如何还有上升沿?是拉低后恢复上拉时候产生的上升沿吗?
示例来源:https://www.basemu.com/how-to-use-rotary-encoder-arduino.html
B 站来源:https://www.bilibili.com/video/BV1uv411q7Wy
源程序并没有串口输出值,而是调节LED亮度,我将其改为直接输出值。强烈建议查看以上2个来源。
Arduino 测试例程:
/*
采样编码器 200Hz 使用 millis() 函数
*/
int Value = 0; // 编码器输出值
int Step = 5; // 定义每次旋转的步进值
unsigned long currentTime;
unsigned long loopTime;
const int pin_A = 2;
const int pin_B = 3;
unsigned char encoder_A;
unsigned char encoder_B;
unsigned char encoder_A_prev=0;
void setup() {
Serial.begin(115200);
pinMode(pin_A, INPUT_PULLUP); //设置上拉输入,是否就不用外部上拉?
pinMode(pin_B, INPUT_PULLUP);
currentTime = millis();
loopTime = currentTime;
}
void loop() {
// 获取经过的时间
currentTime = millis();
if(currentTime >= (loopTime + 5)){
// 5ms = 200Hz
encoder_A = digitalRead(pin_A); // 读取编码器值
encoder_B = digitalRead(pin_B);
// A脚 高电平转低电平,下降沿
if((!encoder_A) && (encoder_A_prev)){
// A从高到低
if(encoder_B) {
// B 高电平,顺时针
// 增加,不要超过255
if(Value + Step <= 255) Value += Step;
} else {
// B 低电平,逆时针
// 降低,不要低于0
if(Value - Step >= 0) Value -= Step;
}
}
// A脚 低电平转高电平,上升沿
if((encoder_A) && (!encoder_A_prev)){
if(!encoder_B) {
// 增加,不要超过255
if(Value + Step <= 255) Value += Step;
} else {
// 降低,不要低于0
if(Value - Step >= 0) Value -= Step;
}
}
// 存储A脚状态
encoder_A_prev = encoder_A;
// 输出
Serial.println(Value);
// 更新循环时间
loopTime = currentTime;
}
// 其他补充的代码,可以从这里开始
}