rychly rotacny enkoder

Všetko čo sa týka mikropočítačov + Sekcia Arduino

Moderátori: psichac, Moderátori

jordiksvk
Stály člen
Stály člen
Príspevky: 141
Dátum registrácie: 15 Feb 2010, 00:00
Bydlisko: Kosice
Vek: 47
Kontaktovať používateľa:

rychly rotacny enkoder

Príspevok od používateľa jordiksvk » 12 Dec 2012, 11:07

nieco som napisal v AVRc ale stale sa mi to zda byt velmi pomale
ked rychlo potocim enkoderom nestihne to zareagovat na vsetky impulzy....
ako to zrychlit? (spustit casovac pri ENC_A zavernej hrane a pocitat impulzy?)
ako sa to robi?

tu je moja utilitka:

Kód: Vybrať všetko

unsigned char enkoder()       //vracia hodnotu: 1- doprava        2-dolava        3-OK
{
      
    while (1)
    {
          if (PINB & (1<<ENC_A))
          {
           do
           { 
             if (!(PINB & (1<<ENC_OK)))
             return (3);                                //pressed button
            } while (PINB & (1<<ENC_A));                                    
            
             if (PINB & (1<<ENC_B))
                 return (1);                            //turned right
             else 
                return (2);                             //turned left
          }                 
                          
          if (!(PINB & (1<<ENC_A)))
          {
           do
           {                                        //pressed button     
             if (!(PINB & (1<<ENC_OK)))
             return (3);           
           }  while (!(PINB & (1<<ENC_A)));
             if (!(PINB & (1<<ENC_B)))
                 return (1);                        //turned right
             else
                 return (2);                       //turned left         
          }    
    }
}
a takto ju volam z mainu()

Kód: Vybrať všetko

 
do
  {
    x= enkoder();
    switch (x)
     {
     case 1:          
            lcd_gotoxy(0,0);
            index_main_menu++;   
            if (index_main_menu == MAX_MENU)
                index_main_menu = 0;
            lcd_putsf(p_main_menu[index_main_menu]);     
            break;                                  
     case 2:          
            lcd_gotoxy(0,0);        
            if (index_main_menu == 0)
                index_main_menu = MAX_MENU;
            index_main_menu--;
            lcd_putsf(p_main_menu[index_main_menu]);     
            break;
     default:                                              
     }        
          
  } while (x !=3);
    delay_ms(250);

  switch (index_main_menu)
  {
  case 0:
         break;
  case 1:
         break;
  case 2:      
         manualne_ovladanie();
         break;
  default:                  
  }    

dakujem....
0

Používateľov profilový obrázok
Peťus
Ultimate člen
Ultimate člen
Príspevky: 3940
Dátum registrácie: 07 Mar 2009, 00:00
Bydlisko: Praha
Vek: 34
Kontaktovať používateľa:

Re: rychly rotacny enkoder

Príspevok od používateľa Peťus » 12 Dec 2012, 11:21

jaká frekvence mikrokontroléru?
0
https://chiptron.cz - novinky ze světa elektro (Arduino, Raspberry Pi, STM32, ESP8266, ESP32,...)

Používateľov profilový obrázok
awen
Power user
Power user
Príspevky: 609
Dátum registrácie: 11 Feb 2009, 00:00
Bydlisko: Bratislava
Vek: 36

Re: rychly rotacny enkoder

Príspevok od používateľa awen » 12 Dec 2012, 11:23

Zdrziava sa ti to asi na funkciach komunikujucich s displejom. Staci takto? :wink:
0

jordiksvk
Stály člen
Stály člen
Príspevky: 141
Dátum registrácie: 15 Feb 2010, 00:00
Bydlisko: Kosice
Vek: 47
Kontaktovať používateľa:

Re: rychly rotacny enkoder

Príspevok od používateľa jordiksvk » 12 Dec 2012, 14:13

najskor odpoveim: atmega328, 8Mhz vnurotny xtal


takze takto ako som to spravil je to dobre?
nieje to zle- funguje to, ale niesom stym kodom nejako vnutorne uspokojeny....

som skusal na radiu co mam a tam ked potocim rychlo tak az nasledne mi dobiehaju ciselka a enkoder uz je zastaveny....
preto som si myslel ze toto co som ja napisal je strasne amaterske....
akym inym / lepsim sposobom sa toto da este ovladat?

dakujem
0

Marekodzapadu
Stály člen
Stály člen
Príspevky: 175
Dátum registrácie: 25 Apr 2010, 00:00
Vek: 12

Re: rychly rotacny enkoder

Príspevok od používateľa Marekodzapadu » 12 Dec 2012, 14:30

