日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

初出茅庐的小李第36篇博客之读取旋转编码器正反转状态(arduino uno 测试)

發布時間:2024/3/24 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 初出茅庐的小李第36篇博客之读取旋转编码器正反转状态(arduino uno 测试) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

旋轉編碼器的引腳

  • CLK(A相)
  • DATA(B相)
  • SWITCH
  • VCC
  • GND
  • 工作原理

    旋轉編碼器的工作原理以及如何在Arduino中使用 https://www.yiboard.com/thread-1001-1-1.html

    為了更加清楚的理解這個辨別方向的過程我把我的理解用波形圖畫出來


    判斷AB兩相的相位差就可以判斷出正反轉
    斜體樣式核心的思想就是在A產生下降沿的時候判斷B的電平狀態,如果為高電平狀態則說明順時針反之逆時針

    代碼實現

    const int clkPin = 2;/*A相接口*/ const int dtPin = 3;/*B相接口*/ const int swPin = 4;/*按鍵接口*/ int encoderVal = 0; /*記錄當前的編碼器值,為正順時針方向,為負逆時針方向*/int getEncoderTurn(void) {static int oldA = HIGH;/*初始化A波形*/static int oldB = HIGH;/*初始化B波形*/int result = 0; /*定義一個結果變量記錄順時針還是逆時針*/int newB = digitalRead(dtPin);int newA = digitalRead(clkPin);if(newA != oldB || newB != oldB)/*判斷AB波形是否發生變化,有任意一個變化則滿足條件,確認旋轉*/{if(oldA == HIGH && newA == LOW)/*兩個條件同時為真,A波形圖產生一個下降沿11發生變化10*/{result = (oldB*2-1); /*順時針返回1*2-1=1,逆時針返回0*2-1=-1*/}}oldA = newA;/*更新A波形值*/oldB = newB;/*更新B波形值*/return result; }void setup() {pinMode(clkPin,INPUT); /*信號輸入單片機*/pinMode(dtPin,INPUT); /*信號輸入單片機*/pinMode(swPin,INPUT); /*信號輸入單片機*/digitalWrite(swPin,HIGH); /*默認按鍵不觸發*/Serial.begin(9600); /*串口監視器波特率9600*/ }void loop() {int change = getEncoderTurn();/*反饋信號子函數*/encoderVal = encoderVal + change;if(digitalRead(swPin) == LOW){encoderVal = 0; /*按鍵被按下*/}Serial.println(encoderVal);/*打印編碼器的值*/ } 這里loop循環里不能添加延時函數,否則會發生不可預測的錯誤(有點兒坑) 這種寫法可以驗證編碼器的工作原理,但是不適合和其他函數整合到一塊兒使用 應該是加入了延時會影響波形的判斷,程序需要進一步改進和優

    實驗現象

    順時針旋轉串口監視器輸出正數逐漸增大
    逆時針旋轉串口監視器輸出數逐漸減小會出現負數

    總結

    以上是生活随笔為你收集整理的初出茅庐的小李第36篇博客之读取旋转编码器正反转状态(arduino uno 测试)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。