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