Форум Микро-Чип

Форум Микро-Чип (http://www.microchip.su/index.php)
-   Общетехнические вопросы (http://www.microchip.su/forumdisplay.php?f=8)
-   -   Обработка сигнала механического энкодера (http://www.microchip.su/showthread.php?t=10326)

Марк 27.09.2010 18:23

Обработка сигнала механического энкодера
 
Применяю такой энкодер для ввода данных: http://www.platan.ru/pdf/datasheets/bourns/pec12.pdf

В связи с этим хотелось бы некоторых советов по алгоритму обработки. Применял разные варианты, однако сбойные ситуации (пропуски в основном) все таки проскакивают.
Дело в том, что в отличие от кнопок, можно очень медленно поворачивать вал и возникает длинный дребезг. Скорее всего это решается как то стандартно, однако я не нашел и не додумался... Пока не додумался... :)
Спасибо.

Filya44 27.09.2010 18:51

Re: Обработка сигнала механического энкодера
 
А может емкость попробовать?

Марк 27.09.2010 19:00

Re: Обработка сигнала механического энкодера
 
Емкость ставят при известном и НЕБОЛЬШОМ дребезге...

vitalka 27.09.2010 19:10

Re: Обработка сигнала механического энкодера
 
если дребезг по частоте выше, чем полезный сигнал,
то можно легко програмно отсеивать все импульсы, идущие чаще определенного порога

tester 27.09.2010 19:15

Re: Обработка сигнала механического энкодера
 
Цитата:

Сообщение от Марк (Сообщение 114600)
Емкость ставят при известном и НЕБОЛЬШОМ дребезге...

Так вал же не может разогнаться моментально. Следовательно быстрые импульсы при медленных оборотах нужно отсекать.
Плюс соседние импульсы имеют соизмеримую длительность, а дребезг хаотичен.

Контур 27.09.2010 19:35

Re: Обработка сигнала механического энкодера
 
http://www.mirmk.net/content/view/84/29/

Greg 27.09.2010 20:09

Re: Обработка сигнала механического энкодера
 
Цитата:

Сообщение от Марк (Сообщение 114594)
Применяю такой энкодер для ввода данных: http://www.platan.ru/pdf/datasheets/bourns/pec12.pdf

В связи с этим хотелось бы некоторых советов по алгоритму обработки. Применял разные варианты, однако сбойные ситуации (пропуски в основном) все таки проскакивают.
Дело в том, что в отличие от кнопок, можно очень медленно поворачивать вал и возникает длинный дребезг. Скорее всего это решается как то стандартно, однако я не нашел и не додумался... Пока не додумался... :)
Спасибо.

а что такое быстро и "очень медленно"? просто с "медленно" проблем не было

alexem 27.09.2010 20:57

Re: Обработка сигнала механического энкодера
 
Цитата:

Сообщение от Марк (Сообщение 114594)
Применяю такой энкодер для ввода данных: http://www.platan.ru/pdf/datasheets/bourns/pec12.pdf

В связи с этим хотелось бы некоторых советов по алгоритму обработки. Применял разные варианты, однако сбойные ситуации (пропуски в основном) все таки проскакивают.
Дело в том, что в отличие от кнопок, можно очень медленно поворачивать вал и возникает длинный дребезг. Скорее всего это решается как то стандартно, однако я не нашел и не додумался... Пока не додумался... :)
Спасибо.

Может просто "лежалый на складе" попался? Разобрать и Contact Cleanerом побрызгать имеешь возможность? Я такой давным давно от СВЧ печки использовал в связке еще с 16F628 и на асме... ничего подобного не замечал. Да, и о реализации. От сигнальных выводов через 2 диода заводил на INT0. По прерыванию вводил задержку на дребезг и потом, собственно, принимал решение... Давно это было, может и неправильно, но работало замечательно.

quarry 27.09.2010 21:20

Re: Обработка сигнала механического энкодера
 
инкодеры для того и делают что бы забить на дребезг
меняете алгоритм

alexem 27.09.2010 21:27

Re: Обработка сигнала механического энкодера
 
Цитата:

Сообщение от quarry (Сообщение 114619)
инкодеры для того и делают что бы забить на дребезг
меняете алгоритм

ээээ... Уважаемый! Он механический!!!

quarry 27.09.2010 21:34

Re: Обработка сигнала механического энкодера
 
Цитата:

Сообщение от alexem (Сообщение 114620)
ээээ... Уважаемый! Он механический!!!

и шо? да хоть из навоза.
закономерность есть? отслежаванию поддаёцца?

DL36 27.09.2010 22:52

Re: Обработка сигнала механического энкодера
 
На телесистемах полтора два года назад обсасывали проблему энкодера, все возможные ситуации, был результирующий код.

alexem 27.09.2010 23:41

Re: Обработка сигнала механического энкодера
 
Цитата:

Сообщение от quarry (Сообщение 114622)
и шо? да хоть из навоза.
закономерность есть? отслежаванию поддаёцца?

А надо?
У ремонтников спросите. Или у хозяев муз. центров в составе которых имеются подобные энкодеры (повторюсь: контактные).

Марк 28.09.2010 08:23

Re: Обработка сигнала механического энкодера
 
О как... Спасибо, господа, за живое участие.
Энкодеры вроде вполне "свежие". Куплены в Платане.
Все посты прочел.
Немного о своем варианте. Возможно вскроется очевидный косяк.
Я поставил эту приблуду на индикаторный блок некоего устройства.
Контроллер PIC18F25K20. Индикатор TIC234. Упомянутый энкодер со встроенной кнопкой (осевое нажатие). И УСАРТ для обмена с этим неким устройством.
Так как все три внешних прерывания в контроллере остались свободны, я решил "с жиру" на них и повесить энкодер с кнопкой.
Нулевой интеррапт на кнопку, а первый и второй на энкодер. Общий пин энкодера (и один вывод кнопки) на землю и все прерывания подтянул к питанию. Соответственно все входы прерываний получили активный низкий в соответствующих битах в своих контрол-регистрах.
Алгоритм был такой.
При входе в одно из двух прерываний проверяется "соседний" пин.
Если на нем пассивный уровень, то запрещаем сработавшее прерывание и выходим. Если на "соседе" активный (низкий), то снова запрещаем сработавшее, производим инкремент/декремент ( в зависимости от номера сработавшего вторым прерывания) объекта регулировки и выходим. Разрешаем оба прерывания только после некоторого числа проходов суперлупа с пассивными (высокими) уровнями на обоих пинах прерываний.
Такая вот "перекрестная" обработка. Однако очень редко(крайне редко) происходит несброс в суперлупе. И все замирает. И иногда (тоже нечасто) несрабатывает при повороте. Возможно я ошибаюсь с причиной. И дело не в медленном, а наоборот в быстром вращении. Или причина в недоворотах между фиксациями и возвратах на прежнюю позицию...
ЗЫ. To DL36. Телесиси пока не читал. Найду - прочту. Спасибо.

DL36 28.09.2010 09:27

Re: Обработка сигнала механического энкодера
 
Цитата:

Сообщение от Марк (Сообщение 114662)
Телесиси пока не читал. Найду - прочту. Спасибо.

Смысл прямой там Леонид Иванович и компания общались. Недавно ссылка на сахаре была, вопрос был по поводу кода.

quarry 28.09.2010 09:44

Re: Обработка сигнала механического энкодера
 
прерывания это хорошо, если пользовать правильно

но ещё не стоит забывать старый дедовский способ работающий на всех МК
кладёте состояние линий в младшие два бита с нужным периодом
и получаете последовательность чисет 2,3,1,0 в одну сторону и 0,1,3,2 в другую
её и отслеживаете
если уж очень дребезжать станет, один шаг вперёд/назад игнорируйте.
и будет вам счастье.

Вова 29.09.2010 01:39

Re: Обработка сигнала механического энкодера
 
