30位旋转编码器EC11输出30脉冲 --Arduino
ShoryLee
2021年03月17日 14:54
收录于文集
共2篇

手上的旋转编码器是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;     }   // 其他补充的代码,可以从这里开始 }