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

PIC18 и ручной энкодер

Подключил энкодер ( 20 импульсов на оборот)

Два канала Аи Б энкодера дают меандр, смещенный на 90 град

Делаю прерывание по спаду в А канале - запускаю опрос Б канала., если Б=0 то -1 в лево, если 1 то +1 в право.

все работает хорошо., только при вращении в лево пропускает счет - на 50 щелчков энкодера дает значение 42-44.

В право без пропусков.

Менял программу - давал при вращении в право вычитание - то же самое, ошибка не зависит от направления вращения

Делал задержку перед опросом Б ( в прерывании) не помогло.

В канале Б точно 0 - это и в описании энкодера и осц. кажет

Как побороть?

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


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

Софт коряво написан. Можно поискать готовую реализацию. Много уже обсуждалось.

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


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

в нете не нашел

Не верю. (с) Станиславский

К примеру: http://www.chipenable.ru/index.php/how-con...n/9-encoder-avr

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


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

Делаю прерывание по спаду в А канале - запускаю опрос Б канала., если Б=0 то -1 в лево, если 1 то +1 в право.

0 - это и в описании энкодера и осц. кажет

Как побороть?

 

Прерывание должно быть по обоим каналам, т.е. вам еще добавить канал Б и обработку канала А в нем;)

 

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


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

Надо ещё на дребезг посмотреть.

Вот именно.

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


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

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

Например так: прерывание по фронту канала А, подпрограмма обработки прерывания:

 

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;

}

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


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

Подключил энкодер ( 20 импульсов на оборот)

Два канала Аи Б энкодера дают меандр, смещенный на 90 град

Делаю прерывание по спаду в А канале - запускаю опрос Б канала., если Б=0 то -1 в лево, если 1 то +1 в право.

все работает хорошо., только при вращении в лево пропускает счет - на 50 щелчков энкодера дает значение 42-44.

В право без пропусков.

Менял программу - давал при вращении в право вычитание - то же самое, ошибка не зависит от направления вращения

Делал задержку перед опросом Б ( в прерывании) не помогло.

В канале Б точно 0 - это и в описании энкодера и осц. кажет

Как побороть?

 

Нужно одновременно читать сигналы А и Б. На отрезке "Делаю прерывание по спаду в А канале - запускаю опрос Б канала" у Вас А и Б считываются в разное время (хотя и короткое).

Я делаю два подряд считывания порта в разные регистры, а затем анализирую изменение битов в этих регистрах для определения направления.

 

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


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

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

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

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

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

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

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

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

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

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