Перейти к основному содержимому

Энкодеры

Два энкодера измеряют вращение выходных валов колёсного робота

Мятные стрелки показывают движение шасси. На каждом выходном валу находится диск, а неподвижный чувствительный элемент считывает его вращение. Синяя и мятная линии — два канала обратной связи от каждого энкодера к контроллеру, графитовая линия — общий электрический опорный провод. Оранжевая пара питает драйвер моторов и не передаёт данные энкодера. Питание чувствительных элементов и полный pinout на учебной схеме не показаны: их подключают только по datasheet конкретного датчика.

Команда «дать мотору 40% ШИМ» не сообщает, насколько далеко уехал робот. Колесо может буксовать, напряжение батареи — меняться, а правый привод — вращаться немного быстрее левого. Энкодер превращает движение в электрические данные, по которым программа оценивает положение, направление и скорость.

Коротко

Инкрементальный энкодер выдаёт изменения положения — импульсы или последовательность состояний. Два квадратурных канала позволяют определить и величину перемещения, и направление. Абсолютный энкодер передаёт код текущего положения. Чтобы перевести отсчёты в обороты или метры, нужно знать, на каком валу стоит датчик и что производитель называет CPR, PPR, циклом и режимом X1/X2/X4.

Зачем это нужно

Без обратной связи программа знает только отправленную команду. Она не видит, что колесо зажато, вал отстаёт под нагрузкой или механизм перескочил из-за люфта. Энкодер замыкает информационный путь:

команда -> драйвер -> мотор -> редуктор -> колесо
^ |
|---------- отсчёты энкодера ----------|

По этим отсчётам мобильный робот может:

  • сравнивать скорости левого и правого колёс;
  • оценивать пройденное расстояние;
  • обнаруживать команду движения без фактического вращения;
  • плавнее удерживать скорость на разном покрытии;
  • выполнять относительный поворот или подъезд к точке.

Энкодер не устраняет проскальзывание колеса и не измеряет координаты робота в комнате. Он сообщает движение того вала или шкалы, с которыми механически связан. Для полной оценки положения часто добавляют IMU, внешние метки, камеры или другие датчики.

Примеры устройств

Примеры моторов рядом с темой энкодеров

УстройствоЧто этоКак связана тема энкодераЧто сравнить перед выбором
130 DCмотор без редуктораштатного энкодера нет, обратную связь добавляют отдельноесть ли место для диска, магнита или другого датчика
N20компактный мотор-редуктор без энкодераштатного энкодера нет, поэтому обратную связь добавляют отдельным датчикомможно ли поставить диск, магнит или датчик на выходной вал
ТТ motorучебный мотор-редукторштатного энкодера часто нет, но его используют в простых роботахнужен ли внешний датчик скорости или достаточно времени/ШИМ
JGA25-370 с энкодеромметаллический мотор-редуктор с обратной связьюэнкодер помогает держать скорость колесанапряжение датчика, распиновку, CPR/PPR и редукцию
JGB37-520 с энкодеромболее крупный мотор-редуктор с датчикомудобен для тяговых приводов, где важна скорость и путьчастоту импульсов, ток мотора и возможности контроллера

Главный вопрос: у выбранного мотора энкодер уже встроен или его нужно добавлять отдельно? Если энкодер встроен, всё равно надо проверить, на каком валу он стоит и что производитель считает одним отсчётом.

Главная идея

Энкодер состоит из движущейся шкалы и неподвижного считывающего элемента. Шкалой может быть диск с прорезями, магнит с чередующимися полюсами или кодовое кольцо. При вращении электроника формирует данные, а контроллер считает изменения либо принимает готовое значение положения.

ТипЧто приходит к контроллеруЧто известно сразу после включенияТипичная задача
однофазный инкрементальныйпоследовательность импульсовтолько изменения после запуска; направление само по себе не известноизмерение скорости в одном направлении
квадратурный инкрементальныйдва сдвинутых каналаотносительное движение и направление после запускаколёса, моторы, линейные оси
инкрементальный с индексомA/B и редкий опорный импульсотносительное положение; индекс даёт известную метку после её прохожденияоборотный стол, шпиндель
абсолютныйкод или цифровое сообщение о положенииположение в пределах заявленной области измерениясустав робота, механизм без поиска нуля

Инкрементальный счётчик обычно начинается с программного нуля. После отключения питания накопленное значение теряется, если система не сохранила его и механика не двигалась без контроля. Канал индекса Z может дать одну опорную точку за оборот, но сам по себе не превращает обычный A/B-энкодер в истинно абсолютный.

Абсолютный энкодер кодирует каждое положение. Однако число разрядов, однооборотный или многооборотный диапазон, интерфейс, задержка и поведение при потере питания зависят от конкретного устройства.

Квадратура A/B

У квадратурного энкодера каналы A и B имеют одинаковый период и сдвинуты примерно на четверть электрического цикла. Контроллер смотрит не только на число фронтов, но и на порядок состояний.

Концептуальная последовательность четырёх состояний квадратурного энкодера

В этой концептуальной схеме верхний синий индикатор — канал A, нижний мятный — канал B. Пустой круг означает низкий уровень, заполненный — высокий. При выбранном направлении повторяется последовательность:

00 -> 10 -> 11 -> 01 -> 00

Оранжевая стрелка задаёт порядок чтения слева направо. Ячейки показывают дискретные устойчивые состояния, а не измеренную временную осциллограмму. Положение двух считывателей у секторального диска условно; точную квадратурную последовательность задают ячейки справа, а реальную геометрию определяет устройство. При реверсе порядок проходит в обратную сторону. Какому физическому вращению — по часовой стрелке или против — соответствует опережение A, зависит от стороны наблюдения, установки датчика и полярности каналов; это проверяют по datasheet и тестом на малой скорости.

Если из 00 система сразу увидела 11, один из промежуточных переходов потерян или входы искажены помехой. Такой скачок полезно считать диагностической ошибкой, а не молча принимать за два шага.

X1, X2 и X4 без путаницы

Один полный квадратурный цикл содержит четыре допустимых перехода. Декодер может учитывать разное число фронтов:

Режим декодированияКакие события считаютсяОтсчётов на один цикл A/B
X1один выбранный фронт одного канала1
X2оба фронта одного канала2
X4оба фронта обоих каналов4

Эти названия описывают способ декодирования, но термины CPR, PPR, «линии», «циклы» и «отсчёты» производители используют неодинаково. Например, один документ называет CPR числом циклов до квадратурного умножения, другой — числом отсчётов после X4. Поэтому нельзя автоматически умножать каталоговое число на четыре.

Безопасный порядок такой:

  1. найти в datasheet точное определение параметра;
  2. выяснить, на каком валу он задан;
  3. записать выбранный режим X1/X2/X4;
  4. вручную повернуть вал на один оборот и сравнить счётчик;
  5. сохранить результат как counts_per_revolution именно для этой сборки и настройки.
Разрешение не равно точности

Больше отсчётов позволяет различать меньшие изменения счётчика. Но погрешность диаметра колеса, биение диска, люфт, проскальзывание, шум и пропущенные фронты не исчезают от перехода X1 → X4.

Где поставить энкодер

Энкодер до редуктора и энкодер на его выходе наблюдают разные движения.

УстановкаПреимуществоОграничение
на валу мотора, до редукторамного оборотов датчика на один оборот колеса; компактная интеграцияне видит люфт, упругость и повреждение после точки измерения
на выходном валу редуктораизмеряет движение ближе к колесу или нагрузкеможет дать меньше отсчётов и требует места у выходного узла
непосредственно на колесе или механизмеучитывает большую часть трансмиссиисложнее защищать, центрировать и прокладывать проводку

Если энкодер на моторном валу даёт C_мотор отсчётов на его оборот, а точное отношение редуктора i = n_мотор / n_выход, то ожидаемое число отсчётов на оборот выхода:

C_выход = C_мотор × i

У некоторых редукторов отношение не является целым числом. Тогда значение отсчётов на один одиночный оборот выхода может быть дробным как коэффициент пересчёта; счётчик остаётся целым, а совпадение повторяется на большем числе оборотов. Используют точное отношение из документации, а не округлённую надпись 100:1.

Редукторный люфт особенно заметен при реверсе. Энкодер на моторе уже показывает движение, пока выходной вал выбирает зазор. Энкодер на выходе увидит фактическую задержку, но и он не обнаружит проскальзывание шины относительно пола.

От отсчётов к углу, скорости и расстоянию

Пусть C — проверенное число отсчётов на один оборот измеряемого вала в выбранном режиме, а ΔN — изменение счётчика. Угол поворота:

θ = 2π × ΔN / C

Если за время Δt получено ΔN отсчётов, средняя скорость в оборотах в минуту:

RPM = 60 × ΔN / (C × Δt)

Для колеса диаметра D без проскальзывания расчётные путь и линейная скорость:

s = π × D × ΔN / C
v = π × D × ΔN / (C × Δt)

