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

Режим энкодера таймера

Инкрементальный энкодер выдаёт два сдвинутых сигнала A и B, и по их порядку видно, в какую сторону крутится вал. Считать их в прерываниях утомительно и ненадёжно на больших скоростях — у таймеров STM32 есть режим, который делает это аппаратно.

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

Режим энкодера (encoder interface mode) — режим ведомого контроллера таймера STM32, в котором счётчик тактируется фронтами двух входов TI1 и TI2, подключённых к выходам A и B инкрементального энкодера. Таймер сам определяет направление по порядку фронтов: при вращении в одну сторону счётчик растёт, в другую — уменьшается, а бит DIR в TIMx_CR1 показывает текущее направление (RM0090, разд. 17.3.16). Значение счётчика в любой момент — это положение вала в отсчётах.

Как включить

Режим выбирают полем SMS в регистре TIMx_SMCR:

SMSСчётОтсчётов на период A
001по фронтам TI1, направление по уровню TI22
010по фронтам TI2, направление по уровню TI12
011по фронтам обоих входов4

Соответствие кодов — по описанию битов SMS (RM0090, разд. 17.4.3, 18.4.3) и константам HAL TIM_ENCODERMODE_TI1 = SMS_0 («counts up/down on TI1FP1 edge depending on TI2FP2 level») и TIM_ENCODERMODE_TI2 = SMS_1 (stm32f4xx_hal_tim.h). В функциональном описании разд. 17.3.16 RM0090 коды 001 и 010 указаны наоборот — это расхождение внутри документа, мы следуем описанию регистра и HAL. Число отсчётов в последнем столбце — наш вывод из таблицы направлений RM0090 (табл. 94): каждый фронт активного входа даёт один отсчёт. Полярность входов задают CC1P и CC2P, при необходимости включают входной фильтр. Счётчик ходит между 0 и ARR, поэтому ARR задают до запуска; предделитель, захват и сравнение при этом продолжают работать как обычно.

Что учесть

  • Какие таймеры. У STM32F4 режим есть у TIM1, TIM8 и TIM2…TIM5; TIM2 и TIM5 32-битные (RM0090, разд. 17.2, 18.2). Наш вывод: при ARR = 0xFFFFFFFF переполнения на практике не будет, но при вращении назад от нуля счётчик перейдёт в 0xFFFFFFFF — CNT читают как int32_t или заранее ставят в середину диапазона.
  • Подключение. Энкодер можно подключить напрямую, но дифференциальные выходы RM0090 советует сначала привести к цифровому виду компараторами — так выше помехоустойчивость.
  • Индекс. Третий выход энкодера (метка нуля) подключают к линии EXTI и по нему сбрасывают счётчик.
  • Скорость считают вторым таймером в режиме захвата входа или читая счётчик через равные интервалы.

Не путать

С абсолютным энкодером: он выдаёт код положения сразу, часто в коде Грея, и счётчик ему не нужен; инкрементальному же положение без счёта от метки нуля неизвестно. Подробнее о таймерах STM32 — в статье «Таймеры STM32».

Частые вопросы

Почему счётчик даёт в четыре раза больше импульсов, чем написано у энкодера?

При SMS = 011 таймер считает каждый фронт обоих сигналов A и B (RM0090, табл. 94), а за один период сигнала A таких фронтов четыре. Наш вывод: у энкодера на 600 периодов на оборот получится 2400 отсчётов на оборот. Если считать только по одному входу (SMS = 001 — по TI1, 010 — по TI2), отсчётов будет вдвое больше периодов.

Как не потерять позицию при переполнении счётчика?

Счётчик в режиме энкодера ходит между 0 и ARR и переходит через границу, как обычный счётчик (RM0090, разд. 17.3.16). Самое простое — взять 32-битный TIM2 или TIM5 и ARR = 0xFFFFFFFF. Наш вывод: при вращении назад от нуля счётчик перейдёт в 0xFFFFFFFF, поэтому CNT читают как int32_t или перед запуском записывают в него середину диапазона. У 16-битных таймеров переход через ноль или ARR ловят прерыванием обновления и ведут старшую часть позиции программно.

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

RM0090 предлагает два способа: измерять время между событиями энкодера вторым таймером в режиме захвата или читать счётчик через равные интервалы. Во втором случае скорость — разность показаний, делённая на интервал; при малой скорости первый способ точнее, при большой — второй (наш вывод).

Источники

  1. STMicroelectronics. RM0090 Reference manual: STM32F405/415, STM32F407/417, STM32F427/437 and STM32F429/439, Rev 21 — разд. 17.4.3 и 18.4.3 (описание битов SMS) — 001: Encoder mode 1, счёт по фронтам TI1FP1 в зависимости от уровня TI2FP2; 010: Encoder mode 2, по фронтам TI2FP2 в зависимости от TI1FP1; 011: по обоим; в тексте разд. 17.3.16 и 18.3.12 соответствие 001 и 010 указано наоборот; разд. 17.3.16 и 18.3.12 — полярность CC1P/CC2P, фильтр; направление по последовательности фронтов, бит DIR; счётчик между 0 и ARR, ARR задают до запуска; табл. 94 — направление счёта; дифференциальные выходы энкодера рекомендуется приводить к цифровым компараторами, индекс подключать к внешнему прерыванию; скорость — вторым таймером в режиме захвата или чтением через равные интервалы; 17.2 — поддержка квадратурного энкодера у TIM1 и TIM8; 18.2 — TIM2 и TIM5 32-битные
  2. STMicroelectronics. RM0008 Reference manual: STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx, Rev 21 — разд. 14.3.16 (TIM1, TIM8) и 15.3.12 (TIM2…TIM5) — тот же Encoder interface mode у STM32F1: SMS = 001, 010, 011, полярность CC1P/CC2P, табл. 81 — направление счёта
  3. STMicroelectronics. STM32CubeF4 HAL driver v1.8.5, stm32f4xx_hal_tim.h — TIM_ENCODERMODE_TI1 = TIM_SMCR_SMS_0 — счёт по фронтам TI1FP1 в зависимости от уровня TI2FP2; TIM_ENCODERMODE_TI2 = TIM_SMCR_SMS_1 — по фронтам TI2FP2; TIM_ENCODERMODE_TI12 — по обоим

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