Пытаюсь применить колесико мышки в интерфейсе своей железки. Подключаю энкодер как советуют - средний вывод к земле, два крайних вывода к микроконтроллеру. Пытаюсь воспользоваться встроенным в таймеры STM32 режимом "Encoder interface mode". Оно даже както работает, но с жутким "дребезгом" контактов.
Копипастил с такого кода. Код инициализации таймера: Спойлер
"Полечил" такое поведение добавлением конденсаторов на пару десятков нанофарад на ножки энкодера. Но все равно - время от времени считает не в ту сторону. Попробовал пару энкодеров - одинаково криво считает.
Собственно вопрос - кто нить пробовал подключать такую штуковину? Как добиться четкого срабатывания?
Пытаюсь применить колесико мышки в интерфейсе своей железки. Подключаю энкодер как советуют - средний вывод к земле, два крайних вывода к микроконтроллеру. Пытаюсь воспользоваться встроенным в таймеры STM32 режимом "Encoder interface mode". Оно даже както работает, но с жутким "дребезгом" контактов.
"Полечил" такое поведение добавлением конденсаторов на пару десятков нанофарад на ножки энкодера. Но все равно - время от времени считает не в ту сторону. Попробовал пару энкодеров - одинаково криво считает.
Собственно вопрос - кто нить пробовал подключать такую штуковину? Как добиться четкого срабатывания?
Подтяжка пинов по входу включена? Я тоже когда-то с этим боролся. Ушел побежденным к софтовому варианту. Алгоритм от ЛИ. Сильно меня напрягало 4 импульса вместо одного.
Подтяжка пинов по входу включена? Я тоже когда-то с этим боролся. Ушел побежденным к софтовому варианту. Алгоритм от ЛИ. Сильно меня напрягало 4 импульса вместо одного.
Да, конечно включена. Именно через Pull Up подается напряжение на энкодер. Причем в данных дребезг есть, но он не сильно велик. Когда просто выводишь на экран A и B каналы энкодера, то там логический уровень довольно четко сменяется.
Что ж, тогда попробую вместо полностью хардварного энкодера сделать "полухардварный", с interrupt на фронтах сигнала. Вместе со сглаживающими конденсаторами должно решить проблему.
Что ж, тогда попробую вместо полностью хардварного энкодера сделать "полухардварный", с interrupt на фронтах сигнала. Вместе со сглаживающими конденсаторами должно решить проблему.
Не хочу быть назойливым, но в своих поделках всегда опирался на это: Спойлер
Код:
//!************************************************** //! Файл : button_enc.h //! Авторское право (с) : //! Разработка : //! Дата создания : //! Описание //! //!************************************************** #ifndef __button_enc_H__ #define __button_enc_H__
Использовать или не использовать прерывания - вам виднее. Я всегда находил в теле основной задачи вермя и место для вставки этого короткого поллинга. Работает безукоризненно. Без конденсаторов.
Спасибо за код. Разломал один из энкодеров. Оказывается ошибся в подключением. Думал что центральный провод это земля. Ан нет, земляной провод - это боковой .
В механических контактах будет дребезг по любому. Пробовал 2 варианта решения: 1 Капнуть в механизм силиконовое масло, но оно со временем может вытечь. 2 Ставить последовательно с контактом резистор 1-3к, а на вывод стм конденсатор 100-10н пФ.
Дребезг будет. Но это не значит что его невозможно побороть программно.
Цитата:
Пробовал 2 варианта решения: 1 Капнуть в механизм силиконовое масло, но оно со временем может вытечь. 2 Ставить последовательно с контактом резистор 1-3к, а на вывод стм конденсатор 100-10н пФ.
Капнуть в герметезированный корпус не получится. Резисторы и конденсаторы ухудшают скоростные свойства энкодера. А они часто очень важны, определяюще важны. А посему - правильно созданный и выверенный алгоритм лучше костылей в виде случайных резисторов и конденсаторов. Изделия с такими костылями будут работать у одного и напрочь откажутся работать у другого.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 21
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения