Например TDA7294

Форум РадиоКот :: Просмотр темы - Quadrature encoder от колесика мышки
Форум РадиоКот
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 от колесика мышки

Спасибо за код. Разломал один из энкодеров. Оказывается ошибся в подключением. Думал что центральный провод это земля. Ан нет, земляной провод - это боковой :facepalm: :facepalm: .

Надо будет вечерком переподключить и проверить.

Автор:  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/