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

Пpивет, All!

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

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

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

Reply to
Vladislav Baliasov
Loading thread data ...

Пpивет, Alex!

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

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

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

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

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

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

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

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

Reply to
Vladislav Baliasov

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

Reply to
Alex Torres

П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 я и программно изображу. Хотелось бы услышать конкретику от тех, кто решал именно такую задачу. Вероятно, начну с цифровой фильтрации сигнала "направление". А, возможно, стоит отфильтровать оба и вообще не работать по прерываниям...

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

Reply to
Vladislav Baliasov

Пpивет, Yuriy!

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

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

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

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

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

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

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

Reply to
Vladislav Baliasov

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.

Reply to
Yuriy K

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

Reply to
Alex Torres

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, Юрий.

Reply to
Yuriy K

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"

Reply to
Vladimir Vassilevsky

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]

Reply to
Alex Samutin

Hello, Vladislav Baliasov !

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

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

Reply to
Dima Orlov

П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> Я бы все-таки по прерываниям работал, но сигналы фильтровал.

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

Reply to
Vladislav Baliasov

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

Аркадий

Reply to
Arcady Schekochikhin

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

Reply to
Alex Torres

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 прошу не беспокоиться) ?

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

Георгий

Reply to
George Shepelev

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

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

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

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

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

Георгий

Reply to
George Shepelev

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

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

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

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

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

И точно! ;)

Георгий

Reply to
George Shepelev

Hello Vladislav.

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

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

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

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

Alexey

Reply to
Alexey Boyko

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

Reply to
Anatoly Mashanov

Hello, Vladislav Baliasov !

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

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

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

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

Reply to
Dima Orlov

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.