реклама на сайте
подробности

 
 
> Опрос валкодера, Дребезг
Anjey_N
сообщение Nov 14 2007, 09:49
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 80
Регистрация: 12-01-07
Из: Энергодар Украина
Пользователь №: 24 374



Все привет!
Вопрос такой:
В системе стоит механический валкодер. Опрашиваю его я вот так

signed char ReadEncoder(void)
{
register signed char temp = 0;
encoder = (~PIN_Coder & 0x03);//i?iaa?yai PD0,PD1
if(status != encoder)
{
switch(encoder)
{
case 0:
if(status == 1) temp = 1;
else if(status == 2) temp = -1;
break;
case 1:
if(status == 3) temp = 1;
else if(status == 0) temp = -1;
break;
case 2:
if(status == 0) temp = 1;
else if(status == 3) temp = -1;
break;
case 3:
if(status == 2)temp = 1;
else if(status == 1) temp = -1;
break;
}
status = encoder;
}
return temp;
}
Єту программку скачал с нета. При медленном вращении валкодера показания на индикаторе меняются стабильно, а при быстром вращении - не изменяются.
Похоже на дребезг контактов. Как можно от этого избавиться?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
psw
сообщение Nov 14 2007, 13:24
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 8-06-06
Пользователь №: 17 866



похоже, что я писал этот кусок smile.gif как часто опрашиваешь валкодер?
Go to the top of the page
 
+Quote Post
Anjey_N
сообщение Nov 14 2007, 16:35
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 80
Регистрация: 12-01-07
Из: Энергодар Украина
Пользователь №: 24 374



Цитата(psw @ Nov 14 2007, 17:24) *
похоже, что я писал этот кусок smile.gif как часто опрашиваешь валкодер?


1 раз в 1 мсек
Go to the top of the page
 
+Quote Post
Anjey_N
сообщение Nov 15 2007, 08:27
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 80
Регистрация: 12-01-07
Из: Энергодар Украина
Пользователь №: 24 374



Валкодеры, их два, подключены по такой схеме

Длительность строба 2 мс

Вместе с валкодерами подключены и кнопки. Валкодеры опрашиваются, когда на их средний вывод приходит "0".
Опрос валкодера, если незадействованы кнопки 1раз в 12 мс

Прикрепленное изображение
Go to the top of the page
 
+Quote Post
alexander55
сообщение Nov 15 2007, 08:44
Сообщение #5


Бывалый
*****

Группа: Свой
Сообщений: 1 584
Регистрация: 7-08-07
Пользователь №: 29 615



Цитата(Anjey_N @ Nov 15 2007, 11:27) *
Опрос валкодера, если незадействованы кнопки 1раз в 12 мс

Прикрепленное изображение

Опрашивать надо чаще. Чем выше максимальная скорость, тем чаще.
Частота опроса д.б. более, чем в 2 раза больше скорости изменения показаний.
Теорема Котельникова- Шенона, однако. 07.gif
Go to the top of the page
 
+Quote Post
Anjey_N
сообщение Nov 15 2007, 15:24
Сообщение #6


Частый гость
**

Группа: Участник
Сообщений: 80
Регистрация: 12-01-07
Из: Энергодар Украина
Пользователь №: 24 374



Цитата(alexander55 @ Nov 15 2007, 12:44) *
Опрашивать надо чаще. Чем выше максимальная скорость, тем чаще.
Частота опроса д.б. более, чем в 2 раза больше скорости изменения показаний.
Теорема Котельникова- Шенона, однако. 07.gif



Боюсь, в моём случае это не сработает! Валкодер привязан к сканированию индикатора.
Схему нужно изменить, средний вывод посадить на "землю", тогда можно и скорость увеличить!

Цитата(Alex B._ @ Nov 15 2007, 12:40) *
Обязательно нужно через фильтр пропускать отсчеты. Ниже старый, но рабочий код. Сканируется раз в 200 мкс

Код
typedef struct __ENC_CB
{
    U08 phs_sample_period;

    U16 A_window;
    U16 B_window;

    U16 A_sum;
    U16 B_sum;

    U08 A_mask;
    U08 B_mask;

    U08 Current;
    U08 Previous;

    U08 State;

} ENC_CB;

ENC_CB ENC;

/* =================== */

void adsf (void)
{
    port = ENC_PORT;

    if (++ENC.phs_sample_period > (ENC_PHS_SAMPLE_PERIOD_VAL - 1))
    {
        ENC.phs_sample_period = 0;

        if (port & ENC_A_PIN)
        {
            ENC.A_sum++;
            ENC.A_window |= ENC.A_mask;
        }
        else
        {
            if (ENC.A_sum > 0)
                ENC.A_sum--;
            ENC.A_window &= ~ENC.A_mask;
        }

        ENC.A_mask <<= 1;
        if (ENC.A_mask == 0)
            ENC.A_mask = 1;

        if ((ENC.A_window & ENC.A_mask) &&
            (ENC.A_sum > 0)
           )
            ENC.A_sum--;

        if (port & ENC_B_PIN)
        {
            ENC.B_sum++;
            ENC.B_window |= ENC.B_mask;
        }
        else
        {
            if (ENC.B_sum > 0)
                ENC.B_sum--;
            ENC.B_window &= ~ENC.B_mask;
        }

        ENC.B_mask <<= 1;
        if (ENC.B_mask == 0)
            ENC.B_mask = 1;

        if ((ENC.B_window & ENC.B_mask) &&
            (ENC.B_sum > 0)
           )
            ENC.B_sum--;

        ENC.Current = ENC.Previous;

        if      (ENC.A_sum > 5)  ENC.Current |=  0x01;
        else if (ENC.A_sum < 2)  ENC.Current &= ~0x01;

        if      (ENC.B_sum > 5)  ENC.Current |=  0x02;
        else if (ENC.B_sum < 2)  ENC.Current &= ~0x02;

        if (!ENC.Current)
        {
            if (ENC.Previous == 0x01)
                ENC.State |= ENC_EVENT_UP;
            if (ENC.Previous == 0x02)
                ENC.State |= ENC_EVENT_DW;
        }

        ENC.Previous = ENC.Current;
    }
}



Спасибо за код, изучаю. Вы какой компилятор используете?
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Anjey_N   Опрос валкодера   Nov 14 2007, 09:49
|- - Alex B._   Обязательно нужно через фильтр пропускать отсчеты....   Nov 15 2007, 08:40
- - Kirill Frolov   Цитата(Anjey_N @ Nov 14 2007, 12:49) Вопр...   Nov 15 2007, 17:06
|- - Anjey_N   Спасибо, думаю   Nov 16 2007, 08:25
- - Anjey_N   Мне тут посоветовали применить компъютерную мышь...   Nov 16 2007, 15:45
- - 676038   Мой опыт смотри здесь: http://electronix.ru/forum/...   Nov 16 2007, 19:39
|- - Anjey_N   Ходил по ссылке, читал. Так вы закончили этот прое...   Nov 17 2007, 15:33
- - 676038   По ссылке выше во вложении есть весь проект на С (...   Nov 17 2007, 18:29
|- - Anjey_N   Цитата(676038 @ Nov 17 2007, 22:29) По сс...   Nov 18 2007, 17:44
- - Anjey_N   Я тут провёл один эксперимент. На макетке собрал с...   Nov 20 2007, 15:29
- - Anjey_N   Провёл следующий эксперимент. Результаты те же, пр...   Nov 20 2007, 17:54
- - 676038   Позволю себе маленькие замечания по коду: - При ин...   Nov 20 2007, 20:03
- - Anjey_N   Цитата(676038 @ Nov 21 2007, 00:03) А теп...   Nov 21 2007, 08:27


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 20:49
Рейтинг@Mail.ru


Страница сгенерированна за 0.01421 секунд с 7
ELECTRONIX ©2004-2016