Отговори на тема  [ 28 мнения ]  Отиди на страница Предишна  1, 2
Rotary encoder 
Автор Съобщение
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Чет Ное 20, 2008 1:49 pm
Мнения: 276
Местоположение: Бургас
Мнение 
Чак пък 16 !?
Аз го правя не с таблица, а със сравняване. В края на краищата на теб ти трябват 4 от тези 16 състояния. Ако сравняванията не ми съвпаднат с никое от тези четири състояния, изпадам в грешка и игнорирам. Самото сравнение ми заема по-малко код отколкото таблицата.

_________________
Digitally yours: Optron


Вто Окт 26, 2010 10:58 am
Профил
Ранг: Почетен член
Ранг: Почетен член

Регистриран на: Пет Яну 22, 2010 5:46 pm
Мнения: 680
Мнение 
Добре, де. В мишките е пълно с оптронни енкодери. Няма ли ги в подходящ за монтиране вид на пазара. Едва ли е чак такава философия. Пък и по-лесно се чете по начина както съм го направил аз - едно прекъсване и един бит за посока.

_________________
PIC SPBRG values calculator


Нед Окт 31, 2010 3:19 am
Профил WWW
Ранг: Ориентиран
Ранг: Ориентиран

Регистриран на: Чет Ное 20, 2008 1:49 pm
Мнения: 276
Местоположение: Бургас
Мнение 
В мишките всичко виси по платката. Разглобявал съм, виждал съм. Такива готови в единен корпус не съм виждал.
А действително това с прекъсването е най-лесно реализируемото от софтуерна гледна точка.

_________________
Digitally yours: Optron


Съб Ное 06, 2010 9:37 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Сря Юли 11, 2007 10:16 am
Мнения: 1730
Мнение Четене на механичен енкодер
Прилагам ви един код, който доста успешно се справя с четенето на механични енкодери и е малък по обем.
Примера е реализиран за атмел контролери (atxmega), но съм убеден, че лесно ще можете да го префасонирате за вашия любим такъв :)
Код:
/* Порт на който е свързан енкодера */
#define PORT_ENC      PORTC
/* Извод от порт на който е свързан А извод на енкодера. */
#define ENC_PIN_A      PIN1_bp
/* Извод от порт на който е свързан Б извод на енкодера. */
#define ENC_PIN_B      PIN2_bp
/* Битова маска за извличане на състоянието на двата извода на енкодера */
#define ENC_BIT_MASK   ((1<<ENC_PIN_A) | (1<<ENC_PIN_B))

void read_encoder() {
   static uint8_t i;
   
   i = (i<<2) + (PORT_ENC.IN ^ ENC_BIT_MASK);
   /* маскиране на резултата, понеже са ни нужни само 4-те младши бита */
   i &= 15;

   switch (i) {
      /* Проверка на бит 3 и бит 1 за 0->1 */
      case 0x07:
         /*
            Код който ще се изпълни при
            въртене на енкодера на ляво
         */
         break;
      /* Проверка на бит 3 и бит 1 за 1->0 */
      case 0x0D:
         /*
            Код който ще се изпълни при
            въртене на енкодера на дясно
         */
         break;
   }
}


Идеята е взета на готово от ChaN, като леко е модифициран кода за по голяма универсалност.

ПС: Наистина няма да е лошо, да се инсталира и едно Wiki, че такива неща да има къде да се слагат.


Пон Май 23, 2011 8:52 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Съб Ное 06, 2010 12:03 pm
Мнения: 3
Мнение 
Ето моя код, който не ползва прекъсвания и таймери, и работи бетон - хваща си и едно прецъкване, и две, и много, и то бързи. Зашумяването при превключване, както и времето на лагване между фронтовете варира доста и зависи от скоростта на въртене, от енкодера и въобще не може да се разчита на него, така че всички опити с таймери и прекъсвания са прекалено точни и бързи и ненужни. Да не говорим че понякога евтините енкодери могат да запецнат в междинно състояние. Кода е за няква мега8, с авр-гцц:
Код:

#define BTN   (1 << PD2) // бутон, при натискане на енкодера
#define R_A   (1 << PD3) // ляво (или дясно)
#define R_B   (1 << PD4) // обратно на горното

unsigned char enc_get_state(void)
{
   return (PIND & (R_A|R_B)) >> 3;
}

int enc_wait_idle(void)
{
   while (7 == (PIND & (BTN|R_A|R_B)))
      ;
   _delay_ms(1);
   if (!(PIND & BTN))         // button pressed
   {
      while (!(PIND & BTN))   // wait release
         ;
      _delay_ms(1);
      return 1;             // report button press
   }
   _delay_ms(1);
   return 0;               // report encoder event
}

int enc_wait_direction(void)
{
   if (2 == enc_get_state())
   {
      _delay_ms(2);
      while (0 != enc_get_state())
         _delay_ms(1);

      while (1 != enc_get_state())
         _delay_ms(1);

      while (3 != enc_get_state())
         _delay_ms(1);
      
      return 1;   
   }
   else
   if (1 == enc_get_state())
   {
      _delay_ms(2);
      while (0 != enc_get_state())
         _delay_ms(1);

      while (2 != enc_get_state())
         _delay_ms(1);

      while (3 != enc_get_state())
         _delay_ms(1);
      
      return -1;   
   }

   return 0;
}
....
....
....

// Употреба - в основния цикъл в main():

char dir; // това е "signed"
for (;;)
{
   if (enc_wait_idle())
   {
      usart_puts("BTN\r\n");   // бутончето на енкодера
   }
   else
   {
      dir = enc_wait_direction();
      if (!dir)
         continue;

      i += dir; // dir e 1 или -1, в зависимост от посоката на въртене
   }
}


По принцип винаги си коментирам кода на английски. Българските коментари на дефайните ги добавих за яснота тук
_delay_ms() е библиотечна функция, от авр-либц. Може да си я смените с ваша ако не ползвате стандартните библиотеки..


Нед Юли 10, 2011 10:32 am
Профил
Ранг: Ориентиран
Ранг: Ориентиран
Аватар

Регистриран на: Чет Май 12, 2005 11:10 am
Мнения: 211
Мнение 
Значи според мен проблемът ти е в начина на отчитне.
Аз съм направил много неща с такива енкодери и други доста по-големи.
Свързвам двете фази на В-порта старша част и пускам прекъсване от промяна на състояние н входа.
Сетне чета и двете фази.
Преди това съм запомнил до сега какви са били фазите.
И зависимост от състоянието (това са 4 комбинации) вземаш решение ступка напред или стъпка назад.
Няма грешка - бъди сигурен!!!


Сря Юли 13, 2011 8:59 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юни 10, 2007 2:22 pm
Мнения: 6492
Местоположение: София
Мнение Re: Rotary encoder
Да не отварям нова тема пък и то си е продължение на тая де.

Любопитно ми е какво налага софтуерното (или друго) debounce-ване на тия механичните
врътки. Това че шуморлясват около точките на прекъсване ясно, но то не би било
проблем освен ако не се застъпват (т.е. да шуми не само тоя изход в преход ами и тоя, дето
е стабилен по това време). Така ли шумят наистина?

Аз наскоро сложих два - ама купих оптически, да нямам изненади а и очаквах да
се връткат по-мазно (и се въртят доббре наистина :-) ). Понеже е еднократно изпълнение
за да се подсигуря купих от тия: http://eu.mouser.com/Search/ProductDeta ... D-C24-L32S
.
Работят добре по отношение връткане, но копчето за натискане изолацията му падна
до към 1 кило - след само месец спорадично пипане по време на разработката. Аз го напънах
повечко и засега работи, ако откаже ще пробивам дупки в кутията и ще слагам отделни
бутони, кво да правя. Разказвам историята като поучителна защо не винаги по-скъпият
вариант е по-сигурен :D . Инак любопитстовото ми е само защо става дума за debounce-ване,
днес търсех нещо друго (линк който бях поствал) и попаднах и на тая тема дето ми е
актуална в момента :-) .

_________________
-------------------
www.tgi-sci.com
-------------------
http://www.flickr.com/photos/didi_tgi/


Сря Ное 16, 2011 8:51 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение Re: Rotary encoder
Ами те в действителност двата ключа включват почти едновременно в момента на кликването, единия малко изпреварва/изостава в зависимост от посоката. Когато не се върти и двата са изключени. Пък вече за дебаунсване - зависи как го слушаш ключето. То по принцип е хубаво да е на прекъсване единия край и тогава реакцията на контролера е доста бърза та сработва няколко пъти. Аз лично за да не си натоварвам софта им слагам 100nF и 4,7k пулъпи и всичко става ок.


Сря Ное 16, 2011 10:30 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юни 10, 2007 2:22 pm
Мнения: 6492
Местоположение: София
Мнение Re: Rotary encoder
Чакай бе, не са ли отместени на 90 градуса фронтовете? Т.е. единият цъка по средата
на стабилното състояние на другия? Изглежда и механически по-лесно постижимо ама
знам ли. Тия оптическите са така поне. И очевидно ако не пука някой докато трябва да
е стабилен няма нужда от филтри, първата пуканка хваща, остнаналите до следващия
път (т.е. след пуканка в другия канал) се игнорират.

_________________
-------------------
www.tgi-sci.com
-------------------
http://www.flickr.com/photos/didi_tgi/


Сря Ное 16, 2011 10:41 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение Re: Rotary encoder
То и аз така си мислех отначало, ама тия дето ги имаше в комет се оказа че не са.

Е да де ама нали следиш фронта на единия канал - та той като е на прекъсване неговите пуканки се хващат по 10-20 пъти. Другия че не пукал - той ми е само за определяне на посоката.


Сря Ное 16, 2011 10:59 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юни 10, 2007 2:22 pm
Мнения: 6492
Местоположение: София
Мнение Re: Rotary encoder
Е, колко са няколко пуканки за игнориране. То аз и двата ги дебна в прекъсване
де, точно за да филтрирам по "първи цъкнал", но товарът е пренебрежим както и
да го гледаш. Въпросът е да не се разшумят и двата едновременно (че за посоката
при прекъсването на единия гледам нивото на другия, а и "първи цъкнал" отива
на кино ако правят малки пуканки и в стабилната си част).

_________________
-------------------
www.tgi-sci.com
-------------------
http://www.flickr.com/photos/didi_tgi/


Сря Ное 16, 2011 11:09 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 20, 2005 12:02 pm
Мнения: 9119
Местоположение: Разград
Мнение Re: Rotary encoder
В стабилната част не съм забелязал да пукат - то и няма логика :). Както казах 100nF спасяват положението. По принцип винаги съм бил противник на преборването на хардуерни проблеми със софтуерни средства :)

Ама и варианта с оптични си е по-добър отвсякъде. Особено ако оптроните имат вградени шмигери - тогава си става чудно.


Сря Ное 16, 2011 11:20 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юни 10, 2007 2:22 pm
Мнения: 6492
Местоположение: София
Мнение Re: Rotary encoder
Специално тия цъкат стръмно, явно имат шмигери. То за $20+ остана и да не цъкат
свястно.
Инак моят принцип пък е ако нещо става (става като става, без компромиси във
функционалността) в софтуера спестяваме съответния хардуер :) . В случая бях
максимално далече от тоя принцип де, тия хем щракат хубаво хем всичко но са на
5 волта та ги буферирах надолу (4-те изхода, нали два имам) с едно 74hc132, и понеже
не ги знаех как ще се държат а време за експерименти нямах, сложих и по една
RC група на всеки изход :D :D :D :D . Но както и да се пази човек от гадни изненади
все му намират цаката гадините, ей го за $20+ едната врътки почнаха да им се развалят
натискарките от нищо. Откак ги напънах с повечко ток държат де, ама ще мога да
кажа, че това работи ако удържат поне година оттук натам.

_________________
-------------------
www.tgi-sci.com
-------------------
http://www.flickr.com/photos/didi_tgi/


Сря Ное 16, 2011 11:43 pm
Профил WWW
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 28 мнения ]  Отиди на страница Предишна  1, 2

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 5 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни