Показать сообщение отдельно
Непрочитано 22.04.2013, 13:35  
omercury
Почётный гражданин KAZUS.RU
 
Аватар для omercury
 
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
omercury на пути к лучшему
По умолчанию Re: Алгоритмы фильтра дребезга avr

Так и не дождался ответа.
Попробую развить мысль в одно лицо.
Картинка как раз для этого случая, воспользуемся.
Нажмите на изображение для увеличения
Название: 480px-Счетчик_импульсов_реверсивный_режим_работы.jpg
Просмотров: 41
Размер:	20.5 Кб
ID:	46090
Работаем по событиям (Events) на первом датчике, второй для контроля направления.
1) Простейший случай:
- положение 1, оба датчика освещены, на входах "0" (датчики замыкают на "землю");
- переход в положение 2, перекрывается датчик-1 и линия переходит в "1" - происходит Event posedge(положительный перепад). Проверяем датчик-2, на нем по прежнему "0" - значит происходит вращение вправо. Если бы было "1" - значит было бы вращение влево. Однозначно!

2)Чуть сложней, с подавлением дребезга:
- положение 1, оба датчика освещены, на входах "0" (датчики замыкают на "землю");
- переход в положение 2, перекрывается датчик-1 и линия переходит в "1" - происходит Event posedge(положительный перепад). Проверяем датчик-2, на нем по прежнему "0" - значит происходит вращение вправо. Запоминаем состояние датчика-2 в двух флагах (флаг-1 и флаг-2) и запускаем таймаут. Если в течение отсчёта таймаута произошло ещё одно такое же событие(положительный перепад) и состояние датчика-2 изменилось на противоположное (проверяем по флагу-2), то это однозначно интерпретируется как дрожание счётного механизма. Происходит перезапуск таймаута, сохранение положения датчика-2 только в флаг-2 и ожидание следующего события. Это действие может происходить сколь угодно большое количество раз - на работу устройства оно не оказывает совершенно никакого влияния. Если за время таймаута происходит ещё одно событие (уже третье), но состояние флага-2 и датчика-2 на этот раз совпали, то это следует интерпретировать как реверс счётного механизма. Выполняем инверсию флага-1 и делаем переход на анализ его состояния и исполнение описанного в следующем предложении.
Если же вышел таймаут до прихода следующего события, то анализируется флаг-1 и производятся необходимые действия в соответствии с логикой программы. Далее происходит сброс флагов и наступает ожидание следующего события.

В соответствии с таким алгоритмом работы счёт может выполняться на весьма высокой скорости, даже с резкой сменой направления, задержки появляются только при многократном "дрожании" счётного механизма.

Можно, конечно, анализировать все четыре состояния датчиков, но нужно ли?

Последний раз редактировалось omercury; 22.04.2013 в 13:37.
omercury вне форума  
Сказали "Спасибо" omercury
_Ross_ (22.04.2013)