Цитата:

кладёте состояние линий в младшие два бита с нужным периодом
и получаете последовательность чисет 2,3,1,0 в одну сторону и 0,1,3,2 в другую
её и отслеживаете
А у вас такой алгоритм стабильно работает? Когда-то именно так написал, но были ложные срабатывания примерно раз на 100-200, от которых так и не удалось избавится. Правда игрался с "энкодером" от мыши, может в этом дело. Хотя в любой мыши всегда обработка чёткая..

quarry 29.09.2010 14:42

Re: Обработка сигнала механического энкодера
 
работает как гвоздь, вы же можете делать инкремент/декремент не по переходу от одной цифры к другой, а по трём, четырём а то и пяти переходам. этот метод использовал как раз для механических инкодеров
чтобы не проводить всю жизнь в прерываниях.
А вот с оптическими где 2000 имп/обр там по прерыванию делал, чтобы успевать.
А когда надо было ещё быстрее сделал на двух тригерах простую схемку выделяющую импульсы по направлению и завёл на счётчики.

Марк 29.09.2010 16:01

Re: Обработка сигнала механического энкодера
 
Цитата:

Сообщение от quarry (Сообщение 114808)
......чтобы не проводить всю жизнь в прерываниях.
...........

Ну Вы пессимист, однако... ;):)

Вова 29.09.2010 21:13

Re: Обработка сигнала механического энкодера
 
Цитата:

Сообщение от quarry (Сообщение 114808)
работает как гвоздь, вы же можете делать инкремент/декремент не по переходу от одной цифры к другой, а по трём, четырём а то и пяти переходам. этот метод использовал как раз для механических инкодеров

Спасибо!

petrd 29.09.2010 23:17

Re: Обработка сигнала механического энкодера
 
Цитата:

Сообщение от DL36 (Сообщение 114632)
На телесистемах полтора два года назад обсасывали проблему энкодера, все возможные ситуации, был результирующий код.

Это? http://530.ru/wwwboards/mcontrol/214...s/600350.shtml

DL36 30.09.2010 11:58

Re: Обработка сигнала механического энкодера
 
Цитата:

Сообщение от petrd (Сообщение 114851)

Оно но только половина, первая или вторая. Было начало и продолжение через некое время, приблизительно пол года.

picbasic 03.10.2010 13:32

Re: Обработка сигнала механического энкодера
 
Делал регулятор мощности с регулировкой на енкодере. Один из выводов заводил на внешнее прерывание RB0 второй на вход RB1.
Прерывание по спаду. Если при срабатывани прерывания на RB1 1 значит в одну сторону +1, если при срабатывании 0 - значит -1, далее делаем необходимую задержку (она-же анти-дребезг) и обнуляем флаг прерывания. У меня работало как часы...

(да, энкодер был механический с кнопкой если память не подводит на 24 позиции)

kt3102 03.10.2010 18:11

Re: Обработка сигнала механического энкодера
 
-Энкодер не должен выдавать "недопустимое состояние"
Примеры "недопустимого состояния":
=дребезг на обоих выводах (возм при большой скорости- либо следите за скоростью как сказал тестер, либо смжьте ось вакуумной смазкой- забодаются крутить),
=два перехода на одном выводе припостоянном на другом.

-Программа должна корректно обрабатывать "недопустимое состояние"
Пример корр обработки: прибор продолжает работать, а на дисплей выдаётся сообщ: "Ошибка ХХХ. Обратитесь в сервис". Они Вам звонят, Вы выкатываете счёт. Появляются ресурсы для разработки более продвинутого алгоритма обработки и применения более дешёвого энкодера.

siargy 26.07.2012 14:59

Re: Обработка сигнала механического энкодера
 
