初出茅庐的小李第36篇博客之读取旋转编码器正反转状态(arduino uno 测试)
生活随笔
收集整理的這篇文章主要介紹了
初出茅庐的小李第36篇博客之读取旋转编码器正反转状态(arduino uno 测试)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
旋轉編碼器的引腳
工作原理
旋轉編碼器的工作原理以及如何在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 测试)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 43个云平台通过云计算服务安全评估:阿里
- 下一篇: 监视器和锁