Энкодер на stm32f405 для новичка
- Сообщения: 398
- Зарегистрирован: Чт май 07, 2026 00:30:38
а за время трёх обращений к TIM3->CNT разве нет риска, что его значение изменится?
- Реклама
- Сообщения: 620
- Зарегистрирован: Пн фев 16, 2026 17:30:02
Так же непонятно, зачем делать это: TIM3->CNT >> 2.
Я на прошлой странице привел гуглоперевод параграфа из референс-мануала. Надо просто сделать так, как написано там.
Я на прошлой странице привел гуглоперевод параграфа из референс-мануала. Надо просто сделать так, как написано там.
это какой то бред в мануале в разделе про энкодер, я по нему делал (часть про который Rapra написал на предыдущей странице), я даже инициализировал таймер в чистых регистрах и ничего не получалось, а потому что сначала у меня была проблема с дребезгом и бит SMS в регистре SMCR мне показался с иной функциональностью, что то вроде делителя, по этому меня сбило с толку и я создал эту тему, сейчас у меня есть RC цепочка и дребезга нет, я понял для чего нужен бит SMS.
в мануале про энкодер написано:
CC2S=’01’ (TIMx_CCMR2 register, TI1FP2 mapped on TI2).
CC1P=’0’, CC1NP=’0’, and IC1F = ‘0000’ (TIMx_CCER register, TI1FP1 non-inverted,
TI1FP1=TI1).
CC2P=’0’, CC2NP=’0’, and IC2F = ‘0000’ (TIMx_CCER register, TI1FP2 non-inverted,
TI1FP2= TI2).
SMS=’011’ (TIMx_SMCR register, both inputs are active on both rising and falling
edges).
CEN=’1’ (TIMx_CR1 register, Counter enabled).
и ниже приведена картинка:
Это неверно, картинка соответствует SMS=001, а не SMS=011, и бит CC2S не в регистре CCMR2, я не знаю почему так написано.
То есть вот что я имею ввиду: например настройка C00.20 драйвера серводвигателя stepperonline A6, параметр 2 квадратурный для SMS=001, а параметр 3 или 4 для SMS=011 Это настройка для способа подачи сигнала, а не обратной связи, но суть я думаю понятна, или не понятна.
Ничего не понятна...
Главное я с энкодером разобрался.
бит SMS=001 задаётся таким образом:
sConfig.EncoderMode = TIM_ENCODERMODE_TI1;
этот серводвигатель для опытов куплен, типа как игрушка, может у меня хватит мозгов когда нибудь его запустить, чем больше я понимаю как оно работает, тем больше понимаю что ничего не понимаю)) хех
в мануале про энкодер написано:
Спойлер
CC1S=’01’ (TIMx_CCMR1 register, TI1FP1 mapped on TI1).CC2S=’01’ (TIMx_CCMR2 register, TI1FP2 mapped on TI2).
CC1P=’0’, CC1NP=’0’, and IC1F = ‘0000’ (TIMx_CCER register, TI1FP1 non-inverted,
TI1FP1=TI1).
CC2P=’0’, CC2NP=’0’, and IC2F = ‘0000’ (TIMx_CCER register, TI1FP2 non-inverted,
TI1FP2= TI2).
SMS=’011’ (TIMx_SMCR register, both inputs are active on both rising and falling
edges).
CEN=’1’ (TIMx_CR1 register, Counter enabled).
То есть вот что я имею ввиду: например настройка C00.20 драйвера серводвигателя stepperonline A6, параметр 2 квадратурный для SMS=001, а параметр 3 или 4 для SMS=011 Это настройка для способа подачи сигнала, а не обратной связи, но суть я думаю понятна, или не понятна.
Ничего не понятна...
Главное я с энкодером разобрался.
бит SMS=001 задаётся таким образом:
sConfig.EncoderMode = TIM_ENCODERMODE_TI1;
этот серводвигатель для опытов куплен, типа как игрушка, может у меня хватит мозгов когда нибудь его запустить, чем больше я понимаю как оно работает, тем больше понимаю что ничего не понимаю)) хех
- Сообщения: 398
- Зарегистрирован: Чт май 07, 2026 00:30:38
Извините, но Вы ошибаетесь.Ифторик писал(а): Ср июн 24, 2026 23:51:29 Это неверно, картинка соответствует SMS=001, а не SMS=011
Описание из регистра:
Перевод: Режим энкодера 1 — Счетчик увеличивает/уменьшает значение по фронту TI1FP1 в зависимости от уровня TI2FP2.001: Encoder mode 1 - Counter counts up/down on TI1FP1 edge depending on TI2FP 2level.
011: Режим кодировщика 3 — Счетчик отсчитывает вверх/вниз по фронтам сигналов TI1FP1 и TI2FP2 в зависимости от уровня другого входа (под другим входом здесь имеется ввиду что TI1FP1 другой для TI2FP2 и наоборот).011: Encoder mode 3 - Counter counts up/down on both TI1FP1 and TI2FP2 edges depending on the level of the other input
Описание к картинке:
Перевод: SMS=’011’ (регистр TIMx_SMCR, оба входа активны по обоим (восходящему и нисходящему) фронтам)SMS=’011’ (TIMx_SMCR register, both inputs are active on both rising and falling edges)
На картинки эти моменты я выделил:
То есть, описание битового поля в регистре, картинка и описание к ней очень хорошо дополняют друг друга и поясняют работу. С одним лишь описанием регистра я бы начал подозревать и искать "другой вход", благо, у таймеров достаточно заумная (и офигенная!) система триггеров.
А здесь видно, что счёт идёт по всем фронтам/срезам (или передним и задним, или восходящим и нисходящим фронтам) обоих сигналов, а направление счёта определяется комбинацией состояний "полок" и фронтов/срезов.
Отсюда следует и ошибочность сопоставления:
2 - это SMS=011, а 0, 1, 3, 4 - их можно притянуть к SMS=001 и SMS=010, особенно если где-то в регистре есть и выбор полярности (плохо помню).Ифторик писал(а): Ср июн 24, 2026 23:51:29 настройка C00.20 драйвера серводвигателя stepperonline A6, параметр 2 квадратурный для SMS=001, а параметр 3 или 4 для SMS=011
Ифторик писал(а): Ср июн 24, 2026 23:51:29 чем больше я понимаю как оно работает, тем больше понимаю что ничего не понимаю))
- Вложения
-
- STM32-Timer-Encoder-Mode.jpg
- (30.59 КБ) 166 скачиваний
Последний раз редактировалось Zapolyarny Чт июн 25, 2026 12:53:38, всего редактировалось 1 раз.
Есть. Но какой шанс на это? Ядро работает на частоте 48МГц. Те сравнения занимают от силы 30 инструкций. Время между первым обращением и последним едва ли больше микросекунды.Zapolyarny писал(а): Ср июн 24, 2026 14:16:59 а за время трёх обращений к TIM3->CNT разве нет риска, что его значение изменится?
Ну и плюс я не заморачивался с оптимизацией по причине забрашенности проекта
В комментарии к строке кода: "Для фильтрации шума убираем младший значащий бит. Если значение счётчика изменилось - было враЩение."
Ну и да, я опечатался в комментарии.
Когда я отлаживал код плохой контакт энкодера вызывал дребезг и обработчик функции воспринимал его как частые переключения вперёд-назад на один шаг. Мне это надоело и я стал делить значение счётчика на два. Помехи пропали.
- Реклама
- Сообщения: 398
- Зарегистрирован: Чт май 07, 2026 00:30:38
наверное, Вы хотели сказать, на четыре.
- Сообщения: 620
- Зарегистрирован: Пн фев 16, 2026 17:30:02
В мануале не бред. Это просто читающий не может вкурить написанное. Ну, не всем это дано. Бывает, что ну неспособен человек, нет у него к этому таланта. Может, он талантливый писатель-прозаик или художник, но вовсе не программист.
Я всё таки ориентируюсь на реальное использование программы на реальном оптическом энкодере серводвигателя или шагового двигателя, и в режиме SMS=011 вариант будет не рабочим, потому что во время остановки происходит дребезжание (jitter на рисунке, я уж не говорю о количестве ошибок), в этот момент счетчик должен остановиться как указано на графике, но счетчик не остановится, то есть на картинках точно не SMS=011 и шагов происходит в два раза меньше, что является правильным при подсчете истинного количества шагов. Где то в мануале ость ошибка или недосказанность чего то очень важного.
- Сообщения: 620
- Зарегистрирован: Пн фев 16, 2026 17:30:02
А, ну тут просто ошибка ДНК, это случается в таких случаях.
В мануале же ошибок нет, и всё хорошо описано. Однако, присутствует ошибка ДНК при определении направлении поворота энкодера.
В мануале же ошибок нет, и всё хорошо описано. Однако, присутствует ошибка ДНК при определении направлении поворота энкодера.
- Сообщения: 398
- Зарегистрирован: Чт май 07, 2026 00:30:38
Мне казалось, я достаточно доступно показал...
Если есть условия для джиттера в режиме 011, то они будут и для других режимов, и поведение в этом случае будет далеко не ±1
Если не ошибаюсь, чтобы не учитывать джиттер, реакция на энкодер должна быть минимум в два раза грубее. Полагаю, это всё описано в книгах про сервоприводы, и ими и надо руководствоваться.
Если есть условия для джиттера в режиме 011, то они будут и для других режимов, и поведение в этом случае будет далеко не ±1
Если не ошибаюсь, чтобы не учитывать джиттер, реакция на энкодер должна быть минимум в два раза грубее. Полагаю, это всё описано в книгах про сервоприводы, и ими и надо руководствоваться.
Такое бывает. Но, когда такое бывает, то потом почти всегда оказывается, что просто я - дурак.Ифторик писал(а): Чт июн 25, 2026 18:33:55 Где то в мануале ость ошибка или недосказанность чего то очень важного.
У некоторых таймеров есть возможность настройки "антидребезга". Ну и никто не препятствует не обращать внимания на младшие 1-2 бита… Все равно если взять тот же ШД с 200 шагами на оборот и энкодер с 1024 отсчетами на оборот, на 1 шаг получаем 5 "с хвостиком" отсчетов. Меньше шага измерять смысла нет: неустойчивое положение.
Windows must die!
- Сообщения: 620
- Зарегистрирован: Пн фев 16, 2026 17:30:02
У дребезга контактов есть одно интересное свойство - число генерируемых импульсов - непредсказуемо
Поэтому, убирать младшие биты счетчика - рискованное занятие. У таймера есть входной фильтр, вот его и следует использовать.
Поэтому, убирать младшие биты счетчика - рискованное занятие. У таймера есть входной фильтр, вот его и следует использовать.
- Сообщения: 398
- Зарегистрирован: Чт май 07, 2026 00:30:38
А если оптический энкодер? Тогда ведь, если дребезг и будет, то только одного входа, в точности по Fig. 127. Число импульсов перестаёт иметь значение.
- Сообщения: 1758
- Зарегистрирован: Вт авг 15, 2017 10:51:13
Зависит от того - для чего ТС-у нужен этот "энкодер". Если он нужен в качестве крутилки, которой пользователь должен что-то регулировать, то оптический наверное не подойдёт. Так как для такой крутилки важен тактильный эффект, коего в оптическом видимо нет.Zapolyarny писал(а): Пт июн 26, 2026 05:03:13 А если оптический энкодер? Тогда ведь, если дребезг и будет, то только одного входа, в точности по Fig. 127. Число импульсов перестаёт иметь значение.
Если же он нужен для измерения углового положения вала мотора (или чего-то подобного), то лучше взять не энкодер, а любой аналоговый синус-косинусный датчик. Там про определению никаких "дребезгов" и "импульсов" нет. А точность определяется точностью АЦП.
К тому же сразу бонусом у такого датчика - возможность измерения абсолютного угла, а не дельты.
- Сообщения: 620
- Зарегистрирован: Пн фев 16, 2026 17:30:02
Тактильный эффект щелчков получается механически - шарик с пружинкой либо пластинка с пупыркой по зубчикам. В компутерной мышке колесико прокрутки - оптическое, но с тактильным эффектом щелчков. Механические контакты в этом колесике долго бы не прослужили.
Угловое положение вала тоже прекрасно определяется оптическим угловым энкодером. Хоть инкрементальный, хоть абсолютный с кодом Грея. Вряд ли топикстартеру нужны какие-то там син-кос датчики, он даже словов таких не знает.
Угловое положение вала тоже прекрасно определяется оптическим угловым энкодером. Хоть инкрементальный, хоть абсолютный с кодом Грея. Вряд ли топикстартеру нужны какие-то там син-кос датчики, он даже словов таких не знает.
Есть еще "промежуточный" вариант: энкодер на базе эффекта Холла. Бывают даже 12-битные…
Windows must die!
- Сообщения: 620
- Зарегистрирован: Пн фев 16, 2026 17:30:02
Тенденция прямо противоположная: у всех механический энкодер (+ дорогих моделей), только у некоторых есть оптический.Rapra писал(а): Чт июл 02, 2026 13:31:27 В компутерной мышке колесико прокрутки - оптическое, но с тактильным эффектом щелчков. Механические контакты в этом колесике долго бы не прослужили.
И с мех. енкодер работают напр. 5-10 лет. Офис, повседневная PC деятельность.
Для механического энкодера алгоритм обработки имеет очень важное значение.
Рекомендую rotary алгоритм Bex Buxton state machine - OK как в interrupt, так в и polling.
Портировал его для всех исп. MK, очень удобно, так как делает мех. энкодер "практически вечным" - если один "зуб" неисправен, просто пропускается ход, если второй неисправен - тоже пропускается, если третий неисправен - тоже пропускается, но я выброшу энкодер в мусор
- Вложения
-
- images.jpg
- (23.94 КБ) 6 скачиваний
Больше всего бесит то, что в мышах на среднюю кнопку, которую нажимаешь куда чаще правой, ставят самый дешёвый микрик! Я уже пару десятков мышей выкинул, у которых отказала эта важная для любой работы кнопка! Ведь без нее невозможно вставить выделенное мышью!!!
Windows must die!


