Валкодер программная реализация опроса
В продолжение статьи о валкодере.... Принципов программной реализации опроса валкодера несколько и все они описаны неоднократно. Тем не менее, хочу остановиться подробнее на одном из них. Рассматриваем самый простой, недорогой и распространенный валкодер - механический инкрементный валкодер серии PEC11 от BOURNS с фиксацией (detent) положения, используемый как ручка управления .. Напомню... Опрос можно реализовывать по-разному.. Можно "реагировать" на изменение только одной линии и только в одном направлении, определяя направление поворота по состоянию второй линии в момент реакции на первую. Самый простой, но и самый "неточный" (малое разрешение) способ. Срабатывание определяется до момента прихода валкодера в фиксированное положение ("щелчок") Можно реагировать на изменения обеих линий, рассматривая при этом валкодер, как конечный автомат с 8-ю состояними и определяя направление вращения по каждому изменению. Способ позволяющий добиться от валкодера максимального разрещения по углу поворота. Именно этот способ/метод применяется для определения углового перемещения в системах с обратной связью (станки, антенны и т.д. при использовании валкодера в качестве датчика положения). Если же, как в рассматриваемом случае, валкодер - это ручка управления, то важно точно и четко зафиксировать начальное и конечное положение (один "щелчок"), пропустив при этом все промежуточные. Это можно сделать так (подсмотрено и адаптировано): Пусть линия А валкодера - младший разряд, а В - старший. Тогда при вращении получим: Почему линии не в точках перехода? Потому что это именно "точки перехода" и состояние в них не ясно. Именно в этих точках валкодер "дребезжит". Хотя, микроконтроллер реагирует именно на эти точки перехода :) Кстати, конструкция рассматриваемого валкодера такова, что механическая фиксация положения производится именно когда А и В равны "0". Если взять за начало отсчета положение А и В равное "00", то при вращении вправо получим (вспомните про автомат) - 00, 10, 11, 01, 00; - при вращении влево - 00, 01, 11, 10, 00. Так как начальное и конечное состояние совпадают, то "00" с одной из сторон можно отбросить. Так как нам необходимо определять только положения фиксации ("щелчки"), то сам сабой напрашивается простой алгоритм: - фиксация изменения; - опрос состояния; - запись (со сдвигом) сотояния во временную переменную; - сравнение временной переменной с константами "ВЛЕВО", "ВПРАВО" На Си это может выглядеть так: Вызывается при изменении состояния выводов.. по прерыванию, например /но не ИЗ прерывания :) /
...опрос выводов
Из ресурсов МК - два вывода с прерванием по изменению состояния. (Таких, как правило, много в МК). Внутренние PullUp резисторы МК и все... Ни каких внешних деталей.. Только МК и валкодер (как и должно быть). Впечатления.... Срабатывание четкое. Все попытки "похулиганить" в среднем положении ни к чему не приводят. Теоретически, можно добиться пропуска "щелчка", если "подергать" ручку в среднем положении..но у меня не получилось... Возможно конструктивно линии А и В валкодера имеют не "меандровую" форму, и именно для того, чтобы не было пропусков. Удачи!. (C)STAS633 05.09.10г. |