|
本帖最后由 supercctv 于 2012-3-4 15:03 编辑
翻出去年在北京中发买的旋转编码器,测试了下与arduino的连接。
原理图就不画了,旋转编码器 A,B端分别接10K上拉至VCC,A、B端分别与Arduino主板连接。有时环境存在干扰,会反跳的话,A、B端再通过0.1uf的电容接地即可。
分别测试了两种的连接方式,均成功。
1.采用中断方式。参照czad先前的帖子。我把程序简化了下,意图仅在于说明旋转编码器的正反计数即可。- #define PinA 2 //中断0
- #define PinB 3 //中断1
- unsigned long time = 0;
- long count = 0; //计数值
- long num = 0;
- //初始化
- void setup()
- {
- Serial.begin(9600); //窗口初始化
- pinMode(PinA,INPUT); //D2脚为输入
- pinMode(PinB,INPUT); //D3脚为输入
- attachInterrupt(0, blinkA, LOW); //注册中断0调用函数blinkA
- attachInterrupt(1, blinkB, LOW); //注册中断1调用函数blinkB
- time = millis(); //时间初值
- }
- //主体程序
- void loop()
- {
- while (num != count)
- {
- num = count;
- Serial.println(num);
- }
- }
- //中断0调用函数
- void blinkA()
- {
- if ((millis() - time) > 3) //防抖动处理
- count ++;
- time = millis();
- }
- //中断1调用函数
- void blinkB()
- {
- if ((millis() - time) > 3) //防抖动处理
- count --;
- time = millis();
- }
复制代码 有图有真相:
2.采用普通Digital口的方式,这里用D4与D5。第一种方法要用掉两个中断,有点浪费,有时中断端口要留着其他用处。参考Arduino Cookbook第二版。PS:第一版中,那个图是错误。- 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;
- }
复制代码 有图有真相:
旋转编码器的问题该完结了吧,哈哈~
我在极客的第一帖,特此留念~ |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|