Robi sa to cez externé prerušenie...
0

Používateľov profilový obrázok
jaromir
Power user
Power user
Príspevky: 4538
Dátum registrácie: 08 Júl 2011, 00:00
Vek: 40

Re: rychly rotacny enkoder

Príspevok od používateľa jaromir » 12 Dec 2012, 14:35

No veru, tak sa to robi... :?

My, ktori musime veci robit spolahlivo a poriadne, ale uprednstnujeme ine riesenie: nastavi sa timer na pomerne rychlu periodu, povedezme niekolko sto mikrosekund a vzdy pri tomto preruseni sa skontroluje stav vstupov. Vyhodnotenie enkodera je uz potom jasne. Kluc je ale v nepouzivani vonkajsieho prerusenia.

Mam pocit, ze som to tu na fore pisal uz viackrat.
0

dan21
Ultimate člen
Ultimate člen
Príspevky: 3016
Dátum registrácie: 11 Apr 2007, 00:00
Bydlisko: ZA

Re: rychly rotacny enkoder

Príspevok od používateľa dan21 » 12 Dec 2012, 14:35

jeden pin (A alebo B) zaves na prerusenie a druhy v tom preruseni kontroluj. Ja som to takto urobil. Enkoder mam z koliecka z mysi a funguje to na 100%. Ovladam tym PWM.
0

jordiksvk
Stály člen
Stály člen
Príspevky: 141
Dátum registrácie: 15 Feb 2010, 00:00
Bydlisko: Kosice
Vek: 47
Kontaktovať používateľa:

Re: rychly rotacny enkoder

Príspevok od používateľa jordiksvk » 12 Dec 2012, 16:05

ked by to bolo len na ovldanie hlasitosti naprikald si to viem predstavit....
ale ked budem enkoder pouzivat napriklad na pohyb po menu,
a stale bude mat inu funkciu furt mi to akosi nedochadza ako to spravit

Pomocou ext prerusenia:
zakvacim jeden ENC_A na PC_INT0 any change
v preruseni odsledujem zmenu B a tym padom viem kam sa tocim
napriklad do glob_premennej nacitam pocet tychto zmien.....
po vykonani globalnu zmazem?

----

Pomocou timeru:
tiez tu mas potom nejake pocitadlo ktore ti hovori kolko do ktorej strany bolo potocene a potom sa toto cislo spracuje....
mozes publiknut timer rutinu, nech sa niecomu priucim....
dakujem.

spravne na to idem ?
0

jordiksvk
Stály člen
Stály člen
Príspevky: 141
Dátum registrácie: 15 Feb 2010, 00:00
Bydlisko: Kosice
Vek: 47
Kontaktovať používateľa:

Re: rychly rotacny enkoder

Príspevok od používateľa jordiksvk » 12 Dec 2012, 17:38

daco som spravil pomocou ext prerusenia ENC_B som zakvacil na ext prerusenie any_change
funguje to, ALE ako to pouzijem univerzalne?
ja chcem iba aby mi to vracalo nejaku hodnotu a snou uz budem potom pracovat
Robi sa to potom takto?
"hour" je globalna premenna (alebo smernik)
som niekde v mojom programe kde ocakavam akciu od ENkodera
a testujem "hour" ci nieje nula? (kladne / zaporne)
zase mi to pride malo elegantne..... (fungovat to bude)

Kód: Vybrať všetko

// Pin change 0-7 interrupt service routine
interrupt [PC_INT0] void pin_change_isr0(void)
{
        
// Place your code here
          if (PINB & (1<<ENC_A))
           {  if (PINB & (1<<ENC_B))
               {                                   //vpravo
                 hour++;
        sprintf(lcd_buffer,"%3u",hour);
        lcd_gotoxy(0,0);
        lcd_puts(lcd_buffer);
             }
             else
              {  hour --;                         //vlavo
        sprintf(lcd_buffer,"%3u",hour);
        lcd_gotoxy(0,0);
        lcd_puts(lcd_buffer);
               }
          }                 
                          
          if (!(PINB & (1<<ENC_A)))
          {   if (!(PINB & (1<<ENC_B)))
              {  hour++;                            //vpravo
        sprintf(lcd_buffer,"%3u",hour);
        lcd_gotoxy(0,0);
        lcd_puts(lcd_buffer);
               }
             else     
              {  hour--;                            //vlavo
        sprintf(lcd_buffer,"%3u",hour);
        lcd_gotoxy(0,0);
        lcd_puts(lcd_buffer);
               }
          }    

}
0

