Перейти к содержанию
    

А какие у вас номиналы, ну или пост. времени.

Я попробовал, что-то у меня дребезг не давит, а импульсы , при быстрм вращении валятся в половину.

При быстром вращении длина импульса становится настолько мала, что RC-цепочка "давит" амплитуду импульсов. Вот и получается пропуск. RC-цепочка хороша для механических энкодеров, предназначенных для управления приборами. Там частота вращения ротора низка, а длительность импульсов при вращении много больше длительности импульсов дребезга. И при расчете постоянной времени не возникает проблем. Тогда RC-цепь эффективна. В остальных случаях спасает поллинг. По-крайней мере я пришел к такому выводу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А какие у вас номиналы, ну или пост. времени.

Я попробовал, что-то у меня дребезг не давит, а импульсы , при быстрм вращении валятся в половину.

Ничего удивительного - бороться с дребезгом механических энкодеров RC-цепочками это идиотизм. С бубном вокруг поплясать - и то больше толку. Надо сделать автомат состояний, забирая выборки либо по прерываниям (от обоих каналов энкодера), либо поллингом с достаточно высокой частотой. Дальше все просто, имеем два значения в текущий момент и два те же самые, но на предыдущей выборке. Всего 16 комбинаций. Их декодируем в три варианта - счетчик в "+", в "-" либо ничего не делать. Для большинства энкодеров один щелчок - сдвиг счетчика на 4 либо на 2 (реже). Выборку обработали, сдвинули "историю" и так дальше. Я использовал выборку 4 kHz, энкодер PEC16. Ошибка на шаг при резких рывках вперед-назад - событие редчайшее, при вращении в одну сторону вообще никаких проблем.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дальше все просто, имеем два значения в текущий момент и два те же самые, но на предыдущей выборке. Всего 16 комбинаций. Их декодируем в три варианта - счетчик в "+", в "-" либо ничего не делать. Для большинства энкодеров один щелчок - сдвиг счетчика на 4 либо на 2 (реже). Выборку обработали, сдвинули "историю" и так дальше. Я использовал выборку 4 kHz, энкодер PEC16. Ошибка на шаг при резких рывках вперед-назад - событие редчайшее, при вращении в одну сторону вообще никаких проблем.

Энкодер такой .

У Чана тоже самое:

volatile struct {
    long position;  
    int moved;      
} Encoder;


void sample_encoder(void)
{
    static const int dir[] = { 0,1,-1,0,-1,0,0,1,1,0,0,-1,0,-1,1,0 }; 
    static int i;                          
    int n;


    i = (i << 2) + (PA.PIN.BYTE & 3);   
    n = dir[i & 15];                   
    if (n) {                            
        Encoder.position += n;
        Encoder.moved = 1;
    }
}

 

Что-то написано про 1 кГц, я с такой частотой опрашивал его. Нифига не работает, скачет непредсказуемо.

Или надо эту функцию вызывать, получив стабильные данные?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

rv3dll(lex), есть такой вариант, правда на verilog.

http://www.fpga4fun.com/SerialInterface4.html

После слов: «We filter the data, so that short spikes...»

Он интуитивно понятнее и существенно проще описан.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...