旋转编码器模块研究(1)

来源:互联网 发布:仓禀足而知礼节 编辑:程序博客网 时间:2024/04/29 08:39

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);}  
原创粉丝点击