Používateľov profilový obrázok
sonikmartin
Pokročilý člen
Pokročilý člen
Príspevky: 554
Dátum registrácie: 05 Nov 2010, 00:00
Bydlisko: Litomyšl
Vek: 36
Kontaktovať používateľa:

Re: rychly rotacny enkoder

Príspevok od používateľa sonikmartin » 12 Dec 2012, 17:54

Ja kdyz chci pouzit encoder (a ze ho pouzivam rad) pripojím jeden kanal na preruseni a druhy na bezdy port. V preruseni snímam port a reknu mu

kdyz mas 1 pricitej, kdyz 0 odecitej. Funguje to spolehlive a rychle.
0

Používateľov profilový obrázok
petersno
Ultimate člen
Ultimate člen
Príspevky: 2774
Dátum registrácie: 06 Aug 2011, 00:00
Bydlisko: ba
Vek: 63

Re: rychly rotacny enkoder

Príspevok od používateľa petersno » 12 Dec 2012, 18:20

jordiksvk : ak je osetrenie zmeny enkodera kriticke, tak ti asi nezostane nic ine, iba reagovat priamo v preruseni timeru. ak kriticke nieje, skus deklarovat napr. EncNow, EncOld. EncNow budes menit v preruseni timeru podla stavu enkoderu. niekde v main sa potom mozes pytat, ci je EncNow != EncOld. a ak je iny ...
a aby ti nedochadzalo k preteceniu, mozes tam oba Enc... nastavit do stredu
0

jordiksvk
Stály člen
Stály člen
Príspevky: 141
Dátum registrácie: 15 Feb 2010, 00:00
Bydlisko: Kosice
Vek: 47
Kontaktovať používateľa:

Re: rychly rotacny enkoder

Príspevok od používateľa jordiksvk » 12 Dec 2012, 22:04

najskor by som Vam chcel vsetkym podakovat za reakcie...

petersno:
zmenu enkodera nemam kriticku - osetril som kondikmi...
precital som si to asi 5x i tak som to moc neprebral... este skusim zajtra ci ma neosvieti :)
0

Používateľov profilový obrázok
boraicho
Ultimate člen
Ultimate člen
Príspevky: 12417
Dátum registrácie: 03 Feb 2007, 00:00
Bydlisko: Prešov
Vek: 35
Kontaktovať používateľa:

Re: rychly rotacny enkoder

Príspevok od používateľa boraicho » 12 Dec 2012, 22:40

http://svetelektro.com/modules.php?name ... 46#p407046

mne to ide velmi rychlo a presne a to ešte škrtim 10ms delayami a takisto vypisujem hodnotu na dysplej. Nooo len ako rychlo ti to vypisuje na dysplej to už neviem.Ale mne vcelku dosť rychlo.A nemam to ani cez prerušenie.Nevyhoda je že program vtedy stoji na mieste. Ale myslim že nieje problem do pripojiť na prerušenie alebo ako jaromir snimať vstup vždy každych 2mS cez prerusenie s timerom.

Podľa mna to maš cele zle.Snimaš jeden stav a hned na to druhy.Prečo tam nemaš žiadnu čakaciu slučku? ved aj v datasheete od enkoderu je napisany debouncing čas 2mS.

prepiš si to nejak na AVR ja nemam šajn ako.

Kód: Vybrať všetko

int stav=0;
int vstup()						////////// V S T U P Y //////////
{
stav=0;
while(!stav)
{
if(RA3==1)
{_delay_ms(2);
while(RA2==1 && RA3==1);
if(RA2==1)
stav=1;
}
else if(RA2==1)
{_delay_ms(2);
while(RA2==1 && RA3==1);
if(RA3==1)
stav=2;
}

}
_delay_ms(10);
}
0
"Aj nevinne vyzerajúca súčiastka, môže byť príčinou nefunkčnosti zariadenia a tou kondenzator 100% je"
3D REBEL II + PLA + PETG
CNC 1810 na DPS

neznamy

Re: rychly rotacny enkoder

Príspevok od používateľa neznamy » 12 Dec 2012, 22:43

už si ošetril ten chybový stav keď to zamŕza ?

Používateľov profilový obrázok
boraicho
Ultimate člen
Ultimate člen
Príspevky: 12417
Dátum registrácie: 03 Feb 2007, 00:00
Bydlisko: Prešov
Vek: 35
Kontaktovať používateľa:

Re: rychly rotacny enkoder

Príspevok od používateľa boraicho » 12 Dec 2012, 22:48

to bolo mne?
0
"Aj nevinne vyzerajúca súčiastka, môže byť príčinou nefunkčnosti zariadenia a tou kondenzator 100% je"
3D REBEL II + PLA + PETG
CNC 1810 na DPS

