1.和正常的编码器原理是类似的,不过用着更方便了。
2.不需要搭建外围电路,已经做完上拉,估计精度比较垃圾。
淘宝网址如下:
https://detail.tmall.com/item.htm?spm=a230r.1.14.13.1183b85fR10LMA&id=530477227931&cm_id=140105335569ed55e27b&abbucket=13
https://detail.tmall.com/item.htm?id=41254563868&ali_refid=a3_430583_1006:1109983619:N:%E7%BC%96%E7%A0%81%E5%99%A8%E6%A8%A1%E5%9D%97%20%E6%97%8B%E8%BD%AC:04c59bc25aa4434ecd1581c5182789f6&ali_trackid=1_04c59bc25aa4434ecd1581c5182789f6&spm=a230r.1.14.1
这里重点说一下接口:
CLK不是什么时钟,应该是发出的一路脉冲,只要你扭转就行。理解为A路信号
DT也不是什么数据,应该也是一路脉冲。理解为B路信号
关于编码器的原理,我想主要是两种方案,一种是定时器中断处理,一种是外部中断处理,后续的函数,我会写出来。
配合旋转编码器上的按键,可以复位到初始状态,即从0开始计数。这怎么理解?
个人认为:应该是多了一个触发,其他倒是无所谓。
读数系统通常采用差分方式,即将两个波形一样但相位差为180deg;的不同信号进行比较,以便提高输出信号的质量和稳定性。读数是再两个信号的差别基础上形成的,从而消除了干扰。
增量编码器给出两相方波,它们的相位差90deg;,通常称为A通道和B通道。其中一个通道给出与转速相关的信息,与此同时,通过两个通道信号进行顺序对比。
电气度数来表示机械轴的转动,而轴的转动必须是一个完整的周期。要知道多少机械角度相当于电气上的360度。
可以用下列公式来计算:电气360 =机械360deg;/ndeg;脉冲/转
int redPin=2;
int yellowPin=3;
int greenPin=4;
int aPin = 6;
int bPin = 7;
int buttonPin=5;
int state = 0;
int longPeriod = 5000;
int shortPeriod=700;
int targetCount=shortPeriod;
int count = 0;
void setup()
{
pinMode(aPin, INPUT);
pinMode(bPin, INPUT);
pinMode(buttonPin, INPUT);
pinMode(redPin, OUTPUT);
pinMode(yellowPin, OUTPUT);
pinMode(greenPin, OUTPUT);
}
void loop()
{
count++;
if(digitalRead(buttonPin)) //相当于清零
{
setLight(HIGH,HIGH,HIGH)
}
else
{
int change = getEncoderTurn();//change 只有三个数 0 1 -1
int newPeriod=longPeriod+(change*1000)//6000+1000 0 -1000
if(newPeriod>=1000&&newPeriod<=10000)
{
longPeriod = newPeriod;//
}
if(count>targetCount)
{
setState();
count=0;
}
}
delay(1)
}
int getEncoderTurn()
{
//return -1 0 or +1
//就最初是LOW,后来无所谓了
static int oldA = LOW;
static int oldB = LOW;
int result = 0;.//如果下面没有发生跳变就result = 0
//这个函数挺有意思。
int newA = digitalRead(aPin);
int newB = digitalRead(bPin);
if(newA!=oldA||newB!=oldB)
{
//something has changed
if(oldA==Low&&newA==High)//判断一个上升沿
{
result = -(oldB*2-1);//把01变成 +1 和 -1
//如果oldB=0 result = 1
//如果oldB=1 result = -1
}
}
oldA=newA;
oldB=newB;
return result;
}
int setState()
{
if(state == 0)
{
setLight(HIGH,LOW,LOW); //100
targetCount = longPeriod;
state = 1;
}
else if (state==1)
{
setLight(HIGH,HIGH,LOW); //110
targetCount = shortPeriod;
state = 2;
}
else if (state == 2)
{
setLights(LOW, LOW, HIGH); //001
targetCount = longPeriod;
state = 3;
}
else if (state == 3) //010
{
setLights(LOW, HIGH, LOW);
targetCount = shortPeriod;
state = 0;
}
return 0;
}
void setLights(int red, int yellow, int green)
{
digitalWrite(redPin, red);
digitalWrite(yellowPin, yellow);
digitalWrite(greenPin, green);
}