|
|
  |
Энкодер и дребезг, нужна помощь |
|
|
|
Apr 13 2007, 19:48
|
Местный
  
Группа: Свой
Сообщений: 278
Регистрация: 18-01-05
Из: Санкт-Петербург
Пользователь №: 2 031

|
Вроде дошло. Попробуйте скачать какую-нибудь терминальную программку( например такую) в которой можно cts,rts дёргать или ножки лпт. Затем ножку с LPT или COM подключите вместо датчика.Нажатиями на кнопки в программе проэмитируйте работу датчика.Будет ли насчитывать? Также можно просимулировать всё это в кейле. Там для этого какой-то скриптовый язык есть. Более подходящая программа. Приятное доп. к вашему осциллографу
|
|
|
|
|
Apr 13 2007, 20:09
|

Участник

Группа: Свой
Сообщений: 71
Регистрация: 9-03-07
Из: г. Днепропетровск
Пользователь №: 26 009

|
Цитата(_Sam_ @ Apr 13 2007, 19:48)  Вроде дошло. Попробуйте скачать какую-нибудь терминальную программку( например такую) в которой можно cts,rts дёргать или ножки лпт. Затем ножку с LPT или COM подключите вместо датчика.Нажатиями на кнопки в программе проэмитируйте работу датчика.Будет ли насчитывать? Также можно просимулировать всё это в кейле. Там для этого какой-то скриптовый язык есть. Более подходящая программа. Приятное доп. к вашему осциллографу  Пасибки пребольшое  разберёмся... Цитата(Visor @ Apr 13 2007, 19:51)  'BigCoster' Я сторонник отладки частями, и чтобы определиться где "хандрит", в железе или в софте, было бы неплохо написать совсем простенькую программку подсчета импульсов, может даже без прерываний. Завтра приступим...
Сообщение отредактировал BigCoster - Apr 13 2007, 20:10
|
|
|
|
|
Apr 14 2007, 10:03
|
Гуру
     
Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823

|
Цитата(BigCoster @ Apr 13 2007, 20:09)   разберёмся... Завтра приступим... Мне нравится желание изобрести что-то новое, оригинальное, но не нравится упертое желание наступить на грабли. Поскольку у меня есть определенный опыт с позиционированием (автофокус), то вынужден напомнить, что задача не имеет надежного решения с одним каналом. Быть может, если создается поделка для себя... Но ТЗ мы тут тоже не увидели. Короче, успехов!
--------------------
Уходя, оставьте свет...
|
|
|
|
|
Apr 14 2007, 19:44
|

Частый гость
 
Группа: Свой
Сообщений: 105
Регистрация: 6-01-06
Пользователь №: 12 901

|
Цитата(Dog Pawlowa @ Apr 14 2007, 11:03)  Мне нравится желание изобрести что-то новое, оригинальное, но не нравится упертое желание наступить на грабли. Поскольку у меня есть определенный опыт с позиционированием (автофокус), то вынужден напомнить, что задача не имеет надежного решения с одним каналом. Быть может, если создается поделка для себя... Но ТЗ мы тут тоже не увидели. Короче, успехов!  Полностью поддерживаю! Ув. BigCoster, уж если Вы решились на "переделку" своего устройства, то непременно воспользуйтесь приведенными в теме рекомендациями.
|
|
|
|
|
May 17 2007, 14:46
|
Группа: Новичок
Сообщений: 1
Регистрация: 12-03-05
Пользователь №: 3 275

|
Имею по работе проекты, в которых используются датчики импульсов типа ПДФ-3. Даже оставив датчик без приёмной цифровой схемы, он самопроизвольно генерирует импульсы, когда берёшся за вал рукой, при этом я нахожусь на полу из металлических плит. При коммутации какой-либо нагрузки происходит аналогичное явление. Побороть данного вида помехи позволило заземление общей точки питания самого датчика. Поэтому, считаю что Вам необходимо начать поиск в начале с самого энкодера, потом схемы, на которую он работает, а затем уже саму программу.
|
|
|
|
|
May 17 2007, 15:36
|

Участник

Группа: Свой
Сообщений: 71
Регистрация: 9-03-07
Из: г. Днепропетровск
Пользователь №: 26 009

|
Я для себя решил, что без осциллографа схему менять не буду (общая точка датчика на земле, схемы включения я приводил, сказали вроде б нормально). Не могу понять, как правильно организовать задание расстояния, которое должен проехать моторчик. у меня просто: пока держишь кнопку счётчик считает, а программа проверяет не отпущена ли кнопка, бросаем кнопку, нажимаем другую и сохраняем. после всего этого едем и видим, что не совсем так же проехали, как при настройке, а больше и тем больше проезжаем, чем больше раз нажимали книпку задания расстояния тем .. А сейчас вообще не пишет данные в EEPROM, вернее возвращает постоянно одинаковое значение. И концевой датчик тоже сошел с ума ..
|
|
|
|
|
May 23 2007, 22:51
|
Участник

Группа: Новичок
Сообщений: 38
Регистрация: 12-09-05
Пользователь №: 8 464

