Kazalo po Svet elektronike forumu Svet elektronike
Revija za prave elektronike
 
AlbumAlbum   Pomoč pogostih vprašanjPomoč pogostih vprašanj   IščiIšči   Seznam članovSeznam članov   Skupine uporabnikovSkupine uporabnikov   Registriraj seRegistriraj se 
 Tvoj profilTvoj profil   Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil   PrijavaPrijava 

Encoder ne šteje dobro!?
Pojdi na stran 1, 2, 3  Naslednja
 
Objavi novo temo   Odgovori na to temo    Kazalo po Svet elektronike forumu -> Digitalna elektronika
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
marko11
Profesionalec


Pridružen/-a: Ned Jan 2004 18:00
Prispevkov: 112
Kraj: Ponikve

PrispevekObjavljeno: Tor Dec 20, 2011 7:04 pm    Naslov sporočila: Encoder ne šteje dobro!? Odgovori s citatom

Hi

Ne morem in ne znam napisati programa, da bi točno štel impulze iz encoderja.
Ko zavrtim os encoderja čisto počasi prešteje kar točno, ko pa malo hitreje pa ne sledi več.
Pravzaprav ali je sploh možno z Mega8 šteti tako hitro?

Če je možno, kaj sem napravil narobe v programu, prosim za komentarje?

Spodaj prilagam kodo.

LP,marko


Imam:
Encoder HEDS 5310, (ima 100 razdelkov na obrat)
Mega8,
kristal je notranji, 4MHz
Bascom AVR.

Koda:
 
'//////////////////////////////////////
'Števec ver. 1.1
'/////////////////////////////////////

$regfile = "m8def.dat"
$crystal = 4000000                                          'crystal je interni


Config Lcdpin = Pin , Db7 = Portb.0 , Db6 = Portd.7 , Db5 = Portd.6 , Db4 = Portb.3 , E = Portb.4 , Rs = Portb.5

Config Lcd = 16 * 2
Config Lcdbus = 4
Cursor Off


Cha Alias Pind.2
Chb Alias Pind.3

Config Cha = Input
Config Chb = Input


Config Int0 = Falling
Const Debouncetime = 1

Dim Wtime As Byte
Dim Stevec As Integer

Set Chb

On Int0 Stetje

Cls

Wtime = 100
Stevec = 0

Enable Interrupts
Enable Int0

Do
  'Waitms Wtime
  Upperline
  Lcd "Stanje: " ; Stevec ; "     "
  Waitms Wtime
Loop

Stetje:
  Waitms Debouncetime
  If Cha = 0 Then
    If Chb = 0 Then Incr Stevec Else Decr Stevec
  End If
Return

End
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
RudiP
Profesionalec


Pridružen/-a: Sre Jul 2008 8:39
Prispevkov: 128
Kraj: KOPER

PrispevekObjavljeno: Sre Dec 21, 2011 7:59 am    Naslov sporočila: Odgovori s citatom

Brez waitms v interupt rutini bo to delalo veliko bolje. Povečaj klok na 8 MHz in če še ne bo šlo daj zunanji kristal 16 MHz.
_________________
Lep pozdrav !
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Profesionalec


Pridružen/-a: Tor Jan 2004 19:06
Prispevkov: 234

PrispevekObjavljeno: Sre Dec 21, 2011 1:33 pm    Naslov sporočila: Odgovori s citatom

Bascoma ne poznam. Če prav razumem gornjo kodo, pišeš na LCD? Dviganje clocka v tem primeru ne bo pomagalo dosti, kajti LCD potrebuje svoj procesorski čas. Malo preveri koliko ti le tega "kuri" tvoja rutina. Recimo v assemblerju bi spravil en karakter na displej tam nekje v 10uS. Tukaj gre za kompleksno univerzalno rutino. Po moje so tukaj časi tam v mS. Če je hitrost vrtenja enkoderja nekaj sto vrtljajev - frekvenca nekaj 10kHz potem se boš mogel zadeve lotiti precej drugače. (recimo izvesti drugačen ne neposreden prikaz)
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Vlado
Profesionalec


