О подключении и работе с энкодером.
С энкодером можно работать через прерывания - один канал (любой) на INT, второй на любой вход.
Например канал А настроен на прерывание по нарастающему фронту, тогда достаточно в прерывании анализировать вход B, если B=0 то +, если B=1 то -. Вроде все впорядке, но при небольших смещениях возле прерывания (когда меняется только А) будут насчитываться лишние импульсы в + или в - (в зависимости от состояния канала B), не говоря уже о возможном дребезге. Выход есть - прерывание настраивать на любое изменение канала А и анализировать переход 10 или 01 - в этом случае энкодер будет давать в 2 раза больше "импульсов", чем в предыдущем варианте. Но дребезг на входе канала А может загрузить контроллер.
Рассмотрим этот вариант подробней. Прерывание, канал А стал 0 - есть 2 варианта B=0 и B=1. Пусть если B=0 то декремент, если B=1 то инкремент. Дальше, прерывание, канал А стал 1 - есть 2 варианта B=0 и B=1, если B=0 то инкремент, если B=1 то декремент. На один шаг 2 инкремента/декремента.
Есть и другой вариант, можно считать не импульсы, а состояния.
Если A и B идут на одни порт контроллера (например на A=PB0 B=PB1), то при вращении энкодера у нас возникает меняющийся код. Теперь остается только циклически опрашивать наш энкодер (например по таймеру) сравнивая текущее состояние с новым и на основании этого делающего выводы о вращении. Причем частота опроса должна быть такой, чтобы не пропустить ни одного импульса. Цитата: "Например, мой EC12 имеет 24 импульса на оборот. Вращать его предпологается вручную и я вряд ли смогу вращать его с космической скоростью, но решил все же замерить. Подключился к осциллографу, крутнул ручку что есть мочи: Выжал меньше килогерца. Т.е. опрашивать надо примерно 1000 раз в секунду. Можно даже реже, будет надежней в плане возможного дребезга." Ручные энкодеры народ опрашивает 5 кГц.
Алгоритм такой:
Помним предыдущее состояние.
Считываем текущее состояние.
Сравниваем текущее состояние с предыдущим, если текущее состояние отличается от предыдущего добавляем его в буфер.
Анализируем буфер. Но здесь вопрос сколько последних состояний необходимо анализировать.
Видим, что если анализировать 4 состояния (1 текущее и 3 предыдущих), то ни одного импульса не насчитаем, при дребезге.
Если анализировать 3 состояния (1 текущее и 2 предыдущих), то для набора 00 01 11 - будет 1 "импульс" на шаг (шаг от 00 до 00), для набора 01 11 10 - будет 1 "импульс", для набора 11 10 00 - будет 1 "импульс", для набора 10 00 01 - будет 1 "импульс". Вроде все работает если искать какой нибудь один набор, например 00 01 11, получаем 1 "импульс" на шаг (например для инкремента). Для декремента нужно искать другой набор 00 10 11 или 10 11 01 или 11 01 00 или 01 00 10.
Инкремент : 00 01 11 или 01 11 10 или 11 10 00 или 10 00 01
Декремент: 00 10 11 или 10 11 01 или 11 01 00 или 01 00 10.
Если анализировать 2 состояния (1 текущее и 1 предыдущее), то имеем 16 наборов:
00) 00 00
01) 00 01
02) 00 10
03) 00 11
04) 01 00
05) 01 01
06) 01 10
07) 01 11
08) 10 00
09) 10 01
10) 10 10
11) 10 11
12) 11 00
13) 11 01
14) 11 10
15) 11 11
Состояния 0, 5, 10, 15 исключаем т.к. мы их не воспринимаем - входной сигнал не изменяется.
Остаются запрещенные состояния (которые по идее никак не могут возникнуть) это 3, 6, 9, 12.
00 11
01 10
10 01
11 00
Состояния инкремента: 1, 7, 14, 8.
00 01
01 11
11 10
10 00
Состояния декремента: 2, 11, 13, 4.
00 10
10 11
11 01
01 00
Получается, что на один шаг имеем 4 "импульса" при инкременте и 4 "импульса" при декременте. Если был дребезг, то общая сумма на один шаг все равно будет =4 , для примера дребезга изображенного на рисунке будет +1, -1, +1, +1, -1,+1, +1, -1, +1, +1. Можно как бы увеличить разрешение энкодера в 4 раза, а можно по достижении 4 или -4 инкрементировать/декрементировать выходной регистр.
Вопрос в том, что делать если мы поймали запрещенное состояние - это означает, что мы пропустили какойто переход, а может и не один. Есть 2 варианта: 1) просто игнорировать и 2) считать количество ошибок и по количеству ошибок принимать какие-то действия.
И еще с дребезгом, наверное, лучше бороться аппаратно: емкости, RC цепочки, триггеры Шмидта.