Do you have a question? Post it now! No Registration Necessary
- Vladislav Baliasov
July 27, 2004, 4:56 pm

Пpивет, All!
Что-то никак не могу правильно сделать. Делаю прерывание по отрицательному
фронту одного из квадратурных сигналов, в момент прерывания анализирую
состояние второго и по нему определяю направление. Дальше закрываю прерывания
на время антидребезга. И все равно имею ложные срабатывания при медленном
вращении. По даташиту при 15 rpm дребезг не больше 5 mS, делал антидребезг до
60 mS - все равно при пошаговом переборе не очень надежно. Терять импульсы при
быстром вращении тоже не хочется. Как это сделать красиво и надежно, кто
подскажет (только не теоретизирование, а практическое воплощение, так что VT и
GS прошу не беспокоиться) ? Кроме аппаратного прерывания есть семплер 4 kHz, на
нем сейчас и антидребезг.
с уважением Владислав
Что-то никак не могу правильно сделать. Делаю прерывание по отрицательному
фронту одного из квадратурных сигналов, в момент прерывания анализирую
состояние второго и по нему определяю направление. Дальше закрываю прерывания
на время антидребезга. И все равно имею ложные срабатывания при медленном
вращении. По даташиту при 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> "вперед" а между ними кое-где проскакивает "назад") ?
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ именно.
с уважением Владислав
*** 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.
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адо_ обрабатывать оба фронта, а еще лучше - все четыре .
С какими временными параметрами ?
с уважением Владислав
*** 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, Юрий.
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
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]
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
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'е
Вт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
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: обработка валкодера
П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 я и программно изображу. Хотелось бы услышать конкретику
от тех, кто решал именно такую задачу. Вероятно, начну с цифровой фильтрации
сигнала "направление". А, возможно, стоит отфильтровать оба и вообще не
работать по прерываниям...
с уважением Владислав
*** 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
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> вращении, если крутить быстро, то все чисто.
В общем случае, это ничего не означает. Кроме того, при быстром
кручении развивается, возможно, больший момент на оси валкодера, что
влияет в свою очередь на возникновение дребезга. Также возможно,
что при медленном вращении действительно имеют место колебания оси,
и это никакой не дребезг. Причин масса *даже чисто механических*.
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"
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 назад...
С уважением, Дима Орлов.
> Что-то никак не могу правильно сделать. Делаю прерывание по
> отрицательному
> фронту одного из квадратурных сигналов, в момент прерывания
> анализирую
> состояние второго и по нему определяю направление. Дальше закрываю
> прерывания
> на время антидребезга. И все равно имею ложные срабатывания при
> медленном вращении.
Когда-то, очень давно, я имел подобный опыт с промышленным оптическим датчиком
положения. Как датчик скорости триггер направления и счетчик импульсов давали
приемлимые результаты, для датчика положения я тогда делал программное
сэмплирование с максимально возможной частотой обеих фаз после чего по таблице
с учетом предыдущего состояния инкрементировал, декрементировал или не менял
соответсвующий счетчик. Все другие методы при медленном вращении (обенно
покачивании туда-сюда) врали безбожно. Тогда я это сделал на отдельном 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> Я бы все-таки по прерываниям работал, но сигналы фильтровал.
А если фильтровать, то прерывания вообще лишние выходят. Поскольку состояние
фильтрового регистра уже на руках в семплере, не вручную же генерить прерывание
?
с уважением Владислав
*** 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 нет
такого режима).
С уважением, Дима Орлов.
> AT> Попрообуй подавить оба.
> AT> Какой контроллер и какое прерывание используется?
> INT2 @ MEGA8515
> AT> У меня сейчас - по изменению ножки порта, т.е. я работаю по любому
> AT> фронту.
> Может быть, так и ме было бы превильнее, хотя все равно не очень
> понятно, как в
> этом случае определять смену направления и отсчитывать щелчки в
> условиях дребезга и произвольной скорости.
По таблице состояний, как тебе уже писали. Лишь бы успевали обрабатываться
прерывания. Хотя по-моему, сэмплирование с заведомо достаточной для
максимальной скорости частотой надежнее.
> VB>> Вероятно, начну с цифровой фильтрации сигнала "направление". А,
> VB>> возможно, стоит отфильтровать оба и вообще не работать по
> AT> прерываниям...
> AT> Я бы все-таки по прерываниям работал, но сигналы фильтровал.
> А если фильтровать, то прерывания вообще лишние выходят. Поскольку
Hу и что? А если не фильтровать, то их куда больше.
> состояние фильтрового регистра уже на руках в семплере, не вручную же
> генерить прерывание ?
Таймером например, если по изменению состояния ножек нельзя (кажется в AVR нет
такого режима).
С уважением, Дима Орлов.
Site Timeline
- » Выбор аналога PIC12C509
- — Next thread in » Microcontrollers (Russian)
-
- » EWAVR v3.20A вопрос по компилятору
- — Previous thread in » Microcontrollers (Russian)
-
- » По моему это гениально
- — Newest thread in » Microcontrollers (Russian)
-
- » Suche nach Steckverbindung?
- — The site's Newest Thread. Posted in » Electronics (German)
-
- » (PDF) Illustrated Anatomy of the Head and Neck 5th Edition by Fehrenbach
- — The site's Last Updated Thread. Posted in » Electronics (Polish)
-