обработка валкодера

Jul 27, 2004 27 Replies

Пpивет, All!


Что-то никак не могу правильно сделать. Делаю прерывание по отрицательному фронту одного из квадратурных сигналов, в момент прерывания анализирую состояние второго и по нему определяю направление. Дальше закрываю прерывания на время антидребезга. И все равно имею ложные срабатывания при медленном вращении. По даташиту при 15 rpm дребезг не больше 5 mS, делал антидребезг до



60 mS - все равно при пошаговом переборе не очень надежно. Терять импульсы при быстром вращении тоже не хочется. Как это сделать красиво и надежно, кто подскажет (только не теоретизирование, а практическое воплощение, так что VT и GS прошу не беспокоиться) ? Кроме аппаратного прерывания есть семплер 4 kHz, на нем сейчас и антидребезг.


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


Пpивет, Alex!

*** 27 Jul 04 22:23, Alex Torres wrote to Vladislav Baliasov:

VB>> Дальше закрываю прерывания на время антидребезга.

AT> Постой, что за валкодер?

А, я забыл сказать, что это механический контактный (PEC16 от Bourns).

VB>> все равно при пошаговом переборе не очень надежно.

AT> А что именно происходит? Ложные срабатывания или неправильное AT> определение направления (тьипа крутишь медленно вперед, идут импульсы AT> "вперед" а между ними кое-где проскакивает "назад") ?

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ именно.

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

Hello, Vladislav! You wrote to All on Tue, 27 Jul 2004 20:56:54 +0400:

VB> Пpивет, All!

VB> Что-то никак не могу правильно сделать. Делаю прерывание по VB> отрицательному фронту одного из квадратурных сигналов, в момент VB> прерывания анализирую состояние второго и по нему определяю VB> направление.

Аналогично.

VB> Дальше закрываю прерывания на время антидребезга.

Постой, что за валкодер?

VB> И все равно имею ложные срабатывания при медленном вращении. По VB> даташиту при 15 rpm дребезг не больше 5 mS, делал антидребезг до 60 mS - VB> все равно при пошаговом переборе не очень надежно.

А что именно происходит? Ложные срабатывания или неправильное определение направления (тьипа крутишь медленно вперед, идут импульсы "вперед" а между ними кое-где проскакивает "назад") ?

VB> Терять импульсы при быстром вращении тоже не хочется. Как это сделать VB> красиво и надежно, кто подскажет (только не теоретизирование, а VB> практическое воплощение, так что VT и GS прошу не беспокоиться) ?

:)

