本程序用于测试,
编译器采用CodeVisionAVR
#include <delay.h>
#include <mega8.h>
#define IN_A PINB.1
#define IN_B PINB.2
unsigned char encoder_now;//本次值
unsigned char encoder_ago;//上次值
flash signed char encoder_tab[4][4]=
{
{0 ,1 ,-1 ,0},
{-1, 0, 0, 1},
{1 ,0, 0 ,-1 },
{0 ,-1 ,1 ,0 },
};
signed char encoder_read(void)
{
signed char a=0;
unsigned char encoder_filter=0; //滤波
while(a<10)//判断次数,进行滤波
{
encoder_now=IN_A;
encoder_now<<=1;
encoder_now+=IN_B;
if(encoder_filter==encoder_now)a++;
else a=0;
encoder_filter=encoder_now;
}
a=encoder_tab[encoder_now][encoder_ago];
encoder_ago=encoder_now;
return a;
}
main()
{
while (1)
{
switch(encoder_read())
{
case 1:
PORTB.2=1;
delay_ms(10);
break;
case -1:
PORTB.3=1;
delay_ms(10);
break;
case 0:
PORTB.2=0;
PORTB.3=0;
break;
}
};
}
说明一下示波器输入A,B为模拟的编码器的两线输入波形,C,D为解码后的输出正负,和脉冲个数,值得一提的是实际编码器每拨动一格就会有两个脉冲输出,所以把连续的两个脉冲作为一个有效的加减标志可以提高可靠性(本例未体现)
原理波形
编译器采用CodeVisionAVR
#include <delay.h>
#include <mega8.h>
#define IN_A PINB.1
#define IN_B PINB.2
unsigned char encoder_now;//本次值
unsigned char encoder_ago;//上次值
flash signed char encoder_tab[4][4]=
{
{0 ,1 ,-1 ,0},
{-1, 0, 0, 1},
{1 ,0, 0 ,-1 },
{0 ,-1 ,1 ,0 },
};
signed char encoder_read(void)
{
signed char a=0;
unsigned char encoder_filter=0; //滤波
while(a<10)//判断次数,进行滤波
{
encoder_now=IN_A;
encoder_now<<=1;
encoder_now+=IN_B;
if(encoder_filter==encoder_now)a++;
else a=0;
encoder_filter=encoder_now;
}
a=encoder_tab[encoder_now][encoder_ago];
encoder_ago=encoder_now;
return a;
}
main()
{
while (1)
{
switch(encoder_read())
{
case 1:
PORTB.2=1;
delay_ms(10);
break;
case -1:
PORTB.3=1;
delay_ms(10);
break;
case 0:
PORTB.2=0;
PORTB.3=0;
break;
}
};
}
说明一下示波器输入A,B为模拟的编码器的两线输入波形,C,D为解码后的输出正负,和脉冲个数,值得一提的是实际编码器每拨动一格就会有两个脉冲输出,所以把连续的两个脉冲作为一个有效的加减标志可以提高可靠性(本例未体现)
原理波形