Pridružen/-a: Ned Jan 2004 16:11
Prispevkov: 556
Kraj: Ljubljana

PrispevekObjavljeno: Sre Dec 21, 2011 6:14 pm    Naslov sporočila: Odgovori s citatom

Marko,
zakaj ne uporabiš ukaza ENCODER ki je že vgrajen v Bascom?

LP
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
marko11
Profesionalec


Pridružen/-a: Ned Jan 2004 18:00
Prispevkov: 112
Kraj: Ponikve

PrispevekObjavljeno: Sre Dec 21, 2011 6:44 pm    Naslov sporočila: Odgovori s citatom

Vlado je napisal/a:
Marko,
zakaj ne uporabiš ukaza ENCODER ki je že vgrajen v Bascom?

LP


Gledal sem primer od ukaza Encoder, pa me zanima, če bi ta primer dovolj hitro čital impulze z enkoderja (100 na obrat) in če bi se to dalo pisati na LCD?

Moram malo pobrskati po netu, da vidim če je napisan kakšen primer.

Pa s tem enkoderjem se mučim že celo leto, mislim, da mi bo nekoč uspelo.

LP,

_________________
Kdor visoko leta, daleč vidi.
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Jure
Urednik


Pridružen/-a: Pon Jan 2004 12:51
Prispevkov: 2132
Kraj: Ljubljana

PrispevekObjavljeno: Sre Dec 21, 2011 6:56 pm    Naslov sporočila: Odgovori s citatom

Marko,

tole je malce predelana koda iz Bascom Encoder programa, uporablja se prekinitev za hitrejšo reakcijo na spremembe.
Koda:

$regfile = "m168pdef.dat"

$crystal = 12000000
Dim C1 As Integer , K1 As Bit , C2 As Byte , K2 As Byte , K3 As Bit , K4 As Bit
Enk1 Alias Pinc.2                                                'dolocimo, kje so izhodni pini enkoderja
Enk2 Alias Pinc.3
Enk3 Alias Pinb.5
Config Pinc.2 = Input
Config Pinc.3 = Input
Config Enk3 = Input

Bipbip Alias Portd.0
Config Bipbip = Output

Dim Test1 As Bit                                                 'tipka
Config Lcd = 16 * 2
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.2 , Rs = Portd.1

Cursor Off
'Config Debounce = 10 Ms
K1 = 0                                                           'pomozna spremenljivka za postavljanje C1 na nic ob vklopu
K2 = 0                                                           'pomozna spremenljivka za dolocanje koraka C2
K3 = 0                                                           'pomozna spr. da se C1 ne povecuje nekontrolirano
K4 = 0                                                           'pomozna spr. da se C1 ne zmanjsuje nekontrolirano
Enable Interrupts
Cls

C1 = 1                                                           'zacetna vrednost C1
C2 = 1                                                           'zacetni korak povecevanja C2
K2 = 1

'zacetek Do-Loop zanke
'Portc = &B00001100

Dim B As Byte


'   B = Encoder(pinb.0 , Pinb.1 , Links , Rechts , 1)
   '                                               ^--- 1 means wait for change which blocks programflow
   '                               ^--------^---------- labels which are called
   '              ^-------^---------------------------- port PINs
   'Print B

'so while you can choose PINB0 and PINB7,they must be both member of PINB
'this works on all PIN registers

Pcmsk2 = &B00001100                                              ' enable pin change interrupt on pind.6 and pind.7
Pcicr.2 = 1
On Pcint2 Enkoder_sub
Enable Pcint2

Portc.2 = 1
Portc.3 = 1
Do                                                               'neskoncna zanka


  Locate 1 , 1                                                   'izpis v prvi vrstici LCD-ja
  Lcd "C1  " ; C1 ; "  "                                         'izpis C1
  Debounce Enk3 , 0 , Pojdi_sub , Sub                            'tipka za izbiro podmenijev