|
1. Двухканальный энкодер (о чем упоминалось выше), - там максимальная абсолютная неточность в пределах импульса (и сразу защита от всяких любых дребезгов если правильно отрабатывать). 2. В прерывании переполнения таймера-счетчика организовать программный счетчик и считать каждый импульс (событие 255 прописанных +1 пришедший). 3. Если пункт 1 не устраивает то пункт 2 + антидребезг. Как организовать антидребезг - это насколько хватит фантазии. Триггер Шмидта помогает - стандартное решение для одноканальных энкодеров. Расчитанно именно на ситуацию когда метка в слабо-определенном состоянии.
К сожалению трудно четко представить чего там у вас происходит.
|
|
|
|
|
Sep 3 2013, 05:44
|
Частый гость
 
Группа: Участник
Сообщений: 191
Регистрация: 18-09-12
Из: Орёл
Пользователь №: 73 591

|
Тема конечно устарела, но сейчас столкнулся с тем же. Посадил выход от энкодера на внешнее прерывание на меге128 (INT2). Сразу побежал дребезг. Сделал напрямую на порт: Код m_value = PIND & (1 << PD2); if (m_value == 0){ m_trigger = 1; } else { if (m_trigger == 1){ ++m_counter; } m_trigger = 0; } всё хорошо стало. Потому что внешнее прерывание ещё использовать уметь надо.
|
|
|
|
|
Sep 4 2013, 20:02
|
Профессионал
    
Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439

|
Цитата(vladimir_orl @ Sep 3 2013, 09:44)  . Да не в умении даже дело. Прерывание почти каждый дребезг поймает, но и ваша система иногда будет напарываться. Простое решение это запретить прерывание как оно случилось и очистить его флаг на случай если вызвалось снова пока вызывался обработчик, запустить таймер на половину короткого интервала. По прерыванию таймера считать достоверное значение и снова разрешить прерывание от сигнала. Я делал обработчик в более удобной среде там было два смещенных датчика с перекрытием как синус и косинус. Правда надо было етхе регистрировать направление. Итого было четыре области, которые я мог различить. 00, 01, 11 и 10 если бит 0 еыто сигнал одного датчика, а бит 1 второго. Далее я построил машину состояний (автомат) с четырьмя состояниями и разрешил в ней переходы между состояниями, соответствующиими соседним значениям датчиков. То есть если я в состоянии 01, то переход в 11 или 00 возможен, а в 10 нет. Расстояние хемминга 1 инициирует переход. И моя модель крутилась вслед за датчиком.
Сообщение отредактировал IgorKossak - Sep 6 2013, 17:26
Причина редактирования: избыточное цитирование
|
|
|
|
|
Sep 9 2013, 18:13
|

Профессионал
    
Группа: Участник
Сообщений: 1 620
Регистрация: 22-06-07
Из: Санкт-Петербург, Россия
Пользователь №: 28 634

|
Какая скорость прихода импульсов с валкодера? Разрешение? Крутит человек или это колесо на производстве чего-то? Дребезг давить аппаратно (с опичтеских не требуется), если быстродействие озволяет, оба сигнала завести на прерывания. Обработчик общий на двоих: Код static uint_fast8_t old_val;
void spool_encinterrupt(void) { const uint_fast8_t new_val = hardware_get_encoder_bits(); /* Состояние фазы A - в бите с весом 2, фазы B - в бите с весом 1 */
// dimensions are: // old_bits new_bits static const int_fast8_t graydecoder [4][4] = { { +0, /* 00 -> 00 stopped */ -1, /* 00 -> 01 rotate left */ +1, /* 00 -> 10 rotate right */ +0, /* 00 -> 11 invalid combination */ }, { +1, /* 01 -> 00 rotate right */ +0, /* 01 -> 01 stopped */ +0, /* 01 -> 10 invalid combination */ -1, /* 01 -> 11 rotate left */ }, { -1, /* 10 -> 00 rotate left */ +0, /* 10 -> 01 invalid combination */ +0, /* 10 -> 10 stopped */ +1, /* 10 -> 11 rotate right */ }, { +0, /* 11 -> 00 invalid combination */ +1, /* 11 -> 01 rotate right */ -1, /* 11 -> 10 rotate left */ +0, /* 11 -> 11 stopped */ }, };
#if ENCODER_REVERSE position1 -= graydecoder [old_val][new_val]; #else position1 += graydecoder [old_val][new_val]; #endif old_val = new_val; } В инициализации не забыть Код old_val = hardware_get_encoder_bits(); /* Состояние фазы A - в бите с весом 2, фазы B - в бите с весом 1 */ чтобы ложные шаги при ресете не проходили на стоящем валкодере.
|
|
|
|
|
Sep 9 2013, 19:35
|
Профессионал
    
Группа: Свой
Сообщений: 1 351
Регистрация: 21-05-10
Пользователь №: 57 439

|
Цитата(Genadi Zawidowski @ Sep 9 2013, 22:13)  . Красиво. Дребезг даже не подавленный не будет мешать, однако будут лишние вызовы прерываний, что не есть хорошо. Если время оборота составляет несколько миллисекунд, то возможно поллинг будет лучшим подходом.
Сообщение отредактировал IgorKossak - Sep 10 2013, 18:39
Причина редактирования: бездумное цитирование
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|