pumpitup 发表于 2015-6-30 17:13:44

旋转编码器学习笔记

参考阿莫的sword_yang的文章“单片机在音响上的应用(一)旋转编码器的解码”了解了这种旋转编码器的原理。



元件与上述类似。

两相分别在两边,中间的可上拉也可下拉,本人用的上拉。接通为低电平,断开为高电平。

程序一,只使用其中一相,接7号口。
int inAPin = 7;
int aPreStatus;
int count = 0;

void setup() {
pinMode(7, INPUT);
pinMode(13, OUTPUT);
aPreStatus = digitalRead(inAPin);
Serial.begin(9600);
Serial.println(count);
}

void loop() {
if (digitalRead(inAPin)==0) // current pressed
{
    if (aPreStatus == 1) // previous not pressed
    {
      count++;
      Serial.println(count);
    }
    aPreStatus = 0;
}
else
    aPreStatus = 1;
}

调试通过。

程序2,7、8号口分别接两相。
int inAPin = 7;
int inBPin = 8;
int aPreStatus;
int count = 0;

void setup() {
pinMode(7, INPUT);
pinMode(8, INPUT);
pinMode(13, OUTPUT);
aPreStatus = digitalRead(inAPin);
Serial.begin(9600);
Serial.println(count);
}

void loop() {
if (digitalRead(inAPin)==0) // current pressed
{
    if (aPreStatus == 1) // previous not pressed
    {
      if (digitalRead(inBPin)) count++; // U can change this with count--
      else count--;
      Serial.println(count);
    }
    aPreStatus = 0;
}
else
    aPreStatus = 1;
}
调试通过。


现在有一个问题是,开始的时候我用程序一来调试,只是线接得不对,左接地,中接A,右接B,程序运行后,计数器不断增加,还没想明白是怎么原理。



PINKWALKMAN 发表于 2015-6-30 17:36:19

为啥不用中断或者脉宽捕获功能呢?

pumpitup 发表于 2015-6-30 19:39:42

PINKWALKMAN 发表于 2015-6-30 17:36 static/image/common/back.gif
为啥不用中断或者脉宽捕获功能呢?

脉宽捕获是inpulse那个么?

可以用中断,先写个不用中断的看看可不可行。

后来看了,有时是有反复的,比如向一个方向转的话,有的时候会跳回去一两个数字,不知道怎么解决。

如果用中断的方法,也会遇到反复的问题,应该。

yoyoyo 发表于 2016-1-18 04:04:07

楼主,感谢您的文章!但有个小问题, 您能解释一下第二个程序的if (digitalRead(inBPin)) count++;
      else count--;是什么原理吗?怎么通过他控制码盘方向的???:):):)

艰苦奋斗 发表于 2016-1-18 20:55:19

本帖最后由 艰苦奋斗 于 2016-1-18 20:58 编辑

有个第三方编码器库,用起来非常简便,如果用两个外部中断口,可以用来给减速电机编码,详见:http://www.pjrc.com/teensy/td_libs_Encoder.html

页: [1]
查看完整版本: 旋转编码器学习笔记