zoukankan      html  css  js  c++  java
  • Arduino练习:旋转编码器

    旋转编码器判断正反转程序    http://www.openedv.com/thread-65126-1-1.html

    原文链接:http://yehnan.blogspot.com/2014/02/arduino.html

    旋转编码器应用电路图(注意电路图中电阻R20,R24,R25不能取太大,比如取1M,结果容易导致旋转编码器不工作)如下:

    旋轉編碼器(rotary encoder)可將旋轉位置或旋轉量轉變成訊號(類比或數位),透過某種方式(機械、光學、磁力等),得知轉軸轉動了,發出訊號通知我們。可分為絕對型(absolute)及增量型(incremental)或稱為相對型(relative),絕對型將轉軸的不同位置一一編號,然後根據目前位置輸出編號;增量型編碼器則是當轉軸旋轉時輸出變化,轉軸不動就沒有輸出。

    底下是我購買的增量型旋轉編碼器模組,可以一直旋轉,旋轉一整周被分為20小格,正轉逆轉皆可,當轉動時,CLK腳位就會呈低電位,此時可讀取DT資料腳位,若為HIGH代表正轉,LOW代表逆轉;SW則是開關腳位,轉軸可被按下改變此腳位的狀態。另外+需接正電源,GND接地。

     

    這種編碼器屬於機械式,需要對訊號進行去抖動,較不精準、適合低轉速場合;光學式則可用於高轉速或精確度需求較高的地方。

    增量型旋轉編碼器會有類似齒輪缺口與感應的機制,以此可有兩個輸出A與B,旋轉時,A與B將輸出不同的訊號,正轉與逆轉可得到不同的一串訊號,如此便可區分正逆轉。

     

    不過我購買的模組已經處理好了,不需要自己偵測A與B作處理與判斷。

    我用的板子是Arduino Uno R3,軟體開發環境版本為1.0.5、Windows版。

    電路如下:
    Arduino腳位2,連接模組的CLK。
    Arduino腳位3,連接模組的DT。
    Arduino腳位4,連接模組的SW。

    草稿碼如下,當偵測到正轉時,就增加全域變數count、並輸出到序列埠,逆轉則減少,按下開關則歸零。

    #define SERIAL_BAUDRATE 115200
    #define CLK_PIN 2 // 定義連接腳位
    #define DT_PIN 3
    #define SW_PIN 4

    #define interruptA 0 // UNO腳位2是interrupt 0,其他板子請見官方網頁

    volatile long count = 0;
    unsigned long t = 0;

    void setup() {
      Serial.begin(SERIAL_BAUDRATE);
      // 當狀態下降時,代表旋轉編碼器被轉動了
      attachInterrupt(interruptA, rotaryEncoderChanged, FALLING);
      pinMode(CLK_PIN, INPUT_PULLUP); // 輸入模式並啟用內建上拉電阻
      pinMode(DT_PIN, INPUT_PULLUP); 
      pinMode(SW_PIN, INPUT_PULLUP); 
    }
    void loop() {
      if(digitalRead(SW_PIN) == LOW){ // 按下開關,歸零
         count = 0;  
         Serial.println("count reset to 0");
         delay(300);
      }
    }
    void rotaryEncoderChanged(){ // when CLK_PIN is FALLING
      unsigned long temp = millis();
      if(temp - t < 200) // 去彈跳
        return;
      t = temp;
      
      // DT_PIN的狀態代表正轉或逆轉
      count += digitalRead(DT_PIN) == HIGH ? 1 : -1;
      Serial.println(count);
    }

    執行後,開啟序列埠監控視窗,用手轉動旋轉編碼器,正轉時可看到不斷變大的數字,逆轉則減少。不過有時會出現錯誤,應該加1的情況卻先加1、再減1、再加1,不夠完美。

    參考資料:

  • 相关阅读:
    phpmailer发送邮件,可以带附件
    poj 3370 鸽笼原理知识小结
    yii_wiki_145_yii-cjuidialog-for-create-new-model (通过CJuiDialog来创建新的Model)
    兄弟单词查询
    asp.net mvc3 利用Ajax实现局部刷新
    eclipse 找不到application选项
    ECharts一个强大的商业产品图表库
    多校训练hdu --Nice boat(线段树,都是泪)
    [外文理解] DDD创始人Eric Vans:要实现DDD原始意图,必须CQRS+Event Sourcing架构。
    ubuntu重新启动网卡
  • 原文地址:https://www.cnblogs.com/watson8544/p/5454086.html
Copyright © 2011-2022 走看看