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

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Russian to

Threaded View
                           Пpивет, All!


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


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

Re: обработка валкодера
                           Пpивет, Alex!

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

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

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

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

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

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

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

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

обработка валкодера
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.


обработка валкодера
                           Пpивет, Yuriy!

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

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

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

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

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

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

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

обработка валкодера
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, Юрий.


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

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


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

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

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


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

 И точно! ;)


                                                   Георгий


Re: обработка валкодера
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 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 delay1DE%LAY1;
int delay2DE%LAY2;
int delay3DE%LAY3;
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.

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

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

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

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

Alexey


обработка валкодера
Привет Vladislav!

Втp Июл 27 2004 22:14, Vladislav Baliasov -> Alex Torres:

 VB>>> Дальше закрываю прерывания на время антидребезга.
 AT>> Постой, что за валкодер?
 VB> А, я забыл сказать, что это механический контактный (PEC16 от Bourns).

 VB>>> все равно при пошаговом переборе не очень надежно.
Я имел дело с таким валкодеpом. Использовал опpос пpимеpно 500Гц и пpогpаммное
подавление дpебезга по обоим каналам. Все pаботает. Единственный недостаток - в
них плохая фиксация позиции, иногда останавливается на пол-шага и от вибpации
на одну из соседних позиций слетает.


Hа этом все, пока.
                                                 Anton Abrosimov.
... Hет повести печальнее на свете, чем повесть о заклинившем Reset'е

Re: обработка валкодера
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



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

Quoted text here. Click to load it

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

Аркадий

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

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

Re: обработка валкодера
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 23:27, Vladislav Baliasov wrote to Alex Torres:

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

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

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


                                                   Георгий


Re: обработка валкодера
Hемедленно нажми на RESET, Vladislav Baliasov!


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

  В общем случае, это ничего не означает. Кроме того, при быстром
кручении развивается, возможно, больший момент на оси валкодера, что
влияет в свою очередь на возникновение дребезга. Также возможно,
что при медленном вращении действительно имеют место колебания оси,
и это никакой не дребезг. Причин масса *даже чисто механических*.


обработка валкодера
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"


обработка валкодера
Hello, Vladislav Baliasov !

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


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


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


Re: обработка валкодера
                           П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 Baliasov !

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

 > INT2 @ MEGA8515

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

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

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

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

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

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

 > А если фильтровать, то прерывания вообще лишние выходят. Поскольку

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

 > состояние фильтрового регистра уже на руках в семплере, не вручную же
 > генерить прерывание ?

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

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


Site Timeline