标题:
格雷码编码器测试
[打印本页]
作者:
liuqq
时间:
2015-5-21 22:32
标题:
格雷码编码器测试
本帖最后由 liuqq 于 2015-5-21 22:34 编辑
搞到一个格雷码输出的1024分辨率的光洋编码器,之前没看手册,然后用直接接线读取,然后将格雷码转成2进制,发现数据就是不对,
后面到光洋网站上下载了编码器文档,仔细一看才知道,这玩意是PNP输出的,恍然大悟,终于知道为什么处理出来的角度数据是错的。原来就是输出类型的问题没有主意。电平翻转后转成2进制,nice。数据就正确了。
格雷码百科
格雷码属于
可靠性编码
,是一种错误最小化的编码方式。因为,虽然自然二进制码可以直接由数/模转换器转换成模拟信号,但在某些情况,例如从十进制的3转换为4时二进制码的每一位都要变,能使数字电路产生很大的尖峰电流脉冲。而格雷码则没有这一缺点,它在相邻位间转换时,只有一位产生变化。它大大地减少了由一个状态到下一个状态时逻辑的混淆。由于这种编码相邻的两个码组之间只有一位不同,因而在用于风向的转角位移量-数字量的转换中,当风向的转角位移量发生微小变化(而可能引起数字量发生变化时,格雷码仅改变一位,这样与其它编码同时改变两位或多位的情况相比更为可靠,即可减少出错的可能性。
格雷码是一种
绝对
编码方式
,典型格雷码是一种具有反射特性和循环特性的单步自补码,它的循环、单步特性消除了随机取数时出现重大误差的可能,它的反射、自补特性使得求反非常方便。
由于格雷码是一种
变权码
,每一位码没有固定的大小,很难直接进行比较大小和算术运算,也不能直接转换成液位信号,要经过一次码变换,变成自然二进制码,再由上位机读取。
[3]
典型格雷码是一种采用
绝对编码方式的准权码
,其权的绝对值为2^i-1(设最低位i=1)。
格雷码的十进制数奇偶性与其码字中1的个数的奇偶性相同。
#include "RobotLib.h"
int temp=0;
long int GrayData=0;
long int Data=0;
long int DecData=0;
float Angle;
static unsigned int GraytoDecimal(unsigned int x)
{
int i;
for(i=0;(1<<i)<sizeof(x)*8;i++)
{
x^=x>>(1<<i);
}
return x;
}
void main()
{
int i=0;
int count=10;
unsigned char GrayBit[10];
GrayData=0;
Data=0;
DecData=0;
Angle=0;
for (i = 0; i < count; i++)
{
GrayBit[i]=0;
}
while(1)
{
for (i = 0; i < count; i++)//Read GrayBit
{
GrayBit[i]=DI(i);
}
for (i = 0; i < count; i++)//this encoder is PNP type,so need overturn
{
if (GrayBit[i]==1)
GrayBit[i]=0;
else GrayBit[i]=1;
}
//Assembly the Graybit
Data=((GrayBit[9]<<0)|(GrayBit[8]<<1)|(GrayBit[7]<<2)|\
(GrayBit[6]<<3)|(GrayBit[5]<<4)|(GrayBit[4]<<5)|\
(GrayBit[3]<<6)|(GrayBit[2]<<7)|(GrayBit[1]<<8)|\
(GrayBit[0]<<9));
//Gray transform to Bin
DecData=GraytoDecimal(Data);
Angle=0.3515625*DecData;
printf(" Gray bit\r\n %d %d %d %d %d %d %d %d %d %d\n count=%d\n \r Angle=%f\n",
GrayBit[0],GrayBit[1],GrayBit[2],GrayBit[3],GrayBit[4],GrayBit[5],\
GrayBit[6],GrayBit[7],GrayBit[8],GrayBit[9],DecData,Angle);
}
}
复制代码
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1