Вложений: 2
Добрый день, добрался и я до механического энкодера.
Сразу сделал как Марк писал выше по тексту, вобщем не получилось,
при вращении энкодера счетчик менял значение произвольным образом.
Подключил осцилограф глянул сигналы:
http://www.microchip.su/attachment.p...1&d=1343299323
Развернул осцилограмму и вывел на свободный вывод мк индикацию входа в прерывание, получается контроллер реагирует на "иголки".
Повесил кондер на выводы энкодера, паралельно замыкающемуся контакту, и все стало четко работать. Единственное смущает что энкодер закорачивает заряженный конденсатор, наверно правильнее подключать дополнительный резистор:
http://www.microchip.su/attachment.p...1&d=1343300032

Считаю, что програмно от шума сложно избавиться, каким-нибудь хитрым методом включения-выключения прерываний. RC-цепочка работает проще и стабильнее. Но может я что-то не так делаю?

Марк 26.07.2012 15:16

Re: Обработка сигнала механического энкодера
 
Прежде всего нужно обработать сигналы от каждого контакта энкодера, как от кнопки. Т.е. сделать защиту от дребезга.
Предлагается следующий алгоритм.
Опрашиваете контакты с некоторым интервалом времени, который больше даташитного дребезга, но меньше времени между двумя срабатываниями одного контакта (можно рассчитать по угловой скорости вращения).
Этот интервал может формироваться таймером (в прерывании) или просто в некоем более-менее стабильном цикле.(обычно этот интервал имеет порядок 10...30 мс)
Считанное состояние каждого контакта вдвигаете в двухбитный буфер (свой для каждого контакта) и проверяете оба бита. Если они одинаковы, то это значение защелкиваете в булевой переменной - статусе контакта. Эта переменная и будет состоянием контакта БЕЗ ДРЕБЕЗГА. Это состояние и используете в программе.
Если значения разрядов двухбитного буфера будут разные, то в статус контакта ничего не записываете - он остается ПРЕЖНИМ.

siargy 26.07.2012 16:30

Re: Обработка сигнала механического энкодера
 
Марк, так я это понимаю, цена вопроса 2 конденсатора или 20 строчек программы)

Марк 26.07.2012 16:35

Re: Обработка сигнала механического энкодера
 
Полагаю, что программная защита будет более куртуазна.
Зачем плодить лишнее?

maagalex 26.07.2012 18:43

Re: Обработка сигнала механического энкодера
 
Ой..мне тоже скоро это понадобиться..
Думаю что нужно добавить таймер..
Во-первых чтобы реагировать на уровни линий только если они не меняются в течение некоего времени Х, и во-вторых чтобы прибавлять-убавлять значение счётчика по экспоненте, скажем сдвинул энкодер на деление в пол секунды-прибавилась единичка, сдвинул на пять делений в секунду-прибавилась сотня и тд..

maagalex 26.07.2012 19:38

Re: Обработка сигнала механического энкодера
 
..скажем..изменился уровень на порте-счётчик сбросился , и пока уровень не меняется-считает клоки таймера..,то-же и со втором портом.
По переполнению счётчика либо по спаду уровня можно сравнить значения счётчиков и очерёдность и подсчитать результат учитывая скорость и не учитывая дребезг:rolleyes:

dr_Sash 26.07.2012 23:41

Re: Обработка сигнала механического энкодера
 
Вложений: 1
А я вот, чего-то примерно такую схемку использую...

Наверное я - "неправильный" какой-то :)

Greg 27.07.2012 00:04

Re: Обработка сигнала механического энкодера
 
Цитата:

Сообщение от Марк (Сообщение 164286)
Прежде всего нужно обработать сигналы от каждого контакта энкодера, как от кнопки. Т.е. сделать защиту от дребезга.
Предлагается следующий алгоритм.
Опрашиваете контакты с некоторым интервалом времени, который больше даташитного дребезга, но меньше времени между двумя срабатываниями одного контакта (можно рассчитать по угловой скорости вращения).
Этот интервал может формироваться таймером (в прерывании) или просто в некоем более-менее стабильном цикле.(обычно этот интервал имеет порядок 10...30 мс)
Считанное состояние каждого контакта вдвигаете в двухбитный буфер (свой для каждого контакта) и проверяете оба бита. Если они одинаковы, то это значение защелкиваете в булевой переменной - статусе контакта. Эта переменная и будет состоянием контакта БЕЗ ДРЕБЕЗГА. Это состояние и используете в программе.
Если значения разрядов двухбитного буфера будут разные, то в статус контакта ничего не записываете - он остается ПРЕЖНИМ.