jordiksvk
Stály člen
Stály člen
Príspevky: 141
Dátum registrácie: 15 Feb 2010, 00:00
Bydlisko: Kosice
Vek: 47
Kontaktovať používateľa:

Re: rychly rotacny enkoder

Príspevok od používateľa jordiksvk » 15 Dec 2012, 07:59

Boraicho:
dakujem za tvoj kod.
takto podobne ako to mas ty to mam i ja celkom v prvom prispevku, nemam tam ten delay za zmenou, preto mi to asi blblo....
druhy kod:
cakacie slusky neamm preto lebo ten druhy kod je uz cez prerusenie a ten sa vyvola ked nastane zmena, cize cakacka ja uz osetrena prerusenim, v nom staci uz len otestovat stav. ked ENC_B ide do nuly, alebo do log.1 - vyvola sa toto ext prerusenie
funguju oba moje kody, prvy ide pomalsie s chybami (vynechalo mi to parkrat krok), druhy nema ziadnu chybu....

petersno:
vobec som to neprebral ako si to myslel

right13:
to bolo mne ci boraichovi?
0

Používateľov profilový obrázok
petersno
Ultimate člen
Ultimate člen
Príspevky: 2774
Dátum registrácie: 06 Aug 2011, 00:00
Bydlisko: ba
Vek: 63

Re: rychly rotacny enkoder

Príspevok od používateľa petersno » 15 Dec 2012, 11:25

jordiksvk : deklarujes 2 premenne a nastavis rovnaku hodnotu napr.

Kód: Vybrať všetko

char A, B = 128;
v isr nerobis priamo osetrenie, iba posuvas hodnotu jednej premennej podla enkodera

Kód: Vybrať všetko

 if enkoder vlavo A++; else A--
a ked potrebujes vyhodnotit zmeny

Kód: Vybrať všetko

 if A != B
ak nieje zhoda, doslo k zmenam. rozdiel medzi A a B potom dava suhrn zmien za urcity cas a mozes ich osetrit naraz.

Kód: Vybrať všetko

 A = B = 128;
nakonic zase nastavis.
pouzitie napriklad ked nechces alebo nemozes vypisovat kazdu zmenu na LCD, co napr. pri float dost zdrzuje. da sa to samozrejme urobit iba s jednou premennou, alebo uplne inym sposobom.
snad je to tentokrat zrozumitelnejsie :wink:
0

Používateľov profilový obrázok
boraicho
Ultimate člen
Ultimate člen
Príspevky: 12417
Dátum registrácie: 03 Feb 2007, 00:00
Bydlisko: Prešov
Vek: 35
Kontaktovať používateľa:

Re: rychly rotacny enkoder

Príspevok od používateľa boraicho » 05 Máj 2015, 18:26

Nazdar, može mi tu niekto nahodiť jeho script na enkoder? diky.
0
"Aj nevinne vyzerajúca súčiastka, môže byť príčinou nefunkčnosti zariadenia a tou kondenzator 100% je"
3D REBEL II + PLA + PETG
CNC 1810 na DPS

vladosk
Nový člen
Nový člen
Príspevky: 96
Dátum registrácie: 27 Máj 2009, 00:00
Bydlisko: Prievidzsko

Re: rychly rotacny enkoder

Príspevok od používateľa vladosk » 05 Máj 2015, 19:32

Včera som pripájal encoder k Arduinu Uno R3, a je na to knižnica Encoder.h, v ktorej časť je napísaná v strojovom kóde (asm). Možno by to bolo dobré preštudovať. Pokiaľ sa chcete vzdelávať. Skúšal som ostatné knižnice, a všetky boli pomalé a nestíhali - pri vyšších otáčkach nestíhali čítať. Mám tam pripojený enkodér z CNC stroja za účelom odmeriavania.
0

Používateľov profilový obrázok
datam
Power user
Power user
Príspevky: 2360
Dátum registrácie: 24 Apr 2008, 00:00
Bydlisko: SVK
Vek: 42

Re: rychly rotacny enkoder

Príspevok od používateľa datam » 19 Máj 2015, 13:41

Ja poiužívam IRC normálne ale maximum som neskúšal. Prevážne do 10kHz pre moje potreby.

Od nábežnej A volám HW prerušenie a v prerušení iba testujem B ktorého hodnota vlastne uváda či mám inkrementovať alebo dekrementovať. Ak je H tak INC a ak L tak DEC. Eliminuješ to iba na jeden jump a aritmetickú operáciu a hneď môžeš vyskočiť z prerušenia.

Mega na 8MHz v poho zvládala 2048ppr IRC s max 300rpm čo je niečo cez 10kHz.
0

Napísať odpoveď