旋转编码器解码的工作原理与应用源码

来源:本站
导读:目前正在解读《旋转编码器解码的工作原理与应用源码》的相关信息,《旋转编码器解码的工作原理与应用源码》是由用户自行发布的知识型内容!下面请观看由(电工技术网 - www.9ddd.net)用户发布《旋转编码器解码的工作原理与应用源码》的详细说明。
简介:本文主要介绍旋转编码器解码的工作原理,并给出相应的应用源码。

旋转编码器的信号输出有A相,B相,Z相,其中Z为零脉冲,计数模块中不使用。计数模块使用A,B来进行计数。编码器结构以及计数原理如下:

结构:玻璃码盘,上排为A,下排为B,灰色的不透光,白色的透光。

编码器转动后经过码盘和光电二极管的作用可以得到如下的波形:

旋转编码器解码的工作原理与应用源码

上图为编码器的工作原理,图中A相超前B相90度,如果转动方向相反,则A相滞后B相90度。B_A为B&A的组合,若A相超前B相90度设定为正向旋转,则编码器正向转动一个码的距离,B_A变化过程为01-11-10-00。

根据这个原理计数模块根据B_A变化过程来计数:

若当前B_A为00状态,下一个状态为01则计数器加1。

若当前B_A为00状态,下一个状态为10则计数器减1。

其余状态不符合编码器的工作原理,计数器的值不变。

此时计数器的结果是编码器实际移动一个码距离的4倍。由于编码器加工精度的原因,这个结果与实际的位置相比,不是非常准确。

通常的增量式光电编码器产生的周期性的方波信号理论的占空比是1:1,即50%。但是由于码盘加工精度,安装精度等原因的影响,在编码器匀速转动时产生信号的占空比不是1:1,是40%-60%,即信号占空比的误差是10%。

但是其信号的周期误差,即高电平与低电平时间总和的误差比较小,为1%。所以通常用编码器信号测量速度应该测量信号的整个周期来计算,这样测量的误差才较小。

只有把计数结果右移两位(除以4),得到的结果才是准确的编码器移动一个码的距离。

*旋转编码器解码程序

PC4,PC5为左右输入,内部上拉,公共脚接地。

1ms调用一次

//修改:

*/

#defineKnob_In_PINPINC

#defineKnob_In_PORTPORTC

#defineKnob_In_DDRDDRC

#defineKnob_In_LPC4

#defineKnob_In_RPC5

//输出结果:0不动作;1左转一格;2右转一格。

enumdirect{STOP,LEFT,RIGHT}D_OUT;

constuint8_tdirect_left[5]PROGMEM={3,2,0,1,3};

constuint8_tdirect_right[5]PROGMEM={3,1,0,2,3};

//初始化。

voidKnob_Init(void)

{

Knob_In_DDR&=~((1<<Knob_In_L)|(1<<Knob_In_R)); //输入

Knob_In_PORT|=(1<<Knob_In_L)|(1<<Knob_In_R); //上拉

}

//编码器解码

voidknob_scan(void)

{

staticuint8_tknob_ary[3];

staticuint8_tknob_count=0;

uint8_tknob_value;

uint8_tupdate=0;

uint8_ti;

knob_value=Knob_In_PIN&((1<<Knob_In_L)|(1<<Knob_In_R));//取端口C管脚信号

knob_value=knob_value>>4;

if(knob_value==knob_ary[0])

{

++knob_count;

if(knob_count==1)

{

knob_ary[2]=knob_ary[1];

knob_ary[1]=knob_ary[0];

update=1;

}

if(knob_count==0xff) //停留,不转动。

{

knob_count=2;

}

}

else

{

knob_ary[0]=knob_value;

knob_count=0;

}

//如果转动产生新数据,判断方向。

//左转为1110000111 32013

//右转为1101001011 31023

if(update)

{

update=0;

for(i=0;i<4;i++)

{

if((knob_ary[2]==pgm_read_byte(direct_left+i))

&&(knob_ary[1]==pgm_read_byte(direct_left+i+1)))

{

D_OUT=LEFT;

}

elseif((knob_ary[2]==pgm_read_byte(direct_right+i))

&&(knob_ary[1]==pgm_read_byte(direct_right+i+1)))

{

D_OUT=RIGHT;

}

elseD_OUT=STOP;

}

}

}

提醒:《旋转编码器解码的工作原理与应用源码》最后刷新时间 2024-03-14 00:58:54,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《旋转编码器解码的工作原理与应用源码》该内容的真实性请自行鉴别。