Валкодер какой? Настоящий или самодельный? У меня такие проблемки возникали с самодельными валкодерами (из шаговых двигателей к 5" дисководам). С н"настоящим", а также с полусамодельными оптическими (из старой мышки) - такого не возникало.

VB> Кроме аппаратного прерывания есть семплер 4 kHz, на нем сейчас и VB> антидребезг.

With best regards, Alex Torres. E-mail: snipped-for-privacy@yahoo.com

Пpивет, Alex!

*** 27 Jul 04 23:40, Alex Torres wrote to Vladislav Baliasov:

AT> Ага. Хотя для механического - странно, для самопального их шаговика - AT> понятно, если скопом посмотреть что там происходит. AT> В общем, я понял так: одим сигналом ты запускаешь прерывание, AT> блокируешь на некоторое время прерывания чтобы дребезг подавить. А в AT> какой момент ты проверяешь второй, ортогональный сигнал?

Сразу после входа в прерывание (возможная задержка незначительна).

AT> И по нему ты дребезг не давишь?

Hет. Предполагал, что обойдется.

AT> Тогда понятно почему "откат" наблюдается - ведь в зависимости от AT> скороти, между фронтами сигналов разное время - не AT> получается так. что ты налетаешь на дребезг второго сигнала ?

Рановато вроде как. Сомневаюсь. Проблема возникает именно при медленном вращении, если крутить быстро, то все чисто.

AT> Вообще - там аппаратно никак нельзя с дребезгом разобраться, прежде AT> чем на контролллер подавать?

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

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

Пpивет, Yuriy!

*** 27 Jul 04 22:58, Yuriy K wrote to Vladislav Baliasov:

VB>> ... VB>> Делаю прерывание по отрицательному фронту одного из квадратурных VB>> сигналов,

YK> Теперь представь, что будет в случае дребезга на положительном фронте.

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

YK> _Hадо_ обрабатывать оба фронта, а еще лучше - все четыре .

С какими временными параметрами ?

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

Tue Jul 27 2004 22:14, Vladislav Baliasov wrote to Alex Torres:

VB>>> Дальше закрываю прерывания на время антидребезга.

AT>> Постой, что за валкодер?

VB> А, я забыл сказать, что это механический контактный (PEC16 от Bourns).

VB>>> все равно при пошаговом переборе не очень надежно.

AT>> А что именно происходит? Ложные срабатывания или неправильное AT>> определение направления (тьипа крутишь медленно вперед, идут импульсы AT>> "вперед" а между ними кое-где проскакивает "назад") ?

VB> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ именно.

VB> ... VB> Делаю прерывание по отрицательному фронту одного из квадратурных VB> сигналов,

Теперь представь, что будет в случае дребезга на положительном фронте.

_Hадо_ обрабатывать оба фронта, а еще лучше - все четыре .

WBR, Yuriy.

Hello, Vladislav!

VB>>> Дальше закрываю прерывания на время антидребезга.

AT>> Постой, что за валкодер?

VB> А, я забыл сказать, что это механический контактный (PEC16 от VB> Bourns).

Честно говоря - с такими не сталкивался.

VB>>> все равно при пошаговом переборе не очень надежно.

AT>> А что именно происходит? Ложные срабатывания или неправильное AT>> определение направления (тьипа крутишь медленно вперед, идут AT>> импульсы "вперед" а между ними кое-где проскакивает "назад") ?

VB> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ именно.

Ага. Хотя для механического - странно, для самопального их шаговика - понятно, если скопом посмотреть что там происходит. В общем, я понял так: одим сигналом ты запускаешь прерывание, блокируешь на некоторое время прерывания чтобы дребезг подавить. А в какой момент ты проверяешь второй, ортогональный сигнал? И по нему ты дребезг не давишь? Тогда понятно почему "откат" наблюдается - ведь в зависимости от скороти, между фронтами сигналов разное время - не получается так. что ты налетаешь на дребезг второго сигнала ?

Вообще - там аппаратно никак нельзя с дребезгом разобраться, прежде чем на контролллер подавать?

With best regards, Alex Torres. E-mail: snipped-for-privacy@yahoo.com

Tue Jul 27 2004 23:55, Vladislav Baliasov wrote to Yuriy K:

VB>>> Делаю прерывание по отрицательному фронту одного из квадратурных VB>>> сигналов,

YK>> Теперь представь, что будет в случае дребезга на положительном фронте.

VB> Предполагалось, что это будет задавлено антидребезгом,

____ _____ _____ ____

1) __/ \/\___/ \_____/ \____/\/ \__ _____ _____ _____ _____ 2) \_____/ \_____/ \_____/ \_____

(a) (b) (a) (b) (a) (с)

Ты поборол дребезг в (а), но не в (b)

Если в момент (с) случится дребезг, то появится ложный отрицательный фронт, возникнет прерывание и будет прочитано неправильное значение 2)

Мое мнение: Просто читать состояние обоих каналов раз в TBD :) миллисекунд и сравнивать с предыдущим.

Прошлое текущее Изменение состояние состояние положения

1) 2) 1) 2) 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

VB> С какими временными параметрами ?

Это тебе виднее, смотря какой дребезг и скорости. Если у тебя 5мс, то можно читать раз в 10мс, наверно. Прерывания по фронтам не нужны и даже вредны. :) Хорошо бы иметь не менее 4 точек чтения на четверть периода. Тогда, даже если дребезг случится в момет чтения, то он будет скомпенсирован в следующем чтении, так как получится два перехода +1 -1.

P.S. Как раз пару месяцев назад боролись с квадратурными бесконтактными датчиками.

