haker_fox 61 1 августа, 2009 Опубликовано 1 августа, 2009 · Жалоба А какие у вас номиналы, ну или пост. времени. Я попробовал, что-то у меня дребезг не давит, а импульсы , при быстрм вращении валятся в половину. При быстром вращении длина импульса становится настолько мала, что RC-цепочка "давит" амплитуду импульсов. Вот и получается пропуск. RC-цепочка хороша для механических энкодеров, предназначенных для управления приборами. Там частота вращения ротора низка, а длительность импульсов при вращении много больше длительности импульсов дребезга. И при расчете постоянной времени не возникает проблем. Тогда RC-цепь эффективна. В остальных случаях спасает поллинг. По-крайней мере я пришел к такому выводу. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rx3apf 0 1 августа, 2009 Опубликовано 1 августа, 2009 · Жалоба А какие у вас номиналы, ну или пост. времени. Я попробовал, что-то у меня дребезг не давит, а импульсы , при быстрм вращении валятся в половину. Ничего удивительного - бороться с дребезгом механических энкодеров RC-цепочками это идиотизм. С бубном вокруг поплясать - и то больше толку. Надо сделать автомат состояний, забирая выборки либо по прерываниям (от обоих каналов энкодера), либо поллингом с достаточно высокой частотой. Дальше все просто, имеем два значения в текущий момент и два те же самые, но на предыдущей выборке. Всего 16 комбинаций. Их декодируем в три варианта - счетчик в "+", в "-" либо ничего не делать. Для большинства энкодеров один щелчок - сдвиг счетчика на 4 либо на 2 (реже). Выборку обработали, сдвинули "историю" и так дальше. Я использовал выборку 4 kHz, энкодер PEC16. Ошибка на шаг при резких рывках вперед-назад - событие редчайшее, при вращении в одну сторону вообще никаких проблем. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
muravei 3 5 августа, 2009 Опубликовано 5 августа, 2009 · Жалоба Дальше все просто, имеем два значения в текущий момент и два те же самые, но на предыдущей выборке. Всего 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 кГц, я с такой частотой опрашивал его. Нифига не работает, скачет непредсказуемо. Или надо эту функцию вызывать, получив стабильные данные? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x736C 0 5 августа, 2009 Опубликовано 5 августа, 2009 · Жалоба rv3dll(lex), есть такой вариант, правда на verilog. http://www.fpga4fun.com/SerialInterface4.html После слов: «We filter the data, so that short spikes...» Он интуитивно понятнее и существенно проще описан. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться