Sulautettujen järjestelmien kilpailutehtävä Tehtävän laatija: Jari Koskinen, Tietomyrsky Oy Taitaja 2003/Jyväskylänkoulutuskuntayhtymä Taitajat esiin! Käyntiosoite: Sepänkatu 3, Jyväskylä Puh (014) 444 5130, fax (014) 444 5500
Askelmoottorit Askelmoottori ei ole samanlainen moottori kuin tavallinen DC-moottori. DC-moottorissa on yksi käämi ja moottori pyörii, kun siihen kytketään käyttöjännite. Askelmoottorissa on sen sijaan useita käämejä, joihin kytketään jännite tietyssä järjestyksessä. Jokaisella jännitteen kytkentähetkellä moottorin akseli kääntyy yhden askeleen verran. Kahden peräkkäisen askeleen välillä pitää olla riittävä taukoaika, jotta moottorin roottori ehtii asettua askelta vastaavan asentoon. Moottorin askelpituus riippuu moottorin rakenteesta. Kuvan 1 moottorin askelpituus on 7,5 O, jolloin moottorin akseli pyörähtää täyden ympyrän (360 O ) 48 askeleella. Unipolaarinen askelmoottori Unipolaarisella askelmoottorilla on yleensä (5 tai) 6 liitäntäjohtoa, jotka on kytketty kuvan 1 mukaisesti kahteen keskiulosotolla varustettuun käämiin. Joissain malleissa molempien käämien keskiulosotot voi olla yhdistettynä toisiinsa. Kuva 1. Tehtävässä käytettävän askelmoottorin data-tiedot. Käytännössä molempien käämien keskiulosotot (Red, kuvassa 1) kytketään positiiviseen syöttöjännitteeseen ja molempien käämien päät (Black, Brown, Orange ja Yellow) kytketään vuorotellen syöttöjännitteen maahan (negatiiviseen napaan). Taitaja 2003/Jyväskylänkoulutuskuntayhtymä Taitajat esiin! Käyntiosoite: Sepänkatu 3, Jyväskylä Puh (014) 444 5130, fax (014) 444 5500
Kuvassa 2 esitetään unipolaarisen askelmoottorin periaatteellinen rakenne. Moottorin roottorissa on kiinteä magneetti, jossa on 3 pohjoisnapaa (N) ja 3 etelänapaa (S). Moottorin käämi 1 on sijoitettu staattorin napojen ylä- ja alapuolelle. Käämi 2 on sijoitettu vastaavasti vasemmalle ja oikealle puolelle. Kuva 2. Unipolaarisen askelmoottorin periaatteellinen rakenne. Kuvassa 2 on esitetty, miten moottorin staattori pyörähtää neljä askelta. Tänä aikana esimerkkimoottorin akseli kääntyy 4 * 7,5 O = 30 O. Kun moottoria pyöritetään myötäpäivään, kuvan 2 käämeihin pitää kytkeä jännite seuraavassa järjestyksessä: 1a, 2b, 1b, 2a, 1a, 2b, 1b, 2a, 1a, Kuvan 1 moottorin liitäntäjohtojen värien mukaan jännite kytketään seuraavassa järjestyksessä: Musta, oranssi, ruskea, keltainen, musta, oranssi, ruskea, keltainen, musta, Normaalisti, kun askel on suoritettu, aktiivinen käämi jätetään jännitteelliseksi. Tällöin moottori pitää asentonsa. Jos käämiä ei jätetä jännitteelliseksi, moottorin akseli pyörii vapaasti, jos sitä esimerkiksi pyöritetään. Askelmoottori siis kuluttaa virtaa, vaikka se on pysähtyneenä. Taitaja 2003/Jyväskylänkoulutuskuntayhtymä Taitajat esiin! Käyntiosoite: Sepänkatu 3, Jyväskylä Puh (014) 444 5130, fax (014) 444 5500
Kilpailutehtävä 1. Piirrä askelmoottorin tarvitseman liitäntäelektroniikan kytkentä liitteenä olevalle kytkentä-kaavion pohjalle. Askelmoottoria ohjataan EXB2313-kortin PB0 PB3 lähtöliitännöillä. Valitse tarvittavat komponentit jaettujen komponenttien joukosta. Huomaa, että kaikkia jaettuja komponentteja ei tarvitse käyttää. Kun olet valmis, irrota kytkentäkaaviosivu nipusta ja laita paperiin omat tietosi (nimi ja numero). Esitä kytkentäkaavio tuomarille ja pyydä lupaa jatkaa tehtävää eteenpäin. max 10 p 2. Kytke tarvittavat komponentit ja askelmoottori EXB2313-kortin koekytkentäalustalle. Esitä kytkentä tuomarille ja pyydä lupaa jatkaa tehtävää eteenpäin. max 3 p 3a. Tee askelmoottorin pyörittämiseen tarvittava ohjelma siten, että Kun S1-näppäintä pidetään alhaalla moottori pyörii vastapäivään Kun S2-näppäintä pidetään alhaalla moottori pyörii myötäpäivään Esitä ohjelman toimivuus tuomarille ja pyydä lupaa jatkaa ohjelman B-osaan. max 8 p 3b. Lisää edelliseen ohjelmakoodiin seuraavat toiminnot Kun S3-näppäintä painetaan kerran, moottori pyörii vastapäivään yhden koko kierroksen Kun S4-näppäintä painetaan kerran, moottori pyörii myötäpäivään yhden koko kierroksen Esitä ohjelman B-osan toimivuus tuomarille. max 4p Laadi ohjelma siten, että se on kommentoitu ja muotoiltu oikein. Käytä hyvän ohjelmointitavan mukaisia vakiomäärittelyjä, mikäli ohjelmassa esiintyy vakioita. Taitaja 2003/Jyväskylänkoulutuskuntayhtymä Taitajat esiin! Käyntiosoite: Sepänkatu 3, Jyväskylä Puh (014) 444 5130, fax (014) 444 5500
Komponenttien data-tiedot Taitaja 2003/Jyväskylänkoulutuskuntayhtymä Taitajat esiin! Käyntiosoite: Sepänkatu 3, Jyväskylä Puh (014) 444 5130, fax (014) 444 5500
Taitaja 2003/Jyväskylänkoulutuskuntayhtymä Taitajat esiin! Käyntiosoite: Sepänkatu 3, Jyväskylä Puh (014) 444 5130, fax (014) 444 5500
Taitaja 2003 tehtävän mallivastaus pelkkään A-osaan /********************************************************************** Project : Askelmoottorin ohjaus Version : 1.0 Date : 21.1.2001 Author : Jari Koskinen Company : Tietomyrsky Oy Finland **********************************************************************/ #include <90s2313.h> #include "exb2313.h" #include <delay.h> #define STEP_DELAY 100 // askelten välissä oleva viive unsigned char step[] = 1, 4, 2, 8; // askelkuvio talletettu taulukkoon void main(void) char i; // indeksimuuttuja taulukkoon (0...3) PORTB=0xFF; DDRB=0xFF; PORTD=0x7C; DDRD=0x40; // B-portin liitännät lähdöiksi // D-portin liitännät i = 0; while (1) if (S1) // asetetaan indeksimuuttuja osoittamaan // taulukon ensimmäistä alkiota // jos S1-näppäintä on painettu... // pyöritetään myötäpäivään i--; // taulukon edellinen alkio if (i<0) // varmistetaan, että indeksi ei mene i = 3; // nollaa pienemmäksi if (S4) // jos S4-näppäintä on painettu... // pyöritään vastapäivään i++; // taulukon seuraava alkio if (i>3) // varmistetaan, että indeksi ei mene i = 0; // yli kolmosen PORTB = step[i]; delay_ms(step_delay); // asetetaan seuraavan askeleen vaatima tieto // pidetään tauko jokaisen askeleen välissä ;
Taitaja 2003 tehtävän mallivastaus A-osa ja B-osa yhdessä /********************************************************************** Project : Askelmoottorin ohjaus Version : 1.0 Kilpailijan tiedot pitäisi näkyä Date : 21.1.2001 ohjelmalistauksessa. Kannattaa vielä Author : Jari Koskinen muistuttaa kilpailijoita Company : Tietomyrsky Oy Finland **********************************************************************/ #include <90s2313.h> #include "exb2313.h" #include <delay.h> Vakiot pitäisi olla määritelty. #define STEP_DELAY 100 // askelten välissä oleva viive /**************************************************************************/ /* B-osaan tarvittavat lisämäärittelyt */ /**************************************************************************/ #define CLOCKWISE 1 // pyöritään myötäpäivään #define ANTICLOCKWISE 2 // pyöritään vastapäivään #define ONE_ROUND 48 // yksi kierros on 48 askelta kerrallaan /**************************************************************************/ unsigned char step[] = 1, 4, 2, 8; // askelkuvio talletettu taulukkoon /**************************************************************************/ /* B-osaan tarvittavat lisämuuttujat */ /**************************************************************************/ unsigned char steps; // askelten määrä unsigned char dir; // pyörimissuunta /**************************************************************************/ void main(void) char i; // indeksimuuttuja taulukkoon (0...3) PORTB=0xFF; DDRB=0xFF; PORTD=0x7C; DDRD=0x40; i = 0; while (1) if (S1) // B-portin liitännät lähdöiksi // D-portin liitännät // asetetaan indeksimuuttuja osoittamaan // taulukon ensimmäistä alkiota // jos S1-näppäintä on painettu... // pyöritetään myötäpäivään i--; // taulukon edellinen alkio if (i<0) // varmistetaan, että indeksi ei mene i = 3; // nollaa pienemmäksi if (S2) // jos S2-näppäintä on painettu... // pyöritään vastapäivään i++; // taulukon seuraava alkio if (i>3) // varmistetaan, että indeksi ei mene i = 0; // yli kolmosen Rakenteet pitää olla selkeästi ja johdonmukaisesti sisennettyjä. Askelkuviot taulukossa on parempi kuin, että ne olisivat aseteltu bitti Ohjelma pitää olla kommentoitu. Kommenttien sisältöä voisi arvioida myös, jos menee hiusten halkomiseksi. Hyvä kommentti selittää ohjelman toimintaa, eikä esim. laitetaan luku 3 muuttujaan. Senhän näkee C- lauseestakin.
/************************************************************************/ /* B-osan ohjelmakoodi */ /************************************************************************/ if (S3) // jos S3-näppäintä on painettu... dir = ANTICLOCKWISE; // pyöritään vastapäivään... steps = ONE_ROUND; // aseta yhteen kierrokseen tarvittava // askelmäärä if (S4) // jos S4-näppäintä on painettu... dir = CLOCKWISE; // pyöritään myötäpäivään... steps = ONE_ROUND; // aseta yhteen kierrokseen tarvittava // askelmäärä if (steps) // jos on vielä askeleita jäljellä... if (dir == ANTICLOCKWISE) // onko suunta vastapäivään? i--; // taulukon edellinen alkio if (i<0) // varmistetaan, että indeksi ei mene i = 3; // nollaa pienemmäksi else // jos ei, niin se on myötäpäivään? i++; // taulukon seuraava alkio if (i>3) // varmistetaan, että indeksi ei mene i = 0; // yli kolmosen steps--; // vähennä yksi askel /************************************************************************/ ; PORTB = step[i]; delay_ms(step_delay); Helppo muuttaa nopeutta (vakiot!) // asetetaan seuraavan askeleen vaatima tieto // pidetään tauko jokaisen askeleen välissä Onko käytetty vastaavissa tilanteissa elselausetta. Vai vertaillaanko uudelleen if-lauseella (jos kaksi vaihtoehtoa). Onko ohjelma skaalattavissa? Jos se halutaan saada pyörittämään n-kierrosta. Selviääkö tarvittava muutos kommenteista? Tähän päästään yleensä vakioiden käytöllä ja riittävällä kommentoinnilla. Tässä voisi vielä huippuominaisuutena olla tehtävä ratkaistuna siten, että PORTB:ssä (8-bit) voisi olla kaksi toisistaan riippumatonta askelmoottoria tai muita ohjauksia (LEDejä). Eli, kun PORTB:n neljään alimpaan bittiin asetetaan tieto, neljä ylintä bittiä ei muutu mitenkään (AND- ja ORoperaatioilla).