美文网首页我爱编程
[Arduino] 旋转编码器

[Arduino] 旋转编码器

作者: Cocoonshu | 来源:发表于2017-07-10 22:16 被阅读889次

有用过酷炫的旋钮吗,怎么拧都拧不到底的那种?


旋钮

旋钮的实现方式有两种,一种是两头可以拧到底的电位器(也称滑动变阻器),另一种是可以一直拧的旋转编码器。电位器利用金属触点在电阻轨迹上滑动的距离来产生不同的电阻,从而使电路读取模拟电压或者电流值来改变某个功能,最常见的就是音响调节音量大小的旋钮。旋转编码器则是在旋转的过程中使处于旋钮盘上呈一定夹角的两个采样点或者多个采样点采集不同的状态,从而形成不同旋转方向和角度的电平编码数据,供电路或单片机做处理。所以电位器属于模拟电子的元器件(当然数字电路也可以通过ADC(模拟转数字)处理后使用),旋转编码器属于数字电路元器件(模拟电路要使用也不是不可以,原理OK就行)。

旋转编码器有各种各样的,按工作原理分有光电式、磁电式、触点式,按输出编码分有相对式(增量式)和绝对式。总之好多好多好多,本文不是用来介绍旋转编码器的,所以后面我要拉回主题了,有关旋转编码器的具体介绍,请参见百度百科。

电路连接

我们使用最便宜的触点式增量旋转编码器来实现本文所述的功能。它的电路原理如下:


旋转编码器电路原理图

旋转旋钮时,是安装下图所示原理来采样出A、B脚的电平的:


旋转编码器原理

在中间旋转的圆盘叫编码盘,它随着旋钮一起转动。可以把编码盘看做是导电金属盘,A、B引脚都分别接入单片机的两个GPIO脚,且同时拉高这两个引脚,C引脚就直接接地。当编码盘旋转时,A引脚在编码盘上的触点如果接触到编码盘,则与C引脚在编码盘上的触点接通,因为C引脚是接地的,那么就相当于此时把A引脚接地了,因此连接在A引脚上的GPIO脚则被拉低。B引脚同理。

触点式增量旋转编码器因为它那简单暴力的实现方式,会很容易出现电平抖动干扰,这种东西在[Ardunio] Button & Switch中也有提过。所以我们要对旋转编码器的电路添加一下抗干扰的外围,然后再在Ardunio或Android Things上使用它。电路图如下:

抗抖动外围

电路连接完成后,就是编写代码了

编写代码

这里的实现思路都是根据连接于旋转编码器A、B脚上的GPIO引脚的电平变化来判断旋钮旋转的方向及分度值的。在旋转编码器原理中,每一个脉冲周期计为两个分度值,每逆时针旋转一个分度值,则在单片机中对其状态值减少一个单位,每顺时针旋转一个分度值,则在单片机中对其状态值增加一个单位。
假设我们的旋钮是用来设置温度的,则示例代码可以这样写。

#define PINA 2
#define PINB 3

volatile int     mRotaryEncoderPulse        = 0;
volatile uint8_t mLastestRotaryEncoderPinAB = 0; // last last pin value of A and B
volatile uint8_t mLastRotaryEncoderPinAB    = 0; // last pin value of A and B

void onRotaryEncoderChanged(int value) {
    Serial.print("RotaryEncoder: ");Serial.println(value);
}

void onPinABInterrupted() {
    uint8_t currentPin = digitalRead(PINA) * 10 + digitalRead(PINB);
    if (currentPin == mLastRotaryEncoderPinAB) {
      return;
    } else {
        // (A<=>B) 表示旋转编码器的A脚和B脚的电平值
        // ---------------------------------------------------------------------------------------------------
        // (1<=>1) 是旋转编码的选择一个刻度的起始点
        // (1<=>0) 是旋转编码顺时针旋转的起始标识, (0<=>1) 是旋转编码逆时针旋转的起始标识
        // (0<=>0) 是旋转编码旋转一个刻度的中位点
        // (0<=>1) 是旋转编码顺时针旋转的终止标识, (0<=>1) 是旋转编码逆时针旋转的终止标识
        // (1<=>1) 是旋转编码的选择一个刻度的终止点,也是下一个刻度的起始点
        if (mLastRotaryEncoderPinAB == 00) {
          if (mLastestRotaryEncoderPinAB == 10 && currentPin == 01) mRotaryEncoderPulse++;
          else if (mLastestRotaryEncoderPinAB == 01 && currentPin == 10) mRotaryEncoderPulse--;
        }

        mLastestRotaryEncoderPinAB = mLastRotaryEncoderPinAB;
        mLastRotaryEncoderPinAB = currentPin;
    }

    if (lastPulse != mRotaryEncoderPulse) {
        onRotaryEncoderChanged(mRotaryEncoderPulse);
    }
}

void setup() {
    // put your setup code here, to run once:
    Serial.begin(115200);
    Serial.println("RotaryEncoder setup");

    // setup rotary encoder interruption
    setupRotaryEncoder();
}

void loop() {
    // put your main code here, to run repeatedly:
}
浅浅画图猝死惹,所以我自己来画~

相关文章

  • [Arduino] 旋转编码器

    有用过酷炫的旋钮吗,怎么拧都拧不到底的那种? 旋钮的实现方式有两种,一种是两头可以拧到底的电位器(也称滑动变阻器)...

  • 旋转编码器安装不得不关注的三大事项

    旋转编码器是编码器的一种,旋转编码器作为一种重要的测试装置,被广泛应用于很多场合中.旋转编码器的工作原理是基于不同...

  • 怎样选择倍加福旋转编码器

    你遇到过旋转编码器吗?你知道它是做什么的吗?旋转编码器用于日常机械。旋转这个词的意思是旋转运动。这种装置通过检测圆...

  • 如何将光学旋转编码器与Arduino连接

    什么是光学旋转编码器 光学旋转编码器是一种机械设备,在圆柱形外壳的内部有一个旋转轴,其结构与电机相同。 圆形平盘,...

  • 旋转编码器工作原理是什么?

    旋转编码器是用来测量转速并配合PWM技术可以实现快速调速的装置,光电式旋转编码器通过光电转换,可将输出轴的角位移、...

  • 树莓派基础实验26:旋转编码器实验

    一、介绍    旋转编码器是一种机电装置,可将轴或轴的角位置或运动,转换为模拟或数字代码。旋转编码器通常放置在垂直...

  • 旋转编码器的功能是什么?

    旋转编码器是一种将旋转位移转换成一串数字脉冲信号的旋转式传感器,这些脉冲能用来控制角位移,如果编码器与齿轮条或螺旋...

  • 编码器工作原理

    旋转编码器是一种将旋转位移转换成一串数字脉冲信号的旋转式传感器,这些脉冲能用来控制角位移,如果编码器与齿轮条或螺旋...

  • 如何安装MNI40增量编码器

    如何安装MNI40增量编码器 MNI40磁性增量旋转编码器是Pepperl+Fuchs系列产品中最紧凑的编码器。即...

  • 拉线式增量式编码器选购注意事项

    拉线编码器就是编码器加装上一个弹簧式拉线盒,用来测位移的。把直线位移转化为编码器轴的旋转运动。编码器多采用是多圈绝...

网友评论

    本文标题:[Arduino] 旋转编码器

    本文链接:https://www.haomeiwen.com/subject/opnuhxtx.html