Перейти к содержанию

Почему энкодер на таймере STM32 считает неправильно?

Обновлено Редакция GAW

В режиме энкодера таймер STM32 сам определяет направление по порядку фронтов сигналов A и B и считает положение в регистре CNT. Аппаратный счёт не теряет импульсы, поэтому «неправильный» счёт почти всегда объясняется одной из причин ниже.

СимптомПричинаЧто сделать
Отсчётов в 4 раза больше, чем на шильдикеSMS = 011: каждый фронт A и Bделить на 4 или SMS = 001 — тогда ×2
Назад от нуля — 6553516-битный счётчик переходит через нольчитать CNT как int16_t, ARR = 0xFFFF
Положение «уплывает» при вращениидребезг контактов длиннее фильтраRC-цепочки на входах
Счёт идёт сам, без вращениявход без подтяжки, наводкиподтяжки, экранированный кабель
Счёт идёт не в ту сторонуA и B перепутаныпоменять входы или CC1P

Четыре отсчёта на период

При SMS = 011 счётчик меняется на каждом фронте обоих входов, а за один период сигнала A таких фронтов четыре. Наш расчёт: энкодер на 20 периодов на оборот даёт 80 отсчётов. RM0090 (разд. 17.3.16) отмечает и плюс этого режима: если вал стоит у точки переключения и сигнал дрожит, счётчик качается на ±1 и не накапливает ошибку.

Переход через ноль

Счётчик ходит между 0 и ARR (RM0008, разд. 15.3.12). У STM32F103 таймеры TIM2–TIM4 16-битные: при вращении назад от нуля CNT становится 65535. Если ARR = 0xFFFF, достаточно читать (int16_t)TIM3->CNT, а для больших диапазонов вести старшую часть в прерывании обновления. Поля регистров SMCR, CCMR1 и CCER — на странице регистров таймеров STM32F1.

Дребезг и фильтр

Фильтр входа ICxF принимает новый уровень после N одинаковых выборок. Наибольшая настройка 1111 — выборка fDTS/32 и N = 8.

tфильтра=8⋅3272 МГц≈3,6 мксt_\text{фильтра} = \frac{8 \cdot 32}{72\ \text{МГц}} \approx 3{,}6\ \text{мкс}

Расчёт наш для fDTS = 72 МГц. Дребезг механического энкодера длится намного дольше, поэтому для дешёвых ручек ставят RC-цепочки на входах, а цифровой фильтр оставляют против коротких помех; что такое дребезг и как его давят, разобрано отдельно. Остальные режимы таймеров — в статье «Таймеры STM32».

Похожие вопросы

Какой SMS выбрать: 001, 010 или 011?

Для большинства задач — 011: четыре отсчёта на период и, по RM0090 (разд. 17.3.16), компенсация дрожания, когда вал стоит у точки переключения. 001 и 010 считают фронты одного входа и дают два отсчёта на период. Учтите, что в RM0090 соответствие 001 и 010 входам TI1 и TI2 в разных местах документа указано по-разному; описание регистра и HAL ST сходятся на 001 — TI1.

Как подключить энкодер с открытым коллектором?

Выходы с открытым коллектором сами уровень не держат — нужны подтяжки к питанию. Встроенных подтяжек STM32 хватает для коротких проводов; для длинного кабеля ставят внешние резисторы в единицы килоом, а дифференциальные выходы ST советует приводить к цифре компараторами (наш вывод и RM0008).

Как считать энкодер на ESP32?

У ESP32 для этого служит счётчик импульсов PCNT: два канала одного блока, у каждого счётный и управляющий входы, дают счёт вверх и вниз. Подробности — в термине PCNT.

Источники

  1. STMicroelectronics. RM0008 Rev 21 (STM32F101…F107) — 15.3.12 — режим энкодера: счётчик ходит между 0 и ARR, ARR задают до запуска; при счёте по обоим входам дрожание у точки переключения компенсируется (рис. 134); табл. 85 — направление; дифференциальные выходы советуют приводить компараторами, индекс — на внешнее прерывание; 15.4.7 — IC1F: 1111 — выборка fDTS/32, N = 8
  2. STMicroelectronics. RM0090 Rev 21 и STM32CubeF4 HAL, stm32f4xx_hal_tim.h — описание битов SMS (17.4.3) и HAL: 001 — счёт по фронтам TI1, 010 — по TI2, 011 — по обоим; в функциональном описании RM0090 (17.3.16) коды 001 и 010 указаны наоборот; там же — компенсация дрожания при счёте по обоим входам

Нашли ошибку?