Энкодеры: квадратурный сигнал, подключение и декодирование
Энкодер превращает поворот вала в цифровой сигнал: инкрементальный — в импульсы двух каналов со сдвигом на четверть периода, абсолютный — сразу в код угла. Разбираем по даташитам Alps Alpine, Broadcom, ams и справочному руководству ST, как определить направление и разрешение, чем декодировать сигнал — таймером STM32 или программой — и что делать с дребезгом механических энкодеров.
Обновлено Редакция GAW
Энкодер — датчик угла или перемещения с цифровым выходом. Инкрементальный выдаёт импульсы при каждом шаге поворота, и положение получается их счётом от какой-то точки отсчёта. Абсолютный выдаёт код самого угла: после включения положение известно сразу. По принципу действия энкодеры бывают механические (скользящие контакты), оптические (диск с прорезями, светодиод и фотоприёмники) и магнитные (магнит на валу и магниточувствительный датчик — у AS5600 это датчики Холла).
Квадратурный сигнал
У инкрементального энкодера два выхода, A и B, сдвинутые на четверть периода. В терминах Broadcom один цикл — это 360 электрических градусов (одна пара «штрих — прорезь» на диске), сдвиг фаз A и B — 90 электрических градусов, а фронты двух каналов делят цикл на четыре состояния по 90°. Число циклов на оборот N Broadcom называет CPR (counts per revolution), Alps Alpine — числом импульсов. Некоторые производители понимают под CPR отсчёты после умножения на 4, а циклы называют PPR, поэтому определение сверяйте по даташиту.
Последовательность состояний — двухразрядный код Грея: на каждом шаге меняется только один сигнал.
| Шаг | A | B | Состояние 2A + B |
|---|---|---|---|
| 0 | 0 | 0 | 0 |
| 1 | 1 | 0 | 2 |
| 2 | 1 | 1 | 3 |
| 3 | 0 | 1 | 1 |
| 4 = 0 | 0 | 0 | 0 |
При вращении в одну сторону состояния идут сверху вниз (A опережает B), в другую — снизу вверх (B опережает A). Направление определяется тем, какой сигнал переключился, в какую сторону и каким был в этот момент второй: передний фронт A при низком B — шаг вперёд, при высоком — назад; задний фронт A — наоборот. Какому направлению вала соответствует «A опережает B», указывает даташит: у HEDS-5500 — вращение против часовой стрелки, если смотреть со стороны энкодера, у EC11 — по часовой стрелке.
Индекс (канал Z или I) — третий выход, один импульс за оборот. У HEDS-5540 он шириной 90 электрических градусов (по таблице допусков 55–125°) и совпадает с состоянием, когда A и B оба низкие. По нему находят нулевое положение после включения.
Режимы x1, x2, x4 и скорость счёта
Из одного цикла можно получить один, два или четыре отсчёта — смотря какие фронты считать:
| Режим | Какие фронты считаются | Отсчётов на оборот | Режим таймера STM32 |
|---|---|---|---|
| x1 | один фронт канала A | N | нет, считают в x2 или x4 и делят |
| x2 | оба фронта одного канала | 2N | SMS = 001 (TI2) или 010 (TI1) |
| x4 | оба фронта A и B | 4N | SMS = 011 (TI1 и TI2) |
Шаг по углу и частота отсчётов при скорости n об/мин:
где k — 1, 2 или 4, а fA — частота сигнала на одном канале. Именно fA Broadcom называет частотой счёта и гарантирует работу HEDS-5500/5540 до 100 кГц.
Пример. HEDS-5540 с диском на 500 CPR (буква A в обозначении) на двигателе 3000 об/мин, счёт x4:
- fA = 3000 · 500/60 = 25 кГц — четверть гарантированных 100 кГц;
- fсч = 4 · 25 = 100 кГц, то есть 100 000 отсчётов в секунду: в среднем 10 мкс между фронтами, 720 тактов таймера на 72 МГц. Погрешность ширины состояния у HEDS-5540 — до 35 из 90 электрических градусов, поэтому самый короткий интервал — около 10 · 55/90 ≈ 6,1 мкс, 440 тактов;
- 2000 отсчётов на оборот, шаг 0,18°. Это мельче, чем погрешность самого энкодера: ошибка положения HEDS-5500/5540 — до 40 угловых минут, около 0,67°;
- гарантированный предел по частоте счёта: об/мин, тогда fсч = 400 кГц. Broadcom оговаривает, что модуль может работать и на более высоких частотах, но без гарантии;
- 16-битный счётчик таймера при 100 кГц проходит полный круг за 65 536 / 100 000 ≈ 0,66 с; разность двух отсчётов со знаком однозначна, пока она меньше 32 768, то есть счётчик надо читать чаще чем раз в 0,33 с.
Скорость получают двумя способами, оба описаны в RM0008: считывают счётчик через равные интервалы и делят приращение на время, или измеряют вторым таймером период между соседними событиями энкодера. Первый хорош на высоких скоростях: при опросе раз в 1 мс и 2000 отсчётах на оборот один отсчёт соответствует 60/(2000 · 0,001) = 30 об/мин. На малых скоростях точнее второй.
Механические, оптические и магнитные энкодеры
| Параметр | Alps Alpine EC11E15244G1 | Broadcom HEDS-5540 | ams AS5600 |
|---|---|---|---|
| Принцип | механические контакты | оптический, металлический диск | магнитный, датчики Холла |
| Тип | инкрементальный | инкрементальный | абсолютный в пределах оборота |
| Выходы | A и B — контакты на общий вывод C | A, B и индекс I, уровни TTL | I²C, аналоговый или ШИМ |
| Разрешение | 15 импульсов, 30 фиксаций | 50–512 CPR (HEDM — до 1024) | 12 бит, 4096 на оборот |
| Скорость в даташите | в данных Alps не указана, дребезг проверяют при 360°/с | 100 кГц на канал гарантированно, не более 30 000 об/мин | выборка раз в 150 мкс |
| Питание | контакты: 5 В, рабочий ток 1–10 мА | 4,5–5,5 В, 57 мА типично | 4,5–5,5 В или 3,0–3,6 В, до 6,5 мА |
| Подтяжки | нужны | 2,7 кОм по даташиту | только на SDA и SCL |
| Дребезг | до 3 мс и отскок до 2 мс | нет, выходы через компараторы | нет |
| Температура | −40…+85 °C | −40…+100 °C | −40…+125 °C |
| Ресурс | 15 000 циклов | бесконтактный | бесконтактный |
Механический энкодер EC11
Ручки регулировки и навигации по меню обычно делают на механических энкодерах. Внутри два скользящих контакта, которые замыкают выводы A и B на общий вывод C, поэтому без подтягивающих резисторов на выходах нет никакого сигнала. Рабочий ток контактов по Alps Alpine — от 1 до 10 мА при резистивной нагрузке, дребезг нормирован при подтяжке 5 кОм к 5 В, то есть при 1 мА. Если микроконтроллер питается от 3,3 В, подтяжку ставят к 3,3 В: 1 мА — это 3,3 кОм.
Главное, что надо знать про EC11, — число фиксаций и импульсов не совпадает. У EC11E15244G1 30 фиксаций и 15 импульсов на оборот; в каталоге серии EC11E есть также 18/9 и 36/18. На диаграмме Alps Alpine в каждой фиксации оба контакта разомкнуты или оба замкнуты, а между фиксациями по часовой стрелке первым переключается A, затем B. Значит, один щелчок — это полцикла, два перехода кода Грея и 2 отсчёта в режиме x4. Счёт по одному фронту A дал бы один отсчёт на два щелчка.
Контакты дребезжат: по Alps Alpine при проверке на 360°/с с подтяжкой 5 кОм дребезг (chattering) длится до 3 мс, отскок (bounce) — до 2 мс. Общие сведения о явлении — в статье «Дребезг контактов». Alps Alpine приводит пример фильтра на каждый канал: подтяжка 10 кОм к 5 В, затем 10 кОм последовательно ко входу и 0,01 мкФ на землю. Ток замкнутого контакта в этом примере — 0,5 мА, ниже минимума из таблицы, так что свои номиналы проверяйте по таблице. Постоянная времени разряда при замыкании контакта — 10 кОм · 0,01 мкФ = 100 мкс, заряда при размыкании через оба резистора — 200 мкс. Такая цепь гасит короткие выбросы, но не весь дребезг длиной в миллисекунды — остальное делает логика декодера. Фронты после RC-цепи пологие, поэтому вход микроконтроллера должен быть с триггером Шмитта.
Оптический энкодер HEDS-5500/5540
HEDS-5500 — двухканальный модуль, HEDS-5540 — трёхканальный, с индексом. Светодиод через линзу светит на металлический диск, за ним — микросхема с фотодиодами и компараторами, которые формируют чистые прямоугольные импульсы без дребезга. Питание — 4,5–5,5 В, выходы совместимы с TTL. Высокий уровень на выходе HEDS-5540 не ниже 2,4 В гарантирован при токе нагрузки до 200 мкА, и для надёжной работы Broadcom требует подтягивающие резисторы 2,7 кОм на выходах A, B и I, расположенные не дальше 1,2 м от энкодера. HEDS-5500 обычно обходится без них, но 3,2 кОм рекомендуются для более крутых фронтов, особенно выше 100 кГц. Такие энкодеры ставят на двигатели постоянного тока для обратной связи по скорости и положению.
Магнитный абсолютный AS5600
AS5600 стоит под торцом вала с диаметрально намагниченным магнитом и измеряет угол его поля. Сигналы датчиков Холла оцифровывает 12-битный АЦП, угол вычисляет блок CORDIC, а автоматическая регулировка усиления компенсирует изменения поля от температуры и зазора. Угол читают по I²C, а вывод OUT выдаёт его аналоговым напряжением, пропорциональным питанию, или ШИМ.
- Питание. Режим 5 В: 4,5–5,5 В на VDD5V с конденсатором 100 нФ, на VDD3V3 — 1 мкФ к встроенному стабилизатору. Режим 3,3 В: VDD5V и VDD3V3 соединены, 3,0–3,6 В. Ток — до 6,5 мА, в режимах пониженного потребления — до 1,5–3,4 мА.
- Интерфейс. Адрес I²C фиксированный — 0x36, частота до 1 МГц, растягивания такта нет. Подтяжки шины считают как обычно — см. I²C.
- Направление. Вывод DIR на общем проводе — угол растёт по часовой стрелке, на питании — против.
- Магнит. Нужна вертикальная составляющая поля 30–90 мТл на поверхности кристалла. Регистр STATUS (0x0B) показывает MD — магнит обнаружен, ML — слишком слабый, MH — слишком сильный; регистр AGC (0x1A) — усиление, которое лучше держать в середине диапазона: 0–255 в режиме 5 В и 0–128 в режиме 3,3 В.
Угол хранится в двух регистрах: RAW ANGLE (0x0C, 0x0D) — без масштабирования, ANGLE (0x0E, 0x0F) — с учётом запрограммированных начала и конца диапазона. Регистры читают двумя байтами подряд: в первом, H, младшие 4 бита — разряды 11:8 угла, во втором, L, — разряды 7:0. Пересчёт в градусы:
Шаг 0,088°, но интегральная нелинейность — до ±1°, шум (среднеквадратичный) — до 0,015° при самом медленном фильтре (установление 2,2 мс) и до 0,043° при самом быстром (0,286 мс). В режиме ШИМ кадр длится 4351 такт: 128 тактов высокого уровня, 4095 тактов данных и 128 низкого; код равен числу тактов высокого уровня минус 128. Частота ШИМ задаётся битами PWMF: 115, 230, 460 или 920 Гц.
Абсолютные энкодеры и код Грея
Инкрементальный энкодер после включения не знает, где вал, — его обнуляют по индексу или концевику. Пропущенный из-за помехи импульс остаётся ошибкой до следующего обнуления. Абсолютный энкодер выдаёт код положения, поэтому ошибка не накапливается. AS5600 абсолютен в пределах одного оборота. Если нужны обороты, программа считает их сама: читает RAW ANGLE чаще, чем вал проходит пол-оборота, и ловит переход кода через границу в обе стороны — 4095 → 0 при вращении вперёд и 0 → 4095 назад. ANGLE для этого хуже: на границе 360° у него гистерезис 10 единиц младшего разряда.
Если код положения снимается сразу с нескольких разрядов, которые переключаются не строго одновременно, обычный двоичный код опасен: при переходе 0111 → 1000 меняются все четыре разряда, и в момент перехода может прочитаться любое число. Код Грея устроен так, что соседние значения отличаются ровно одним разрядом, и на границе читается либо старое, либо новое значение. Фрэнк Грей описал его в патенте 1947 года об импульсно-кодовой передаче сигналов, где код формирует электронно-лучевая трубка с кодирующей маской, и назвал «отражённым двоичным кодом»: кодовые группы соседних уровней сигнала там тоже отличаются одной позицией.
| Число | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|---|
| Двоичный | 000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
| Грея | 000 | 001 | 011 | 010 | 110 | 111 | 101 | 100 |
Преобразования делаются операцией «исключающее ИЛИ»:
#include <stdint.h>
static inline uint16_t bin_to_gray(uint16_t b)
{
return b ^ (b >> 1);
}
static inline uint16_t gray_to_bin(uint16_t g)
{
for (uint16_t s = g >> 1; s != 0; s >>= 1)
g ^= s; /* fold every higher bit down */
return g;
}
Квадратурный сигнал A, B — тот же код Грея, только двухразрядный и бесконечно повторяющийся.
Аппаратное декодирование: режим энкодера STM32
Таймеры STM32F1 умеют считать квадратурный сигнал сами (RM0008, раздел 15.3.12 «Encoder interface mode» для TIM2–TIM5 и 14.3.16 для TIM1 и TIM8). Сигналы подают на входы каналов 1 и 2 — TI1 и TI2, режим выбирают полем SMS[2:0] регистра TIMx_SMCR: 001 — счёт по фронтам TI2, 010 — по фронтам TI1, 011 — по фронтам обоих входов. Направление по таблице 85 для режима 011:
| Уровень другого входа | TI1, передний фронт | TI1, задний фронт | TI2, передний фронт | TI2, задний фронт |
|---|---|---|---|---|
| высокий | вниз | вверх | вверх | вниз |
| низкий | вверх | вниз | вниз | вверх |
Если A подключён к TI1, а B к TI2, то при A, опережающем B, счётчик идёт вверх. Бит DIR регистра CR1 обновляется аппаратно на каждом переходе и в этом режиме доступен только для чтения. Счётчик ходит между 0 и ARR, поэтому ARR надо записать до запуска: 0xFFFF — для непрерывного счёта, 4N − 1 — чтобы счётчик проходил ровно круг за оборот. Счётчик TIM2–TIM5 у STM32F1 16-битный.
Что ещё говорит RM0008:
- Дрожание на границе. Если вал стоит около точки переключения и один сигнал дрожит, в режиме 011 счётчик ходит на один отсчёт вверх и обратно и не уплывает (рисунок 134).
- Фильтр. Поле IC1F (и IC2F) регистра CCMR1 требует N одинаковых выборок подряд: 0011 — 8 выборок на частоте таймера, при 72 МГц это 111 нс. Наибольший фильтр, 1111 при CKD = 10, — 1024 такта, около 14 мкс. Миллисекундный дребезг механического энкодера им не убрать — но в режиме 011 он и не сбивает счёт, а лишь качает счётчик на отсчёт.
- Дифференциальные выходы (A, /A, B, /B у промышленных энкодеров) переводят в однополярные компараторами — помехоустойчивость заметно выше.
- Индекс подключают к линии внешнего прерывания EXTI и по нему обнуляют счётчик.
Регистры TIM4 на STM32F103 по RM0008 (15.4.3, 15.4.7, 15.4.9), A — на PB6 (TIM4_CH1), B — на PB7 (TIM4_CH2), таблица 43:
| Регистр | Поле | Значение | Смысл |
|---|---|---|---|
| TIMx_CCMR1 | CC1S[1:0] | 01 | IC1 подключён к TI1 |
| TIMx_CCMR1 | CC2S[9:8] | 01 | IC2 подключён к TI2 |
| TIMx_CCMR1 | IC1F[7:4], IC2F[15:12] | 0011 | фильтр: 8 выборок на частоте таймера |
| TIMx_CCER | CC1P (бит 1), CC2P (бит 5) | 0 | входы не инвертированы |
| TIMx_SMCR | SMS[2:0] | 011 | счёт по фронтам TI1 и TI2 |
| TIMx_CR1 | CEN (бит 0) | 1 | запуск |
Итого CCMR1 = 0x3131, SMCR = 0x0003. Выводы PB6 и PB7 у STM32F103 допускают 5 В (FT в таблице 5 даташита DS5319), поэтому подходят и для пятивольтового HEDS-5540 с подтяжками к 5 В. Внутреннюю подтяжку на FT-выводе при сигнале выше VDD + 0,3 В надо отключить, поэтому вход — без подтяжки (RM0008, таблица 20: MODE = 00, CNF = 01).
#include "stm32f1xx.h"
/* STM32F103: TIM4 in encoder mode 3 (x4), A -> PB6 (TIM4_CH1), B -> PB7 (TIM4_CH2).
PB6 and PB7 are 5 V tolerant; pull-up resistors are fitted at the encoder. */
void encoder_init(void)
{
RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;
RCC->APB1ENR |= RCC_APB1ENR_TIM4EN;
/* PB6, PB7: floating input, MODE = 00, CNF = 01 */
GPIOB->CRL = (GPIOB->CRL & ~(GPIO_CRL_MODE6 | GPIO_CRL_CNF6 | GPIO_CRL_MODE7 | GPIO_CRL_CNF7))
| GPIO_CRL_CNF6_0 | GPIO_CRL_CNF7_0;
TIM4->CCMR1 = TIM_CCMR1_CC1S_0 /* CC1S = 01: IC1 on TI1 */
| TIM_CCMR1_CC2S_0 /* CC2S = 01: IC2 on TI2 */
| (3U << TIM_CCMR1_IC1F_Pos) /* IC1F = 0011: f_CK_INT, N = 8 */
| (3U << TIM_CCMR1_IC2F_Pos); /* IC2F = 0011 */
TIM4->CCER = 0; /* CC1P = CC2P = 0: not inverted */
TIM4->SMCR = TIM_SMCR_SMS_1 | TIM_SMCR_SMS_0; /* SMS = 011: count on TI1 and TI2 edges */
TIM4->ARR = 0xFFFF; /* must be set before the start */
TIM4->CNT = 0;
TIM4->CR1 = TIM_CR1_CEN;
}
/* Signed change since the previous call, valid while |delta| < 32768 counts */
int16_t encoder_delta(void)
{
static uint16_t last;
uint16_t now = (uint16_t)TIM4->CNT;
int16_t delta = (int16_t)(uint16_t)(now - last);
last = now;
return delta;
}
Как устроены таймеры, PSC, ARR и остальные режимы — в статье «Таймеры STM32». Отсчёты на оборот, частоту сигналов A и B при наибольшей скорости и время полного круга счётчика считает калькулятор таймера.
ESP32. Здесь квадратуру считает блок PCNT (TRM, глава 23): 8 блоков, у каждого 16-битный знаковый счётчик и два канала со входом сигнала и входом управления, частота импульсов до 40 МГц, фильтр отбрасывает импульсы короче заданного числа тактов APB_CLK. Для счёта x4 сигнал A подают на вход сигнала канала 0 и на вход управления канала 1, B — наоборот. Из таблицы режимов раздела 23.2.2 получается настройка, совпадающая по направлению с таблицей STM32 выше:
| Канал | Сигнал | Управление | POS_MODE | NEG_MODE | LCTRL_MODE | HCTRL_MODE |
|---|---|---|---|---|---|---|
| 0 | A | B | 1 (+1) | 2 (−1) | 0 | 1 (инверсия) |
| 1 | B | A | 2 (−1) | 1 (+1) | 0 | 1 (инверсия) |
Входы ESP32 5 В не допускают: по даташиту напряжение высокого уровня — не выше VDD + 0,3 В. Пятивольтовый HEDS-5540 подключают через согласование уровней, а подтяжки механического энкодера ставят к 3,3 В.
Программное декодирование
Когда свободного таймера нет или энкодер — ручка на передней панели, сигнал декодируют программно. Надёжный способ — таблица переходов: из прошлого и нового состояния (2A + B) получается индекс 0–15, а по нему — +1, −1 или 0. Ноль ставится и при отсутствии изменений, и при недопустимом переходе, когда за один опрос сменились оба сигнала: значит, опрос был слишком редким, два отсчёта потеряны и направление неизвестно.
#include <stdint.h>
/* Index = (previous state << 2) | current state, state = (A << 1) | B.
+1: A leads B, -1: B leads A, 0: no change or both lines changed (two counts lost). */
static const int8_t qdec_table[16] = {
0, -1, +1, 0,
+1, 0, 0, -1,
-1, 0, 0, +1,
0, +1, -1, 0
};
/* One instance per encoder: a motor encoder and a knob must not share state */
typedef struct {
uint8_t prev; /* last state, (A << 1) | B */
int32_t position; /* x4 counts */
int8_t acc; /* counts since the last detent, knob only */
} qdec_t;
/* Start from the current pin levels, otherwise the first update may count a false step */
void qdec_init(qdec_t *q, uint8_t a, uint8_t b)
{
q->prev = (uint8_t)((a << 1) | b);
q->position = 0;
q->acc = 0;
}
static int8_t qdec_step(qdec_t *q, uint8_t a, uint8_t b)
{
uint8_t curr = (uint8_t)((a << 1) | b);
int8_t d = qdec_table[(q->prev << 2) | curr];
q->prev = curr;
return d;
}
/* Call on every edge of A and B (EXTI) or from a periodic timer tick */
void qdec_update(qdec_t *q, uint8_t a, uint8_t b)
{
q->position += qdec_step(q, a, b);
}
/* EC11E15244G1 knob (30 detents, 15 pulses): two transitions per detent,
both signals are specified at rest (A == B). Returns +1 or -1 once per detent. */
int8_t knob_update(qdec_t *q, uint8_t a, uint8_t b)
{
q->acc += qdec_step(q, a, b);
if (q->prev == 0 || q->prev == 3) { /* detent reached */
int8_t step = (int8_t)((q->acc >= 2) - (q->acc <= -2));
q->acc = 0; /* bounce back to the same detent gives 0 */
return step;
}
return 0;
}
Таблица сама подавляет дребезг одного канала: каждое ложное переключение даёт +1 и сразу −1. Для ручки по проводке Alps Alpine (A и B подтянуты, общий вывод на земле) поворот по часовой стрелке даёт +1. Логика фиксаций в knob_update рассчитана на EC11E15244G1, у которого в фиксации заданы уровни обоих сигналов. Alps Alpine предупреждает, что у части энкодеров в фиксации задан только уровень A, а B не определён, — для них сверяйте диаграмму своего типа.
Прерывания или опрос. Прерывание на оба фронта обоих сигналов срабатывает на каждый отсчёт x4. Для двигателя из примера выше это 100 000 прерываний в секунду — в среднем 720 тактов на каждое при 72 МГц, а в самом коротком состоянии около 440. На 12 000 об/мин остаётся 180 тактов в среднем — здесь нужен таймер. Для механической ручки удобнее опрос по таймеру раз в 1 мс: при 360°/с, на которых Alps Alpine проверяет дребезг, у EC11 с 60 состояниями на оборот одно состояние держится около 17 мс — это 16 опросов, и дребезг длиной до 3 мс таблица переварит. Прерывания по фронтам механического энкодера без фильтра, наоборот, дают пачки срабатываний на каждом щелчке.
Типичные ошибки
- Нет подтяжек или они слишком слабые. Выходы механического энкодера — просто контакты на общий вывод, без подтяжки высокого уровня на них нет. У HEDS-5540 высокий уровень не ниже 2,4 В гарантирован при нагрузке до 200 мкА, и для надёжной работы Broadcom требует подтяжки 2,7 кОм. Внутренняя подтяжка STM32F103 — 30–50 кОм (DS5319, таблица 36): при 3,3 В это 0,07–0,11 мА, на порядок меньше минимального рабочего тока контактов EC11 (1 мА), а на длинном кабеле фронты с ней затянуты. Ставьте внешние резисторы у энкодера — к 3,3 В, если микроконтроллер на 3,3 В.
- Счёт по одному фронту одного канала. Прерывание только по переднему фронту A с чтением B кажется достаточным, но если вал стоит на границе и A дрожит, каждый передний фронт добавляет отсчёт, а задний ничего не вычитает — положение уплывает. При счёте по всем фронтам дрожание компенсируется, как на рисунке 134 RM0008.
- Фиксации приняты за импульсы. У EC11E15244G1 30 щелчков и 15 импульсов: в x4 — 2 отсчёта на щелчок, при счёте по одному фронту A — один отсчёт на два щелчка.
- Дребезг механического энкодера. До 3 мс по Alps Alpine: без RC-цепи и таблицы переходов ручка «прыгает» на несколько шагов или в обратную сторону.
- Общее состояние у двух декодеров. Каждому энкодеру — своя структура состояния, а начальное состояние берут с выводов: иначе первое же обновление может дать ложный отсчёт.
- Переполнение 16-битного счётчика. Позицию копят в 32-битной переменной, прибавляя разность
(int16_t)(now - last), и читают таймер чаще, чем он проходит половину круга. - Пятивольтовый энкодер на входе 3,3 В. HEDS-5540 питается от 4,5–5,5 В, его выходы с подтяжкой к 5 В подают только на выводы, допускающие 5 В (у STM32F103 PA6 и PA7, входы TIM3, такими не являются, у ESP32 таких нет), или через согласование уровней.
- Обратное направление. Поменяйте провода A и B или инвертируйте один вход (CC1P = 1).
- Эксперименты с OTP у AS5600. Команда BURN_ANGLE (0x80 в регистр 0xFF) записывает начало и конец диапазона навсегда, выполняется не больше трёх раз и только при обнаруженном магните (MD = 1). Пока настройка не окончательная, пишите регистры без прожига.
Частые вопросы
Сколько импульсов на оборот у энкодера EC11 и почему на одну фиксацию приходится два отсчёта?
У EC11E15244G1 по данным Alps Alpine 30 фиксаций и 15 импульсов на оборот. При счёте по всем фронтам (x4) это 15 · 4 = 60 отсчётов на оборот, то есть 2 отсчёта на фиксацию: в каждой фиксации оба контакта разомкнуты или оба замкнуты, а между соседними фиксациями при вращении по часовой стрелке переключаются сначала A, потом B. В серии EC11E есть и варианты 18/9 и 36/18 с тем же соотношением.
На какую скорость рассчитан оптический энкодер HEDS-5540?
Broadcom гарантирует работу до частоты счёта 100 кГц, где частота равна n · N / 60. Для диска на 500 CPR это 100 000 · 60 / 500 = 12 000 об/мин; предельная скорость по Absolute Maximum Ratings — 30 000 об/мин. При счёте по четырём фронтам на 12 000 об/мин микроконтроллер получает 400 000 отсчётов в секунду — это работа для аппаратного счётчика, а не для прерываний.
Почему счётчик энкодера на STM32 считает в обратную сторону?
По таблице 85 RM0008 в режиме SMS = 011 счётчик идёт вверх, когда сигнал на TI1 опережает сигнал на TI2. Если при нужном направлении вращения опережает B, поменяйте местами провода A и B или инвертируйте один вход битом CC1P = 1 в TIMx_CCER — RM0008 показывает этот случай на рисунке 135.
Чем абсолютный энкодер AS5600 лучше инкрементального?
AS5600 выдаёт 12-битный угол — 4096 положений на оборот, шаг 0,088° — и знает его не позже чем через 10 мс после включения, без поиска нуля. Инкрементальный энкодер после включения начинает счёт с нуля, а каждый пропущенный импульс остаётся ошибкой до обнуления по индексу или концевику. Но 12 бит — это не точность: интегральная нелинейность AS5600 по даташиту до ±1°.
Какие подтягивающие резисторы нужны энкодеру?
Для HEDS-5540 Broadcom требует 2,7 кОм к питанию на выходах A, B и I, поближе к энкодеру; HEDS-5500 обычно обходится без них. Механическому EC11 подтяжка нужна всегда — его выходы просто замыкаются на общий вывод C. Рабочий ток контактов по Alps Alpine — от 1 до 10 мА, дребезг нормирован при подтяжке 5 кОм к 5 В, то есть при 1 мА; для микроконтроллера на 3,3 В это около 3,3 кОм к 3,3 В. Внутренняя подтяжка STM32F103 — 30–50 кОм, при 3,3 В это 0,07–0,11 мА, на порядок меньше минимума.
Источники
- STMicroelectronics. RM0008 Rev 21. Reference manual: STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx and STM32F107xx — 14.3.16 и таблица 81 — режим энкодера TIM1/TIM8; 15.3.12 «Encoder interface mode» и таблица 85 — направление счёта по фронтам TI1 и TI2, компенсация дрожания на рисунке 134, инверсия полярности на рисунке 135, компараторы для дифференциальных выходов, индекс на EXTI, измерение скорости; 15.2 — 16-битный счётчик TIM2–TIM5; 15.4.1 — бит DIR и поле CKD; 15.4.3 — SMS[2:0] = 001, 010, 011; 15.4.7 — CC1S, CC2S, IC1F и IC2F с таблицей фильтра; 15.4.9 — CC1P и CC2P; 9.1.4 и таблицы 20 и 23 — режим входа для таймера; таблица 43 — TIM4_CH1 и TIM4_CH2 на PB6 и PB7
- STMicroelectronics. DS5319 Rev 20. STM32F103x8, STM32F103xB datasheet — таблица 5 — PB6 и PB7 допускают 5 В (FT), PA6 и PA7 — нет; таблица 36 — подтяжка 30–50 кОм и требование отключить её на FT-выводе при напряжении выше VDD + 0,3 В
- Broadcom (Avago). HEDM-55xx/560x & HEDS-55xx/56xx Quick Assembly Two and Three Channel Optical Encoders, Data Sheet AV02-1046EN, November 20, 2014 — Theory of Operation — индекс один раз за оборот, шириной 90 эл. градусов, совпадает с низкими A и B; Definitions — N (CPR), цикл 360 эл. градусов, 4 состояния по 90°, направление вращения; Recommended Operating Conditions — 4,5–5,5 В, частота счёта n·N/60 до 100 кГц, гарантирована до 100 кГц; Absolute Maximum Ratings — 30 000 об/мин; Encoding Characteristics (HEDS-5540) — погрешность ширины состояния до 35 эл. градусов, ошибка положения до 40 угловых минут, ширина индекса 55–125°; Electrical Characteristics — VOH не ниже 2,4 В при −200 мкА, ток 57 мА типично у HEDS-5540; Electrical Interface — подтяжки 2,7 кОм для HEDS-5540, HEDS-5500 обычно без них, 3,2 кОм выше 100 кГц; Ordering Information — 50–512 CPR у HEDS, до 1024 у HEDM
- Alps Alpine. EC11E15244G1 Product information (EC11E Series) и каталог EC11E Series (update 2510) — 30 фиксаций и 15 импульсов на оборот; номинал 10 мА, 5 В пост. тока, рабочий ток 10 мА наибольший и 1 мА наименьший (резистивная нагрузка); Output Wave — в фиксации оба контакта разомкнуты или оба замкнуты, по часовой стрелке первым переключается A; общая диаграмма — у части изделий в фиксации задан только уровень A; Sliding Noise — дребезг (chattering) не более 3 мс и отскок (bounce) не более 2 мс при R = 5 кОм и 360°/с; Example of filter circuit — подтяжка 10 кОм к 5 В, 10 кОм последовательно, 0,01 мкФ; срок службы 15 000 циклов; −40…+85 °C. Каталог https://tech.alpsalpine.com/cms.media/product_catalog_ec_01_ec11e_en_611f078659.pdf — варианты 18/9, 30/15 и 36/18 фиксаций/импульсов
- ams OSRAM (сейчас Infineon). AS5600 12-Bit Programmable Contactless Potentiometer, Datasheet v1-06, 2018-Jun-20 — Figure 4 — выводы, DIR; Figure 6 — питание 4,5–5,5 В и 3,0–3,6 В, ток до 6,5 мА; Figure 9 — ШИМ 115–920 Гц; Figure 10 — включение не дольше 10 мс, выборка 150 мкс, установление 2,2–0,286 мс; Figure 11 — поле 30–90 мТл; Figure 12 — 12 бит, INL ±1°, шум до 0,015–0,043°; I²C: адрес 0x36, до 1 МГц; Figure 21 — карта регистров (RAW ANGLE 0x0C/0x0D, ANGLE 0x0E/0x0F, STATUS 0x0B, AGC 0x1A, BURN 0xFF); ANGLE — гистерезис 10 LSB на границе 360°; STATUS — MD, ML, MH; BURN_ANGLE не более 3 раз; PWM Output Mode — кадр 4351 такт (128 + 4095 + 128)
- Espressif. ESP32 Technical Reference Manual, Version 5.8 — глава 23 «Pulse Count Controller (PCNT)»: 23.1 — 8 блоков, 16-битный знаковый счётчик, до 40 МГц; 23.2.2 — POS_MODE, NEG_MODE, LCTRL_MODE, HCTRL_MODE и таблица их действия, фильтр в тактах APB_CLK
- Espressif. ESP32 Series Datasheet, Version 5.3 — таблица 5-3 — входное напряжение высокого уровня не выше VDD + 0,3 В
- Frank Gray. Pulse Code Communication. US Patent 2,632,058 (подана 13.11.1947, выдана 17.03.1953) — название «отражённый двоичный код» (reflected binary code); кодовые группы соседних уровней отличаются одной позицией импульса; кодирующая трубка для импульсно-кодовой модуляции
Нашли ошибку?
Смотрите также
- ДатчикиТок и температура: шунты, датчики Холла, термисторы, термопары — подключение и расчёт
- Таймеры STM32Тактирование, PSC/ARR, ШИМ, мёртвое время, захват, энкодер, OPM, синхронизация
- I²CSDA и SCL, START/STOP, ACK, адреса, скорости, расчёт подтяжек
- Дребезг контактовСерия переключений вместо одного при нажатии кнопки
- Управление коллекторным двигателемКлюч и диод, ШИМ, H-мост, реверс, торможение, датчики скорости
- Цифровая логикаВентили, таблицы истинности, СДНФ, карты Карно, мультиплексор, защёлка, триггер, регистр