WBR, Юрий.

Tue Jul 27 2004 20:56, Vladislav Baliasov wrote to All:

VB> Что-то никак не могу правильно сделать. Делаю прерывание по VB> отрицательному фронту одного из квадратурных сигналов, в момент VB> прерывания анализирую состояние второго и по нему определяю направление. VB> Дальше закрываю прерывания на время антидребезга. И все равно имею ложные VB> срабатывания при медленном вращении.

Hаверное, происходят прерывания на дребезге по положительному фронту и ты их неправильно отрабатываешь.

VB> Кроме аппаратного прерывания есть семплер 4 kHz, на нем VB> сейчас и антидребезг.

Я делал без прерываний, просто по семплеру. Полезно анализировать все четыре фронта по двум сигналам - разрешение получается лучше.

VLV

"Terminator 2012 elections: Arnold Schwartzenegger vs Bill Gates"

Tue Jul 27 2004 22:14, Vladislav Baliasov wrote to Alex Torres:

VB> Пpивет, Alex!

VB> *** 27 Jul 04 22:23, Alex Torres wrote to Vladislav Baliasov:

VB>>> Дальше закрываю прерывания на время антидребезга.

AT>> Постой, что за валкодер?

VB> А, я забыл сказать, что это механический контактный (PEC16 от Bourns).

Ох помню я помучался с подобным механическим валкодером. Его чем медленнее вращаешь - дем сильнее дребезг. Причем длительность дребезга прои медленном вращении сопостовима с длительностью полезного сигнала при быстром. По-зорошему надо было делать частотно зависимый подавитель, но нехотелось возиться. Я сделал попроще, работало удовлитворительно. Hо при _очень_ быстром вращении иногда сбоило. Я ловил прерывание по нарастающему фронту от одного из сигналов, а потом прерывание запрещал и пользовался таймером чтобы несколько раз считать состояние и принять решение куда оно крутится когда дребезг прекратится. Вот кусок кода

//AB terminal state #define ST1 RW_A #define ST2 RW_B #define ST3 (ST1 | ST2) #define ST4 0

#define DELAY1 (3277 /12) //0.1 msec #define DELAY2 (3277 /15) //0.1 msec #define DELAY3 (3277 * 2) // 2 msec #define MAX_RETR 5

int delay1=DELAY1; int delay2=DELAY2; int delay3=DELAY3; int max_retr=MAX_RETR;

int gcount; int gstate;

int prev_dir=0;

//Timer interrupt handler

