Руководство · Начальный · 17 мин чтения
Чтение квадратурных энкодеров для измерения расстояния и скорости
Расшифровка квадратурного энкодера: преобразование отсчётов в расстояние и скорость колеса, учёт направления и переполнения, калибровка на реальном роботе.
Колесный энкодер преобразует вращение в цифровые импульсы. Подсчитав их, можно измерить пройденное роботом расстояние, а подсчитав за некоторое время, — оценить скорость. Квадратурный энкодер формирует два канала импульсов, A и B, сдвинутых на четверть периода. Изменение канала первым позволяет определить направление.
Энкодеры измеряют относительное перемещение, а не абсолютную позицию. Отсчёт имеет смысл только после запуска или намеренного сброса и становится полезным только после того, как вы точно определите, сколько отсчётов соответствует одному обороту колеса.
Чтение двухканальной последовательности
Допустимые квадратурные состояния — 00, 01, 11 и 10. При вращении в одну сторону последовательность проходит в одном порядке, а при вращении в другую — в обратном. За один раз должен изменяться только один бит. Переход, например, из 00 непосредственно в 11 означает, что фронт был пропущен или сигнал искажён шумом.
Существует три распространённых режима подсчёта:
- Декодирование 1×: подсчёт одного фронта в канале A за период.
- Декодирование 2×: подсчёт обоих фронтов в канале A.
- Декодирование 4×: подсчёт каждого фронта в обоих каналах.
Поэтому техническое описание, в котором указано 12 импульсов на оборот, может задавать 12, 24 или 48 программных отсчётов на один оборот вала энкодера. Если энкодер установлен на двигателе, а не на колесе, добавьте передаточное число редуктора. Запишите полную схему подсчёта рядом с константой; необъяснённые двукратные и четырёхкратные различия — частая причина ошибок одометрии.
Правильное подключение сигналов
Определите, являются ли выходы с push-pull, с открытым коллектором или с открытым стоком. Для выходов с открытым коллектором или стоком нужны подтягивающие резисторы, внутренние или внешние в зависимости от частоты фронтов и схемы подключения. Убедитесь, что напряжение сигнала безопасно для контроллера: выход энкодера 5 V может повредить вход 3.3 V.
Держите кабель подальше от проводов двигателя. Для длинных линий используйте рекомендации производителя энкодера по кабелю и терминированию линии. Чистый цифровой фронт ценнее попыток исправлять ложные отсчёты программно.
Покрутите колесо медленно вручную до запуска двигателя. Оба канала должны попеременно переходить между допустимыми логическими уровнями. Если один канал не меняется, сначала исправьте подключение, а затем отлаживайте код.
Определение направления без потери отсчётов
При небольших скоростях можно настроить прерывание при каждом изменении канала A и считывать B для определения направления:
volatile long encoderCount = 0;
void onEncoderA() {
bool a = digitalRead(ENCODER_A);
bool b = digitalRead(ENCODER_B);
encoderCount += (a == b) ? 1 : -1;
}
Знак зависит от порядка каналов и физического расположения. Поменяйте A и B местами или инвертируйте результат, чтобы движение колеса вперёд давало положительный отсчёт. Выполните это изменение один раз на границе с оборудованием, а не расставляйте переключения знака по всему коду одометрии.
При высокой частоте фронтов повторные вызовы digitalRead() могут быть слишком медленными. Используйте аппаратный модуль квадратурного декодирования, проверенную платформенную библиотеку для энкодеров или прямой доступ к портам, подходящий для контроллера. Перед выбором оцените худший случай: edges per second = counts per wheel revolution × maximum wheel revolutions per second.
Работа в прерывании должна быть короткой. Обновите отсчёт и сразу вернитесь. Печать, преобразование в числа с плавающей точкой и расчёты регулирования должны выполняться в главном цикле.
Преобразование отсчётов в расстояние колеса
Пусть N — число декодированных отсчётов на оборот колеса, а D — эффективный диаметр колеса. Длина окружности колеса равна πD, поэтому:
distance = count × πD / N
Для колеса 65 mm и 1,440 декодированных отсчётов на оборот каждый отсчёт соответствует примерно 0.142 mm. Это математическое разрешение не равно фактической точности: сжатие шины, пробуксовка и погрешность диаметра обычно больше.
Безопасно считывайте многобайтовый счётчик. На малом микроконтроллере прерывание может обновить его между чтениями в главном цикле. Ненадолго запретите прерывания или используйте атомарные средства платформы:
noInterrupts();
long snapshot = encoderCount;
interrupts();
float distanceM = snapshot * (PI * wheelDiameterM) / countsPerWheelRev;
Используйте достаточно широкий знаковый счётчик и вычисляйте разности между сохранёнными значениями. Вычитание по модулю для беззнакового типа позволяет обработать переполнение, но только при осознанном выборе типов и интервала дискретизации.
Оценка скорости без усиления шума
При фиксированном интервале дискретизации вычисляйте разность отсчётов:
velocity = (newCount - oldCount) × distancePerCount / elapsedTime
Короткие интервалы обеспечивают быстрый отклик, но дают квантование: скорость отображается нулями и значениями, отличающимися на один отсчёт. Длинные интервалы дают более плавный результат, но добавляют запаздывание. Начните примерно с периода контура регулирования, а затем усредняйте несколько отсчётов, только если это действительно нужно контроллеру.
При очень медленном движении время между фронтами может измеряться точнее, чем число фронтов в фиксированном интервале. В любом случае используйте монотонные часы для отметки времени и измеренный интервал вместо предположения, что каждый цикл выполняется строго по расписанию.
Калибровка на полной приводной системе
Отметьте положение колеса и поверните его ровно на десять оборотов, записывая отсчёты. Деление на десять уменьшает влияние остановок между отдельными фронтами. Затем задайте роботу движение вдоль измеренной прямой, сравните расстояние по энкодеру с расстоянием по полу и скорректируйте эффективный диаметр колеса.
Калибруйте левое и правое колёса отдельно. Если робот сообщает одинаковые расстояния, но движется по дуге, различаются эффективные диаметры или передаточные отношения привода. Сохраняйте отдельные коэффициенты масштабирования: реальным шинам и редукторам необходима такая настройка.
Повторите измерение на второй скорости. Значительное изменение указывает на пробуксовку, неплотные ступицы, пропущенные фронты или проблему с таймингами, а не просто на погрешность диаметра.
Диагностика некорректных измерений
- Отсчёт изменяется при неподвижном роботе: электрический шум или плавающие входы; проверьте сигналы и подтягивающие резисторы.
- Модуль отсчёта ошибочно отличается ровно в 2× или 4×: режим декодирования в программе не соответствует определению импульсов в техническом описании.
- Направление случайно меняется: один канал зашумлён или считывается слишком поздно; проверьте качество фронтов и метод декодирования.
- Отсчёты замирают при движении: контроллер не успевает обслуживать частоту фронтов; используйте аппаратное декодирование или сократите накладные расходы прерываний.
- Расстояние повторяемо, но неверно: откалибруйте эффективный диаметр колеса и передаточное число редуктора.
- Расстояние меняется в зависимости от поверхности: энкодер измеряет вращение колеса, а не истинное перемещение; проскальзывание колёс создаёт реальную неопределённость перемещения.
Надёжные отсчёты являются входными данными для одометрии дифференциального привода, а обратная связь по скорости позволяет замкнуть контур двигателя, рассмотренный в Симуляторе ПИД-регулятора (PID). Эта поза также является входными данными для любого преследователя траектории, поэтому ошибка положения превращается в ошибки преследования траектории.
Далее
Подсчёт — только половина решения. Измеренная скорость ценна тем, что её можно удерживать; ознакомьтесь с замкнутым контуром регулирования скорости колеса, который преобразует ШИМ (PWM) из напряжения в скорость и не даёт роботу уходить в сторону из-за различий между двигателями. Для омниплатформы это уже не дополнительное удобство: управление задаёт именно соотношение скоростей четырёх колёс, а в разомкнутом контуре его нечем удерживать.
Исследуйте граф
Входит в эти сборки
Проекты и учебные пути, в которые входит это руководство.
- ПроектРобот на ROS 2 находит маркер и подъезжает к нему
- ПроектРобот, удерживающий равновесие, на MPU6050 и ПИД-регуляторе (PID)
- ПроектСоберите Micromouse для прохождения лабиринта
- ПроектСоберите робота для покрытия помещения
- ПроектСоберите робота на колёсах Mecanum, который едет боком
- ПроектСоберите робота-ровера для путевых точек GPS
- Учебный путьОмнидирекционный привод: движение вбок без поворота
- Учебный путьСледование по траектории для роботов: дорожная карта обучения
- Учебный путьУправление двигателями роботов: дорожная карта обучения
Дополнительные материалы