Автор Тема: Енкодер...  (Прочитано 3643 раз)

0 Пользователей и 1 Гость просматривают эту тему.

AlKoR

  • Сообщений: 1896
  • GTLab - forever!
    • ICQ клиент - 350457696
    • Просмотр профиля
    • E-mail
Енкодер...
« : Января 21, 2008, 04:27:57 pm »
Написал в С++ функцию обработки энкодера, но иногда срабатывает в нету сторону. Энкодер имеет оду особенность, он фиксируется только когда контакт1 и контакт2 разомкнуты, а если повернуть ручку, он будет выдавать такой код:

00 - изначально разомкнуты,
01 - если влево
10 - если влево

или наоборот
00 - изначально разомкнуты,
10 - если вправо
01 - если вправо

фрагмент кода:
{  // функция обрабатывает энкодер, подключенный к линиям порда Д 0 и 1
int val1=0;
int val2=0; //флаги срабатывания контакта энкодера
int d;
if (PIND.0 ==1 && PIND.1 == 0) val1=1;
if (PIND.0 ==0 && PIND.1 == 1) val2=1;
d=0;  //флаг выхода из цикла  
if(val1==1 ) //если пришел сигнал с первого контакта
{while (d==0) //пока не пришел сигнал с друого контакта, ждать его
        {if (PIND.0 ==0 && PIND.1 == 1 && val1 == 1 ) {val2=0; d++;}
         if (PIND.0 ==1 && PIND.1 == 0 && val2 == 1 ) {val1=0; d++;}
        }
}
if(val2==1 )//если пришел сигнал с второго контакта
{while (d==0)//пока не пришел сигнал с друого контакта, ждать его

        {
         if (PIND.0 ==0 && PIND.1 == 1 && val1 == 1 ) {val2=0; d++;}
         if (PIND.0 ==1 && PIND.1 == 0 && val2 == 1 ) {val1=0; d++;}
        }
}
if (val1==1) {return 1;} //если сработало по первому контакту, вернуть 1
if (val2==1) {return 2;}//если сработало по второму контакту, вернуть 2

if (val1==0 && val2==0) return 0; //если небыло сигнала, вернуть 0
val1=0; val2=0; обнуление флагов
}

Вроде, работоспособность такого решения большая, но ошибается... Правда, только один раз. Может быть, функция вызывается тогда, когда валкодер вращается? Помогите...
Я - официальный воен категории "В" :)
хранилище гитарных схем
http://guitarschems.ex6.ru/index.php

Alex_SG

  • Сообщений: 3068
    • Просмотр профиля
    • E-mail
Re: Енкодер...
« Ответ #1 : Января 21, 2008, 05:59:59 pm »
не много не верно. надо отслеживать не код, а фазу следования импульсов. тогда никаких проскакиваний не будет.
энкодеры этого типа при вращении выдают импульсы а не код. при вращении фронт одного приходт с опережением.

AlKoR

  • Сообщений: 1896
  • GTLab - forever!
    • ICQ клиент - 350457696
    • Просмотр профиля
    • E-mail
Re: Енкодер...
« Ответ #2 : Января 21, 2008, 09:32:05 pm »
Для этого уже нужно работать с прерываниями МК, как я понимаю?

Но проблему решил - в начале поставил две строчки -
...
if (PINC.4==0) exit++;
if (PINC.5==0) exit++;
 Стал работать как положено (доволен как слон).

Если не трудно, выложите фрагмент кода с отслеживанием по фронту, заранее спасибо.
Я - официальный воен категории "В" :)
хранилище гитарных схем
http://guitarschems.ex6.ru/index.php

Alex_SG

  • Сообщений: 3068
    • Просмотр профиля
    • E-mail
Re: Енкодер...
« Ответ #3 : Января 22, 2008, 04:11:17 am »
эх, если бы я был програмером, то выложил бы :-)
а так - просто знаю как оно работает

shn

  • Гость
Re: Енкодер...
« Ответ #4 : Января 22, 2008, 07:48:28 am »
Эх, если б я умел программить МК, то выложил бы... :-)

А так - да, прерывание юзать нужно. Вроде у МК есть прерывания по сигналу с порта (мне казалось, есть такая штука). Ну вот на него и вешать.
« Последнее редактирование: Января 22, 2008, 07:49:57 am от shn »

AlKoR

  • Сообщений: 1896
  • GTLab - forever!
    • ICQ клиент - 350457696
    • Просмотр профиля
    • E-mail
Re: Енкодер...
« Ответ #5 : Января 22, 2008, 01:01:05 pm »
В конечном итоге количество внешних прерываний ограничено, поэтому желательно без них. Я пока мега8 пробую запрограмммировать.
Я - официальный воен категории "В" :)
хранилище гитарных схем
http://guitarschems.ex6.ru/index.php

shn

  • Гость
Re: Енкодер...
« Ответ #6 : Января 22, 2008, 01:27:09 pm »
Если энкодеров много, то можно использовать только одно прерывание. Простой сумматор со всех энкодеров (который выдает "1" при появлении сигнала хотя бы с одного энкодера), затем этот "суммированный" сигнал подается на отдельный порт, который вызывает прерывание. По прерыванию запускается процедура, считывающая сигналы со всех энкодеров и "выявляющая", который из них и куда был повернут.

Хм.. по правде сказать, я не совсем понимаю, как работает энкодер. Как регистрируется угол поворота? От него зависит задержка между импульсами или что?.. не совсем понимаю.

AlKoR

  • Сообщений: 1896
  • GTLab - forever!
    • ICQ клиент - 350457696
    • Просмотр профиля
    • E-mail
Re: Енкодер...
« Ответ #7 : Января 22, 2008, 02:24:01 pm »
энкодер - по сути, это механический переключатель без ограничения вращения, при вращении ручки замыкает пару контактов, причем замыкание одного из них сдвинуто по углу вращения, вследствие чего он выдает последовательность , соответствующая вращению, например:
00
10
11
01
00

как видно, первый бит просто опаздывает на один шаг, если крутить ручку в одну сторону, и будет спешить, если в другую ... Аааа, ну наконец-то до меня дошло... Верно говорят, поставь правильно задачу - и она будет решена :)
Хотя, с добавлением тех двух строчек, все работает без ошибок, как ни странно. Логика - страшная вещь, никогда не знаешь, куда она тебя заведет ...
Я - официальный воен категории "В" :)
хранилище гитарных схем
http://guitarschems.ex6.ru/index.php

AlKoR

  • Сообщений: 1896
  • GTLab - forever!
    • ICQ клиент - 350457696
    • Просмотр профиля
    • E-mail
Re: Енкодер...
« Ответ #8 : Января 22, 2008, 02:37:36 pm »
Я - официальный воен категории "В" :)
хранилище гитарных схем
http://guitarschems.ex6.ru/index.php

shn

  • Гость
Re: Енкодер...
« Ответ #9 : Января 22, 2008, 06:19:42 pm »
Спасибо за линк, все ясно стало сразу. Хм... там приведен и алгоритм обработки ;-)