Почему энкодер «врет» на переходах?
Если при переходе с 7 на 8 датчик на мгновение выдает 0, 15 или «мусор», это не баг прошивки, а фундаментальная проблема параллельного двоичного кода.
Возьмем переход 7 → 8:
было 0111, стало 1000.
Чтобы это произошло, должны одновременно измениться все четыре бита. В реальной схеме из-за разброса задержек в логике, трассировке или входных буферах разряды переключаются не синхронно. На короткий момент возникает промежуточная комбинация. Это не произвольное число, а одно из состояний при частично переключившихся битах, но его достаточно, чтобы система управления зафиксировала скачок координаты или ошибку счётчика.
Решение — код Грея.
Его свойство в том, что любые два соседних значения отличаются ровно одним битом. При переходе меняется только один разряд, поэтому даже если считывание попадёт на момент переключения, вы получите либо старое, либо новое допустимое значение без многобитного скачка.
Сравнение перехода 7 → 8:
обычный код — 0111 → 1000, меняются 4 бита, высокий риск промежуточных состояний;
код Грея — 0100 → 1100, меняется 1 бит, переход одноразрядный.
Именно поэтому код Грея применяют в абсолютных оптических энкодерах, где дорожки диска размечаются сразу в этом коде, и в асинхронных FIFO для передачи счётчиков между разными тактовыми доменами. Он не заменяет синхронизаторы, но существенно снижает риск некорректного захвата при переходах.
Преобразование из двоичного кода в код Грея выполняется одной операцией:
gray = binary ^ (binary >> 1);
Разрядность сохраняется, логики минимум, поведение на переходах становится предсказуемым.
Post #42
990

- ❤ 16
- 🔥 9
- 👍 3