本帖最后由 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);
-
-
- }
- }
复制代码
|