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