|
Svet elektronike Revija za prave elektronike
|
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
marko11 Profesionalec
Pridružen/-a: Ned Jan 2004 18:00 Prispevkov: 112 Kraj: Ponikve
|
Objavljeno: Tor Dec 20, 2011 7:04 pm Naslov sporočila: Encoder ne šteje dobro!? |
|
|
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 |
|
|
RudiP Profesionalec
Pridružen/-a: Sre Jul 2008 8:39 Prispevkov: 128 Kraj: KOPER
|
Objavljeno: Sre Dec 21, 2011 7:59 am Naslov sporočila: |
|
|
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 |
|
|
Silvo Profesionalec
Pridružen/-a: Tor Jan 2004 19:06 Prispevkov: 234
|
Objavljeno: Sre Dec 21, 2011 1:33 pm Naslov sporočila: |
|
|
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 |
|
|
Vlado Profesionalec
Pridružen/-a: Ned Jan 2004 16:11 Prispevkov: 556 Kraj: Ljubljana
|
Objavljeno: Sre Dec 21, 2011 6:14 pm Naslov sporočila: |
|
|
Marko,
zakaj ne uporabiš ukaza ENCODER ki je že vgrajen v Bascom?
LP |
|
Nazaj na vrh |
|
|
marko11 Profesionalec
Pridružen/-a: Ned Jan 2004 18:00 Prispevkov: 112 Kraj: Ponikve
|
Objavljeno: Sre Dec 21, 2011 6:44 pm Naslov sporočila: |
|
|
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 |
|
|
Jure Urednik
Pridružen/-a: Pon Jan 2004 12:51 Prispevkov: 2132 Kraj: Ljubljana
|
Objavljeno: Sre Dec 21, 2011 6:56 pm Naslov sporočila: |
|
|
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 |
|
|
Vlado Profesionalec
Pridružen/-a: Ned Jan 2004 16:11 Prispevkov: 556 Kraj: Ljubljana
|
Objavljeno: Sre Dec 21, 2011 7:48 pm Naslov sporočila: |
|
|
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 |
|
|
marko11 Profesionalec
Pridružen/-a: Ned Jan 2004 18:00 Prispevkov: 112 Kraj: Ponikve
|
Objavljeno: Sre Dec 21, 2011 8:05 pm Naslov sporočila: |
|
|
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 |
|
|
Vlado Profesionalec
Pridružen/-a: Ned Jan 2004 16:11 Prispevkov: 556 Kraj: Ljubljana
|
Objavljeno: Sre Dec 21, 2011 8:37 pm Naslov sporočila: |
|
|
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 |
|
|
marko11 Profesionalec
Pridružen/-a: Ned Jan 2004 18:00 Prispevkov: 112 Kraj: Ponikve
|
Objavljeno: Čet Dec 22, 2011 5:03 pm Naslov sporočila: |
|
|
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 |
|
|
Vlado Profesionalec
Pridružen/-a: Ned Jan 2004 16:11 Prispevkov: 556 Kraj: Ljubljana
|
Objavljeno: Čet Dec 22, 2011 5:24 pm Naslov sporočila: |
|
|
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 |
|
|
marko11 Profesionalec
Pridružen/-a: Ned Jan 2004 18:00 Prispevkov: 112 Kraj: Ponikve
|
Objavljeno: Čet Dec 22, 2011 6:21 pm Naslov sporočila: |
|
|
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 |
|
|
Silvo Profesionalec
Pridružen/-a: Tor Jan 2004 19:06 Prispevkov: 234
|
Objavljeno: Čet Dec 22, 2011 6:57 pm Naslov sporočila: |
|
|
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 |
|
|
Vlado Profesionalec
Pridružen/-a: Ned Jan 2004 16:11 Prispevkov: 556 Kraj: Ljubljana
|
Objavljeno: Čet Dec 22, 2011 7:22 pm Naslov sporočila: |
|
|
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 |
|
|
marko11 Profesionalec
Pridružen/-a: Ned Jan 2004 18:00 Prispevkov: 112 Kraj: Ponikve
|
Objavljeno: Čet Dec 22, 2011 8:01 pm Naslov sporočila: |
|
|
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 |
|
|
|
|
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
|