|
本程序用于测试,编译器采用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;
}
};
}
仿真波形图 (原文件名:未命名.JPG)
说明一下示波器输入A,B为模拟的编码器的两线输入波形,C,D为解码后的输出正负,和脉冲个数,值得一提的是实际编码器每拨动一格就会有两个脉冲输出,所以把连续的两个脉冲作为一个有效的加减标志可以提高可靠性(本例未体现)
粗略的推导过程ourdev_709097QY8GUZ.xls(文件大小:14K) (原文件名:推导过程.xls)
程序及仿真ourdev_709104R2A1F2.rar(文件大小:57K) (原文件名:程序.rar)
所用编码器图片 (原文件名:2011-12-30-20-30-47.jpg)
原理波形图 (原文件名:原理波形.jpg) |
阿莫论坛20周年了!感谢大家的支持与爱护!!
你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
|