發(fā)表于 2012-3-4 14:59:34
翻出去年在北京中發(fā)買的旋轉(zhuǎn)編碼器,測(cè)試了下與arduino的連接,。
原理圖就不畫了,,旋轉(zhuǎn)編碼器 A,B端分別接10K上拉至VCC,,A,、B端分別與Arduino主板連接。有時(shí)環(huán)境存在干擾,,會(huì)反跳的話,,A、B端再通過0.1uf的電容接地即可,。
分別測(cè)試了兩種的連接方式,,均成功。
1.采用中斷方式,。參照czad先前的帖子,。我把程序簡(jiǎn)化了下,意圖僅在于說明旋轉(zhuǎn)編碼器的正反計(jì)數(shù)即可,。- #define PinA 2 //中斷0
- #define PinB 3 //中斷1
- unsigned long time = 0;
- long count = 0; //計(jì)數(shù)值
- long num = 0;
- //初始化
- void setup()
- {
- Serial.begin(9600); //窗口初始化
- pinMode(PinA,INPUT); //D2腳為輸入
- pinMode(PinB,INPUT); //D3腳為輸入
- attachInterrupt(0, blinkA, LOW); //注冊(cè)中斷0調(diào)用函數(shù)blinkA
- attachInterrupt(1, blinkB, LOW); //注冊(cè)中斷1調(diào)用函數(shù)blinkB
- time = millis(); //時(shí)間初值
- }
- //主體程序
- void loop()
- {
- while (num != count)
- {
- num = count;
- Serial.println(num);
- }
- }
- //中斷0調(diào)用函數(shù)
- void blinkA()
- {
- if ((millis() - time) > 3) //防抖動(dòng)處理
- count ++;
- time = millis();
- }
- //中斷1調(diào)用函數(shù)
- void blinkB()
- {
- if ((millis() - time) > 3) //防抖動(dòng)處理
- count --;
- time = millis();
- }
復(fù)制代碼 有圖有真相:
2.采用普通Digital口的方式,,這里用D4與D5。第一種方法要用掉兩個(gè)中斷,,有點(diǎn)浪費(fèi),,有時(shí)中斷端口要留著其他用處。參考Arduino Cookbook第二版,。PS:第一版中,,那個(gè)圖是錯(cuò)誤。- const int encoderPinA = 4;
- const int encoderPinB = 5;
- boolean encoderALast = LOW; // remembers the previous pin state
- void setup()
- {
- pinMode(encoderPinA, INPUT);
- pinMode(encoderPinB, INPUT);
- digitalWrite(encoderPinA, HIGH);
- digitalWrite(encoderPinB, HIGH);
- Serial.begin (9600);
- }
- void loop()
- {
- boolean encoderA = digitalRead(encoderPinA);
- if ((encoderALast == HIGH) && (encoderA == LOW))
- {
- if (digitalRead(encoderPinB) == LOW)
- {
- encoderPos--;
- }
- else
- {
- encoderPos++;
- }
- Serial.print (encoderPos);
- }
- encoderALast = encoderA;
- }
復(fù)制代碼 有圖有真相:
旋轉(zhuǎn)編碼器的問題該完結(jié)了吧,哈哈~
|
|
|