也谈Arduino与旋转编码器的两种连接方式(中断方式,普通D口)
翻出去年在北京中发买的旋转编码器,测试了下与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();
}
复制代码有图有真相:
2012-3-4 14:56 上传
(38.46 KB)
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;
}复制代码有图有真相:
旋转编码器的问题该完结了吧,哈哈~
我在极客的第一帖,特此留念~
via - 极客工坊