там всё обычно немного сложней (обрабатывается 4 бита)
типа http://www.piclist.com/techref/microchip/qenc.htm

на Си выглядит довольно изящно

Код:

// keyboard encoder     
// read port value for encoder 6
      uc_enc6state <<= 2;
     
      if (RB2)
        uc_enc6state |= 1;
     
      if (RB3)
        uc_enc6state |= 2;

// test status

      switch (uc_enc6state & 0x0F) {
     
// nothing happened     
      case 0:
      case 5:     
      case 10:     
      case 15:
           
      // error
      case 3:
      case 6:
      case 9:
      case 12:     
        break;
       
      // UP 
      case 1:
      case 7:
      case 8:
      case 14:     
        kbd_flags |= KEY_UP;
        break;
       

      // DOWN
      case 2:
      case 4:
      case 11:
      case 13:     
        kbd_flags |= KEY_DWN;
        break;
      }  // switch encoder 6 state


Марк 27.07.2012 13:53

Re: Обработка сигнала механического энкодера
 
Грег, я не писал об обработке собственно энкодера, я писал лишь о защите от дребезга. Естественно, что энкодеру нужны 4 фазы.

Greg 27.07.2012 14:14

Re: Обработка сигнала механического энкодера
 
Цитата:

Сообщение от Марк (Сообщение 164325)
Грег, я не писал об обработке собственно энкодера, я писал лишь о защите от дребезга. Естественно, что энкодеру нужны 4 фазы.

так там и дребез давится. Что я привёл - часть таймерного прерывания.
Просто давить "как у кнопки" а потом обрабатывать - получается тормознуто, если крутить быстро - теряются отсчёты.
но самое лучшее - сразу брать мк с аппаратными входами обработки энкодера

edv_2000 27.07.2012 22:44

Re: Обработка сигнала механического энкодера
 
напишу на почту. моя edv_2222_mail.ru

Bill 31.07.2012 22:31

Там, вроде, малость попроще
 
Цитата:

Сообщение от dr_Sash (Сообщение 164311)
А я вот, чего-то примерно такую схемку использую...

Наверное я - "неправильный" какой-то :)

http://basicelectronic.blogspot.com/...r-circuit.html
Или нет?

ArkaNN 01.08.2012 16:01

Re: Обработка сигнала механического энкодера
 
А если взять контроллер с QEI модулем, то там фильтры уже есть и они настраиваемые. Например в dsPIC такое видел и пробовал.

БОЦМАН 01.08.2012 19:10

Re: Там, вроде, малость попроще
 
Цитата:

Сообщение от Bill (Сообщение 164603)

Если использовать CLC, должно симпатично получиться.

picpicpic 10.08.2012 12:21

Re: Там, вроде, малость попроще
 
БОЦМАН на каком решении остановились?

n.c.u.x 10.08.2012 19:26

Re: Там, вроде, малость попроще
 
Извиняюсь, не хотел плодить в форуме кучу тем.
Кто-нибудь подскажет, в чем подвох вот таких энкодеров:
10 Pcs 12mm Shaft Rotary Encoder Switches Dia 6mm New
10 штук за 5 баксов (из них 4 - доставка). Может, там ресурс никакой? Или дребезг ужасный?

Eddy71 12.08.2012 01:03

Re: Там, вроде, малость попроще
 
Я себе такие купил - замечательно работают. За год пока ничего не сдохло. Да, мелкий дребезг при кручении есть. Но он есть и у именитых брендов. Так что ничего странного. А стоят дешево потому, что в комплекте ручек нет.

siargy 13.08.2012 09:16

