格雷碼(Gray
Code)因1953年公開的弗蘭克.格雷的專利而得名。格雷碼是二進(jìn)制循環(huán)碼,其編碼最大的特點(diǎn)是任意上下相鄰的兩個(gè)碼值間,只有一位碼不同,這樣在碼值上下變化過程中,每次只改變一位碼,從而傳輸、讀數(shù)的錯(cuò)碼率最小。格雷碼還是循環(huán)碼,其最大碼到最小碼同樣遵循只改變一位碼的編碼原則,因而形成循環(huán)碼。
每次只變一位的唯一性、循環(huán)性、圖案化編碼對(duì)稱性是格雷碼的編碼原則,它的圖案化編碼形式猶如小孩子搭積木來搭建金字塔般簡(jiǎn)單,而又優(yōu)美。
以下是以4位代碼為例,對(duì)比格雷碼與純二進(jìn)制碼:
(1)每次只變化一位,例如在7到8之間,純二進(jìn)制(0111到1000)4位都發(fā)生了碼值的變化,格雷碼(0100到1100)僅最高位碼值變化。
(2)循環(huán)碼,最大碼15與最小碼0的格雷碼只有一位最高位碼值的不同(1000到0000)。
(3)圖案化編碼金字塔對(duì)稱,最低位從1(2的0次)開始向大變化,連續(xù)兩個(gè)1再連續(xù)兩個(gè)0,再兩個(gè)1;第二低位從2(2的1次)開始向大變化,連續(xù)四個(gè)1,再連續(xù)四個(gè)0;第三低位從4(2的2次)開始,連續(xù)8個(gè)1,再8個(gè)0;第四低位從8(2的3次)開始,連續(xù)16個(gè)1,再16個(gè)0......如果橫過來看,像積木搭金字塔型圖案,依此規(guī)律方法,即使小學(xué)生都可隨手寫出更多位數(shù)的格雷碼編碼。
格雷碼這樣圖案化編碼的好處:
(1)同步性多位數(shù)讀碼容錯(cuò)寬度最大。
由于格雷碼兩個(gè)相鄰碼值變化時(shí)每次只變一位,那么在多碼道位數(shù)同時(shí)讀取(例如光學(xué)碼盤)、輸出(例如多芯電纜的并行輸出)、以及后續(xù)設(shè)備的多位數(shù)的接收,在數(shù)值增加或減少時(shí),編碼與同步讀取的誤差最小。多位數(shù)的數(shù)據(jù)刷新是不可能做到完全同步的(由于物理位置精度的原因,以及時(shí)間精度瞬間有先后),格雷碼因只有一位的變化,而可以“從容”分辨出這僅一位的變化,其余的沒有改變,沒有同步性偏差。而如果是純二進(jìn)制碼,有多個(gè)數(shù)據(jù)改變了,這些刷新改變的數(shù)據(jù)讀取會(huì)有同步性上的先后,就有可能有些已經(jīng)讀到刷新后的數(shù)據(jù),有些還沒有讀到刷新后的數(shù)據(jù),這樣就會(huì)亂碼,例如表1內(nèi)的7到8,純二進(jìn)制有多個(gè)位0和1發(fā)生改變,如果有一位還停留在刷新前的,如第二位,那么讀到的就不是8(1000),而是10(1010)了。而格雷碼由于每次只改變一位,因?yàn)榫椭挥幸晃辉谒⑿?,就不存在刷新先后的問題,也就不會(huì)發(fā)生錯(cuò)碼了。
(2)制作時(shí)容錯(cuò)寬度最大,格雷碼編碼的刻線寬度大,一條刻線容下了兩個(gè)碼值,一個(gè)刻線周期容下了4個(gè)碼值。
例如上圖一個(gè)5位格雷碼32個(gè)分辨位置,最密的刻線碼道僅需8個(gè)刻線,寬度比純二進(jìn)制碼寬一倍。同時(shí),由于相鄰兩個(gè)格雷碼只有一位的變化,刻線位置的誤差寬度可達(dá)±1/2碼而不會(huì)發(fā)生錯(cuò)碼。這對(duì)于碼盤的加工以及讀取傳感器的安裝精度要求大大放寬,便于制作出在同樣尺寸下更高分辨率的編碼器。
(3)編碼與刻線有規(guī)律的圖案化排列。
格雷碼以搭寶塔積木似的編碼刻線,對(duì)于碼盤設(shè)計(jì)極為的方便,也便于布排各個(gè)碼道的傳感器讀取頭。
(4)循環(huán)碼,便于多周期的旋轉(zhuǎn)循環(huán)而不會(huì)發(fā)生錯(cuò)碼。
格雷碼的最高兩位是特別的,在一個(gè)循環(huán)周期里面,最高兩位的刻線寬度是一樣的,而位置錯(cuò)開了1/4周期,格雷碼最高位的變化是在整個(gè)格雷碼編碼測(cè)量周期的中點(diǎn)和起始點(diǎn)。也就是在周期的1/2(180度相位)時(shí),僅有最高位的碼值從0到1,而在周期的終點(diǎn)循環(huán)到起始點(diǎn),也僅有最高位的碼值從1到0,其間的變化不會(huì)發(fā)生錯(cuò)碼。
(5)增量型編碼器的AB相編碼,也就是利用了格雷碼最高2位為循環(huán)編碼不易錯(cuò)碼,并上述各項(xiàng)格雷碼與刻線的優(yōu)點(diǎn)。
這樣的編碼可以分辨出進(jìn)位與退位(編碼器旋轉(zhuǎn)的正轉(zhuǎn)于反轉(zhuǎn)),可以每個(gè)周期的2位格雷碼編碼的4個(gè)位置(四倍頻),可以有刻線與讀取的最大限度的容錯(cuò)。
例如一個(gè)光學(xué)增量型編碼器,通過傳感器內(nèi)的光學(xué)碼盤,分割有很多個(gè)分割刻線,通過度取刻線通與暗的規(guī)律,輸出每圈的脈沖數(shù)(PPR)對(duì)一個(gè)360度圓周分割,也稱為分辨率。每個(gè)脈沖周期的變化代表了一定角度變化,這樣預(yù)先分割角度到每個(gè)周期并讀取計(jì)數(shù)周期變化的方式為“增量編碼”,增量編碼器輸出一般是A、B、Z三相信號(hào),A和B的編碼按格雷碼一個(gè)周期內(nèi)循環(huán)碼最高2位的位置編排,輸出相差1/4個(gè)周期的A和B,正轉(zhuǎn)(進(jìn)位)是1/4相差,而反轉(zhuǎn)(退位)是3/4相差,以此可以判斷編碼器的正反轉(zhuǎn);另外一個(gè)信號(hào)Z相是每圈僅提供一個(gè)位置脈沖,以此可以設(shè)定零位值。
(6)絕對(duì)值編碼器的N位數(shù)編碼,也就是利用了格雷碼多碼道同步讀取時(shí)錯(cuò)碼率最小,以及便于碼盤設(shè)計(jì)、刻線以及傳感器安裝的寬容度最大。并行信號(hào)輸出的格雷碼,也便于后續(xù)設(shè)備讀取變化時(shí)錯(cuò)碼率最低。用格雷碼制作絕對(duì)值碼盤,物理制作最簡(jiǎn)單經(jīng)濟(jì),同時(shí)又達(dá)到最大的寬容度容錯(cuò)性。
較易錯(cuò)誤的純二進(jìn)制編碼碼盤
格雷碼編碼的碼盤,制作寬容度與容錯(cuò)性最佳。
絕對(duì)值編碼的編碼器內(nèi)部碼盤已對(duì)應(yīng)有整個(gè)測(cè)量行程預(yù)先有N位的大數(shù)據(jù)編碼,在整個(gè)規(guī)定的測(cè)量行程中每一個(gè)位置都是唯一性的編碼,與時(shí)間軸無關(guān),任何時(shí)間讀取或者不讀取都可以根據(jù)數(shù)據(jù)下游指令,可直接一次輸出與時(shí)間軸無關(guān)的編碼大數(shù)據(jù)。在360度以內(nèi)的唯一編碼的為單圈絕對(duì)值編碼器,超出360度有更多圈數(shù)量程的唯一編碼的為絕對(duì)值多圈編碼器。
格雷碼對(duì)純二進(jìn)制的解碼,以下表規(guī)律解碼:
解碼過程:以“0”和格雷碼的最高位以上表方法比較,結(jié)果保留在(純二進(jìn)制碼)最高位,再以此結(jié)果與格雷碼的第二高位比較,結(jié)果保留在(純二進(jìn)制碼)第二高位;再以剛得到的值與第三高位比較,結(jié)果保留在(純二進(jìn)制碼)第三高位......以此類推,直到最低位。
例如自然數(shù)14,格雷碼為1001,向純二進(jìn)制碼解碼,最高位比較值(0與1)結(jié)果為1,第二高位比較(1與0),結(jié)果為1;第三高位比較(1與0),結(jié)果為1;最低位比較(1與1),結(jié)果為0,得到純二進(jìn)制代碼1110。
格雷碼的讀?。河捎诟窭状a是循環(huán)碼,在讀碼時(shí)要確認(rèn)多少位,一次完整地從高位向低位讀取,而不能因?yàn)橹桓淖兊臀?,就僅僅只讀低位而不讀高位。
格雷碼有規(guī)律的積木式編碼方式,可以節(jié)省位數(shù)的解碼。編碼器在快速旋轉(zhuǎn)中當(dāng)需要快速讀取碼值而放棄了高分辨率的最后幾位,僅讀取高位,可大膽放棄最后幾位的格雷碼向二進(jìn)制碼的解碼----格雷碼的解碼是從高位開始的,例如原先一個(gè)13位的格雷碼編碼,當(dāng)放棄最后最后3位后可以成為一個(gè)10位的格雷碼編碼。
故事:國(guó)王的紅酒,簡(jiǎn)單圖案化的格雷碼編碼。
故事里在中世紀(jì)歐洲某個(gè)小國(guó)的國(guó)王要宴請(qǐng)賓客,準(zhǔn)備了1000瓶紅酒,宴請(qǐng)請(qǐng)?zhí)矎V而發(fā)之,但是在宴請(qǐng)的前一天得到絕密情報(bào),在這1000瓶紅酒里面混入了一瓶毒酒,而且確認(rèn)只有一瓶毒酒,據(jù)已被抓住的下毒者交代,這瓶毒酒在顏色與口味上無法和其他紅酒分開,嘗一口就會(huì)致命,而且喝下后不會(huì)立刻發(fā)作,而是大約要大半天時(shí)間發(fā)作而亡,以達(dá)到掩人耳目不易被察覺那瓶是毒酒。此時(shí)離國(guó)王宴請(qǐng)只有一天時(shí)間了,國(guó)王既來不及取消宴請(qǐng),也不能將這個(gè)毒酒的消息透漏出去怕引起賓客混亂,怎么辦呢?此時(shí)有個(gè)大臣建議用監(jiān)獄里面的死囚來嘗試這個(gè)紅酒,可是監(jiān)獄里面的死囚數(shù)量有限,究竟需要多少個(gè)死囚來可以試出這個(gè)1000瓶紅酒里面的毒酒呢?
讓我們一起來學(xué)習(xí)體會(huì)格雷碼圖案化的簡(jiǎn)單編碼,來破解這個(gè)毒酒難題:
A.將1000瓶紅酒都以格雷碼編號(hào),需要用10位格雷碼,每瓶酒做十次(10位)記號(hào)編碼,由于格雷碼是簡(jiǎn)單圖案化的編碼,稍作學(xué)習(xí)小學(xué)生都會(huì),最初是每隔兩瓶做一個(gè)記號(hào),然后第二次是每隔4瓶做一個(gè)記號(hào),再依次類推(格雷碼從低位到高位的簡(jiǎn)單編碼),做十次標(biāo)記(10位格雷碼),總共可有1024個(gè)不同的各自唯一性的編碼,覆蓋這1000瓶紅酒,使每瓶酒都有了唯一性的格雷碼。例如,假設(shè)那瓶毒酒的格雷碼編號(hào)是00,,101,,0;
B.找十個(gè)死囚犯,從低位到高位編號(hào),輪到各自位數(shù)有記號(hào)的逢1便嘗酒。如果有囚犯中毒,即可根據(jù)格雷碼的編排圖案化規(guī)律而找到了那瓶毒酒。
C.半天后,有可能有死囚會(huì)死去,那樣就有了毒酒的格雷碼編碼數(shù)。究竟有多少個(gè)死囚會(huì)被毒死?那要看這個(gè)毒酒的編號(hào)里有幾個(gè)“1”,也就是“嘗”到的有幾個(gè)囚犯。根據(jù)幾個(gè)死囚死去的位置編號(hào),就能找到那瓶毒酒。