| Форум РадиоКот https://radiokot.ru/forum/ |
|
| Quadrature encoder от колесика мышки https://radiokot.ru/forum/viewtopic.php?f=59&t=100498 |
Страница 1 из 1 |
| Автор: | balmer [ Пн фев 10, 2014 00:00:04 ] |
| Заголовок сообщения: | Quadrature encoder от колесика мышки |
Добрый день. Пытаюсь применить колесико мышки в интерфейсе своей железки. Подключаю энкодер как советуют - средний вывод к земле, два крайних вывода к микроконтроллеру. Пытаюсь воспользоваться встроенным в таймеры STM32 режимом "Encoder interface mode". Оно даже както работает, но с жутким "дребезгом" контактов. Копипастил с такого кода. Код инициализации таймера: СпойлерКод: TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_Period = 65535; // Maximal TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); TIM_EncoderInterfaceConfig(TIM1, TIM_EncoderMode_TI1, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); TIM_Cmd(TIM1, ENABLE); "Полечил" такое поведение добавлением конденсаторов на пару десятков нанофарад на ножки энкодера. Но все равно - время от времени считает не в ту сторону. Попробовал пару энкодеров - одинаково криво считает. Собственно вопрос - кто нить пробовал подключать такую штуковину? Как добиться четкого срабатывания? |
|
| Автор: | ut1wpr [ Пн фев 10, 2014 09:50:15 ] |
| Заголовок сообщения: | Re: Quadrature encoder от колесика мышки |
balmer писал(а): Добрый день. Подтяжка пинов по входу включена?Пытаюсь применить колесико мышки в интерфейсе своей железки. Подключаю энкодер как советуют - средний вывод к земле, два крайних вывода к микроконтроллеру. Пытаюсь воспользоваться встроенным в таймеры STM32 режимом "Encoder interface mode". Оно даже както работает, но с жутким "дребезгом" контактов. "Полечил" такое поведение добавлением конденсаторов на пару десятков нанофарад на ножки энкодера. Но все равно - время от времени считает не в ту сторону. Попробовал пару энкодеров - одинаково криво считает. Собственно вопрос - кто нить пробовал подключать такую штуковину? Как добиться четкого срабатывания? Я тоже когда-то с этим боролся. Ушел побежденным к софтовому варианту. Алгоритм от ЛИ. Сильно меня напрягало 4 импульса вместо одного. |
|
| Автор: | balmer [ Пн фев 10, 2014 11:36:49 ] |
| Заголовок сообщения: | Re: Quadrature encoder от колесика мышки |
ut1wpr писал(а): Подтяжка пинов по входу включена? Я тоже когда-то с этим боролся. Ушел побежденным к софтовому варианту. Алгоритм от ЛИ. Сильно меня напрягало 4 импульса вместо одного. Да, конечно включена. Именно через Pull Up подается напряжение на энкодер. Причем в данных дребезг есть, но он не сильно велик. Когда просто выводишь на экран A и B каналы энкодера, то там логический уровень довольно четко сменяется. Что ж, тогда попробую вместо полностью хардварного энкодера сделать "полухардварный", с interrupt на фронтах сигнала. Вместе со сглаживающими конденсаторами должно решить проблему. |
|
| Автор: | ut1wpr [ Пн фев 10, 2014 22:56:39 ] |
| Заголовок сообщения: | Re: Quadrature encoder от колесика мышки |
balmer писал(а): Что ж, тогда попробую вместо полностью хардварного энкодера сделать "полухардварный", с interrupt на фронтах сигнала. Вместе со сглаживающими конденсаторами должно решить проблему. Не хочу быть назойливым, но в своих поделках всегда опирался на это:СпойлерКод: //!************************************************** //! Файл : button_enc.h //! Авторское право (с) : //! Разработка : //! Дата создания : //! Описание //! //!************************************************** #ifndef __button_enc_H__ #define __button_enc_H__ typedef enum {NULL_ENC=0,PLUS_ENC,MINUS_ENC}REZ_ENC; extern void Encoder_Init(void); extern REZ_ENC Encoder_Exe(void); #endif // __button_enc_H__ //!************************************************** //! Файл : button_enc.c //! Авторское право (с) : //! Разработка : Ридико Л.И. //! Модифицировал : //! Разработка : //! Дата создания : //! Описание //! //!************************************************** #include "button_enc.h" #include "hard_config.h" //---------- Константы: ---------- enum { State0, StateA, StateB, StateAB }; //состояния энкодера //---------- Переменные: ---------- static char EncPrev; //предыдущее состояние энкодера static char EncPrevPrev; //пред-предыдущее состояние энкодера //---------- Инициализация энкодера: ---------- void Encoder_Init(void) { EncPrev = State0; //инициализация предыдущего состояния EncPrevPrev = State0; //инициализация пред-предыдущего состояния } //---------- Обработка энкодера: ---------- REZ_ENC Encoder_Exe(void) { char EncCur = 0; REZ_ENC cRezEnc=NULL_ENC; if(!Pin_ENC_F1) {EncCur = StateA;} //опрос фазы 1 энкодера if(!Pin_ENC_F2) {EncCur |= StateB;} //опрос фазы 2 энкодера if(EncCur != EncPrev) //если состояние изменилось, { if(EncPrev == StateAB && //если предыдущее состояние StateAB EncCur != EncPrevPrev ) //и текущее и пред-предыдущее не равны, { if(EncCur == StateB) {cRezEnc=PLUS_ENC;} else{ cRezEnc=MINUS_ENC;} } EncPrevPrev = EncPrev; //сохранение пред-предыдущего состояния EncPrev = EncCur; //сохранение предыдущего состояния } return cRezEnc; } Использовать или не использовать прерывания - вам виднее. Я всегда находил в теле основной задачи вермя и место для вставки этого короткого поллинга. Работает безукоризненно. Без конденсаторов. |
|
| Автор: | balmer [ Вт фев 11, 2014 09:40:36 ] |
| Заголовок сообщения: | Re: Quadrature encoder от колесика мышки |
Спасибо за код. Разломал один из энкодеров. Оказывается ошибся в подключением. Думал что центральный провод это земля. Ан нет, земляной провод - это боковой .Надо будет вечерком переподключить и проверить. |
|
| Автор: | makser [ Вт фев 11, 2014 12:12:39 ] |
| Заголовок сообщения: | Re: Quadrature encoder от колесика мышки |
В механических контактах будет дребезг по любому. Пробовал 2 варианта решения: 1 Капнуть в механизм силиконовое масло, но оно со временем может вытечь. 2 Ставить последовательно с контактом резистор 1-3к, а на вывод стм конденсатор 100-10н пФ. |
|
| Автор: | balmer [ Вт фев 11, 2014 22:14:35 ] |
| Заголовок сообщения: | Re: Quadrature encoder от колесика мышки |
Припаял правильно энкодер. Код из первого поста стал работать идеально хорошо. Без всяких конденсаторов и иных ухищьрений. |
|
| Автор: | ut1wpr [ Вт фев 11, 2014 23:20:37 ] |
| Заголовок сообщения: | Re: Quadrature encoder от колесика мышки |
makser писал(а): В механических контактах будет дребезг по любому. Дребезг будет. Но это не значит что его невозможно побороть программно.Цитата: Пробовал 2 варианта решения: Капнуть в герметезированный корпус не получится.1 Капнуть в механизм силиконовое масло, но оно со временем может вытечь. 2 Ставить последовательно с контактом резистор 1-3к, а на вывод стм конденсатор 100-10н пФ. Резисторы и конденсаторы ухудшают скоростные свойства энкодера. А они часто очень важны, определяюще важны. А посему - правильно созданный и выверенный алгоритм лучше костылей в виде случайных резисторов и конденсаторов. Изделия с такими костылями будут работать у одного и напрочь откажутся работать у другого. |
|
| Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|


