Автор Тема: И снова про энкодер  (Прочитано 346 раз)

0 Пользователей и 1 Гость просматривают эту тему.

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 5252
  • Карма: +6/-0
И снова про энкодер
« : 01 Июль 2020, 23:09:03 »
в Сети уже понаписано масса информации по теории и реализации обработчика сигналов с этого нехитрого органа управления.
Наиболее понятно принцип описывается примерно так:
Энкодер имеет два сигнальных выхода CLK (тактовый) и DT (я бы назвал его direction - направление, но это почему-то data). Так вот, надо просто поймать фронт импульса CLK и в этот момент посмотреть сигнал DT, если там ноль, то поворот, допустим, вправо, если единица - влево. Вот и все.
Теперь вопрос - какой фронт ловить, передний или задний? Казалось-бы без разницы, ан нет.
Смотрим картинку:



Так выглядит сигнал моего энкодера с конденсаторами 100n параллельно контактам. Задний фронт четкий, логично ловить его.
А что будет, если отключить конденсаторы?
Полный хаос:

« Последнее редактирование: 03 Июль 2020, 07:50:46 от slav0n »
while(1||!1);
зберігай спокій

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 5252
  • Карма: +6/-0
Re: и снова про энкодер
« Ответ #1 : 02 Июль 2020, 23:54:25 »
А теперь, собственно, код обработки.
Раньше я уже показывал его - http://primuss3.com/forum/index.php?topic=219.msg17108#msg17108
Немного причешу для удобоваримости:
Код
	static u8 old;
u8 clk = PINC & (1<<5), dir = PINC & (1<<4);//смотрим ноги
if(old && !clk){//ловим задний фронт
if(dir)DATA++;//туда
else DATA--;//сюда
}
old = clk;

У меня этот код встроен в обработчик прерывания от таймера и вызывается с периодом примерно 1мс.
С конденсаторами на энкодере код замечательно работает, но без них все плохо. Иголки от дребезга контактов портят всю картину.
Ок, пробую исправить ситуацию перепроверкой сигнала CLK:
Код
	static u8 old, flg;
u8 clk = PINC & (1<<5), dir = PINC & (1<<4);//смотрим ноги
if(flg && !clk){//ловим задний фронт
if(dir)DATA++;//туда
else DATA--;//сюда
flg = 0;
}
if(old && clk) flg = 1;
old = clk;
В работе этот код повел себя вполне удовлетворительно без блокировочных конденсаторов, а с конденсаторами так и подавно.
В общем, получился еще один способ решения среди массы других.
while(1||!1);
зберігай спокій

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 5252
  • Карма: +6/-0
Re: и снова про энкодер
« Ответ #2 : 03 Июль 2020, 06:56:42 »
Олдскульный интерфейс энкодера на логике 4000 серии.

while(1||!1);
зберігай спокій

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 5252
  • Карма: +6/-0
Re: И снова про энкодер
« Ответ #3 : 07 Июль 2020, 04:12:07 »
Очевидно, что при несоблюдении условия устойчивого фронта сигала CLK не имеет смысла проверять сигнал направления.
Поэтому маленькая коррекция кода:
Код
	static u8 old, flg;
u8 clk = PINC & (1 << PC5);//смотрим ногу CLK
if(flg && !clk){//ловим задний фронт
if(PINC & (1 << PC4))DATA++;//туда
else DATA--;//сюда
flg = 0;
}
if(old && clk) flg = 1;
old = clk;
while(1||!1);
зберігай спокій