Цитата(alexander55 @ Nov 15 2007, 12:44)

Опрашивать надо чаще. Чем выше максимальная скорость, тем чаще.
Частота опроса д.б. более, чем в 2 раза больше скорости изменения показаний.
Теорема Котельникова- Шенона, однако.

Боюсь, в моём случае это не сработает! Валкодер привязан к сканированию индикатора.
Схему нужно изменить, средний вывод посадить на "землю", тогда можно и скорость увеличить!
Цитата(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;
}
}
Спасибо за код, изучаю. Вы какой компилятор используете?