Grayův kód

13bitový Grayův kód použitý na dělicím kotouči absolutního rotačního snímače polohy (horní část obrázku, kotouč je v dolní části poškozen)

Zrcadlový binární kód, známý také jako Grayův kód podle Franka Graye, je binární číselná soustava, ve které se každé dvě po sobě jdoucí hodnoty liší v bitovém vyjádření změnou pouze jedné bitové pozice.

Zrcadlový binární kód byl původně navržen pro zabránění rušivého výstupu z elektromechanických přepínačů (hazardy relé). Dnes je Grayův kód používán pro podporu opravy chyb v digitální komunikaci jako je digitální pozemní televize a některé systémy kabelové televize. Grayův kód využívají také odpovídače sekundárního radaru v letadlech. Také některé snímače polohy (lineární i rotační) udávají absolutní polohu v Grayově kódu, aby byl vyloučen výskyt chybné hodnoty při přechodu mezi dvěma sousedními polohami.

Důvod vzniku

Srovnání dvojkového a Grayova kódu, podbarvením je vyznačen různý rozsah hodnot pro různé počty použitých bitů

Použití tohoto kódu má význam v elektrických obvodech při čtení hodnoty asynchronních (nesynchronizovaných) čítačů a absolutní snímače polohy. Obecně se problém zajištění "současnosti" v digitálních systémech řeší pomocí synchronizačního (hodinového, vzorkovacího) signálu i použitím synchronních čítačů. V některých případech může být použití synchronizačního signálu nevýhodné.

Při změně hodnoty klasického binárního čítače o hodnotu ±1 dochází u každé druhé změny ve stejném směru (+ nárůst / − pokles hodnoty) ke změně na více bitových pozicích čítače. Například při přechodu z hodnoty 3 (011B) na hodnotu 4 (100B) se současně změní všechny tři bitové pozice. S nárůstem počtu n bitů pro vyjádření hodnoty (= 2n), narůstá i počet takových stavů, ve kterých dochází ke změnám na dvou a více bitových pozicích. Tyto stavy jsou na obrázku vyznačeny červeně, s uvedením počtu změněných bitů při přechodu na hodnotu ±1.

V reálném systému není nikdy možné zaručit, aby se změnilo více logických hodnot naprosto současně a není možno zajistit ani jejich naprosto současné přečtení a vyhodnocení. Toto bývá u elektroniky způsobeno různým zpožděním logických členů, přechodovými charakteristikami, parazitními kapacitami, nesynchronním snímání optického kotouče snímači a dalšími vlivy.

V případě změny na dolních bitech ze stavu 3 (xx011B) na stav 4 (xx100B) může v nejnepříznivějším případě nastat situace, kdy je přečtena hodnota 00000B nebo 00111B, prakticky může nastat libovolná kombinace nedefinovaného stavu na bitech, které jsou měněny při změně hodnoty 3/4 (00xxxB), což je 8 možných stavů. Počet takovýchto nedefinovaných změn je vyznačen na obrázku pro 5 kódových bitů. V tomto případě nastává 16 situací, kdy nelze zaručit správnost kódu. V praxi se však u absolutních snímačů využívá 10–20 bitů pro určení polohy, což zvyšuje počet takových situací. Nejzávažnější je tato situace na horních bitech, kdy může dojít k úplné ztrátě relevantnosti přenášené informace. Podle příkladu na obrázku, při přechodu z hodnoty 15–16 a 31–0.

Grayův kód je navržen tak, aby eliminoval tyto nežádoucí stavy způsobující nejednoznačnost. Na obrázku je uvedeno srovnání dvojkového a Grayova kódu, kde v řádcích jsou uvedeny hodnoty shodné pro oba kódy a ve sloupcích stavy jednotlivých kódových bitů. Z grafického zobrazení je dobře patrný rozdíl mezi kódy i to, že v Grayově kódu při změně hodnoty o ±1 dochází ke změně pouze v jednom kódovém bitu.

Další využití

Pro svou robustnost se Grayův kód používá pro inkrementální (relativní) snímače polohy na principu jedné rotující clonky se dvěma úhlově posunutými optickými senzory, tedy s dvěma kódovými bity vyjadřující stav 0–3. Tento princip se používá nejen u CNC strojů, ale i u obyčejné myši: Vyhodnocující elektronika pak umožňuje nejen načítání vzdálenosti, ale i určení směru pohybu.

Převod kódu

HW řešení

Obvod pro konverzi z 3bitového Grayova kódu na binární
Obvod pro konverzi z 3bitového binárního kódu na Grayův

Převod z Grayova kódu na klasický binární kód lze snadno realizovat pomocí dvou logických členů XOR. Jiným zapojením lze uskutečnit převod opačným směrem, tedy z binárního kódu na Grayův.

SW řešení

Převod z binárního do Grayova kódu v jazyku C:

unsigned int gray_encode(unsigned int b) {
  return b ^ (b >> 1);
}

O něco málo složitější je převod z Grayova kódu do binárního:

unsigned int gray_decode(unsigned int g) {
  unsigned int b;
  b = 0;
  while(g) {
    b ^= g;
    g >>= 1;
  }
  return b;
}

Jednostopý Grayův kód

Kódový kotouč pro jednostopý Grayův kód s 5 senzory

Ve výše uvedeném příkladu je pro generování kódu použito n stop pro n bitů, minimálně 2. Každý kódový bit je snímán ze samostatné kódové stopy. Existuje však i patentované řešení, pro které postačuje jedna kódová stopa. Snímaný kód je odlišný; je postupný, není zrcadlový a vyjadřuje 30 možných hodnot výstupní kombinace kódu, výstupní kód 0D a 31D (00H a 1FH / 00000B a 11111B) není generován. Podstatné je, že i tento kód splňuje podmínku, že při změně hodnoty o ±1 se výstupní kód mění pouze v jednom bitu.

Související články

Externí odkazy

Média použitá na této stránce

Gray code rotary encoder 13-track opened.jpg
A Gray code absolute rotary encoder with 13 tracks. At the top can be seen the housing, interrupter disk, and light source; at the bottom can be seen the sensing element (reflective, marked 'OPTOLAB') and support components. This encoder was removed from a machine after water ingress caused the gray code tracks to lift off.
Binary-Gray-Code.png
Autor: W.Rebel, Licence: CC BY-SA 3.0
Porovnání binárního a Grayova kódu
ConvertGrayToBin.png
Autor: W.Rebel, Licence: CC BY-SA 3.0
konverze Gray => Bin
ConvertBinToGray.png
Autor: W.Rebel, Licence: CC BY-SA 3.0
konverze Bin =>Gray
Enkelspoors-Graycode.svg
Autor: Gerbrant, Licence: CC BY-SA 2.5 nl
Diagram of a single track Gray code. Five sensors have been placed along the track. When the track rotates 1/30 of a revolution, one of the sensors will be located in a different segment. Note that 00000 and 11111 are not present.