Grayův kód: Porovnání verzí
Dělící kotouč |
−prakticky duplicitní kód, zjednodušení, redukce obrázků, které strašně natahují pravou část |
||
Řádek 1: | Řádek 1: | ||
[[Soubor:Gray code rotary encoder 13-track opened.jpg|thumb| |
[[Soubor:Gray code rotary encoder 13-track opened.jpg|thumb|upright|13bitový Grayův kód použitý na dělící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 [[Frank Gray|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''', známý také jako '''Grayův kód''' podle [[Frank Gray|Franka Graye]], je [[dvojková soustava|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čů ([[hazard]] |
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čů ([[hazard (signál)|hazardy]] [[relé]]). Dnes je Grayův kód používán pro podporu opravy chyb v digitální komunikaci jako je [[DVB-T|digitální pozemní televize]] a některé systémy [[kabelová televize|kabelové televize]]. Grayův kód využívají také [[odpovídač]]e sekundárního [[radar]]u 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 == |
== Důvod vzniku == |
||
[[Soubor:Binary-Gray-Code.png|thumb| |
[[Soubor:Binary-Gray-Code.png|thumb|upright|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ý obvod|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é. |
Použití tohoto kódu má význam v [[elektrický obvod|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 (011<sub>B</sub>) na hodnotu 4 (100<sub>B</sub>) se současně změní všechny tři bitové pozice. S nárůstem počtu |
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 (011<sub>B</sub>) na hodnotu 4 (100<sub>B</sub>) se současně změní všechny tři bitové pozice. S nárůstem počtu ''n'' bitů pro vyjádření hodnoty (= 2<sup>''n''</sup>), 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ý člen|logických členů]], [[přechodová charakteristika|přechodovými charakteristikami]], [[parazitní kapacita|parazitními kapacitami]], nesynchronním snímání optického kotouče snímači a dalšími vlivy. |
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ý člen|logických členů]], [[přechodová charakteristika|přechodovými charakteristikami]], [[parazitní kapacita|parazitními kapacitami]], nesynchronním snímání optického kotouče snímači a dalšími vlivy. |
||
Řádek 17: | Řádek 17: | ||
=== Další využití === |
=== Další využití === |
||
[[Soubor: |
<!--[[Soubor:Gray disc.png|thumb|right|9bitový kódový dělící kotouč]]--> |
||
Pro svou robustnost se Grayův kód používá pro inkrementální (relativní) [[senzor|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 [[Číslicové řízení|CNC]] strojů, ale i u obyčejné [[Počítačová myš|myši]]: Vyhodnocující elektronika pak umožňuje nejen načítání vzdálenosti, ale i určení směru pohybu. |
Pro svou robustnost se Grayův kód používá pro inkrementální (relativní) [[senzor|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 [[Číslicové řízení|CNC]] strojů, ale i u obyčejné [[Počítačová myš|myši]]: Vyhodnocující elektronika pak umožňuje nejen načítání vzdálenosti, ale i určení směru pohybu. |
||
Řádek 23: | Řádek 23: | ||
=== HW řešení === |
=== HW řešení === |
||
Převod z Grayova kódu na klasický |
Převod z Grayova kódu na klasický binární kód lze snadno realizovat pomocí [[logický člen|logických členů]] [[XOR]]: |
||
[[Soubor:ConvertGrayToBin.png| |
[[Soubor:ConvertGrayToBin.png|center|thumb|Obvod pro konverzi z 3bitového Grayova kódu na binární]] |
||
Pro převod opačným směrem, tedy z binárního kódu na Grayův, lze použít následující zapojení. |
Pro převod opačným směrem, tedy z binárního kódu na Grayův, lze použít následující zapojení. |
||
[[Soubor:ConvertBinToGray.png| |
[[Soubor:ConvertBinToGray.png|center|thumb|Obvod pro konverzi z 3bitového binárního kódu na Grayův]] |
||
{{Clear}} |
{{Clear}} |
||
=== SW řešení === |
=== SW řešení === |
||
⚫ | |||
{|width=50% |
|||
|Velmi snadno lze převod do grayova kódu naprogramovat v [[C (programovací jazyk)|jazyku C]]. |
|||
|- |
|||
| |
|||
<source lang="c"> |
<source lang="c"> |
||
unsigned int gray_encode(unsigned int b) { |
unsigned int gray_encode(unsigned int b) { |
||
Řádek 43: | Řádek 39: | ||
} |
} |
||
</source> |
</source> |
||
|} |
|||
O něco málo složitější je převod z Grayova kódu do binárního: |
|||
{|width=50% |
|||
|Převod z grayova do binárního kódu vyjde v jazyku C o něco složitěji: |
|||
|- |
|||
| |
|||
<source lang="c"> |
<source lang="c"> |
||
unsigned int gray_decode( unsigned int g ) { |
unsigned int gray_decode( unsigned int g ) { |
||
Řádek 60: | Řádek 52: | ||
} |
} |
||
</source> |
</source> |
||
|} |
|||
{|width=50% |
|||
⚫ | |||
|- |
|||
| |
|||
<source lang="pascal"> |
|||
function GrayEncode(b: Longint): Longint; |
|||
begin |
|||
GrayEncode := b xor (b shr 1); |
|||
end; |
|||
</source> |
|||
|} |
|||
== Jednostopý Grayův kód == |
== Jednostopý Grayův kód == |
||
[[Soubor:Enkelspoors-Graycode.svg|thumb| |
[[Soubor:Enkelspoors-Graycode.svg|thumb|upright|Kódový kotouč pro jednostopý Grayův kód s 5 senzory]] |
||
[[Soubor:Binary-Gray-Code-Single-Track.png|thumb| |
<!--[[Soubor:Binary-Gray-Code-Single-Track.png|thumb|upright|Kódování z jednostopého snímání]]--> |
||
Ve výše uvedeném příkladu je pro generování kódu použito n |
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 0<sub>D</sub> a 31<sub>D</sub> (00<sub>H</sub> a 1F<sub>H</sub> / 00000<sub>B</sub> a 11111<sub>B</sub>) 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. |
||
{{Clear}} |
{{Clear}} |
||
Verze z 20. 5. 2016, 09:15
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
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í
Převod z Grayova kódu na klasický binární kód lze snadno realizovat pomocí logických členů XOR:
Pro převod opačným směrem, tedy z binárního kódu na Grayův, lze použít následující zapojení.
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
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.