Как опросить валкодер ALPS

May 04, 2006 4 Replies

Приветствую, All! Попался ко мне в руки валкодер с дополнительной кнопкой на валу. Сзади надпись: "ALPS Japan". Никаких других опознавательных знаков нет. Подключил я его вместо валкодера с оптопарами. И тут начались чудеса... Видимо, сигналы у него на выходах не такие, как у нормальных... А осциллографа сейчас под рукой нет. Кто знает, что это за зверь и как его опрашивать? В данный момент опрос валкодера ведется стандартным способом - ловлю перепад 0->1 на одном из выходов валкодера и проверяю состояние второго выхода. По состоянию последнего делается вывод о том, в какую сторону произошел поворот.



Заранее спасибо!


Пpивет, Владимир!

*** 04 May 06 20:57, Владимир Соломийчук wrote to All:

ВС> Попался ко мне в руки валкодер с дополнительной кнопкой на валу. ВС> Сзади надпись: "ALPS Japan". Hикаких других опознавательных ВС> знаков нет. Подключил я его вместо валкодера с оптопарами. И тут ВС> начались чудеса... Видимо, сигналы у него на выходах не такие, как у ВС> нормальных...

Просто у него дребезг на фронтах большой, только и всего. Проблема всех механических энкодеров.

ВС> А осциллографа сейчас под рукой нет. Кто знает, что это ВС> за зверь и как его опрашивать?

Машина состояний. По любому изменению уровней на входах (прерыванием от изменения или просто опросом) считать состояния, и, используя эти и считанные на предыдущем цикле опроса состояния (всего четыре бита) принять решение - крутим счетчик вперед, назад или не крутим вообще. Проверено, не теряет и не насчитывает лишнего. Hо счетчик считает каждое изменение состояние, поэтому надо "списывать" из него двойками или четверками (зависит от типа энкодера).

с уважением Владислав

Приветствую Вас, Владимир!

Однажды 04 Мая 06 в 20:57, Владимир Соломийчук писал(а) к All...

ВС> Попался ко мне в руки валкодер с дополнительной кнопкой на валу. ВС> Сзади надпись: "ALPS Japan". Hикаких других опознавательных ВС> знаков нет. Подключил я его вместо валкодера с оптопарами. И тут ВС> начались чудеса... Видимо, сигналы у него на выходах не такие, как у ВС> нормальных... А осциллографа сейчас под рукой нет. Кто знает, что это ВС> за зверь и как его опрашивать? В данный момент опрос валкодера ведется ВС> стандартным способом - ловлю перепад 0->1 на одном из выходов ВС> валкодера и проверяю состояние второго выхода. По состоянию последнего ВС> делается вывод о том, в какую сторону произошел поворот. ВС>

По таблице, путем игноpиpования неpеальных сочетаний, тогда и дpебезг сpазу отсекается. Hе очень давно об этом много говоpили. Вот так:

previos current decode result 0 0 0 0 0 0 0 0 1 +1 0 0 1 0 -1 0 0 1 1 err

0 1 0 0 -1 0 1 0 1 0 0 1 1 0 err 0 1 1 1 +1 1 0 0 0 +1 1 0 0 1 err 1 0 1 0 0 1 0 1 1 -1 1 1 0 0 err 1 1 0 1 -1 1 1 1 0 +1 1 1 1 1 0

В одном моем пpоекте PIC12F629 4МГц intRC_OSC легко спpавляется с такой задачей и по двум пpоводам пеpесылает в "центpальный пpоцессоp". Что Alps, что Bourns и именно с кнопкой. Раньше вообще PIC12C508 стоял, но я нечаянно убил 2 отладочных кpисталла и отказался от PIC12C совсем.

С уважением, Виталий.

... -|O|-

Привет Владимир!

04 Май 06 года (а было тогда 20:57) Владимир Соломийчук в своем письме к All писал:

ВС> за зверь и как его опрашивать? В данный момент опрос валкодера ведется ВС> стандартным способом - ловлю перепад 0->1 на одном из выходов ВС> валкодера и проверяю состояние второго выхода. По состоянию последнего ВС> делается вывод о том, в какую сторону произошел поворот.

Я тоже так делал, но один раз попался вокодер с некоторой не идеальностью :

нормальный ----____----____----____----____ --____----____----____----____--

не идеальный ----____----____----____----____ ----___-----___-----___-----___--

ну или приблизительно так, вобщем при вращении в одну из сторон, полярность импульсов менялась практически одновременно.

Вот такой код работал :

================ кут =============== bit Vok_A @ (unsigned)&PORTA*8+4 ; // Hога вокодера 1 bit Vok_B @ (unsigned)&PORTA*8+5 ; // Hога вокодера 2

unsigned char Y_Offset; // смещение

bit Vok_Tmp; // для вокодера

================ кут ===============

// Вызывается через каждые 6.5 мС в прерывании if (Vok_Tmp != Vok_B){ DelayUs(250); // антидребезг if (Vok_B != Vok_A){ Y_Offset++; // вправо }else{ Y_Offset--; // влево } Vok_Tmp = Vok_B; }

================ кут ===============

Можно попробовать количество шагов вдвое увеличить, если еще по второй ноге похожую конструкцию пристроить.

С уважением, Andrey 06 Май 06 года

formatting link
E-Mail:a_biv<саба>list,ru Jabber:Andrey_B@jabber,ru |СQ:226793191

Приветствую, Виталий!

Спасибо за подсказку! Пробовал сделать так, как ты написал, но не получилось. Сделал немного по-другому и все заработало. Вот исходник:

;******************************************************************* ; Обработчик прерываний ;******************************************************************* IRQS bcf INTCON,GIE ; Отключаем прерывания bcf INTCON,INTF ; Сбрасываем флаг от INT0

bsf STATUS,RP0 ; Банк 1 btfss OPTION_REG,6 ; goto $+3 ; bcf OPTION_REG,6 ; goto $+2 ; bsf OPTION_REG,6 ; bcf STATUS,RP0 ; Банк 0

movwf STORE_W ; Сохраняем регистры W swapf STATUS,0 ; и STATUS clrf STATUS ; в буферных movwf STORE_S ; регистрах ;------------------------------------------------------------------- ; Действия по обработке прерывания от INT0 ;------------------------------------------------------------------- bsf STATUS,RP0 ; Банк 1 btfsc OPTION_REG,6 ; goto PER1 ;

PER0 bcf STATUS,RP0 ; Банк 0 bcf TICKS,7 ; incf TICKS,1 ;

bsf TICKS,7 ; btfsc PORTB,1 ; bcf TICKS,7 ;

goto ENDIRQ ;

PER1 bcf STATUS,RP0 ; Банк 0 bcf TICKS,7 ; incf TICKS,1 ;

btfsc PORTB,1 ; bsf TICKS,7 ; ;------------------------------------------------------------------- ENDIRQ swapf STORE_S,0 ; Восстанавливаем регистры movwf STATUS ; W и STATUS из буферов swapf STORE_W,1 ; swapf STORE_W,0 ; и выходим retfie ; из обработчика прерываний

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required