欢迎光临散文网 会员登陆 & 注册

30位旋转编码器EC11输出30脉冲 --Arduino

2021-03-17 14:54 作者:ShoryLee  | 我要投稿

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

30位旋转编码器EC11输出30脉冲 --Arduino的评论 (共 条)

分享到微博请遵守国家法律