PrimussTh

Мастерская и лаборатория => Я не волшебник, я только учусь... => Тема начата: slav0n от 01 Июль 2020, 23:09:03

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

(https://s7.gifyu.com/images/encoder.gif) (https://gifyu.com/image/QpV3)

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

(https://s7.gifyu.com/images/enc-no-cap.gif) (https://gifyu.com/image/Qpe4)
Название: Re: и снова про энкодер
Отправлено: slav0n от 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;
В работе этот код повел себя вполне удовлетворительно без блокировочных конденсаторов, а с конденсаторами так и подавно.
В общем, получился еще один способ решения среди массы других.
Название: Re: и снова про энкодер
Отправлено: slav0n от 03 Июль 2020, 06:56:42
Олдскульный интерфейс энкодера на логике 4000 серии.

Название: Re: И снова про энкодер
Отправлено: slav0n от 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;