Страница 1 из 1
Quadrature encoder от колесика мышки
Добавлено: Пн фев 10, 2014 00:00:04
balmer
Добрый день.
Пытаюсь применить колесико мышки в интерфейсе своей железки.
Подключаю энкодер как советуют - средний вывод к земле, два крайних вывода к микроконтроллеру.
Пытаюсь воспользоваться встроенным в таймеры 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);
"Полечил" такое поведение добавлением конденсаторов на пару десятков нанофарад на ножки энкодера. Но все равно - время от времени считает не в ту сторону. Попробовал пару энкодеров - одинаково криво считает.
Собственно вопрос - кто нить пробовал подключать такую штуковину? Как добиться четкого срабатывания?
Re: Quadrature encoder от колесика мышки
Добавлено: Пн фев 10, 2014 09:50:15
ut1wpr
balmer писал(а):Добрый день.
Пытаюсь применить колесико мышки в интерфейсе своей железки.
Подключаю энкодер как советуют - средний вывод к земле, два крайних вывода к микроконтроллеру.
Пытаюсь воспользоваться встроенным в таймеры STM32 режимом "Encoder interface mode".
Оно даже както работает, но с жутким "дребезгом" контактов.
"Полечил" такое поведение добавлением конденсаторов на пару десятков нанофарад на ножки энкодера. Но все равно - время от времени считает не в ту сторону. Попробовал пару энкодеров - одинаково криво считает.
Собственно вопрос - кто нить пробовал подключать такую штуковину? Как добиться четкого срабатывания?
Подтяжка пинов по входу включена?
Я тоже когда-то с этим боролся. Ушел побежденным к софтовому варианту. Алгоритм от ЛИ. Сильно меня напрягало 4 импульса вместо одного.
Re: Quadrature encoder от колесика мышки
Добавлено: Пн фев 10, 2014 11:36:49
balmer
ut1wpr писал(а):Подтяжка пинов по входу включена?
Я тоже когда-то с этим боролся. Ушел побежденным к софтовому варианту. Алгоритм от ЛИ. Сильно меня напрягало 4 импульса вместо одного.
Да, конечно включена. Именно через Pull Up подается напряжение на энкодер.
Причем в данных дребезг есть, но он не сильно велик. Когда просто выводишь на экран A и B каналы энкодера, то там логический уровень довольно четко сменяется.
Что ж, тогда попробую вместо полностью хардварного энкодера сделать "полухардварный", с interrupt на фронтах сигнала. Вместе со сглаживающими конденсаторами должно решить проблему.
Re: Quadrature encoder от колесика мышки
Добавлено: Пн фев 10, 2014 22:56:39
ut1wpr
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;
}
Использовать или не использовать прерывания - вам виднее. Я всегда находил в теле основной задачи вермя и место для вставки этого короткого поллинга.
Работает безукоризненно. Без конденсаторов.

Re: Quadrature encoder от колесика мышки
Добавлено: Вт фев 11, 2014 09:40:36
balmer
Спасибо за код. Разломал один из энкодеров. Оказывается ошибся в подключением. Думал что центральный провод это земля. Ан нет, земляной провод - это боковой

.
Надо будет вечерком переподключить и проверить.
Re: Quadrature encoder от колесика мышки
Добавлено: Вт фев 11, 2014 12:12:39
makser
В механических контактах будет дребезг по любому.
Пробовал 2 варианта решения:
1 Капнуть в механизм силиконовое масло, но оно со временем может вытечь.
2 Ставить последовательно с контактом резистор 1-3к, а на вывод стм конденсатор 100-10н пФ.
Re: Quadrature encoder от колесика мышки
Добавлено: Вт фев 11, 2014 22:14:35
balmer
Припаял правильно энкодер. Код из первого поста стал работать идеально хорошо. Без всяких конденсаторов и иных ухищьрений.
Re: Quadrature encoder от колесика мышки
Добавлено: Вт фев 11, 2014 23:20:37
ut1wpr
makser писал(а):В механических контактах будет дребезг по любому.
Дребезг будет. Но это не значит что его невозможно побороть программно.
Пробовал 2 варианта решения:
1 Капнуть в механизм силиконовое масло, но оно со временем может вытечь.
2 Ставить последовательно с контактом резистор 1-3к, а на вывод стм конденсатор 100-10н пФ.
Капнуть в герметезированный корпус не получится.
Резисторы и конденсаторы ухудшают скоростные свойства энкодера. А они часто очень важны, определяюще важны.
А посему - правильно созданный и выверенный алгоритм лучше костылей в виде случайных резисторов и конденсаторов. Изделия с такими костылями будут работать у одного и напрочь откажутся работать у другого.