Loop
End

'subrutine

'--------------------------------------------------------------
Pojdi_sub:
'********************************************
'Biper
'********************************************
   Bipbip = 0                                                    'zvok na Portd.0
   Wait 1
   Bipbip = 1
   Do
      Debounce Enk3 , 0 , Biper_s , Sub                          'srednja tipka za izbiro podmenijev
   Loop Until Enk3 = 0
Return



'********************************************
Biper_s:
'********************************************
   Bipbip = 0                                                    'zvok na Portd.0
   Waitus 100
   Bipbip = 1
Return



'********************************************

Gor:
Test1 = Not Test1
If Test1 = 0 Then Incr C1

Return

Dol:
Test1 = Not Test1
If Test1 = 1 Then Decr C1
Return


'--------------------------------------------------------------

Enkoder_sub:
   B = Encoder(pinc.2 , Pinc.3 , Gor , Dol , 0)
Return


LCD prikaz upočasni izvajanje, vendar to mene v tem primeru ni motilo, saj za vrtenje z roko nisem opazil "preskokov" in praznih odčitavanj. Sicer si pa preberi na MCS forumu dobro debato o Encoder-ju.

Lp
Jure
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo Obišči avtorjevo spletno stran
Vlado
Profesionalec


Pridružen/-a: Ned Jan 2004 16:11
Prispevkov: 556
Kraj: Ljubljana

PrispevekObjavljeno: Sre Dec 21, 2011 7:48 pm    Naslov sporočila: Odgovori s citatom

Marko,
v prekinitveni rutini bereš podatek, v glavni zanki pa ta podatek prikazuješ.
Ne pričakuješ valjda da boš lahko sproti videl na LCD-ju izpis če enkoder vrtiš z velko hitrostjo, že en obrat pomeni spremembo 100 krat v sekundi. Tudi če bi LCD to uspel prikazati ti nebi videl tega podatka. Moraš najti kak kompromis, ali pa napiši kaj delaš da vidimo kaj se da narediti.
LP
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
marko11
Profesionalec


Pridružen/-a: Ned Jan 2004 18:00
Prispevkov: 112
Kraj: Ponikve

PrispevekObjavljeno: Sre Dec 21, 2011 8:05 pm    Naslov sporočila: Odgovori s citatom

Vlado je napisal/a:

Ne pričakuješ valjda da boš lahko sproti videl na LCD-ju izpis če enkoder vrtiš z velko hitrostjo, že en obrat pomeni spremembo 100 krat v sekundi. Tudi če bi LCD to uspel prikazati ti nebi videl tega podatka. Moraš najti kak kompromis, ali pa napiši kaj delaš da vidimo kaj se da narediti.
LP


Seveda ne pričakujem tega, da bi videl izpis. Rad bi pa videl, ko se vrti počasi.
Delam, preurejam staro mašino za navijanje tuljavic, transformatorčkov.

LP,

_________________
Kdor visoko leta, daleč vidi.
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Vlado
Profesionalec


Pridružen/-a: Ned Jan 2004 16:11
Prispevkov: 556
Kraj: Ljubljana

PrispevekObjavljeno: Sre Dec 21, 2011 8:37 pm    Naslov sporočila: Odgovori s citatom

Marko, če delaš strojček za navijanje potem pa res ne rabiš 100 impulzov na obrat, dovolj bo 4, tak enkoder pa lahko narediš tudi sam. S tem boš dosegel boljši prikaz, lahko boš videl število obratov kar sproti če se mašina ne bo vrtela preveč hitro. Pri tem strojčku pa te res ne zanima ali si navil 1/100 navoja.
LP
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
marko11
Profesionalec


Pridružen/-a: Ned Jan 2004 18:00
Prispevkov: 112
Kraj: Ponikve

