Myös korttimaksu toimii

Arduino

Aloittaja Pete2, 19.12.09 - klo:21:13

« edellinen - seuraava »

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

Kremmen

Lainaus käyttäjältä: Pete2 - 20.12.09 - klo:22:47
   // tsekataan kumpaan suuntaan inkrementti tuli ja päivitetään inkrementtilaskuri sen mukaan.
   // Otetaan välistä ulos suuntatieto muuttujaan cw
   cw = ((dA && (chA ^ chB)) || (dB && !(chA ^ chB)));
   encoder0Pos +=  cw - ((dA && !(chA ^ chB)) || (dB && (chA ^ chB)));

En itse pääse debuggaamaan tuota joten koetapa muokata lausetta vähän:

   cw = ((dA && (chA ^ chB)) || (dB && !(chA ^ chB)));
   ccw = ((dA && !(chA ^ chB)) || (dB && (chA ^ chB)));  // tämä muuttuja on esiteltävä samoin kuin cw
    if (cw) {
        encoder0Pos += 1;
    } else if (ccw) {
        encoder0Pos -= 1;
    }

Jotain muutakin bugia tuossa vielä täytyy olla. Kokeile nyt tuolla niin katsotaan mitä tapahtuu.
Nothing sings like a kilovolt
Dr W. Bishop

Pete2

Nyt laskee kymmenyksiä eteenpäin riipumatta
pyörityssuunasta kunnes 800 tulee täyteen jonka
jälkeen - merkki(muutuu negatiiviseksi) eteen ja
laskeminen taaksepäin 0:aan ja taas alusta.

Liitteenä ohjelma.

Kremmen

Tuosta olit pudottanut pois kierrosten laskun keskeytyspalvelusta. Ei sitä ollut tarkoitus poistaa.

#include <avr/interrupt.h>
#include <LiquidCrystal.h>

#define encoder0PinA  3            //Quadrature Track A
#define encoder0PinB  4            //Quadrature Track B
#define encoder0PinC  2            //Index Track

#define ENCODER_RESOLUTION 400      // Resoluutio kerrotaan nimetyllä vakiolla joka esitellään, eikä koodiin hautaamalla!
#define SUBDIVISIONS 10            // Moneenko osaan kierros jaetaan näytöllä

//encoder variables

volatile int encoder0Pos = 0;      //the encoder position variable.
volatile int turn = 0;                              //the total turns.
volatile int cw, ccw;               // pyörii myötäpäivään (miksikähän alkup tekijä oli valinnut vastapäivään)
volatile int atIndex;            // INDEKSITIETO KESKEYTYKSESTÄ JOUTOSILMUKKAAN
volatile unsigned int chA, chAPrev; // Enkooderin A-kanavan viimeinen ja viimeistä edellinen tila
volatile unsigned int chB, chBPrev; // Enkooderin B-kanavan viimeinen ja viimeistä edellinen tila



// int start = true;                        //variable used to indicate the first time the encoder sees the index track.
int decimal = 0;                        //tenths of a turn.
int encoderHome = 0;                        //used to reset encoder0Pos if any counts are missed during a rotation.
                                           // pitäisi olla volatile kun muutetaan keskeytyspalvelijasta!! No ,tätä ei enää

käytetä joten jätä kommentoiduksi
// int ccw = false;                        //which direction the encoder is spinning.
int display = 0;                        //variable for display data on LCD screen.

LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

void setup(){

//encoder pinModes
pinMode(encoder0PinA, INPUT);
digitalWrite(encoder0PinA, HIGH);       // turn on pullup resistor
pinMode(encoder0PinB, INPUT);
digitalWrite(encoder0PinB, HIGH);       // turn on pullup resistor
pinMode(encoder0PinC, INPUT);
digitalWrite(encoder0PinC, HIGH);       // turn on pullup resistor

/* MOLEMMAT KESKEYTYKSET ENKOODERIN KANAVIIN */

attachInterrupt(0, doEncoder, CHANGE);  // encoder track A on interrupt 0 - pin 3
attachInterrupt(1, doEncoder, CHANGE);  // encoder track A on interrupt 1 - pin 4

        lcd.begin(16, 2);
        lcd.noCursor();


}


void loop(){
   int tmpPos, tmpTurn;
   lcd.clear();            //clears the LCD screen.
   lcd.print ("Turns =");        //print "Turns =" on the LCD screen.

   cli();                        // VOLATILE-MUUTTUJAN KÄSITTELY PITÄÄ KEHYSTÄÄ KESKEYTYSKIELLOIN!
   tmpPos = encoder0Pos;
        tmpTurn = turn;
   sei();

   decimal = (tmpPos * SUBDIVISIONS / ENCODER_RESOLUTION);
   if (tmpTurn <0) {
      display = abs(tmpTurn+1);
      decimal = abs(decimal);   // Tässä oli syy miksi yksi desimaali putosi pois. Klassinen off-by-one -virhe
      lcd.print ("-");                  //print a negative sign when turns is negative
   } else {
      display = tmpTurn;
   }
lcd.print (display);            //show turns on LCD
lcd.print (".");                  //print a decimal point after the turns
lcd.print (decimal);            //print the tenths of a turn after the decimal point.
delay(20);                        //delay 20ms so that the LCD screen doesnt flood
}


void doEncoder(){

int dA, dB, chC;

   chA = digitalRead(encoder0PinA); //OLETUS: TÄMÄ FUNKTIO ASETTAA ALIMMAN BITIN ARVOON 1/0 JA MUUT 0
   chB = digitalRead(encoder0PinB);

   dA = chA ^ chAPrev;
   dB = chB ^ chBPrev;

   cw = ((dA && (chA ^ chB)) || (dB && !(chA ^ chB)));
   ccw = ((dA && !(chA ^ chB)) || (dB && (chA ^ chB)));  // tämä muuttuja on esiteltävä samoin kuin cw
    if (cw) {
        encoder0Pos += 1;
    } else if (ccw) {
        encoder0Pos -= 1;
    }   

   chAPrev = chA;
   chBPrev = chB;

   chC = digitalRead(encoder0PinC);
   if (chC) {
       encoder0Pos = 0;
       if (cw) {
           turn += 1;
       } else {
           turn -= 1;
   }
}

 
}
Nothing sings like a kilovolt
Dr W. Bishop

Pete2

Nyt laskee eteenpäin ok paitsi että
kymmenykset nollautuvat 20:nessä
taaksepäin laskee kymmenykset
samalla tavalla,mutta kierroslaskuri
muutumaton.

Luulisin että hardware ok

Olisi ehkä pitänyt aloittaa Ledin vilkutus ohjelmalla,
eikä heti kesketyksiä ja nosevia reunoja : )
Viimeksi olen vääntänyt assembler koodia 8085 processorille : )
vuosia sitten.Basic stamp II löytyy myös,mutta se on hidas
lukemaan encoderia.





Tapani Honkanen

Nuo mikrocontrollerit näyttävät mielenkiintoiselta. Aloitin kolmenkymmentä vuotta sitten mikrorakentelun. Kerhoomme kuului tuhansia jäseniä. 1800 User`s Club oli kerhon nimi ja prosessori oli RCA 1800 sarjasta. Koneen nimi oli Telmac. Hauskaa kesti muutaman vuoden kunnes hankin PC:n.  Nyt tuntuu, että tuo Arduino olisi lupaus tulevasta. Onko joutilasta osaajaa, joka joutaisi kertomaan hieman lisää. Mistä koneen voi hankkia ja siitä eteenpäin. p. 050-595 4464 Honkanen tai yksityisviestilläkin. En vielä rohjennut klikata linkkiä. Kyllä "poikakin" voi olla vanha(naikainen)

Pete2

En ole osaaja mutta joutilas : )
Ostin oman Arduinon huutonetistä tuli n viikossa
Honkongista,Arduinosta on olemassa monta mallia
ja monta kloonia.Ainakin Robomaa.com myy Suomessa.
Erittäin hyvin dokumentoitu netissä.


Orbitrek

Ostin omani elektrokit.se ruotsista. Voin suositella. Postit ei maksa sen enempää juurikaan kuin suomesta.
Omasta mielestä arduinon hienous on nimenomaan saatavilla oleva suuri määrä dokumentoitua koodia ja esimerkkejä joita netti on pullollaan. Lsiäksi arduinon koodikirjastolla (vaimikäsenyoli) on helppoa saada mm. lcd:t, servot, pwm ym. toimimaan vaan minuuteissa.
Siitä sitten muokkaamaan ja kehittämään omaa sovellusta.

Kremmen

Lainaus käyttäjältä: Pete2 - 21.12.09 - klo:14:32
Nyt laskee eteenpäin ok paitsi että
kymmenykset nollautuvat 20:nessä
taaksepäin laskee kymmenykset
samalla tavalla,mutta kierroslaskuri
muutumaton.

Luulisin että hardware ok

Olisi ehkä pitänyt aloittaa Ledin vilkutus ohjelmalla,
eikä heti kesketyksiä ja nosevia reunoja : )
Viimeksi olen vääntänyt assembler koodia 8085 processorille : )
vuosia sitten.Basic stamp II löytyy myös,mutta se on hidas
lukemaan encoderia.

Ei tämäkään niin rakettitiedettä ole, ettei voisi näillä aloittaa :)
Tein piruuttani eilen iltapuhteeksi AVR Studiolla testiohjelman, jossa simuloin kaikki koodinpätkät pulssikeskeytyksen ja näyttölaskennan käsittelyssä. Simulattorisa ne toimivat kyllä aivan tarkoitetulla tavalla, eli positio laskee ylös/alas, indeksi päivittää kierroslaskurin ja nollaa position, kierros- ja desimaalinäyttö seuraavat laskentaa kuten pitää. Minulla siis AVR Studio joka käyttää kääntäjänä AVR-GCC ja simulaation tein mega32:a matkien (millä ei pitäisi olla väliä, koska piirin ominaisuuksia ei testiohjelmassa käytetä mihinkään).
Oletko varma, että nuo LCD-näytön ohjaukset todellisuudessa toimivat juuri olettamallasi tavalla? Niitä en pysty simuloimaan kun minulla ei ole tuota Arduinoa itsellä.
Nothing sings like a kilovolt
Dr W. Bishop

Pete2

Ehkä Lcd ohjelmassa kielletään kesketykset,kun
se lähettää byten 4bittiä kerrallaan näytöön?
Ajattelin laittaa vähän "hardwarea" encoderin jälkeen
että ei tarvitse tarkistella pyörimissuuntaa vaan vain
pulsseja ,netissä oli joku 74ls74:lla toteutanut moisen.


Kremmen

Jos se näyttö on HD44780-klooni niin silloin ei pitäisi olla tarvetta kieltää keskeytyksiä missään vaiheessa näytönpäivitystä. Mutta kukapa tietää ennekuin lukee sorsakoodista onko vai ei. Voihan siihen jkoku syy olla.
Kokeile toki sitä piiriratkaisua jos siltä tuntuu. Puusta katsoen tuon keskeytyksen ei pitäisi tarvita mitään pitoa flipflopilla mutta saahan sitä kokeilla. Miten muuten meinasit saada selville pyörimissuunnan jos vain "tarkistelet pulsseja" mutta et pyörimissuuntaa? Meinaan että jos tuo tieto ylipäänsä muodostetaan niin jostain se johtopäätös on kuitenkin tehtävä.
Nothing sings like a kilovolt
Dr W. Bishop

Pete2

Kytkin 74ls74 näin:

http://profmason.com/?p=775

Testasin ledillä kaikki ok.
Sitten kytkin kaksi Diodia outputeihin,
josta johto vain kesketys pinniin.
(Näin keskeytys jos pullssi eteen tai taakse
outputissa)
En käytä indexiä,mutta nyt sille olisi vapaana
viimeinen "pinnikeskeytys"
Nyt toimii jos pyörittää encoderia hitaasti,
mikähän on "pullonkaula" : ) flifloppi vai
laskeeko jännite liikaa diodien takia kun "liipaisu"
aika lyhenee.










Kremmen

Tuo kytkentä antaa sinulle nyt yhden inkrementin kestoisia pulsseja eteen/taakse kahden inkrementin välein. Resoluutio siis on tässä kytkennässä puolet siitä mitä esimerkkiohjelmassa. Jos ymmärsin oikein, e/t -pulssit on kytketty omiin inputteihinsa ja kumpikin diodin kautta vielä yhteen keskeytystuloon.
Pullonkaula ei ainakaan ole 74-logiikan hitaus, se kun on hyvinkin nopeaa. Tilanvaihdot tapahtuvat nanosekunneissa.

Tuo diodiviritys kuullostaa hyvin epäilyttävältä. Jos käyttämäsi piiri on LS-sarjaa niin se low power schottky-teknologia auttaa vähän, mutta silti 74-sarjan piirien kytkeminen erilaisiin virityksiin ei ole takuuvarman onnistumisen paikka. Jos nuo diodit ovat katodi keskeytystuloon päin niin silloin kun kumpikaan flipflop ei ole 1-tilassa, inputti efektiivisesti kelluu. Jos tuloportin ylösvetovastus on aktivoitu, niin sen virta ei mene mihinkään (kun ei pääse diodista läpi flipflopin 0-tilassa olevaan lähtöön) vaan hinaa inputtia kohti 1-tilaa. Ellei ylösvetoa ole aktivoitu, portti kelluu epämääräisessä tilassa. Eli keskeytystuloon pitäisi kytkeä vielä vastus maihin jotta se saadaan luotettavasti 0-tilaan. Vastus pitää mitoittaa niin, että se luotettavasti vetää inputin nollatilaan mutta toisalta niin, että LS-piirin lähtö jaksaa työntää tarpeeksi virtaa jotta tila nousee myös luotettavasti 1-tasoon. Nyt kun alasvetovastusta ei ole, voi käydä jopa niin, että keskeytyksen liipaisee se pieni varausten tasausvirran aiheuttama jännitenökö, joka keskeytystulossa todennäköisesti näkyy kun flipflop putoaa 1-tilasta 0-tilaan. Tuo on äärettömän epämääräinen signaaliksi ja tapahtuu sitä paitsi aivan väärällä ajanhetkellä. Jos arvaan tässä oikein, niin ensinnäkin pyörintäsuunta tulkitaan helposti väärinpäin ja toiseksi pulssititetojen luku tapahtuu hyvin lähellä flipflopin tilanvaihtoa. Voi siis olla ettei viritys kestä nopeampaa pyöritystä siksi, että ajoitukset menevät ristiin eikä mitään järkevää näy (luettaessa nopeasti pyörivää enkooderia tulot ovat aina 0-tilassa lukuhetkellä).
Tällainen 74-logiikan lähtöjen yhdistäminen tehtäisi "oikein" käyttäen piiriä, jossa avoin-kollektorilähtö. Tuollainen lähtö vetää signaalia vain nollaan, mutta ei ykköseen päin. Näitä voi yhdistää rinnan montakin, kunhan niitä lukevassa tulopiirissä on se ylösvetovastus jolla 1-tila saadaan aikaan kun mikään lähtö ei vedä 0-tilaan päin. Tuossa käyttämässäsi ls74:ssä on komplementtilähtö joten sitä ei voi käyttää tähän tapaan. Enpä suoraan muista olisko 74-sarjassa dual d-fliparia o/c lähdöllä, mutta voisihan tuohon lähdön perään laittaa open collector invertterin tai driverin.

Minusta tämä viritys ei ole ainakaan parempi ratkaisu kuin alkuperäinen. Puolet resoluutiosta on menetetty ja kytkentä on monimutkaisempi, ja tällaisena epäluotettava. Tämä ei sitäpaitsi tee mitään mitä alkuperäinen ei myös tehnyt, vaan vähemmän (ei kierroslaskentaa). Periaate sinänsä on ihan OK, mutta minusta turha käyttää tässä sovelluksessa jossa käytössä on prosessori jonka laskentavoima kevyesti pesee parin flipflopin tuoman lisäarvon. Minusta sinun kannattaisi ennemmin hieroa nystyrää kunnes tarkkaan ymmärrät mitä sen alkuperäisen koodin on tarkoitus rivi riviltä tehdä, ja etsit siitä syyn toimimattomuuteen. Se löytyy kyllä ja kun olet sen löytänyt, olet yhden kynnyksen ylemmällä osaamisessa.
Mutta tämä on siis vain minun mielipiteeni. Teet tietysti ihan mitä haluat - kyllä se viisaus lisääntyy monella eri tavalla ;D
Nothing sings like a kilovolt
Dr W. Bishop

Pete2

Resuluutio kyllä piisaa näinkin,ja inputin jouduin
laittamaan digitalWrite(encoder0PinA, LOW)
että sain toimimaan.
Taidan koittaa seuraavaksi flip flopin antoja
molemissa kesketyksissä, ilman diodi "härpäkkeitä",
Ja sitten palaan taas ensimäiseen versioon : )





Kremmen

Joo epäilinkin että ylösvetovastuksen käyttö estäisi toiminnan.
Nuo fliparien lähdöt suoraan kahteen keskeytykseen niin voi muitta mutkitta laskea joko ylöspäin tai alaspäin siitä riippuen kumpi keskeytys tuli.
Nothing sings like a kilovolt
Dr W. Bishop

Jussik

Terve

Jos tarvitsette apuja tuossa AVR:n kanssa, olen sulautettujenjärjestelmien ohjelmoija / HW-suunnittelija.
Kesällä perustin oman yrityksen tarjoamaan CNC-kone huoltoa / valmistusta, Mekaniikka / elektroniikkasuunnittelua.
Erikoisosaamisena Propo / servo hydrauliiikan ohjaukset ja CanOpen ohjaukset.
Pitääpä laittaa oikeen yritys esittely tuonne tarjouspuolelle....

Täällä on aika kattava AVR kirjasto:
http://www.mil.ufl.edu/~chrisarnold/components/microcontrollerBoard/AVR/avrlib/docs/html/main.html

Tuossa linkki suoraan encoder fileen.
http://www.mil.ufl.edu/~chrisarnold/components/microcontrollerBoard/AVR/avrlib/docs/html/encoder_8c-source.html


*Tuosta muokkaamalla saa ihan hyvän encoder kirjaston itselleen.

Hyviä jouluja



Powered by EzPortal
SMF spam blocked by CleanTalk