旋转编码器学习笔记
参考阿莫的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 static/image/common/back.gif
为啥不用中断或者脉宽捕获功能呢?
脉宽捕获是inpulse那个么?
可以用中断,先写个不用中断的看看可不可行。
后来看了,有时是有反复的,比如向一个方向转的话,有的时候会跳回去一两个数字,不知道怎么解决。
如果用中断的方法,也会遇到反复的问题,应该。 楼主,感谢您的文章!但有个小问题, 您能解释一下第二个程序的if (digitalRead(inBPin)) count++;
else count--;是什么原理吗?怎么通过他控制码盘方向的???:):):) 本帖最后由 艰苦奋斗 于 2016-1-18 20:58 编辑
有个第三方编码器库,用起来非常简便,如果用两个外部中断口,可以用来给减速电机编码,详见:http://www.pjrc.com/teensy/td_libs_Encoder.html
页:
[1]