PrispevekObjavljeno: Čet Dec 22, 2011 5:03 pm    Naslov sporočila: Odgovori s citatom

Vlado je napisal/a:
Marko, če delaš strojček za navijanje potem pa res ne rabiš 100 impulzov na obrat. Pri tem strojčku pa te res ne zanima ali si navil 1/100 navoja.
LP


Vse to drži. Jaz imam pač ta stari enkoder, ki je verjetno star ca 30 let, pa sem si rekel, da bi ga uporabil.

Kako pa so v tistem času to čitali? Pa zdi se mi malo čudno, da sedaj ne bi mogel prečitati en Mega8, mogoče se pa motim.

@Vlado, praviš, da lahko napravim sam tak enkoder z 4mi pulzi.
Kako pa naj to napravim? Ali je kje kakšna shema, ki se jo da videti?.

LP,

_________________
Kdor visoko leta, daleč vidi.
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Vlado
Profesionalec


Pridružen/-a: Ned Jan 2004 16:11
Prispevkov: 556
Kraj: Ljubljana

PrispevekObjavljeno: Čet Dec 22, 2011 5:24 pm    Naslov sporočila: Odgovori s citatom

Marko,
kakšen je motor ki ima vgrajen ta enkoder (DC AC)?
Ali se enkoder nahaja na osi motorja, ali pa na vretenu mašine?

Seveda je M8 dovolj hiter da opravi to delo, vendar tega ne boš mogel sproti videti na LCD-ju. Stara elektronika je verjetno imela LED prikazovalnik ki je veliko hitrejši s prikazom kot LCD in je krmilila motor (po določenem številu obratov je ustavila motor). To bo zmogel tudi M8.
Lahko pa si pomagaš tako da tvojih 100 imp. prikažeš kot en obrat, tedaj bo zgodba čisto drugačna, lahko pa obrat (100imp.) deliš z 4, in po 25 imp. prikažeš 0.25 obrata . . .
Kako narediti enkoder je veliko načinov, vpiši v iskalnik optical encoder in bo veliko zadetkov:
http://robota.das.ufsc.br/mediawiki/index.php/Simple_Robot_Guided_by_Radio_Frequency
LP
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
marko11
Profesionalec


Pridružen/-a: Ned Jan 2004 18:00
Prispevkov: 112
Kraj: Ponikve

PrispevekObjavljeno: Čet Dec 22, 2011 6:21 pm    Naslov sporočila: Odgovori s citatom

Citiram:
kakšen je motor ki ima vgrajen ta enkoder (DC AC)?
Ali se enkoder nahaja na osi motorja, ali pa na vretenu mašine?


Ne ni na motorju, jaz imam samo ta encoder HEDS 5312.

Citiram:
Lahko pa si pomagaš tako da tvojih 100 imp. prikažeš kot en obrat, tedaj bo zgodba čisto drugačna, lahko pa obrat (100imp.) deliš z 4, in po 25 imp. prikažeš 0.25 obrata .


Seveda, jaz ne potrebujem stotink obrata, zadostuje že četrtina obrata.

Kaj v zgornjem programu bi moral deliti z 4?

lp,

_________________
Kdor visoko leta, daleč vidi.
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Silvo
Profesionalec


Pridružen/-a: Tor Jan 2004 19:06
Prispevkov: 234

PrispevekObjavljeno: Čet Dec 22, 2011 6:57 pm    Naslov sporočila: Odgovori s citatom

marko11 je napisal/a:
...

Kako pa so v tistem času to čitali? Pa zdi se mi malo čudno, da sedaj ne bi mogel prečitati en Mega8, mogoče se pa motim.



Kot je že Vlado omenil. klasična logika. Z nekaj vrati se določi smer vrtenja. S kakim števcem zadevo zdeliš. Za prikaz se uporabi recimo 40110, ki je ob enem displej driver ter števec gor dol. (slednjega sem opisal v reviji elektronik.si ter je kar podrobno opisan v zbirniku revij v članku Prikazovalniki) Lahko tudi uporabiš kako programibilno logiko - cpld,gal...

