Коды Грея, также известные как отраженные двоичные коды, являются остроумным способом минимизации ошибок при переходе цифровых сигналов из одного состояния в другое. Обеспечивая изменение только одного бита за один переход, они упрощают проектирование оборудования и уменьшают неоднозначность в различных приложениях, начиная от поворотных энкодеров и заканчивая коррекцией ошибок.
В этой статье кратко рассматриваются основы кодов Грея и приводятся несколько практических советов, которые инженеры могут применять при работе с ними в реальных схемах.
Понимание отраженного двоичного (Грея) кода
Отраженный двоичный код, более известный как код Грея по имени его изобретателя Фрэнка Грея, представляет собой систематическую упорядоченность двоичных чисел, разработанную таким образом, что каждое последующее значение отличается от предыдущего всего одним битом. Это свойство отличает код Грея от обычных двоичных последовательностей, где во время переходов могут одновременно изменяться несколько битов.
Для иллюстрации рассмотрим десятичные значения 1 и 2. В стандартной двоичной системе они представляются как 001 и 010, и для перехода от одного к другому требуется изменение двух битов. Однако в коде Грея те же значения выражаются как 001 и 011, что гарантирует изменение только одного бита при инкременте. Эта, казалось бы, незначительная модификация имеет важное практическое значение: она снижает неоднозначность и минимизирует риск неправильной интерпретации при изменениях состояний.
Коды Грея уже давно используются в инженерной практике. Они помогают подавлять ложные сигналы на выходах электромеханических переключателей, где одновременная смена битов в противном случае могла бы привести к переходным ошибкам. В современных приложениях кодирование по Грею также способствует снижению количества ошибок в цифровых системах связи. Упрощая логические операции и ограничивая переходы одним битом, коды Грея обеспечивают прочную основу для надежного проектирования цифровых систем.
Сравнение кода Грея с обычным двоичным кодом
В отличие от стандартного двоичного кодирования, где при увеличении значения числа могут изменяться несколько битов, код Грея гарантирует, что между последовательными значениями изменяется только один бит. Этот однобитовый переход минимизирует неоднозначность при смене состояния и обеспечивает простое обнаружение ошибок: если неожиданно изменяется более одного бита, система может пометить данные как неверные.
Это свойство особенно полезно в кодовых датчиках положения и цифровых системах управления, где переходные ошибки, возникающие из-за одновременного изменения нескольких битов, могут привести к неверной интерпретации. В Таблице 1 сравнивается последовательность значений в обычном двоичном коде и коде Грея, демонстрируя, как код Грея сохраняет в последовательности однобитовые переходы.
| Таблица 1. | Сравнение кода Грея и естественной двоичной последовательности с выделением однобитовых переходов между приращениями |
||||||||||||||||||||
|
|||||||||||||||||||||
Когда речь заходит о надежности выходных сигналов абсолютных энкодеров, предпочтительным выбором является код Грея, поскольку он предотвращает ошибки данных, которые могут возникать при использовании обычного двоичного кода во время переходов состояний. В обычном двоичном коде медленная реакция системы может на мгновение привести к неправильной интерпретации изменения; например, если одновременно изменяются несколько битов, переход от 0011 к 0100 может кратковременно выглядеть как 0111. Код Грея позволяет избежать этой проблемы, обеспечивая одновременное изменение только одного бита, что делает выходной поток более надежным по сути и упрощает его проверку контроллерами на практике.
Кроме того, преобразование кода Грея обратно в обычный двоичный формат не представляет сложности и может быть быстро выполнено на бумаге. Для начала запишите последовательность кода Грея и скопируйте крайний левый бит (MSB) непосредственно под ним. Затем добавьте этот скопированный бит к следующему биту кода Грея справа, игнорируя переносы, и поместите результат рядом с первой скопированной цифрой. Продолжайте этот процесс шаг за шагом для всей последовательности, пока не будут преобразованы все биты. Последняя строка представляет эквивалентное обычное двоичное значение.
Для примера рассмотрим код Грея 1011.
- Копируем самый левый бит → двоичное представление начинается с 1.
- Далее, прибавляем (исключающее ИЛИ, XOR) скопированный бит к следующему биту Грея: 1 XOR 0 1 → получаем двоичное число 11.
- Продолжаем: 1 XOR 1 = 0 → получаем двоичное число 110.
- Наконец: 0 XOR 1 = 1 → получаем двоичное число 1101.
Таким образом, код Грея 1011 соответствует обычному двоичному значению 1101. (См. Таблицу 2).
| Таблица 2. | Пошаговое преобразование кода Грея 1011 в его обычный двоичный эквивалент 1101 |
||||||||||||||||||||
|
|||||||||||||||||||||
Код Грея 1011 не является стандартным взвешенным кодом, однако в 4-битной последовательности он соответствует десятичному значению 13. Его обычный двоичный эквивалент 1101 также равен 13, как показано ниже:
(1×23) + (1×22) + (0×21) + (1×20) = 8 + 4 + 0 + 1 = 13.
Поскольку оба представления дают один и тот же десятичный результат, преобразование подтверждено как правильное.
Выходной кода Грея в поворотных энкодерах
Главное отличие энкодера Грея заключается в его выходном сигнале. Вместо того чтобы возвращать двоичное число, непосредственно отражающее положение ротора, энкодер выдает значение кода Грея.
Как уже обсуждалось ранее, код Грея принципиально отличается от двоичного кода: это не взвешенная система счисления, где каждая цифра последовательно увеличивает вклад в общее значение. Скорее, это невзвешенный код, разработанный таким образом, что между последовательными состояниями изменяется только один бит.
В отличие от этого, в обычном двоичном коде часто требуется одновременное изменение нескольких битов при инкременте или декременте, что может привести к неоднозначности при переходах. В крайних случаях эта неоднозначность может привести к неправильной интерпретации контроллером положения энкодера, что станет причиной ошибок в реакции системы. Ограничивая изменения одним битом, код Грея минимизирует эти риски и обеспечивает более надежное определение состояния.
На Рисунке 1 показан 4-битный поворотный энкодер с выходным кодом Грея. Как видно, он имеет четыре выходных вывода, обозначенные цифрами 1, 2, 4 и 8, а также общий вывод. Числа 1-2-4-8 представляют позиции битов в 4-битном коде, причем каждый вывод соответствует одной выходной линии энкодера. По мере вращения ротора каждая линия переключается между высоким и низким уровнями в соответствии с последовательностью кода Грея, формируя уникальный 4-битный паттерн для каждого положения.
![]() |
|
| Рисунок 1. | Выводы 4-битного энкодера Грея 25LB22-G-Z. |
Вывод «ОБЩИЙ» служит опорной точкой подключения (обычно это земля или возврат питания), относительно которой измеряются четыре выходных сигнала. Вместе эти выводы обеспечивают полный выходной код Грея, который может быть считан контроллером или логической схемой для определения углового положения энкодера.
Примечание: энкодеры с шестнадцатеричным выходом
Хотя многие поворотные энкодеры выдают код Грея или двоичные коды, некоторые устройства рассчитаны на вывод сигналов в шестнадцатеричном формате. В таких энкодерах положение ротора представляется 4-битным двоичным словом, которое напрямую соответствует шестнадцатеричным цифрам (0–F). Такой подход упрощает интеграцию с цифровыми системами, которые уже обрабатывают данные в шестнадцатеричном формате, такими как микроконтроллеры или диагностические интерфейсы.
В отличие от кода Грея, шестнадцатеричные выходные данные не гарантируют однобитовых переходов между состояниями, поэтому они более подвержены неоднозначности при механическом переключении. Однако они остаются полезными в приложениях, где компактное представление и простота декодирования оказываются важнее необходимости в надежности переходов.
Декодирование кода Грея микроконтроллером
Существует несколько способов декодирования кодов Грея, но наиболее распространенным на сегодняшний день является передача выходных битов в микроконтроллер, а подсчет производится программой. На практике программа считывает сигналы с поворотного энкодера через порты ввода-вывода и сначала преобразует код Грея в двоичное значение. Затем это двоичное значение преобразуется в двоично-десятичный код, который обеспечивает удобный формат для управления цифровыми дисплеями.
После этого микроконтроллер может обновлять семисегментный дисплей, ЖК-дисплей или другой интерфейс, чтобы представить положение ротора в понятной десятичной форме. Такой программный подход не только упрощает аппаратную часть, но и обеспечивает гибкость масштабирования для энкодеров с более высоким разрешением или интеграции дополнительных функций обработки.
Что касается меня лично, мой первый эксперимент с энкодером кода Грея заключался в декодировании выходных сигналов средствами аппаратной логики, а не программой микроконтроллера.






