找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3184|回复: 0
打印 上一主题 下一主题
收起左侧

格雷码编码器测试

[复制链接]
跳转到指定楼层
楼主
ID:80436 发表于 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的个数的奇偶性相同。






  1. #include "RobotLib.h"
  2. int temp=0;
  3. long int GrayData=0;
  4. long int Data=0;
  5. long int DecData=0;  
  6. float Angle;

  7. static unsigned int GraytoDecimal(unsigned int x)
  8.     {
  9.      int i;
  10.      for(i=0;(1<<i)<sizeof(x)*8;i++)
  11.      {
  12.        x^=x>>(1<<i);
  13.      }
  14.      return x;
  15.     }

  16. void main()
  17. {


  18. int i=0;
  19. int count=10;
  20. unsigned char GrayBit[10];
  21. GrayData=0;
  22. Data=0;
  23. DecData=0;
  24. Angle=0;
  25.   for (i = 0; i < count; i++)
  26.   {
  27.     GrayBit[i]=0;
  28.   }
  29. while(1)
  30. {
  31.   for (i = 0; i < count; i++)//Read GrayBit
  32.   {
  33.     GrayBit[i]=DI(i);
  34.   }
  35.     for (i = 0; i < count; i++)//this encoder is  PNP type,so need overturn
  36.   {
  37.     if (GrayBit[i]==1)
  38.        GrayBit[i]=0;
  39.      else GrayBit[i]=1;
  40.    
  41.   }
  42.       //Assembly the Graybit
  43.       Data=((GrayBit[9]<<0)|(GrayBit[8]<<1)|(GrayBit[7]<<2)|\
  44.       (GrayBit[6]<<3)|(GrayBit[5]<<4)|(GrayBit[4]<<5)|\
  45.       (GrayBit[3]<<6)|(GrayBit[2]<<7)|(GrayBit[1]<<8)|\
  46.       (GrayBit[0]<<9));
  47.      
  48.      //Gray  transform to Bin
  49.     DecData=GraytoDecimal(Data);
  50.     Angle=0.3515625*DecData;
  51.     printf("    Gray bit\r\n %d %d %d %d %d %d %d %d %d %d\n   count=%d\n \r   Angle=%f\n",
  52.     GrayBit[0],GrayBit[1],GrayBit[2],GrayBit[3],GrayBit[4],GrayBit[5],\
  53.     GrayBit[6],GrayBit[7],GrayBit[8],GrayBit[9],DecData,Angle);
  54.    
  55.   
  56. }
  57. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表