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

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

Марк 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:58.

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