Easyelectronics.ru

Электроника для всех
Текущее время: 25 мар 2017, 12:53

Часовой пояс: UTC + 5 часов



    • Изготовление печатных плат
    • Создание принципиальных схем и проектирование печатных плат
    • Симуляция работы на spice моделях
    • Просмотр GERBER файлов

Начать новую тему Ответить на тему  [ Сообщений: 11 ] 
Автор Сообщение
 Заголовок сообщения: Инкрементальный энкодер в прерывании INT0
СообщениеДобавлено: 30 апр 2016, 01:27 
Свой человек
Аватара пользователя

Зарегистрирован: 11 апр 2014, 13:25
Сообщения: 163
Откуда: Украина, Винница или Днепропетровск с переменным успехом
Доброго времени суток. Осваиваю инкрементальный энкодер, и возникло пару вопросов.
Следующий код вроде делает все что должен, но как-то нестабильно. Иногда сразу после ситуации вращения в одну сторону тут же самопроизвольно вращает на 1 или несколько позиций назад. Как будто я очень быстро кручу энкодером туда-сюда. По выходу из внешнего прерывания я запрещаю его на примерно 65мс (время переполнения Таймера 0).
Show


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 30 апр 2016, 03:31 
Свой человек

Зарегистрирован: 27 дек 2012, 17:46
Сообщения: 51
Была подобная проблема, косяк в самом энкодере, дребезг контактов (если он механический), и слишком близкое расположение фронтов импульсов.
В первом случае помогает задержка вплоть до 0.1с.
Во втором случае ничего не поможет если энкодер механический, если оптический с самодельными формирователем на компараторах, то помогает подстройка уровня переключения компараторов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Инкрементальный энкодер в прерывании INT0
СообщениеДобавлено: 30 апр 2016, 03:33 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 2514
Gnusmas, запрет обработчика, особенно на столь значительное время, может привести к пропуску "очередного" смены состояния энкодера и последующий импульс от него будет воспринят как то состояние, которое пролетело мимо... но пришедшее соотношение "переставлено" (см. двуквадрантную импульсную последовательность энкодера), а потому восприниматься программой инверсно (т.е. назад).
Не запрещайте прерывания, либо снижайте время запрета. Оно должно быть в несколько раз меньше скорости поступления тиков с энкодера при быстром вращении. /IMHO


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Инкрементальный энкодер в прерывании INT0
СообщениеДобавлено: 30 апр 2016, 09:03 
Старожил

Зарегистрирован: 30 авг 2010, 00:02
Сообщения: 914
Я уже два раза тут поднимал тему надежного декодирования, но обсуждения не получилось.
viewtopic.php?f=14&t=26372


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Инкрементальный энкодер в прерывании INT0
СообщениеДобавлено: 30 апр 2016, 12:12 
Старожил

Зарегистрирован: 19 мар 2014, 19:33
Сообщения: 283
нужно учитывать предыдущее состояние и тогда некоторые новые состояния можно отбрасывать как неправильные (перескок, дребезг), этого обычно достаточно если энкодер не убит вусмерть


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Инкрементальный энкодер в прерывании INT0
СообщениеДобавлено: 30 апр 2016, 12:23 
Старожил

Зарегистрирован: 30 авг 2010, 00:02
Сообщения: 914
Morroc писал(а):
нужно учитывать предыдущее состояние и тогда некоторые новые состояния можно отбрасывать как неправильные (перескок, дребезг), этого обычно достаточно если энкодер не убит вусмерть

Пробовал, там не так много возможностей для отбраковки по состоянию, после 0 может быть 1 или 2,
3 - запрещено, в любом месте кода два разрешенных и одно запрещенное. Не работает.
Введение селекции импульсов по времени - "слишком короткий=отбрасываем" - тоже не помогло радикально.
Энкодер новый, но не уменя в руках, не могу дребезг посмотреть.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Инкрементальный энкодер в прерывании INT0
СообщениеДобавлено: 30 апр 2016, 12:59 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 899
Можно по другому принципу к этому делу подойти - прерывания только от таймера, и в этих прерываниях считывание текущего состояния энкодера и сравнение с предыдущим


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Инкрементальный энкодер в прерывании INT0
СообщениеДобавлено: 30 апр 2016, 13:29 
Старожил

Зарегистрирован: 30 авг 2010, 00:02
Сообщения: 914
vt340 писал(а):
Попробуйте по другому принципу к этому делу подойти - прерывания только от таймера, и в этих прерываниях считывание текущего состояния энкодера и сравнение с предыдущим

Пробовал прерываниями и циклическим опросом - одинаково плохо.
Если бы дребезжал только тот выход, который меняет состояние, то числа были бы вроде этих -
000000010011011111111 , то можно было бы по группе подряд единиц принять решение, что переход 0 -> 1 произошел. А если дребезжит еще и тот выход, который едет по сплошной дорожке, то последовательность может быть такой - 0020320130133113111.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Инкрементальный энкодер в прерывании INT0
СообщениеДобавлено: 30 апр 2016, 13:37 
Свой человек
Аватара пользователя

Зарегистрирован: 11 апр 2014, 13:25
Сообщения: 163
Откуда: Украина, Винница или Днепропетровск с переменным успехом
Я так понял что сложные алгоритмы определения текущего состояния и сравнения его с предыдущим актуальны больше для для циклического опроса по таймеру, чем для опроса внутри прерывания. Пока повесил по конденсатору 100нФ на каждую ногу и стало ГОРАЗДО лучше, ложных возвратов назад почти нет. Энкодер дешевый, механический, китайский, и подубитый к тому же, так что результат считаю приемлимым. Над программными алгоритмами буду извращаться уже после праздников наверное. Всем спасибо за внимание и за ссылки.

Up: + забыл сказать, что сделал как сказал u37, запрещаю прерывание не на 65 мс, а только на 1-2 мс. Только эти 2 меры (конденсаторы+уменьшение время запреты прерываний) дали мне удовлетворительный эффект, приминение по отдельности не катит.


Последний раз редактировалось Gnusmas 30 апр 2016, 18:28, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Инкрементальный энкодер в прерывании INT0
СообщениеДобавлено: 30 апр 2016, 14:01 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 899
анкер писал(а):
последовательность может быть такой - 0020320130133113111.

ОК, пусть будет
0020320130133113111 )

Значит на входах было
0000100110111111111
0010110010011001000

Значит фильтруем входы по 3 отсчётам при считывании и будет
0000000000001111111
0000000000000000000
и в итоге
0000000000001111111


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Инкрементальный энкодер в прерывании INT0
СообщениеДобавлено: 30 апр 2016, 14:17 
Старожил

Зарегистрирован: 30 авг 2010, 00:02
Сообщения: 914
vt340 писал(а):
Значит фильтруем входы по 3 отсчётам при считывании и будет
0000000000001111111
0000000000000000000
и в итоге
0000000000001111111

Да придется запоминать и фильтровать, если еще какой-нибудь подводный камень не вылезет.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 11 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: Yahoo [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB