Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Apsolutni enkoder , definisanje pozicije.. potrebna pomoc

[es] :: Elektronika :: Mikrokontroleri :: Apsolutni enkoder , definisanje pozicije.. potrebna pomoc

[ Pregleda: 3980 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

stojakovicv
Vladimir Stojakovic
Gajdobra

Član broj: 12835
Poruke: 389
*.dialup.neobee.net.



+2 Profil

icon Apsolutni enkoder , definisanje pozicije.. potrebna pomoc06.06.2009. u 21:41 - pre 181 meseci
Ne bih da pokrecem novu temu, vec bih da skrenem paznju posetiocima ovog dela foruma na temu koju sam vec postavio u delu ELEKTRONIKA:

http://www.elitesecurity.org/t363764-0#2299479

Rec je o enkoderu za koji sam najzad pronasao kakav kod daje na izlazu, ali mi je potrebna mala programerska pomoc.
Kako da taj kod , odnosno cifre koje se pojavljuju na izlazu enkodera prevedem u linearnu promenu polozaja.

Kod koji pisem je za PIC 18F8722 , u Proton Basic-u.
99% projekta je gotovo, ostalo mi je jos da resim ulazni podatak koji stize sa enkodera, odnosno trenutnu poziciju, al je malo zapelo, pa bih vas zamolio za pomoc.

 
Odgovor na temu

Odin D.
Mlađi referent za automatizaciju
samoupravljanja

Član broj: 37292
Poruke: 2549



+8370 Profil

icon Re: Apsolutni enkoder , definisanje pozicije.. potrebna pomoc06.06.2009. u 23:26 - pre 181 meseci
Malo su mi konfuzni postovi na toj temi, ali ajde da probamo malo pojasniti.

Imas enkoder sa 20 izlaznih linija, koje predstavljaju 5 cifara (kodovanih sa po 4 bita u Petherick-ovom kodu).
Znaci nije ti problem da od tih 20 linija dobijes decimalni broj od 5 cifara.

Kod apsolutnog enkodera je situacija takva da za neki tacno odredjeni polozaj on uvijek daje tacno jednu te istu kombinaciju na izlazu. Posto ti imas dva diska od kojih se jedan okrece brze od drugog zamisli to kao npr. kazaljke od sata, ali da umjesto kazaljki imas dva diska sa strelicom nacrtanom tamo gdje bi trebale biti kazaljke. Kao sto za svaki polozaj kazaljki tacno znas koliko je sati (u 9:15 je uvijek 9:15, ne moze nesto drugo), tako i za odredjeni polozaj ta dva diska imas uvijek jednu kombinaciju bitova na izlazu.

Posto kazes da se jedan disk okrece 5-6 puta brze od drugog, to znaci da je opseg tvog enkodera dok sporiji disk napravi tacno jedan pun krug, dok onaj brzi napravi onoliko koliko napravi, nije bitno. Probaj da ih vrtis dok ne dodjes u poziciju da ti na displeju pokazuje sve nule (0101 na svakoj od 5 grupa) i to nek ti bude 0-ta (pocetna pozicija) i to obiljezi nekim markerom, olovkom... na sporijem disku. A onda vrti disk u desnu stranu dok ne napravi skoro citav krug, jedno mjesto prije 0-te pozicije, i onda ocitaj tih 5 cifara na izlazu i to ce ti biti maximalni opseg tog enkodera.

Znaci tvoj enkoder moze da broji od 0 do neko MAX. E sad kako ces to pretvoriti u linearne duzine to zavisi od mehanike sa kojom je enkoder spojen sa onim sto mjeri. Ako ti uzmes pa kotrljas taj enkoder po stolu tako da se ti diskovi okrecu i recimo da si ga tako gurao 1m, a pri tome se brojevi na izlazu promjene od 0 do 100, to znaci da svakoj promjeni broja na izlazu za 1, odgovara 1cm. Ako taj disk spojis preko nekih zupcanika na nesto drugo mozes dobiti sasvim druge vrednosti. Znaci, sve zavisi od toga sta mjeris i kako je to spojeno sa tim enkoderom.
 
Odgovor na temu

barum
Bojan Radosavljevic

Član broj: 52522
Poruke: 418
92.60.232.*



+1 Profil

icon Re: Apsolutni enkoder , definisanje pozicije.. potrebna pomoc07.06.2009. u 00:11 - pre 181 meseci
Kada je nekoj cifri susedna cifra levo parna vrednost ta cifre se računa 9-x.
Ako je neparna onda se računa kao što jeste.

Predlog
Code:


    Dim Encoder[5] as Byte ' na poziciji 0 je enkodirana cifra najmanje tezine...
    Dim Result as Dword
...
    Result = 0 ' Rezultat
    ErrorF = 0 ' Flag za gresku
    Even = 0   ' Paran broj
    
    For i = 4 To 0 Step -1
        x = LookUp Encoder[i], [20,1,3,2,20,0,4,20,20,8,6,7,20,9,5,20] ' BCD konverzija
        If x < 10 Then
            If Even > 0 Then ' ako je prethodna cifra bila parna
                x = 9 - x
            Endif
            
            Result = Result * 10
            Result = Result + x
            
            If (x&1) > 0 Then
                Even = 0 ' Neparan broj
            Else
                Even = 1 ' Paran broj
            Endif
        Else
            ErrorF = 1
            i = 0 ' izlaz iz petlje
    Endif
    Next i





[Ovu poruku je menjao barum dana 07.06.2009. u 12:29 GMT+1]
 
Odgovor na temu

stojakovicv
Vladimir Stojakovic
Gajdobra

Član broj: 12835
Poruke: 389
80.93.245.*



+2 Profil

icon Re: Apsolutni enkoder , definisanje pozicije.. potrebna pomoc08.06.2009. u 06:42 - pre 181 meseci
Citat:
barum: Kada je nekoj cifri susedna cifra levo parna vrednost ta cifre se računa 9-x.
Ako je neparna onda se računa kao što jeste.



Mozda si hteo reci ako je susedna cifra neparana, onda se uzima 9-x.
Kada krenes u mom excel fajlu od nule, ka vecim ciframa, trebalo bi da je ova matematika ispravna.

pogledaj http://www.elitesecurity.org/t363764-0#2300536 Pedja je dao dobro resenje.



Inace cemu konverzija u kodu na BCD cifre? Jel ovo neki kod koji si vec imao, pa si ga okacio radi ilustracije, ili je to resenje za ovaj moj problem?
Hvala u svakom slucaju!

 
Odgovor na temu

barum
Bojan Radosavljevic

Član broj: 52522
Poruke: 418
*.rcub.bg.ac.yu.



+1 Profil

icon Re: Apsolutni enkoder , definisanje pozicije.. potrebna pomoc08.06.2009. u 09:47 - pre 181 meseci
Citat:
stojakovicv: Mozda si hteo reci ako je susedna cifra neparana, onda se uzima 9-x.


Da, u pravu si. Probao sam na brzinu samo sa dve cifre. Evo sa svih pet cifara.

Gornji kod treba nije dobar, ovo bi trebalo da bude bolje


Code:


    Dim Encoder[5] as Byte ' na poziciji 0 je enkodirana cifra najmanje tezine...
    Dim Result as Dword
...
    Result = 0 ' Rezultat
    ErrorF = 0 ' Flag za gresku
    Even = 0   ' Paran broj
    
    For i = 4 To 0 Step -1

        x = LookUp Encoder[i], [20,1,3,2,20,0,4,20,20,8,6,7,20,9,5,20] ' BCD konverzija

        If x < 10 Then

            If Even = 0 Then ' ako je prethodna cifra bila neparna
                x = 9 - x
            Endif
            
            Result = Result * 10
            Result = Result + x
            
            If (x&1) > 0 Then
                Even = 0 ' Neparan broj
            Else
                Even = 1 ' Paran broj
            Endif

        Else
            ErrorF = 1
            i = 0 ' izlaz iz petlje
        Endif
    Next i


BCD konverzija je konverzija iz četvorobitnog koda u vrednosti od 0 do 9 i za ilegalne kodove sam stavio 20.
Taj lookup niz je rešenje za ovaj tvoj problem.

Evo probao sam u Excel-u sa svih pet ulaznih cifara.
Prikačeni fajlovi
 
Odgovor na temu

stojakovicv
Vladimir Stojakovic
Gajdobra

Član broj: 12835
Poruke: 389
80.93.245.*



+2 Profil

icon Re: Apsolutni enkoder , definisanje pozicije.. potrebna pomoc08.06.2009. u 10:22 - pre 181 meseci
Jel mozes malo da mi pojasnis kod...

Ovaj deo sa BCD konverzijom... kod jeste Binarno kodiran decimalni kod (BCD) ali ne klasican, vec je upotrebljen Petherick-ov kod, tako da su cifre koje se pojavljuju vec u opsegu od 0 do 9:

DEC Petherick

0= 0101
1= 0001
2= 0011
3= 0010
4= 0110
5= 1110
6= 1010
7= 1011
8= 1001
9= 1101

Prema tome, LookUP tabela bi trebala da sadrzi samo elemente 0..9. Ako se desi greska u citanju sa enkodera, potrebno je dodati jos jedan element (20 kao u tvom primeru).

Pre LookUP funkcije, dodao bih konverziju za svaku cifru iz Petherick-a u DEC:

Dakle 5 x ovo dole:

Dim x1 as byte

IF x1= 0101 then x1= 0 : goto kraj
IF x1= 0001 then x1= 1 : goto kraj
IF x1= 0011 then x1= 2 : goto kraj
.
.
.
IF x1= 1101 then x1= 9 : goto kraj

x1=20

kraj:


Da li postoji jednostavnije resenje?


Ako sam u pravu DIM Encoder[5] as Byte je niz koji sadrzi 5 x 8 bita u koga treba da ubacim ulaz sa enkodera

Kako da naredim promenljivima X1,X2,X3,X4,X5 da budu deo niza Encoder[5] ?


FOR petlja pregleda redom sve cifre koje dolaze sa enkodera i trazi one koje su manje od 10, a potom radi oduzimanje 9-x ako je potrebno

 
Odgovor na temu

barum
Bojan Radosavljevic

Član broj: 52522
Poruke: 418
92.60.232.*



+1 Profil

icon Re: Apsolutni enkoder , definisanje pozicije.. potrebna pomoc08.06.2009. u 22:04 - pre 181 meseci
Potrudiću se da pojasnim malo,
Ulazni niz jeste 5 x 8 bita ali se od svaka 8 bita koriste samo 4 manje težine dok su ostala 4 bita veće težine nule.
Kada se takva osmobitna vrednost posmatra kao decimalni broj on može da ima vrednosti od 0 do 15.
LookUp naredba je najbrži način da se od koda dobije kodirana vrednost. Ona radi tako što vrednost prvog argumenta koristi kao indeks u nizu navedenom kao drugi argument i vraća indeksiranu vrednost. Ako je indeks veći nego što ima elemenata u nizu "za gledanje" onda neće biti upisana nova nijedna vrednost u promenjivu koja prihvata rezultat naredbe.
Da bi mogla da se upotrebi treba prvo naći niz koji radi dekodiranje.


Kao polaznu poziciju imamo niz sortiran po kodiranoj vrednosti.

0101 bin = 5 dec. je kod za vrednost 0
0001 bin = 1 dec. je kod za vrednost 1
0011 bin = 3 dec. je kod za vrednost 2
0010 bin = 2 dec. je kod za vrednost 3
0110 bin = 6 dec. je kod za vrednost 4
1110 bin = 14 dec. je kod za vrednost 5
1010 bin = 10 dec. je kod za vrednost 6
1011 bin = 11 dec. je kod za vrednost 7
1001 bin = 9 dec. je kod za vrednost 8
1101 bin = 13 dec. je kod za vrednost 9


Ako se sada isti niz sortira po kodu dobija se:

0001 bin = 1 dec. je kod za vrednost 1
0010 bin = 2 dec. je kod za vrednost 3
0011 bin = 3 dec. je kod za vrednost 2
0101 bin = 5 dec. je kod za vrednost 0
0110 bin = 6 dec. je kod za vrednost 4
1001 bin = 9 dec. je kod za vrednost 8
1010 bin = 10 dec. je kod za vrednost 6
1011 bin = 11 dec. je kod za vrednost 7
1101 bin = 13 dec. je kod za vrednost 9
1110 bin = 14 dec. je kod za vrednost 5

Zatim dopunom ovog niza sa svim vrednostima od 0 do 15 dobijamo

0000 bin = 0 dec. nije kod ni za jednu vrednost
0001 bin = 1 dec. je kod za vrednost 1
0010 bin = 2 dec. je kod za vrednost 3
0011 bin = 3 dec. je kod za vrednost 2
0100 bin = 4 dec. nije kod ni za jednu vrednost
0101 bin = 5 dec. je kod za vrednost 0
0110 bin = 6 dec. je kod za vrednost 4
0111 bin = 7 dec. nije kod ni za jednu vrednost
1000 bin = 8 dec. nije kod ni za jednu vrednost
1001 bin = 9 dec. je kod za vrednost 8
1010 bin = 10 dec. je kod za vrednost 6
1011 bin = 11 dec. je kod za vrednost 7
1100 bin = 12 dec. nije kod ni za jednu vrednost
1101 bin = 13 dec. je kod za vrednost 9
1110 bin = 14 dec. je kod za vrednost 5
1111 bin = 15 dec. nije kod ni za jednu vrednost

Sada treba samo da izaberemo koja vrednost će da označava pogrešnu ulaznu kombinaciju.
Neka to u ovom slučaju bude -1. Tada imamo niz

[-1, 1, 3, 2, -1, 0, 4, -1, -1, 8, 6, 7, -1, 9, 5, -1]

i sada možemo da napišemo programsku liniju u proton basicu:

Code:

vrednost = LookUp kod, [-1, 1, 3, 2, -1, 0, 4, -1, -1, 8, 6, 7, -1, 9, 5, -1]


koja recimo za kod 00001011 (decimalno jedanaest) iz navedenog niza vraća vrednost sa indeksom jedanaest i to je 7.

Nakon ove programske linije greška može da se proveri

Code:

If x < 0 Then
    ErrorF = 1 ' imamo detektovanu grešku, dalja konverzija nema smisla i rezultat ne treba uzimati u obzir
    i = 0 ' ubrzavamo brojač For petlje na poslednju vrednost kako bi smo uštedeli nepotrebne prolaze kroz petlju pri grešci
Endif


Glavna For petlja polazi od vrednosti 4 kako bi izskenirala kodove sa desna na levo (od cifre najveće težine ka cifri najmanje težine) jer dekodiranje neke cifre zavisi od ishoda dekodiranja cifre veće težine.



Citat:
Pre LookUP funkcije, dodao bih konverziju za svaku cifru iz Petherick-a u DEC

I da naglasim, LookUP funkcija zapravo pretvara iz Petherick u decimalnu vrednost.



Citat:
Kako da naredim promenljivima X1,X2,X3,X4,X5 da budu deo niza Encoder[5] ?
U programskom jeziku C moguće je ovo izvesti uz pomoć unije struktura. Na žalost, basic ne poznaje ništa slično.


 
Odgovor na temu

stojakovicv
Vladimir Stojakovic
Gajdobra

Član broj: 12835
Poruke: 389
80.93.245.*



+2 Profil

icon Re: Apsolutni enkoder , definisanje pozicije.. potrebna pomoc09.06.2009. u 07:03 - pre 181 meseci
Zanimljivo resenje!

Kad si vec tu: Da li da stavim ulaz sa enkodera kao interrupt na PIC-u? Enkoder mi daje 20 bita, pa sam razmisljao da cifru koja se najbrze menja (najniza 4 bita) dovedem na jedan interrupt ulaz. Odnosno, posto 18F8722 ima 4 interrupta, da na te pinove dovedem najbrzu cifru a onda da ovu rutinu za ocitavanje enkodera stavim o obradu interrupta.

S druge strane, posto je enkoder apsolutni, i da ga ne vodim na interrupt, program kada prodje kroz deo za ocitavanje enkodera, uvek ce mi dati trenutnu vrednost pozicije, bez gubitka...
 
Odgovor na temu

barum
Bojan Radosavljevic

Član broj: 52522
Poruke: 418
92.60.232.*



+1 Profil

icon Re: Apsolutni enkoder , definisanje pozicije.. potrebna pomoc09.06.2009. u 10:54 - pre 181 meseci
Citat:
stojakovicv:Da li da stavim ulaz sa enkodera kao interrupt na PIC-u? Enkoder mi daje 20 bita, pa sam razmisljao da cifru koja se najbrze menja (najniza 4 bita) dovedem na jedan interrupt ulaz. Odnosno, posto 18F8722 ima 4 interrupta, da na te pinove dovedem najbrzu cifru a onda da ovu rutinu za ocitavanje enkodera stavim o obradu interrupta.

Nažalost, promena poslednje cifre ne pokriva sve promene. Zavisi od vrste posla i verovatno je potpuno nepotrebno vršiti konverziju svaki put. Ja bih, reciomo, u rutinu tih interaptova stavio da se signalizira samo semafor da je do promene došlo:

Code:
PromenaPostoji = 1


Ako mi igde treba vrednost na onovu ovog semafora znam da li treba da uradim povlačenje vrednosti pinova u ulaznu promenljivu i konverziju nad njima ili da koristim rezultat neke ranije konverzije. Pre čitanja pinova semafor se resetuje.
Code:
PromenaPostoji = 0



Citat:
S druge strane, posto je enkoder apsolutni, i da ga ne vodim na interrupt, program kada prodje kroz deo za ocitavanje enkodera, uvek ce mi dati trenutnu vrednost pozicije, bez gubitka...


Upravo tako, ako performansa nije kritičan resurs onda program može da se zabavlja i konverzijama kodova nepromenjenog ulaza. Ali dobar deo računaja može da se uštedi ovde ako se pre čitanja vrednosti portova u promenljvu izvrši upoređivanje i ako su sve vrednosti iste kao i prošli put, petljanje sa konverzijom izbegne.

Šta koristiš ispod PIC18F8722? Mislim, da li je neka razvojna pločica ili tvoja sopstvena štampa?
 
Odgovor na temu

stojakovicv
Vladimir Stojakovic
Gajdobra

Član broj: 12835
Poruke: 389
80.93.247.*



+2 Profil

icon Re: Apsolutni enkoder , definisanje pozicije.. potrebna pomoc09.06.2009. u 11:22 - pre 181 meseci
Cifre se ispisuju kao duzina, ovako: 5432.1 mm
Bilo kakvo kretanje sistema izaziva sigurnu promenu cifre 1 (iza decimalnog zareza).

Mislio sam da 4 bita od cifre 1 dovedem na interrupt ulaze i ako je tu doslo do promene onda se ide u obradu interrupta - vrsi se racunanje pozicije.
Ako nema promene na interruptu, onda se ne ide u racunanje.

Citav kod sam uradio po principu rada PLC-a. Uvek skenira ulaze i ako se desi promena pise promenu na izlaze. Nema odlazenja u podprograme koji odvlace vreme i paznju procesora od ostalih desavanja, vec se obrada promene na ulazima odmah radi, u letu. Ne znam kako da objasnim, al nadam se da razumes.
Znaci program prolazi samo kroz delove koji su trenutno aktivni.

Da li ima negde opisano koliko vremena odvlace pojedine naredbe, npr: IF..THEN, FOR..NEXT,aritmeticke opreacije... itd.
Na taj nacin mogu da izracunam trajanje "scan" ciklusa u mom programu. Simuliram u Proteusu, ne znam da li on to ima? Ili da u njemu jednostavno pratim sat, pa da vidim ?

Pravim upravljacku plocu sa PIC18F8722, sa 50-tak IO, sa podrskom za RS232 (izlaz na stampac), komunikacija sa memorijskom karticom (citanje korisnickih programa po kojima masina radi), LCD 4x20, keypad 4x5,

U mikroelektronici ima da se uzme PIC18F8722 zalemljen na podnozje sa kristalom od 10MHz :

http://www.mikroe.com/sr/tools/mcu_cards/pic/bigpic3/


 
Odgovor na temu

barum
Bojan Radosavljevic

Član broj: 52522
Poruke: 418
92.60.232.*



+1 Profil

icon Re: Apsolutni enkoder , definisanje pozicije.. potrebna pomoc09.06.2009. u 12:03 - pre 181 meseci
Citat:
stojakovicv: Cifre se ispisuju kao duzina, ovako: 5432.1 mm
Bilo kakvo kretanje sistema izaziva sigurnu promenu cifre 1 (iza decimalnog zareza).


0 0
0 1
0 2
0 3
0 4
0 5
0 6
0 7
0 8
0 9
1 9 <-- svaka deseta promena ne izaziva promenu koda za cifru najmanje težine.
 
Odgovor na temu

stojakovicv
Vladimir Stojakovic
Gajdobra

Član broj: 12835
Poruke: 389
*.nectar.rs.



+2 Profil

icon Re: Apsolutni enkoder , definisanje pozicije.. potrebna pomoc09.06.2009. u 12:12 - pre 181 meseci
:))))) u pravu si!

 
Odgovor na temu

[es] :: Elektronika :: Mikrokontroleri :: Apsolutni enkoder , definisanje pozicije.. potrebna pomoc

[ Pregleda: 3980 | Odgovora: 11 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.