|
本帖最后由 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ù)的奇偶性相同。


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