dim371 0 28 января, 2011 Опубликовано 28 января, 2011 · Жалоба Подключил энкодер ( 20 импульсов на оборот) Два канала Аи Б энкодера дают меандр, смещенный на 90 град Делаю прерывание по спаду в А канале - запускаю опрос Б канала., если Б=0 то -1 в лево, если 1 то +1 в право. все работает хорошо., только при вращении в лево пропускает счет - на 50 щелчков энкодера дает значение 42-44. В право без пропусков. Менял программу - давал при вращении в право вычитание - то же самое, ошибка не зависит от направления вращения Делал задержку перед опросом Б ( в прерывании) не помогло. В канале Б точно 0 - это и в описании энкодера и осц. кажет Как побороть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skripach 6 29 января, 2011 Опубликовано 29 января, 2011 · Жалоба Софт коряво написан. Можно поискать готовую реализацию. Много уже обсуждалось. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dim371 0 29 января, 2011 Опубликовано 29 января, 2011 · Жалоба Может дадите ссылочки - в нете не нашел Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
skripach 6 29 января, 2011 Опубликовано 29 января, 2011 · Жалоба в нете не нашел Не верю. (с) Станиславский К примеру: http://www.chipenable.ru/index.php/how-con...n/9-encoder-avr Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kolia 0 1 февраля, 2011 Опубликовано 1 февраля, 2011 · Жалоба Делаю прерывание по спаду в А канале - запускаю опрос Б канала., если Б=0 то -1 в лево, если 1 то +1 в право. 0 - это и в описании энкодера и осц. кажет Как побороть? Прерывание должно быть по обоим каналам, т.е. вам еще добавить канал Б и обработку канала А в нем;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 1 февраля, 2011 Опубликовано 1 февраля, 2011 · Жалоба Надо ещё на дребезг посмотреть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 1 февраля, 2011 Опубликовано 1 февраля, 2011 · Жалоба Надо ещё на дребезг посмотреть. Вот именно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
marser1986 0 1 марта, 2011 Опубликовано 1 марта, 2011 · Жалоба Если проблема всплывает при вычитании, попробуйте постоянно его(вычитание) не использовать. Например так: прерывание по фронту канала А, подпрограмма обработки прерывания: N++; if(Channel_b=1) R++; //при вращении вправо R++, при вращении влево L++; N - количество прерываний. else L++; if(N==50) ///Когда прошло 50 импульсов, вычисляем на сколько изменилось расстояние, используя вычитание. { Length=Length+R-L; N=0; //обнуляем счётчики. R=0; L=0; } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Kolia 0 2 марта, 2011 Опубликовано 2 марта, 2011 · Жалоба А лучше всего вообще убрать вычитание из прерывания :smile3046: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VVD_2 0 15 мая, 2011 Опубликовано 15 мая, 2011 · Жалоба Подключил энкодер ( 20 импульсов на оборот) Два канала Аи Б энкодера дают меандр, смещенный на 90 град Делаю прерывание по спаду в А канале - запускаю опрос Б канала., если Б=0 то -1 в лево, если 1 то +1 в право. все работает хорошо., только при вращении в лево пропускает счет - на 50 щелчков энкодера дает значение 42-44. В право без пропусков. Менял программу - давал при вращении в право вычитание - то же самое, ошибка не зависит от направления вращения Делал задержку перед опросом Б ( в прерывании) не помогло. В канале Б точно 0 - это и в описании энкодера и осц. кажет Как побороть? Нужно одновременно читать сигналы А и Б. На отрезке "Делаю прерывание по спаду в А канале - запускаю опрос Б канала" у Вас А и Б считываются в разное время (хотя и короткое). Я делаю два подряд считывания порта в разные регистры, а затем анализирую изменение битов в этих регистрах для определения направления. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться