Myös korttimaksu toimii

DIY DRO

Aloittaja jussi, 15.05.11 - klo:20:57

« edellinen - seuraava »

0 Jäsenet ja 1 Vieras katselee tätä aihetta.

jussi

Moro. Tuli tarve mittalaitteille pikku sumoreen ja noissa digitönäreissä kun ei oikeen riitä pituus edes tähän pieneen jyrsimeen.
aloin miettiä muuta vaihtoehtoa en tiedä onnistuuko mutta koitetaan ainakin.
eli ostin ebaysta ison tulostimen encoderinauhaa 15€ 1.5metriä ja encoderin 8€. ei ole hinnan kiroissa.
tämä nauha on 600dpi koneesta eli pääsee 4 satkun resoluutioon 1200dpi: täkin on tarjolla.
mutta mulle riittää toikin nyt tässä vaiheessa.mittasauvan tein alu-u profiilista johon nauhan asetin kahden muovisoiron avulla.
encoderiin liimasin muovipalan liukupalaksi ja kulmalista pitää sitä urassa.encoderia lukee avr xmega128 jossa on tulot kolmelle encoderille.
kokeilut vasta yhdellä.encoderin luku toimii ja tulostuskin, mutta vielä en keksinyt miten skaalaan tuon rekisterin arvon millimetreiksi.
tuo kerroin kun ei ole tasaluku. pari kuvaa ja video toiminnasta . saa nähdä pääseekö maaliin tässäkään projektissa ;)

PekkaNF

Hieno homma.

Onko kyseessä tämän tapainen "magnetic tape":
http://www.machine-dro.co.uk/index.php?target=categories&category_id=59

Vai optinen nauha?

Mistä ostit ja mikä oli hintaluokka? Luvataanko tolle jotain speksiäkin?

Pekka

Kremmen

#2
Lainaus käyttäjältä: jussi - 15.05.11 - klo:20:57[...] encoderia lukee avr xmega128 jossa on tulot kolmelle encoderille.
kokeilut vasta yhdellä.encoderin luku toimii ja tulostuskin, mutta vielä en keksinyt miten skaalaan tuon rekisterin arvon millimetreiksi.
tuo kerroin kun ei ole tasaluku. [...]
Asema-anturin mittaustiedon muunto on helppoa kuin heinänteko. Ainakin melkein. Tällaista voisi soveltaa:

1. Asematieto ylläpidetään kiinteän pilkun muuttujassa jonka kokonais- ja murto-osien tarkkuus vastaa haluttua arvoaluetta ja resoluutiota. Esimerkin vuoksi oletetaan, että tarkkuudeksi riittää S15.16, eli etumerkillinen 15-bittinen kokonaisosa ja 16-bittinen murto-osa. Jos 1 kokonaisosan bitti on millin niin liikeala on 15 metriä ja rapiat +/- suunnissa, ja tarkkuus on 1/65536 milliä eli harrastelukäyttöön ehkä just riittävä :)
Muuttuja on siis C-kielen long integer-tyyppiä ja ylemmässä 16 bitin sanassa on kokonaisosa ja alemmassa murto-osa.

2. Jokainen enkooderin inkrementti lisätään / vähennetään asematietoon aina liikesuunnan mukaan. Enkooderin pulssia vastaava lukema saadaan laskemalla seuraavasti. Oletetaan että x = enkooderin yhden inkrementin liikematka. Tällöin ohjelmallinen inkrementti on HEX( x * 65536). Jos vaikka x = 0,025 mm/pulssi, niin inkrementti on HEX( 0,025 * 65536) = 0x666.

3. Asematieto muunnetaan desimaaliseksi melkein suoraviivaisesti seuraavin askelin:

3.1 Kokonaisosa menee helposti ajonaikaisen vakiokirjaston itoa-funktiolla (löytyy ainakin esim WinAVRstä ja pitäisi löytyä kaikista C-kirjastoista). Tällä saadaan kokonaisosaa vastaava merkkijono jonka voi suoraan heittää merkkinäytölle. BCD-luvuksi muuntoon löytynee vastaavat avut.

3.2 Murto-osa on pikkasen työläämpi, mutta onnistuu näin pseudokoodattuna:


byte base = 0x0a         // muunnoksen kantaluku. Tässä 10 eli A. Mikä vaan muukin kantaluku toimii.

unsigned long temp;
byte nextBCD;
char nextdigit;

temp = low word(asematieto);      // asematiedon murto-osa 32-bittiseen etumerkittömään muuttujaan temp

if (temp < 0) {         // tsekataan että on positiivinen ja käännetään tarvittaessa (otetaan 2-komplementti)
    temp = temp xor 0xffff;
    temp = temp +1;
}

while (temp >0) {                 // kierretään tässä silmukassa kunne murto-osa on kokonan käsitelty
    temp = temp * base;         // temp-muuttujan yläsanan alemmassa tavussa on nyt seuraava murto-osan numero
    nextBCD = temp >> 16;      // nextBCD-muuttujaan viedään temp:in toka tavu ylhäältä lukien. Tämä on seuraava murto-osan
                               // desimaalinumero
    nextdigit = itoa(nextBCD);      // muunnetaan saatu luku merkiksi jos halutaan lisätä se merkkijonoon tms.
    temp = temp and 0xffff;      // putsataan saatu numero pois tempin yläosasta ja jatketaan alaosan kanssa
}


Yhdistämällä kokonais- ja murto-osat sopivasti saadaan siis asema esitettyä desimaalisena halutulla tavalla.
Nothing sings like a kilovolt
Dr W. Bishop

jussi

LainaaVai optinen nauha?
kyllä siis optinen nauha kyseessä ja nauha oli tosiaan ebayssa noin 15€ 1.5metriä ja sensori noin 8€ mitään datalehdyköitä en noista varsinaisesti löytänyt netistä toi 600dpi nauha on 150lpi ja sillä pääsee tosiaan tuohon 4satasen tarkkuuteen mikäli nyt oikein olen ymmärtäny.

LainaaAsema-anturin mittaustiedon muunto on helppoa kuin heinänteko
Varmaan joo jos osais tehdä heinääkin 8)
Kiitos esimerkistä .
Ihan se ei mulle vielä auennu mutta pitää pureskella sitä rauhassa.

Kremmen

Lainaus käyttäjältä: jussi - 16.05.11 - klo:16:40[...]
Kiitos esimerkistä .
Ihan se ei mulle vielä auennu mutta pitää pureskella sitä rauhassa.
No joo toi oli äkkiä kiireessä kyhätty esitys. Kyllä voin avata sitä lisääkin, kysy vaan mikä kohta ei auennut.
Nothing sings like a kilovolt
Dr W. Bishop

jussi

#5
Täältä tulee kysymyksiä :-[
Mikä on kiinteänpilkun muuttuja?
Miten saan luettua tuon long int muuttujan ylä ja alasanan ?
sellaisen asian huomasin,että kun asematietomuuttuja päivittyy tuolta laskurin rekisteristä jos sen määrittää int. laskurin tullessa nollaan se kääntyy negatiiviseksi.
mutta jos määritys on long int se jatkaa nollan jälkeen 65536:desta alaspäin eikä muutu negatiiviseksi.ei ymmärrä.

tuolla tulostan sen negatiiviseksi
if (TIMER_value < 0)
            {
            lcd_putc(0x2d);
            TIMER_value = ~TIMER_value;
            TIMER_value+=1;
            }
tässä noin aluksi :)

Tauru

Taitaapa olla siten että kakkosen komplementista on kysymys eli binääriluvun esitysmuodosta. Heksana nolla on 0x0000 ja kun tuosta vähentää ykkösen on lopputulos 0xFFFF eli sanan kaikki bitit ovat pystyssä. C-kielessä int on koneen sanan pituinen jos toteutus noudattaa standardia. int-tyypissä ensimmäinen bitti tulkitaan etumerkiksi, unsigned int -tyypissä taas ensimmäinenkin bitti kuuluu numeroroon mukaan. long int on pidempi eli tässä tapauksessa varmaankin ainakin 32 bittiä joten siinä esitysmuodossa etumerkkibitti on kauampana vasemmalla ja kun se sattuu tässä tapauksessa olemaan nolla niin muistipaikkojen sisältö tulkitaan eritavalla. Joka tapauksessa muistissa esitysmuoto on varmaan kunnossa, mutta sovellus käsittelee lukuja 'väärin'.

yläsanan ja alasanan saa vaikka seuraavasti, olkoot x muuttuja josta pitää sanat erottaa:
alasana = x && 0x0000FFFF; // and-bittioperaatiolla nollataan ylimmät 8 bittiä
alasana = x >> 8;   // siirretään bittejä oikealle 8 pykälää, vasempaan reunaan tulee nollia

Niin ja tuossa huomioi sitten oikeasti sanan pituus (8 vai 16 bittiä), esimerkki kahdeksalla bitillä.
Jos ei auennut niin kysy, kerrotaan lisää. Tällä palstalla on useita c-kielen taitajia.

Kremmen

Lainaus käyttäjältä: jussi - 17.05.11 - klo:16:43
Täältä tulee kysymyksiä :-[
Mikä on kiinteänpilkun muuttuja?
Muuttujia on kolmenlaisia. Kokonaislukumuuttujat kuten char, int, long jotka ovat niitä leipämuuttujia.
Numeerisessa laskennassa joudutaan kuitenkin käsittelemään muuttujia joiden arvoalueet ovat hyvin laajat sekä suuriin että pieniin arvoihin päin (siis lähelle nollaa). Jotta voitaisi samalla muuttujatyypillä käsitellä sekä hyvin isoja että hyvin pieniä lukuja, on keksittävä jotain parempaa kuin kokonaisluvut. Tämä parempi keksintö on kahtalainen: kiinteän pilkun luvut ja liukuluvut (floating point). Liukuluku esitetään muodossa etumerkki/eksponentti/mantissa missä eksponentille ja mantissalle on varattu bittejä vähän prosessorin kapasiteetista ja nimenomaisesta liukulukutyypistä riippuen. AVR-prosessorit tukevat 32-bittisiä likulukutyyppejä (float). Kts lisää täältä: http://fi.wikipedia.org/wiki/Liukuluku
Kiinteän pilkun esityksessä sekä luvun kokonais- että murto-osat esitetään "kokonaislukuna" joille kummallekin on varattu tarkoituksenmukainen määrä bittejä, esim etumerkki+15b kokonaisosa+16b murto-osa. Tämä oli se esitys jota aiemmin ehdotin, mutta mikä tahansa muukin jako tulee kyseeseen sen mukaan mikä on tarkoituksenmukaista.
Yleensä kiinteän pilkun aritmetiikka on nopeampaa, ja käytännössä näin on aina "tehottomammilla" prosessoreilla kuten nämä AVR:t. Sitten kun puhutaan 3 gigan neliydinpenasta jossa on integroitu aritmetiikkaprosessori niin asialla ei ole juurikaan väliä ja liukuluvut ovat yleensä suoraviivaisin vaihtoehto. Suomenkielinen wikipedia ei tunnu tästä tietävän, mutta englanniksi löytyy tällainen: http://en.wikipedia.org/wiki/Fixed_point_number
AVR-gcc ja erityisesti AVR-libc tuntevat suoraan siis float-muuttujatyypin mutta eivät mitään kiinteän pilkun tyyppiä. Sen takia kaikki operaatiot on koodattava itse tai haettava netistä joku sopiva kirjastopaketti.
Lainaa
Miten saan luettua tuon long int muuttujan ylä ja alasanan ?

long pitkamuuttuja;
int ylamuuttuja;
word alamuuttuja;

alamuuttuja = pitkamuuttuja // C-kääntäjä tekee automaattisen tyyppimuunnoksen ja heittää mäkeen longin yläosan.

alamuuttuja = pitkamuuttuja & 0xffff; // asianmukaisempi keino jossa ei jätetä mitään sattuman varaan

ylamuuttuja = pitkamuuttuja >> 16; // oikealle shiftaus ( >> ) 16 kertaa siirtää longin 16 ylintä bittiä int-muuttujaan
Lainaa
sellaisen asian huomasin,että kun asematietomuuttuja päivittyy tuolta laskurin rekisteristä jos sen määrittää int. laskurin tullessa nollaan se kääntyy negatiiviseksi.
mutta jos määritys on long int se jatkaa nollan jälkeen 655536:desta alaspäin eikä muutu negatiiviseksi.ei ymmärrä.
Long-tyypin arvoalue on 65-tuhatkertainen 16-bittiseen laskuriin nähden, joten sen etumerkki ei lainkaan seuraa int-pituisen muuttujan etumerkkiä tuossa sijoituslauseessa. Eli 2-komplementtiesityksessä 16-bittisen muuttujan ylin bitti määrää etumerkin (1 = negatiivinen). Long-tyypiossä tämän yläpuolelle jää sijoituksessa edelleen 16 kpl 0-bittejä joten long ei tällä tavalla muutu negatiiviseksi. Jos haluat tuon sijoituksen tehdä, niin joudut sijoittamaan ylimpiin 16 bittiin etumerkkiä vastaavan bitin. Esim tähän tyyliin:

long pitkaluku;
int lyhytluku;

pitkaluku = lyhytluku; // tämä ei vielä riitä, vaan:

if (lyhytluku < 0) { // jos lyhyt integer on negatiivinen, eli ylin bitti on 1, niin kopioidaan se pitkan ylaosaan
    pitkaluku = pitkaluku ^ 0xffff0000;
}

Tuo xmegan laskuri on int "tyyppinen" joten C-ohjelmassa se pitää määritellä int:iksi, muuten käy juuri kuten sinulle kävi. Nyt vaan on niin, että int-tyypin arvoalue +/- 32 tuhatta ja rapiat ei alkuunkaan riitä, juuri tuon numeerisen laskennan vaatimuksista johtuen, mihin edellä viittasin. Tästä syystä joudut todennäköisesti kehittämään systeemin jolla lasket nuo pulssit ohjelmallisesti. Joko suoraan keskeytysohjelmalla yksitellen tai mikäli pulsseja tulee niin nopeasti ettei ehdi, niin sitten käyttämällä tuota prosessorin hardware-laskuria ja sen ylivuotokeskeytysta jolla tunnistat laskurin ympäripyörähtämisen. Todellinen asema tallennetaan silloin ohjelmallisesti niin, että alempi sana on hardware-laskurissa ja ylempi sana ohjelmassa. Ylempää sanaa kasvatetaan / vähennetään sitten aina hardware-laskurin yli/alivuodosta. Desimaalinen näytettävä asema lasketaan ja muunnetaan sitten noista muuttujista kuten edellä on esitetty.
Lainaa

tuolla tulostan sen negatiiviseksi
if (TIMER_value < 0)
            {
            lcd_putc(0x2d);
            TIMER_value = ~TIMER_value;
            TIMER_value+=1;
            }
tässä noin aluksi :)
Taitaisi toimia myös
TIMER_value = -TIMER_value;
Nothing sings like a kilovolt
Dr W. Bishop

jussi

#8
LainaaTaitaisi toimia myös
TIMER_value = -TIMER_value;
jep niinpä näyttää toimivan :)

Mietinkin tuota keskeytystä jo aiemmin ,mutta mulle jäi sellanen käsitys että kun qdec on otettu käyttöön niin keskeytyksen saa vain index pulssilla.
eli tuo timer/counter owerflow on siis mahdollinen vaikka on qdec kaytössä

Kremmen

Lainaus käyttäjältä: jussi - 17.05.11 - klo:22:55
Mietinkin tuota keskeytystä jo aiemmin ,mutta mulle jäi sellanen käsitys että kun qdec on otettu käyttöön niin keskeytyksen saa vain index pulssilla.
eli tuo timer/counter owerflow on siis mahdollinen vaikka on qdec kaytössä
Mä olen viime ajat Atmelin piireistä pelannut enempi noiden 32-bittisten UC3 sarjalaisten kanssa enkä nyt ihan ulkoa muista miten noi xmegan QDEC-eventit ja niihin yhdistetyt laskurit käyttäytyi. Tuosta viivaimesta ei tietty mitään indeksipulssia saa joten indeksillä resetti jää pois, eikä sitä mihinkään tarvitakaan. Kvadratuuridekooderille piti muistaakseni kertoa montako reunaa kierroksella anturi antaa ja se on nyt hankaluus lineaarienkooderin tapauksessa. Määrän voi tietty asettaa laskurin max. arvoon ja jos konfaa indeksin pois käytöstä niin kaipa tuon pitäisi toimia. Tarttisi kokeilla, miten laskuri antaa yli/alivuotokeskeytyksiä tai eventtejä tuossa tapauksessa, mutta mulla on nyt viritetty toisenlaiset piirikannat kehityspenkkiin niin en pääse samantien kokeilmaan.
Varmaan tuota joutuu vähän protoilemaan, mutta uskon kyllä että sen saa jollain konstilla toimimaan.
Nothing sings like a kilovolt
Dr W. Bishop

Kremmen

Vielä tähän aiheeseen: yksi suosittu kiinteän pilkun open source-kirjasto löytyy täältä: http://code.google.com/p/libfixmath/downloads/detail?name=libfixmath_r37.zip. Minusta se ei enää vaadi 64-bittisten perusmuuttujien tukea ainakaan kaikille operaatioille eli on käyttökelpoinen AVR:nkin kanssa (joskaan en ole itse juuri tuota kokeillut).
Kirjasto toteuttaa mm. koneenohjauksessa ja erilaisissa säätäjissä tuiki tarpeelliset saturoituvat operaatiot. Tämä tarkoittaa, että arvoalueiden ylityksissä kirjasto käyttäytyy sivistyneesti ja muuttujat jäävät makaamaan ns. "tappiin" pyörähtelemättä ympäri tms hölmöä.
Kun käytät Atmelin prosessoria niin kiinnostava voisi olla myös UC32-perheen Software Frameworkiin kuuluva DSPLib-toteutus. Se ei suoraan ole ajokelpoinen xmegassa mutta jos sen sorsat löytyisi jostain niin siellä on kaikki yleisimmät digitaalisen signaalinkäsittelyn operaatiot - perusaritmetiikka, trigonometriset funktiot sekä ainakin Fourier-muunnos, lineaarinen konvoluutio, FIR ja IIR-suotimet ja muutakin. Noita viilaamalla voisi saada käyttökelpoista myös xmegalle.
Nothing sings like a kilovolt
Dr W. Bishop

jussi

#11
Nonniin ;D ihmeiden aika ei ole ohi.sain sen näyttämään millejä kymppejä ja satkut pyöristetty lähimpään vitoseen tai nollaan. Nopealla mittauksellä näyttäis vieläpä oikeelta. toivotaan että on myös kun saa tarkemmin mitattua.
Nyt vaan hommaamaan 4rivinen3.3v näyttö ja pari encoder sensoria lisää.
Kiitokset Taurulle ja Kremmenille  oikeeseen suuntaan potkimisesta :)
Ja tosiaan kyllähän tuo ylivuotokeskeytys toimii ihn normaalisti. tosin tähän sitä en nyt tarvinnut.
http://www.youtube.com/watch?v=kLuiPiJ1di0

Kremmen

Lainaus käyttäjältä: jussi - 30.05.11 - klo:23:14
Nonniin ;D ihmeiden aika ei ole ohi.sain sen näyttämään millejä kymppejä ja satkut pyöristetty lähimpään vitoseen tai nollaan. Nopealla mittauksellä näyttäis vieläpä oikeelta. toivotaan että on myös kun saa tarkemmin mitattua.
Nyt vaan hommaamaan 4rivinen3.3v näyttö ja pari encoder sensoria lisää.
Kiitokset Taurulle ja Kremmenille  oikeeseen suuntaan potkimisesta :)
Ja tosiaan kyllähän tuo ylivuotokeskeytys toimii ihn normaalisti. tosin tähän sitä en nyt tarvinnut.
http://www.youtube.com/watch?v=kLuiPiJ1di0
Okei, yläpeukkua! Kyllähän tuossa kaikki onnistumisen eväät olikin, mutta hienoa silti että pelittää. Käytitkö valmiita kirjastoja laskentaan, vai väänsitkö itse? Ihan mielenkiinnosta olisi hupaisaa tutustua tuohon koodiin, jollei se ole niin luottamuksellista ettei voi laittaa näkyviin.
Nothing sings like a kilovolt
Dr W. Bishop

Tauru

No hyvä että minun esimerkki ei ajanut sinua harhapoluille kun kiireessä kirjoitatussa koodissa meni sekaisin looginen AND ja bitti AND -operaattorit.

Lopputuloksena taisi olla todella halpa ja toimiva mittalaite. Lieneekö 2400dpi enkoodereita saatavilla? Jos tuommoista joskus sorviin tai jyrsimeen suunnittelisi laittaa niin 5 satkua ei riitä (paitsi väljään koneeseen).

jussi

LainaaIhan mielenkiinnosta olisi hupaisaa tutustua tuohon koodiin

Hupaisaa  se varmaan onkin :D . Joo ei tuossa mitään salaisuutta tai mullistavaa ole. Jos on niin on tullut vahingossa.
laitan tänne näkyville kun vielä testaan tuon Z akselin ,että toimii. Tuossahan on kovin vähän mun itse tekemää koodia mä kasaan vaan niinkun lego palikoita
pätkä sieltä ja toinen täältä.Mutta tulihan sitä taas jotain uutta opittua.

LainaaJos tuommoista joskus sorviin tai jyrsimeen suunnittelisi laittaa niin 5 satkua ei riitä
Eihän toi tietenkään kaupallisille pärjää, mutta hinta/laatusuhde on ihan hyvä. 3 akselin näyttö 5 satkun tarkkuudella noin 100€
hakkaa se noi sumoren mittarinkulat ainakin ;D ja laitoin tilaukseen 1200dpi kamat niillä saa sitten jo sen 2 satkun tarkkuuden.

Powered by EzPortal
SMF spam blocked by CleanTalk