Glede na to, da je v tvojem primeru aktualen le en obrat bi sam vhodni del naredil z logiko ali gal-om kjer bi mi le ta določila smer ter ustrezno delil impulze tako da bi dobil na izhodu 1 impulz na obrat. Na tak način bi mi potem ostalo dovolj procesorskega časa za obdelavo prikaz ....
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
Vlado
Profesionalec


Pridružen/-a: Ned Jan 2004 16:11
Prispevkov: 556
Kraj: Ljubljana

PrispevekObjavljeno: Čet Dec 22, 2011 7:22 pm    Naslov sporočila: Odgovori s citatom

Marko,
poskusi nekaj takega, sem res na hitro poskusil napisaati, če bo čas bom jutri preizkusil in ti pošljem kaj boljšega.
Tukaj sicer šteješ samo cele obrate:
Koda:
'/////////////////////////////////////

$regfile = "m8def.dat"
$crystal = 4000000                                          'crystal je interni


Config Lcdpin = Pin , Db7 = Portb.0 , Db6 = Portd.7 , Db5 = Portd.6 , Db4 = Portb.3 , E = Portb.4 , Rs = Portb.5

Config Lcd = 16 * 2
Config Lcdbus = 4
Cursor Off


Cha Alias Pind.2
Chb Alias Pind.3

Config Cha = Input
Config Chb = Input


Config Int0 = Falling
Const Debouncetime = 1

Dim Wtime As Byte
Dim Stevec As Integer , Obrat_old As Integer
dim obrat as Integer

Set Chb

On Int0 Stetje

Cls
Cursor Off

Wtime = 100
Stevec = 0
Obrat_old = 1
Obrat = 0
Enable Interrupts
Enable Int0

Do
  'Waitms Wtime
  If Obrat <> Obrat_old Then
  Upperline
  Lcd "Stanje: " ; Obrat ; "   "
  Obrat_old = Obrat
  End If
'  Waitms Wtime
Loop

Stetje:
'  Waitms Debouncetime
  If Cha = 0 Then
    If Chb = 0 Then Incr Stevec Else Decr Stevec
  End If
  If Stevec => 100 Then
  Incr Obrat
  Stevec = 0
 End If
 If Stevec <= -100 Then
  Decr Obrat
  Stevec = 0
  End If
Return

End

Prekinitvena rutina je malo daljša, vendar še vedno imaš dovolj časa za štetje. Prekinitvena rutina traja okrog 12uS (če povečaš vrednost takta bo hitreje).
LP
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo
marko11
Profesionalec


Pridružen/-a: Ned Jan 2004 18:00
Prispevkov: 112
Kraj: Ponikve

PrispevekObjavljeno: Čet Dec 22, 2011 8:01 pm    Naslov sporočila: Odgovori s citatom

Vlado, povečal sem interni kristal na 8MHz, in vpisal tvojo kodo,
mislim, da kar dobro deluje. Nimam pa dodatnega kristala 16MHz, da bi probal še z njim, bom nabavil.

Nisem pa čisto prepričan, ko ga zelo močno zavrtim z roko. Moral bom probati z vzporednim števcem, da se prepričam.

Če povečam na 16MHz ali bi šlo, da bi delil z 10, da bi imel obrat razdeljen na 10 delov?

Vlado, hvala zelo se trudiš.
LP,

_________________
Kdor visoko leta, daleč vidi.
Nazaj na vrh
Poglej uporabnikov profil Pošlji zasebno sporočilo Pošlji E-sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo    Kazalo po Svet elektronike forumu -> Digitalna elektronika Časovni pas GMT + 1 ura, srednjeevropski - zimski čas
Pojdi na stran 1, 2, 3  Naslednja
Stran 1 od 3

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
You cannot attach files in this forum
You cannot download files in this forum


Powered by phpBB © 2001, 2005 phpBB Group