找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3479|回復(fù): 0
收起左側(cè)

格雷碼編碼器測試

[復(fù)制鏈接]
ID:80436 發(fā)表于 2015-5-21 22:32 | 顯示全部樓層 |閱讀模式
本帖最后由 liuqq 于 2015-5-21 22:34 編輯

搞到一個格雷碼輸出的1024分辨率的光洋編碼器,之前沒看手冊,然后用直接接線讀取,然后將格雷碼轉(zhuǎn)成2進(jìn)制,發(fā)現(xiàn)數(shù)據(jù)就是不對,
后面到光洋網(wǎng)站上下載了編碼器文檔,仔細(xì)一看才知道,這玩意是PNP輸出的,恍然大悟,終于知道為什么處理出來的角度數(shù)據(jù)是錯的。原來就是輸出類型的問題沒有主意。電平翻轉(zhuǎn)后轉(zhuǎn)成2進(jìn)制,nice。數(shù)據(jù)就正確了。


格雷碼百科
  • 格雷碼屬于可靠性編碼,是一種錯誤最小化的編碼方式。因為,雖然自然二進(jìn)制碼可以直接由數(shù)/模轉(zhuǎn)換器轉(zhuǎn)換成模擬信號,但在某些情況,例如從十進(jìn)制的3轉(zhuǎn)換為4時二進(jìn)制碼的每一位都要變,能使數(shù)字電路產(chǎn)生很大的尖峰電流脈沖。而格雷碼則沒有這一缺點,它在相鄰位間轉(zhuǎn)換時,只有一位產(chǎn)生變化。它大大地減少了由一個狀態(tài)到下一個狀態(tài)時邏輯的混淆。由于這種編碼相鄰的兩個碼組之間只有一位不同,因而在用于風(fēng)向的轉(zhuǎn)角位移量-數(shù)字量的轉(zhuǎn)換中,當(dāng)風(fēng)向的轉(zhuǎn)角位移量發(fā)生微小變化(而可能引起數(shù)字量發(fā)生變化時,格雷碼僅改變一位,這樣與其它編碼同時改變兩位或多位的情況相比更為可靠,即可減少出錯的可能性。
  • 格雷碼是一種絕對編碼方式,典型格雷碼是一種具有反射特性和循環(huán)特性的單步自補(bǔ)碼,它的循環(huán)、單步特性消除了隨機(jī)取數(shù)時出現(xiàn)重大誤差的可能,它的反射、自補(bǔ)特性使得求反非常方便。
  • 由于格雷碼是一種變權(quán)碼,每一位碼沒有固定的大小,很難直接進(jìn)行比較大小和算術(shù)運算,也不能直接轉(zhuǎn)換成液位信號,要經(jīng)過一次碼變換,變成自然二進(jìn)制碼,再由上位機(jī)讀取。[3]
  • 典型格雷碼是一種采用絕對編碼方式的準(zhǔn)權(quán)碼,其權(quán)的絕對值為2^i-1(設(shè)最低位i=1)。
  • 格雷碼的十進(jìn)制數(shù)奇偶性與其碼字中1的個數(shù)的奇偶性相同。






  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. }
復(fù)制代碼



回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表