Easyelectronics.ru

Электроника для всех
Текущее время: 22 авг 2017, 21:59

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



    • JLCPCB for PCB Prototyping: 10 шт. 2-слоя 100*100mm 2$(около 140rub), изготовление за 24 часа.
    • Создание принципиальных схем и проектирование печатных плат
    • Крупнейший китайский онлайн магазин радиодеталей. Скидка 50%
    • Просмотр GERBER файлов

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

Зарегистрирован: 11 апр 2014, 13:25
Сообщения: 190
Откуда: Украина, Винница или Днепропетровск с переменным успехом
Доброго времени суток. Осваиваю инкрементальный энкодер, и возникло пару вопросов.
Следующий код вроде делает все что должен, но как-то нестабильно. Иногда сразу после ситуации вращения в одну сторону тут же самопроизвольно вращает на 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
Сообщения: 3061
Gnusmas, запрет обработчика, особенно на столь значительное время, может привести к пропуску "очередного" смены состояния энкодера и последующий импульс от него будет воспринят как то состояние, которое пролетело мимо... но пришедшее соотношение "переставлено" (см. двуквадрантную импульсную последовательность энкодера), а потому восприниматься программой инверсно (т.е. назад).
Не запрещайте прерывания, либо снижайте время запрета. Оно должно быть в несколько раз меньше скорости поступления тиков с энкодера при быстром вращении. /IMHO


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

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


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

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


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

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

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


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

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

_________________
mcu.goodboard.ru


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

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

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


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

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

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


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

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

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

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

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

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

_________________
mcu.goodboard.ru


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

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

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


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

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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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

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