Знак ΔN сохраняет направление. Диаметр измеряют под рабочей нагрузкой, а коэффициент пути калибруют по длинному прямому отрезку. На мягкой шине эффективная окружность отличается от геометрической, а при разгоне и повороте появляется проскальзывание.

Для очень малой скорости метод «считать отсчёты за короткое окно» даёт ступенчатый результат: в одном окне ноль, в следующем один импульс. Тогда измеряют время между переходами. На высокой скорости удобнее считать фронты аппаратным таймером за фиксированное окно. Выбор зависит от частоты событий и возможностей контроллера.

Как декодировать допустимые переходы

Контроллер хранит предыдущее двухбитное состояние и сравнивает его с новым. Для направления, показанного на рисунке, допустимы четыре перехода 00→10, 10→11, 11→01, 01→00; для обратного — та же цепочка наоборот.

Упрощённый обработчик X4 может выглядеть так:

void onEncoderEdge() {
uint8_t current = (readA() << 1) | readB();
uint8_t transition = (previous << 2) | current;

switch (transition) {
case 0b0010: case 0b1011: case 0b1101: case 0b0100:
++count;
break;
case 0b0001: case 0b0111: case 0b1110: case 0b1000:
--count;
break;
default:
if (current != previous) ++invalidTransitions;
}

previous = current;
}

Функции readA() и readB() здесь условные и должны вернуть 0 или 1 из одного согласованного снимка входов. Переменные, изменяемые в прерывании, объявляют и читают по правилам конкретной платформы; многобайтовый count копируют атомарно. Обработчик не выполняет печать, вычисления с плавающей точкой или долгие операции.

На высокой частоте предпочтителен аппаратный режим encoder/QEI таймера. Он декодирует направление и считает переходы без отдельного программного прерывания на каждый фронт. Программа периодически читает счётчик и расширяет его разрядность, учитывая переполнение или переход через ноль.

Пример на Arduino с готовой библиотекой

Для первого опыта не обязательно писать декодер квадратуры вручную. Можно взять готовую библиотеку arduino_encoder: она поддерживает AVR Arduino, например Uno и Nano, а также ESP32. Библиотеку скачивают архивом и кладут в папку Documents/Arduino/libraries на Windows или ~/Arduino/libraries на Linux, после чего перезапускают Arduino IDE.

Ниже простой пример для двух мотор-редукторов с квадратурными энкодерами. Каналы левого энкодера подключены к D5 и D6, правого — к D7 и D8.

// #define ENC_SAVE_MODE
#include <arduino_encoder.h>

const int leftA = 5;
const int leftB = 6;
const int rightA = 7;
const int rightB = 8;

Encoder leftEncoder;
Encoder rightEncoder;

void setup() {
Serial.begin(9600);

leftEncoder.setup(leftA, leftB);
rightEncoder.setup(rightA, rightB);
}

void loop() {
Serial.print("L: ");
Serial.print(leftEncoder.get());
Serial.print(" R: ");
Serial.println(rightEncoder.get());

delay(100);
}

Если счётчик растёт при вращении колеса «не в ту» сторону, направление можно развернуть:

leftEncoder.reverse();

Если нужно начать измерение заново, счётчик обнуляют:

leftEncoder.clear();
rightEncoder.clear();

В библиотеке также есть режим ENC_SAVE_MODE. Его пробуют включать перед #include, если из-за других тяжёлых библиотек контроллер начинает пропускать состояния энкодера.

Частота, пропуски и переполнение

Максимальную частоту событий оценивают до написания программы:

f_событий = RPM / 60 × C

Если колесо имеет C = 2400 отсчётов на оборот и вращается со скоростью 300 RPM, декодер должен обработать около 12 000 событий в секунду. Два колеса удваивают поток. Запас нужен для других прерываний и участков, где они временно запрещены.

Пропуски возникают из-за слишком медленного обработчика, неподходящих входов, дребезга механического энкодера, наводок от мотора, плохого общего провода или превышения допустимой частоты датчика. Диагностика включает осциллограф или логический анализатор, счётчик недопустимых переходов и медленный ручной тест.

Счётчик конечной разрядности рано или поздно переполняется. Для 16 бит это может произойти быстро. Контроллер должен обрабатывать overflow/underflow либо читать счётчик достаточно часто и вычислять знаковое приращение с учётом циклического диапазона. Положение лучше накапливать в более широком типе, а не сбрасывать аппаратный счётчик в случайный момент между фронтами.

Пример: контроль двух колёс

Каждые 20 мс программа атомарно копирует счётчики левого и правого энкодеров и находит приращения. По ним она вычисляет скорости колёс. Два регулятора корректируют команды драйверам так, чтобы фактические скорости следовали заданным.

Если команда велика, ток вырос, а счётчик не меняется дольше разрешённого времени, робот может быть зажат. Это повод остановить оба мотора и сообщить ошибку. Но нулевые отсчёты не всегда означают заклинивание: возможны оборванный провод, неверное питание энкодера или слишком низкая скорость для выбранного окна. Аварийная логика должна различать эти случаи настолько, насколько позволяют датчики.

Для оценки пути берут среднее приращение двух колёс, а для поворота — разность. Это колёсная одометрия. Она полезна на коротких отрезках, но ошибка накапливается из-за проскальзывания и неточного диаметра. Периодическая коррекция по внешнему ориентиру улучшает результат.

Что запомнить про энкодеры

  • Инкрементальный энкодер сообщает изменения, абсолютный — код текущего положения.
  • Квадратура использует порядок четырёх состояний для определения направления.
  • X1/X2/X4 задают число учитываемых фронтов, но терминологию CPR/PPR сверяют по datasheet.
  • Место установки определяет, какие люфты и деформации видит датчик.
  • Отсчёты переводят в угол и путь только после проверки C для конкретного вала и режима.
  • Высокую частоту лучше считать аппаратным таймером/QEI; переполнение и недопустимые переходы обрабатывают явно.
  • Энкодер колеса не измеряет проскальзывание относительно пола.

Практика

Задание 1. Расшифруй терминологию

Выберите реальный квадратурный энкодер или мотор с энкодером. По официальной документации определите, что производитель называет циклом, CPR или PPR, для какого вала дано значение и включено ли X4-декодирование.

Задание 2. Калибровка оборота

Составьте безопасный опыт ручного вращения без питания мотора. Отметьте начальное положение, поверните выход на несколько полных оборотов в обе стороны и сравните счётчик с расчётом. Ответ заранее не записывайте.

Задание 3. Путь колеса

Для выбранного диаметра и измеренного числа отсчётов на оборот выведите коэффициент «метров на отсчёт». Затем предложите прямолинейный маршрут для калибровки эффективного диаметра под массой робота.

Задание 4. Бюджет обработки

Оцените максимальную частоту событий двух энкодеров при предельных оборотах. Сравните программные прерывания и аппаратный encoder/QEI-режим таймера. Укажите способ обнаружения переполнения и потерянных переходов.

Задание 5. Моторный или выходной вал

Для привода с люфтом опишите два опыта реверса: с датчиком до редуктора и после него. Предскажите различие показаний, а затем составьте таблицу измерений без готовых чисел.

Проверьте себя

  1. Чем инкрементальный энкодер отличается от абсолютного после включения питания?
  2. Зачем квадратуре два канала?
  3. Какие четыре состояния образуют допустимый цикл на рисунке?
  4. Что меняется при переходе X1 → X4?
  5. Почему нельзя всегда умножать значение CPR из каталога на четыре?
  6. Как пересчитать отсчёты моторного энкодера на оборот выходного вала?
  7. Как место установки влияет на наблюдение люфта?
  8. Из-за чего программа может терять отсчёты?
  9. Почему одометрия по колёсам накапливает ошибку?
Ориентиры для самопроверки

Сначала ответьте без подсказки. Ответ можно считать полным, если вы:

  • формулируете основную мысль своими словами;
  • называете важные условия, ограничения или меры безопасности;
  • для схемы, кода или расчёта показываете ход решения и ожидаемый результат.

Если один из пунктов объяснить не получается, найдите соответствующую главу статьи, перечитайте её и повторите ответ.

Словарь статьи

  • Энкодер — датчик, преобразующий линейное или вращательное положение в электрические данные.
  • Инкрементальный энкодер — энкодер, который сообщает относительные изменения положения.
  • Абсолютный энкодер — энкодер, передающий код текущего положения в заявленном диапазоне.
  • Квадратура — два периодических канала со сдвигом, позволяющим определить направление.
  • Фронт — переход цифрового сигнала между низким и высоким уровнем.
  • X1/X2/X4 — способы учитывать один, два или четыре фронта за квадратурный цикл.
  • Индекс — дополнительная опорная метка, часто формируемая один раз за оборот.
  • Отсчёт — одно принятое декодером изменение накопленного положения.
  • QEI — аппаратный интерфейс микроконтроллера для декодирования квадратурного энкодера.
  • Одометрия — оценка перемещения по измеренному движению колёс или других приводов.

Связанные темы

Источники