static void rwheel_timer_handler (int irq, void *dev_id, struct pt_regs

*regs) { if (gcount==0){ gstate=get_wstate(); // Get rotary weel state (ST1..ST4) set_wtimer_delay(delay2); //Set delay for next timer irq ++gcount; return; } if ((gcount<max_retr) & (gcount>0)){ if(gstate == get_wstate()) ++gcount; else gcount=0; set_wtimer_delay(delay2); return; } if (gcount==max_retr){ if((gstate==ST4) || (gstate==ST3)) do_ccw(); //direction 1 else if((gstate==ST1) || (gstate==ST2)) do_cw(); //direction 2 else printk("RW bogus state.\n"); gcount=0x00AAFF0B; //Set exit flag set_wtimer_delay(delay3); return; } if (gcount==0x00AAFF0B){ disable_wtimer_int(); enable_rw_irq(); //Enable rising edge interrupt from Rotary Wheel } enable_cpld_rw_irq(); }

// Rotary wheel interrupt handler, triggered by rising edge //We don't do much in this handler, just enable timer and disable RW interrupt // real work for reading RW state and rotation decoding is placed to the timer handler

static void gpio_rwheel_handler1 (int irq, void *data) {

disable_rw_irq(CPLD_IRQ_RW_RIS_EN); gcount=0; set_wtimer_delay(delay1); enable_wtimer_int (); }

/Sam [samoutin(ат)hotbox.ru]

Hello, Vladislav Baliasov !

Когда-то, очень давно, я имел подобный опыт с промышленным оптическим датчиком положения. Как датчик скорости триггер направления и счетчик импульсов давали приемлимые результаты, для датчика положения я тогда делал программное сэмплирование с максимально возможной частотой обеих фаз после чего по таблице с учетом предыдущего состояния инкрементировал, декрементировал или не менял соответсвующий счетчик. Все другие методы при медленном вращении (обенно покачивании туда-сюда) врали безбожно. Тогда я это сделал на отдельном 8088, ОЗУ которого при помощи механизма DMA было помещено в адресное пространство основного процессора 8086. Было это лет 10 назад...

С уважением, Дима Орлов.

Пpивет, Alex!

*** 28 Jul 04 08:48, Alex Torres wrote to Vladislav Baliasov:

AT>>> И по нему ты дребезг не давишь?

VB>> Hет. Предполагал, что обойдется.

AT> Попрообуй подавить оба. AT> Какой контроллер и какое прерывание используется?

INT2 @ MEGA8515

AT> У меня сейчас - по изменению ножки порта, т.е. я работаю по любому AT> фронту.

Может быть, так и ме было бы превильнее, хотя все равно не очень понятно, как в этом случае определять смену направления и отсчитывать щелчки в условиях дребезга и произвольной скорости.

VB>> Вероятно, начну с цифровой фильтрации сигнала "направление". А, VB>> возможно, стоит отфильтровать оба и вообще не работать по

AT> прерываниям...

AT> Я бы все-таки по прерываниям работал, но сигналы фильтровал.

А если фильтровать, то прерывания вообще лишние выходят. Поскольку состояние фильтрового регистра уже на руках в семплере, не вручную же генерить прерывание ? с уважением Владислав

Я помню что тут пролетала схемка такого валкодера из ШД но найти не могу - а попросили подкинуть. Нельзя ли ссылочку дать если есть?

Аркадий

Hello, Vladislav! AT>> В общем, я понял так: одим сигналом ты запускаешь прерывание, AT>> блокируешь на некоторое время прерывания чтобы дребезг подавить. А AT>> в какой момент ты проверяешь второй, ортогональный сигнал?

VB> Сразу после входа в прерывание (возможная задержка незначительна).

AT>> И по нему ты дребезг не давишь?

VB> Hет. Предполагал, что обойдется.

Попрообуй подавить оба. Какой контроллер и какое прерывание используется? У меня сейчас - по изменению ножки порта, т.е. я работаю по любому фронту.

AT>> Тогда понятно почему "откат" наблюдается - ведь в зависимости от AT>> скороти, между фронтами сигналов разное время - не получается так. AT>> что ты налетаешь на дребезг второго сигнала ?

VB> Рановато вроде как. Сомневаюсь. Проблема возникает именно при VB> медленном вращении, если крутить быстро, то все чисто.

Так там оно просто не успевает.

AT>> Вообще - там аппаратно никак нельзя с дребезгом разобраться, прежде AT>> чем на контролллер подавать?

VB> Аппаратно - нельзя (не хочу плодить корпусов, особенно VB> экзотических). Логику какого-нибудь MC14490 я и программно изображу. VB> Хотелось бы услышать конкретику от тех, кто решал именно такую VB> задачу.

Да я-то примерно такую и решал, только не с контактным валкодером.

VB> Вероятно, начну с цифровой фильтрации сигнала "направление". А, VB> возможно, стоит отфильтровать оба и вообще не работать по прерываниям...

Я бы все-таки по прерываниям работал, но сигналы фильтровал.

With best regards, Alex Torres. E-mail: snipped-for-privacy@yahoo.com

Vladislav, ты ещё здесь сидишь?

Вторник Июль 27 2004 20:56, Vladislav Baliasov wrote to All:

VB> Что-то никак не могу правильно сделать. Делаю прерывание по VB> отрицательному фронту одного из квадратурных сигналов,

"Hеправильно ты, дядя Фёдор, бутерброд держишь!" (c)

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

VB> в момент прерывания анализирую состояние второго и по нему определяю VB> направление.

Если датчик будет флуктуировать возле положения, при котором меняется состояние сигнала, по которому ты вырабатываешь прерывание - ерунда у тебя получится!

VB> Дальше закрываю прерывания на время антидребезга. И все равно имею VB> ложные срабатывания при медленном вращении.

Дык! ;-)))

VB> По даташиту при 15 rpm дребезг не больше 5 mS, делал антидребезг до VB> 60 mS - все равно при пошаговом переборе не очень надежно. Терять VB> импульсы при быстром вращении тоже не хочется. Как это сделать VB> красиво и надежно, кто подскажет (только не теоретизирование, а VB> практическое воплощение, так что VT и GS прошу не беспокоиться) ?

Я собирался тебе рассказать нормальное практическое воплощение, но раз ты настаиваешь - не буду, заодно время сэкономлю... Мучайся из вредности ;)

Георгий

Vladislav, ты ещё здесь сидишь?

Вторник Июль 27 2004 23:27, Vladislav Baliasov wrote to Alex Torres:

VB> Аппаратно - нельзя (не хочу плодить корпусов, особенно экзотических). VB> Логику какого-нибудь MC14490 я и программно изображу. Хотелось бы VB> услышать конкретику от тех, кто решал именно такую задачу. Вероятно, VB> начну с цифровой фильтрации сигнала "направление". А, возможно, стоит VB> отфильтровать оба и вообще не работать по прерываниям...

"Hормальные герои всегда идут в обход" (c)

Почитал бы для начала про цифровые автоматы, что ли? Типичная задачка на переходы системы между 4-мя состояниями...

Георгий

Yuriy, ты ещё здесь сидишь?

Среда Июль 28 2004 03:04, Yuriy K wrote to Vladislav Baliasov:

YK> Мое мнение: YK> Просто читать состояние обоих каналов раз в TBD :) миллисекунд и YK> сравнивать с предыдущим.

А, вижу, ты уже с этим дело имел.

YK> P.S. Как раз пару месяцев назад боролись с квадратурными YK> бесконтактными датчиками.

И точно! ;)

Георгий

Hello Vladislav.

27 Jul 04 21:14, you wrote to Alex Torres:

VB> А, я забыл сказать, что это механический контактный (PEC16 от Bourns). AT>> импульсы "вперед" а между ними кое-где проскакивает "назад") ? VB> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ именно.

О. У меня точно тоже самое. Только антидребезг не программный, а конденсатором.

В принципе, я забил на такие глюки. Hо если кто расскажет хороший алгоритм, то может и реализую.

Alexey

Hello Vladislav!

27 Jul 04 20:56, you wrote to All:

VB> Что-то никак не могу правильно сделать. Делаю прерывание по VB> отрицательному фронту одного из квадратурных сигналов, в момент Делай прерывание по любому фронту любого сигнала. Дальше делай переход по предыдущим 2 битам и текущим 2 битам и по таблице прибавляй значение к счетчику угла поворота. Hаконец, засылай текущие в предыдущие. В этом случае даже при дребезге данные будут всегда корректны - ну будет дрожать счетчик на 1 бит, и черт с ним. Этак: ПрТк

0000 ноп 0001 +1 0010 -1 0011 недопустимое значение, игнорировать 0100 -1 0101 ноп 0110 недоп - игн итд

Для уменьшения лишнего дребезга задержка 5 мс от прерывания до считывания или, лучше, три считывания с задержкой по 5 мс между считываниями и мажоритирование не помешает. VB> есть семплер 4 kHz, на нем сейчас и антидребезг.

Тогда вызывать считывание с частотой 4 кгц и обрабатывать валкодер всегда.

Anatoly

Hello, Vladislav Baliasov !

По таблице состояний, как тебе уже писали. Лишь бы успевали обрабатываться прерывания. Хотя по-моему, сэмплирование с заведомо достаточной для максимальной скорости частотой надежнее.

Hу и что? А если не фильтровать, то их куда больше.

Таймером например, если по изменению состояния ножек нельзя (кажется в AVR нет такого режима).

С уважением, Дима Орлов.

Join the Discussion

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

Didn't find your answer?

Ask the community — no account required