Re: Там, вроде, малость попроще
 
Хе-хе, и у мну такие-же. 20 щелчков на оборот)
стоимость доставки там условная, надо смотреть на общую цену.

siargy 13.03.2014 15:36

Re: Там, вроде, малость попроще
 
промучался неделю пока приделал энкодер к меню настройки параметров.
в итоге оказалось все не так и сложно:
- крутелка по прерыванию от порта.
- по прерыванию таймера читается кнопка, и то что накручено.

Alexandr++ 13.03.2014 17:02

Re: Обработка сигнала механического энкодера
 
Цитата:

Сообщение от Марк (Сообщение 114594)
Применяю такой энкодер для ввода данных: http://www.platan.ru/pdf/datasheets/bourns/pec12.pdf

В связи с этим хотелось бы некоторых советов по алгоритму обработки. Применял разные варианты, однако сбойные ситуации (пропуски в основном) все таки проскакивают.
Дело в том, что в отличие от кнопок, можно очень медленно поворачивать вал и возникает длинный дребезг. Скорее всего это решается как то стандартно, однако я не нашел и не додумался... Пока не додумался... :)
Спасибо.

Дребезг легко фильтруется программно, а пропуски для приборного энкодера не критичны и не являются сбоями, ведь он не отслеживает точное положение какого-либо механизма.

Цитата:

Сообщение от tester (Сообщение 114603)
Так вал же не может разогнаться моментально. Следовательно быстрые импульсы при медленных оборотах нужно отсекать.
Плюс соседние импульсы имеют соизмеримую длительность, а дребезг хаотичен.

Эта дешевая (от 0.4 USD, хотя в платане розничная цена может быть иная ) модель энкодера имеет низкий ресурс, низую допустимую скорость и рассчитана для использования на валу ... приборной ручки :)

_MVA_ 17.03.2014 18:43

Re: Обработка сигнала механического энкодера
 
Вложений: 1
Цитата:

Сообщение от siargy (Сообщение 164285)
Добрый день, добрался и я до механического энкодера.
Сразу сделал как Марк писал выше по тексту, вобщем не получилось,
при вращении энкодера счетчик менял значение произвольным образом.
Подключил осцилограф глянул сигналы:
http://www.microchip.su/attachment.p...1&d=1343299323
Развернул осцилограмму и вывел на свободный вывод мк индикацию входа в прерывание, получается контроллер реагирует на "иголки".
Повесил кондер на выводы энкодера, паралельно замыкающемуся контакту, и все стало четко работать. Единственное смущает что энкодер закорачивает заряженный конденсатор, наверно правильнее подключать дополнительный резистор:
http://www.microchip.su/attachment.p...1&d=1343300032

Считаю, что програмно от шума сложно избавиться, каким-нибудь хитрым методом включения-выключения прерываний. RC-цепочка работает проще и стабильнее. Но может я что-то не так делаю?



Доброго времени суток всем. Думаю использование фильтра даст очень хороший эфект. А беспокоиться на счет закорачивания конденсатора через энкодер не стоит, так как стоит сопротивление на 100 ом. Я позавчера сваял макросы cо счетчиками на 1 байт и на 2 байта на asm в AVR Studio 4 для обработки энкодера, просто так, для души. Прокрутил в Proteus. На основе кода Грея. Видел я на этом форуме где используются комбинации двух входов.
Мне кажется что даже лишние импульсы при дребезге если и прибавяться, то тут же отнимуться, если позволит частота. Макрос можно использовать прямо в главном цикле. Для однобайтного счетчика время выполнения не более 90 us. Если у кого-то есть энкодер с платой хотелось бы, чтобы проверили будет ли дребезг влиять на счет? Дело в том, что инкремент или декремент счетчика идет при смене комбинаций сразу без задержек.(4 комбинации и 4 действия). Я выкладываю 2 проэкта АVR Studio и Proteus со всеми коментариями. Всем удачи.


Часовой пояс GMT +3, время: 19:45.

Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot