Joni Heikkilä PYROLYYSIGENERAATTORIN AUTOMAATIO-OHJAUS OHJELMOITAVALLA LOGIIKKAPIIRILLÄ



Samankaltaiset tiedostot
BL40A17x0 Digitaalielektroniikka A/B: Ohjelmoitavat logiikkapiirit

VHDL-piirikuvaus ja simulointi Quartus II ja ModelSim Altera Edition -ohjelmilla

ASM-kaavio: reset. b c d e f g. 00 abcdef. naytto1. clk. 01 bc. reset. 10 a2. abdeg. 11 a3. abcdg

Ohjelmoitavat logiikkaverkot

Digitaalitekniikka (piirit), kertaustehtäviä: Vastaukset

AUTO3030 Digitaalitekniikan jatkokurssi, harjoitus 2, ratkaisuja

Verilogvs. VHDL. Janne Koljonen University of Vaasa

TIETOKONETEKNIIKAN LABORAATIOT V2.0 VHDL ohjelmoinnin perusteet

2_1----~--~r--1.~--~--~--,.~~

AUTO3030 Digitaalitekniikan jatkokurssi, harjoitus 5, ratkaisuja

VHDL-kuvauskieli. Digitaalitekniikka (piirit) Luku 17 Sivu 1 (33)

21~--~--~r--1~~--~--~~r--1~

Jussi Klemola 3D- KEITTIÖSUUNNITTELUOHJELMAN KÄYTTÖÖNOTTO

Esimerkkitentin ratkaisut ja arvostelu

VHDL Tehtävä 1 : JK-Kiikku toteutettu IF:llä

Digitaalitekniikan matematiikka Luku 3 Sivu 1 (19) Kytkentäfunktiot ja perusporttipiirit

Taitaja semifinaali 2010, Iisalmi Jääkaapin ovihälytin

Digitaalilaitteen signaalit

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. FT Ari Viinikainen

VHDL/Verilog/SystemC. Jukka Jokelainen

LUMA SUOMI -kehittämisohjelma LUMA FINLAND -utvecklingsprogram LUMA FINLAND development programme Ohjelmointia Arduinolla

Pikaohje Aplisens APIS type 1X0 ja 2XO

Tällä ohjelmoitavalla laitteella saat hälytyksen, mikäli lämpötila nousee liian korkeaksi.

PM10OUT2A-kortti. Ohje

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Liikennevalot. Arduino toimii laitteen aivoina. Arduinokortti on kuin pieni tietokone, johon voit ohjelmoida toimintoja.

Taitaja2005/Elektroniikka. 1) Resistanssien sarjakytkentä kuormittaa a) enemmän b) vähemmän c) yhtä paljon sähkölähdettä kuin niiden rinnankytkentä

Harjoitustyö - Mikroprosessorit Liikennevalot

Digitaalitekniikan matematiikka Luku 6 Sivu 1 (20) Kombinaatiopiirit & & A B A + B

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

ELEC-C3240 Elektroniikka 2

OMNIA OPINNÄYTETYÖ AMMATTIOPISTO. Diginoppa ICTP09SLG OMNIAN AMMATTIOPISTO

1 Muutokset piirilevylle

Turo Id MIKROPROSESSORIJÄRJESTELMÄN SUUNNITTELU FPGA:LLA

- Käyttäjä voi valita halutun sisääntulon signaalin asetusvalikosta (esim. 0 5V, 0 10 V tai 4 20 ma)

Kauko-ohjauslaite GSM rele 2011 v

CLPD ja FPGA piirien arkkitehtuuri ja ominaisuudet

1 YLEISTÄ. Taitaja2002, Imatra Teollisuuselektroniikkatyö Protorakentelu 1.1 PROJEKTIN TARKOITUS

Ohjelmistoradio. Mikä se on:

TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli

Julkaisun laji Opinnäytetyö. Sivumäärä 43

Digitaalitekniikka (piirit) Luku 15 Sivu 1 (17) Salvat ja kiikut 1D C1 C1 1T 1J C1 1K S R

Tietokoneen muisti nyt ja tulevaisuudessa. Ryhmä: Mikko Haavisto Ilari Pihlajisto Marko Vesala Joona Hasu

Sekvenssipiirin tilat

- Käyttäjä voi valita halutun sisääntulon signaalin asetusvalikosta (esim. 0 5V, 0 10 V tai 4 20 ma)

TAITAJA 2007 ELEKTRONIIKKAFINAALI KILPAILIJAN TEHTÄVÄT. Kilpailijan nimi / Nro:

Harjoitustehtävien ratkaisut

GSRELE ohjeet. Yleistä

PR SARJA ASENNUS JA KYTKENTÄ

Toimilohkojen turvallisuus tulevaisuudessa

SATAKUNNAN AMMATTIKORKEAKOULU Sähkötekniikan koulutusohjelma. M-koodit Omron servojen ohjauksessa. Luovutettu. Hyväksytty

Ohjelmoinnin perusteet Y Python

Digitaalitekniikan matematiikka Harjoitustehtäviä

Tervetuloa jatkamaan DIGITAALI- TEKNIIKAN opiskelua! Digitaalitekniikka (piirit) Luku 0 Sivu 1 (8)

KÄYTTÖOHJE PEL 2500 / PEL 2500-M

Synkronisten sekvenssipiirien suunnittelu

OPERAATIOVAHVISTIMET 2. Operaatiovahvistimen ominaisuuksia

PROBYTE CONTROL GSM. GSM/SMS-hälytys- ja ohjauslaite. GSM Control 7/11/01 sivu 1/5

KÄYTTÖOHJE PEL / PEL-M

Safety Integrated -turvatekniset perusratkaisut. Siemens Automation

I2S-VÄYLÄLIITYNNÄN TOTEUTUS FPGA- PIIRILLE. Joel Junttila. Ohjaaja: Jukka Lahti

Algoritmit 1. Luento 3 Ti Timo Männikkö

KÄYTTÖOHJE PEL 1000 / PEL 1000-M

LUMECOM. Jyrsinsovellus. 1. Asennusohje 2. Käyttöohje 3. Käyttöönottokortti

Sekvenssipiirin tilat. Synkroninen sekvenssipiiri ? 1 ? 2

KAUKO-OHJATTAVA OHJAUSKESKUS

NP-2T DL ohje. Oy Nylund-Group Ab

Näppäimistö CT Käyttäjäopas. Global Safety & Security Solutions Oy info@globalsafety.fi. CT1000v.5

START Pääohjelma - arvojen asettaminen - keskipisteet - kierrenousujen ohjaus. Tokan reiän hionta

Kielioppia: toisin kuin Javassa

Tehtävään on varattu aikaa 8:30 10:00. Seuraavaan tehtävään saat siirtyä aiemminkin. Välipalatarjoilu työpisteisiin 10:00

Moottorin kaukokäynnistys. Toiminta. Käyttäytyminen. Moottorin kaukokäynnistyksen toiminnolla moottori käynnistetään ohjaamon ulkopuolelta.

1.3Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

OPTYMA Control Kylmäjärjestelmän ohjauskeskus

1. Yleistä. 2. Ominaisuudet. 3. Liitännät

Taitaja2010, Iisalmi Suunnittelutehtävä, teoria osa

9.6 Kannettava testilaite

PROBYTE CONTROL GSM GSM/SMS-hälytys- ja ohjauslaite

Ongelma(t): Mistä loogisista lausekkeista ja niitä käytännössä toteuttavista loogisista piireistä olisi hyötyä tietojenkäsittelyssä ja tietokoneen

ERISTYSTASON VALVONTARELE MEV-7 (LC-7 ja Kosketusnäyttö)

Testausdokumentti. Kivireki. Helsinki Ohjelmistotuotantoprojekti HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos

TASA- JA VAIHTOVIRTAPIIRIEN LABORAATIOTYÖ 5 SUODATINPIIRIT

S11-09 Control System for an. Autonomous Household Robot Platform

Siinä tapauksessa tätä ohjelehtistä ei tarvita.

P I C A X E O H J E L M O I N T I

DIMLITE Daylight. Sähkönumero Käyttöohje

JOHDATUS ELEKTRONIIKKAAN. Oppitunti 2 Elektroniikan järjestelmät

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A.

LUMECOM. Jyrsinsovellus. 1. Asennusohje 2. Käyttöohje

SUNDIAL FLOW+ - OHJAUSYKSIKKÖ

Ohjelmoinnin peruskurssi Y1

Ohjelmoitava päävahvistin WWK-951. Anvia TV Oy Rengastie Seinäjoki

ERISTYSTASON VALVONTARELE MEV-7 (LC-7/6)

KÄYTTÖOHJE HIRVIMATIC (2V0)

S SÄHKÖTEKNIIKKA Kimmo Silvonen

Megatunen käyttö. Asenna megatune koneelle MsExtra-sivuilta:

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

Avoimen luukun varoitussanomat. Toiminto

Työ 1: Logiikka ja robotti

Transkriptio:

Joni Heikkilä PYROLYYSIGENERAATTORIN AUTOMAATIO-OHJAUS OHJELMOITAVALLA LOGIIKKAPIIRILLÄ Opinnäytetyö KESKI-POHJANMAAN AMMATTIKORKEAKOULU Tietotekniikan koulutusohjelma Kesäkuu 2008

TIIVISTELMÄ OPINNÄYTETYÖSTÄ Yksikkö Ylivieska, tekniikka Aika 2.6.2008 Tekijä/tekijät Joni Heikkilä Koulutusohjelma Tietotekniikka Työn nimi Pyrolyysigeneraattorin automaatio-ohjaus ohjelmoitavalla logiikkapiirillä Työn ohjaaja Joni Jämsä FM Sivumäärä 25 + 12 liitettä Työelämäohjaaja Yrjö Muilu DI Tämän opinnäytetyön tarkoituksena oli toteuttaa automaatio-ohjaus pyrolyysigeneraattoriin ohjelmoitavalla logiikkapiirillä. Ohjelmointi suoritettiin Alteran Quartus II-suunnittelutyökalulla. Logiikkapiirin konfigurointi tehtiin Quartus II:n ja Alteran kehitysalustan avulla ja myös testaus suoritettiin kehitysalustalla. Ohjelmoinnin lisäksi työhön täytyi suunnitella ohjelmaan tarvittavat ajastukset. Työssä päädyttiin käyttämään ulkoista signaalia, sekä aikareleitä. Järjestelmä on rajattu käsittämään antureiden tilojen tarkkailua ja releiden ohjauksia. Asiasanat Ohjelmoitavat logiikkapiirit, CPLD, VHDL

ABSTRACT CENTRAL OSTROBOTHNIA UNIVERSITY OF APPLIED SCIENCES Ylivieska, Technology Degree programme Information Technology programme Name of thesis Date 2.6.2008 Author Joni Heikkilä Pyrolysisgenerator Automation Control with Programmable Logic Device Instructor Pages Joni Jämsä M.Sc Supervisor 25 + 12 attachments Yrjö Muilu M.Sc The purpose of this work was to create automation control to pyrolysisgenerator with programmable logic device. Programming was performed with Quartus II designing tool. Configuration of the device was made with Quartus II and Altera s educational platform and the software testing also used this educational platform. In addition to programming, in this work timings were planned. External signal and timing relay were used for timings in this work. This system contains the control functions for relays and sensors. Key words Programmable logic devices, CPLD, VHDL

SISÄLLYS TIIVISTELMÄ ABSTRACT SISÄLLYSLUETTELO LYHENTEET 1 JOHDANTO...1 2 YLEISTÄ...2 2.1 PLD -piirit...2 2.2 FPGA -piirit...3 2.3 Järjestelmäpiirit...4 2.4 Laitteiston kuvauskieli...4 2.5 VHDL...5 2.6 VHDL -kuvauksen rakenne...5 3 VAATIMUSMÄÄRITTELY...7 3.1 Normaalikäyttö...7 3.2 Vikatilat...7 4 TYÖSSÄ KÄYTETTÄVÄT LAITTEET JA OHJELMAT...8 4.1 Altera MAX 7000S...8 4.2 UP1-kehitysalusta...9 4.3 Quartus II...9 4.4 Viiveet...11 4.5 Kellopulssi...11 4.6 Input / Output...12 5 OHJELMOINTI...14 5.1 Pääohjelma...14 5.2 Aliohjelmat...19 5.3 Analyysi & synteesi...20 5.4 Kääntäminen...21 5.5 Simulointi...21 5.6 Piirin ohjelmointi...21 6 TESTAUS...22 7 YHTEENVETO...23 LÄHTEET...24 LIITELUETTELO...25 LIITTEET

LYHENTEET ASM CPLD DSP FPGA HDL JTAG MAX PAL PLCC PLD SPLD SRAM VHDL VHSIC Algorithmic State Machine Complex Programmable Logic Device Digital Signal Processing Field Programmable Gate Array Hardware Description Language Joint Test Action Group Multiple Array Matrix Programmable Array Logic Plastic Leader Chip Carrier Programmable Logic Device Simple Programmable Logic Device Static Random Access Memory Very High Speed Integrated Circuit Hardware Description Language Very High Speed Integrated Circuit

1 1 JOHDANTO Tämän opinnäytetyön tarkoituksena oli tehdä toimiva automaatio-ohjaus puukaasuvoimalaitokseen, eli pyrolyysigeneraattoriin, joka sisältää pyrolyysikaasuttimen, kaasunpuhdistusjärjestelmän, sekä generaattorin, jota pyörittää puukaasulla toimiva moottori. Pyrolyysigeneraattoria on kehitetty Ylivieskassa Centrian laboratoriossa. Työn haasteena oli etsiä sopiva ohjelmoitava logiikkapiiri automaatio-ohjaukseen, sekä tarvittavien ajastuksien suunnittelu ja vaikeimpana itse koodin suunnittelu ja toteutus. Automaatio-ohjaus sisältää anturien, termostaattien ja säätimien tilojen tarkkailua, sekä puhaltimien, venttiilien ja releiden ohjausta. Opinnäytetyön kirjallinen osuus alkaa teoriatiedolla, jossa kerrotaan yleisesti logiikkapiireistä ja niiden kuvauskielistä, eli ohjelmointikielistä, sekä Quartus IIsuunnittelutyökalusta, jota käytetään ohjelmoitavien logiikkaverkkojen suunnitteluun ja kehitykseen. Näiden jälkeen kerrotaan vaatimusmäärittely, sekä työssä käytettävistä laitteista ja ohjelmista. Loppuosassa keskitytään pääasiassa itse koodiin, sekä piirin ohjelmointiin ja testaukseen. Lopuksi kerrotaan vielä yhteenveto opinnäytetyöstä.

2 2 YLEISTÄ Ohjelmoitava logiikkaverkko(programmable logic) tarkoittaa ohjelmoitavaa digitaalipiiriä, tai yleisimmin sanottuna ohjelmoitavaa logiikkapiiriä, jonka laitevalmistaja ostaa piirin valmistajalta tyhjänä eli ohjelmoimattomana. Piiri sisältää paljon piirielementtejä, sekä johtimia, joita laitevalmistaja yhdistelee ohjelmoimalla piirielementit toisiinsa. Myös piirielementtien toiminta on osittain ohjelmoitavissa. Ohjelmoitavilla logiikkapiireillä voidaan tehdä monimutkaisia loogisia toimintoja. Yleensä piirit ovat uudelleen ohjelmoitavissa, joten niitä on helppo päivittää, kun tarve vaatii. Nykyään ohjelmoitavia logiikkapiirejä käytetään useissa digitaalilaitteissa. Piirin hyviä puolia ovat juuri uudelleen ohjelmoitavuus, pieni koko ja luotettavuus, sekä tuotekehitysprosessin nopeus ja joustavuus. Huonona puolena voidaan pitää suhteellisen suurta tehonkulutusta, sekä joissakin tapauksissa kallista hintaa. Ohjelmoitavat logiikkaverkot voidaan jakaa kolmeen pääryhmään, jotka ovat PLD(Programmable Logic Device)-piirit, FPGA(Field Programmable Gate Arrays)-piirit ja järjestelmäpiirit. (Haltsonen, Levomäki & Rautanen 2004.) 2.1 PLD -piirit CPLD(Complex PLD)-piirit ja SPLD(Simple PLD)-piirit kuuluvat PLD-piireihin, joka on ensimmäinen ohjelmoitavien logiikkaverkkojen päätyyppi. Näissä on haihtumaton muisti, joten ohjelma säilyy vaikka jännite katkaistaan. PLD-piirejä on kertaohjelmoitavia, sekä uudelleen ohjelmoitavia. Pienet ja yksinkertaiset PLD-piirit ovat SPLD-piirejä ja suuret ja monimutkaisemmat ovat CPLD-piirejä. CPLD-piirien perusarkkitehtuuri on PAL(Programmable Array Logic)-tyyppinen, mikä tarkoittaa, että JA-porttien kytkentä TAI-portteihin on kiinteä. Tämä tapa on nykyisin yleisin. CPLD-piirit ovat rakenteeltaan melkein, kuin SPLD-piirit, mutta niissä on kytkentämatriisin lisäksi myös makrosolu- ja liitäntälohkoja. Kuvasta 1 näkee yleisen rakenteen CPLD-piiristä. (Rautanen, E.2008. Luentokalvoja.)

3 KUVA 1. CPLD-piirin yleinen rakenne. (Rautanen, E.2008. Luentokalvoja) 2.2 FPGA -piirit FPGA-piirit ovat PLD-piireihin verrattuna monipuolisempia ja joustavampia. Ne koostuvat ohjelmoitavista logiikkalohkoista, liitäntälohkoista ja kytkentämatriisista. FPGA-piirejä on kertaohjelmoitavia, kun piiri on kerran ohjelmoitu, niin sitä ei voi enää muuttaa ja sitten on uudelleen ohjelmoitavia piirejä, kuten FLASH-perusteisia, jotka ovat järjestelmäohjelmoitavia, nämä laitetaan piirilevylle tyhjänä ja ohjelmoidaan myöhemmin JTAG(Joint Test Action Group)-ohjelmointiliitännän kautta. SRAM(Static Random Access Memory)-perusteiset piirit ohjelmoidaan aina, kun laitteeseen kytketään sähkö, jolloin ohjelma on erillisessä muistissa, josta piiri osaa itse hakea ohjelman aina kun piiriin on kytketty sähkö. (Haltsonen ym.2004.) Kuvasta 2 näkee FPGA-piirin yleisen rakenteen.

4 KUVA 2. FPGA-piirin yleinen rakenne. ( Rautanen, E.2008. Luentokalvoja.) 2.3 Järjestelmäpiirit Ohjelmoitavat järjestelmäpiirit perustuvat yleensä FPGA-teknologiaan. Yhdellä järjestelmäpiirillä voidaan toteuttaa laitteen koko digitaaliosa. Piiri sisältää suuren FPGApiirin, sekä oman prosessorin ja erillistä SRAM-muistia. Piiristä riippuen voi olla myös erityislohkoja, kuten kertojapiirejä, DSP(Digital Signal Processing)-lohkoja tai vaihelukittuja silmukoita. Järjestelmäpiireihin on tarjolla paljon valmiita ohjelmia, joilla voi toteuttaa laitteen suuritöisiä osia, jotka muuten veisivät paljon aikaa. (Haltsonen ym.2004.) 2.4 Laitteiston kuvauskieli Laitteiston kuvauskieli HDL (Hardware Description Language) on nykyään yleinen tapa suunnitella asiakaskohtaisia digitaalipiirejä, sekä ohjelmoitavia logiikkaverkkoja. Se on tekstimuotoinen tapa kuvata digitaalipiiri tai -laite. Kuvauskieli muistuttaa ohjelmointikieltä, mutta suurimpana erona ohjelmointikieleen on, että kuvauskielessä kuvataan samanaikaisesti laitteen rinnakkaista, että peräkkäistä toimintaa Kuvauksia

5 voidaan käyttää simulointiin, piirisynteesiin ja testaukseen. Laitteiston kuvauskieliä on tehty paljon, etenkin logiikkapiirien valmistajat ovat tehneet omia kuvauskieliä, joita voidaan käyttää vain kyseisen valmistajan piireihin. Tällaisia ovat esimerkiksi ABEL, PALASM, CUPL ja AHDL. Standardoituja kuvauskieliä ovat VHDL(Very High Speed Integrated Circuit Hardware Description Language) ja Verilog, näistä Suomessa käytetään yleisimmin VHDL-kieltä. (Haltsonen ym.2004, 356.) 2.5 VHDL VHDL on alun perin Yhdysvaltain puolustusministeriön VHSIC(Very High Speed Integrated Circuit) -hankkeen perustalta syntynyt kuvauskieli, joka on standardoitu vuonna 1987. VHDL on riippumaton piirin valmistajasta ja koska se on tekstimuotoinen, niin sen voi tehdä millä tahansa tekstiä tuottavalla työkalulla ja siirrellä sellaisenaan työkalusta toiseen. Tähän kuvauskieleen on saatavilla paljon valmislohkoja, joiden avulla voidaan säästää paljon suunnittelutyötä. VHDL on todella monipuolinen kieli, jonka sujuva käyttö vaatii paljon opiskelua, että käytännön kokemusta.(haltsonen ym.2004, 357.) 2.6 VHDL -kuvauksen rakenne Jokaisessa VHDL-kuvauksessa täytyy olla ainakin kirjastojen ja pakettien esittely, sekä suunnitteluyksikön esittely (entity declaration) ja VHDL-arkkitehtuuri(architecture). VHDL-kuvauksen perusrakenteen esittelen kaksituloisen JA-portin avulla. LIBRARY IEEE; -- kirjastot käyttöön USE IEEE.STD_LOGIC_1164.all; ENTITY and_2 IS -- Suunnitteluyksikön esittely: PORT ( -- nimi and_2 a, b: IN BIT; -- tulot ja lähdöt (a,b ja f) ja niiden tyyppinä (BIT) f : OUT BIT); END and_2; ARCHITECTURE toiminta OF and_2 IS -- Arkkitehtuuri: nimi(toiminta) BEGIN -- toiminnan kuvaus: f arvoksi sijoitetaan f <= a AND b; -- ( a JA b) END toiminta;

6 Suunnitteluyksikön esittelyosassa kuvataan suunnitteluyksikön nimi sekä tulo- ja lähtösignaalit ja niiden tyyppi, joka esimerkissä on BIT. VHDL-arkkitehtuurissa kuvataan mitä tapahtuu suunnitteluyksikön sisällä. Arkkitehtuuri jakautuu kahteen osaan määrittelyosaan ja koodiosaan. Määrittelyosa koostuu komponenttien, signaalien, vakioiden, funktioiden, proseduurien ja tietotyyppien määrittelystä. Koodiosa sisältää itse toiminnallisen osan. Esimerkissä kuvaus muodostuu sijoituslauseesta, jossa f saa arvon tulosignaalien a ja b JA -funktiosta. Jokaisella arkkitehtuurilla on oma nimi, tässä tapauksessa toiminta. Kommentti merkitään kahdella tavuviivalla. On erittäin tärkeää kommentoida koodia mahdollisimman paljon, jotta myöhemmässä vaiheessa joku muu, tai itse ymmärtää helpommin mitä koodilla kuvataan. On mahdollista, että koodia joutuu muuttamaan myöhemmässä vaiheessa esimerkiksi vian korjaamisen, tai ominaisuuksien lisäämisen takia.

7 3 VAATIMUSMÄÄRITTELY Työn suunnittelu aloitettiin tekemällä kirjallinen vaatimusmäärittely, josta selviää anturien, ajastuksien, releiden ja moottorien toiminnot, sekä koko järjestelmän toiminta. Kirjallisen vaatimusmäärittelyn perusteella piirsin sitten päätöspuun, josta ymmärtää prosessin toiminnan kaikkein parhaiten. Kaavio löytyy liitteenä. 3.1 Normaalikäyttö Käyttö alkaa siitä, kun käynnistyskytkintä painetaan, menee huuhtelu-tila päälle ja myös kolmen minuutin ajastus lähtee päälle. Kun kolme minuuttia on kulunut, menee poltin huuhtelun lisäksi päälle, joka on, niin kauan päällä, kunnes imuputken lämpötila-anturi saavuttaa 100 celsiusastetta. Sitten kun poltin on sammunut, on jälleen pelkkä huuhtelu päällä viisi minuuttia, jonka aikana kaasun tulisi saavuttaa oikea koostumus. Tämän jälkeen on huuhtelu ja ilmaventtiili auki 10 sekuntia. 10 sekunnin jälkeen huuhtelu sammuu, ilmaventtiili pysyy auki ja moottoria startataan viiden sekunnin ajan, jonka jälkeen tutkitaan vakionopeudensäätimestä käynnistyikö moottori. Jos moottori käynnistyi, pysyy ilmaventtiili auki, jos moottori ei käynnistynyt, niin ilmaventtiili menee kiinni ja odotetaan 30 sekuntia ja startataan uudelleen. Jos moottori ei käynnisty kolmen käynnistyskerran jälkeen, palataan huuhtelu poltin vaiheeseen. Ja jos moottori ei käynnisty kahden käynnistysprosessin kierron jälkeen, ajetaan järjestelmä alas. 3.2 Vikatilat Järjestelmä joudutaan ajamaan alas, jos joku näistä kuudesta ehdosta toteutuu ja ne ovat: Käynnistysprosessin kierto on tapahtunut kaksi kertaa, painetaan sammutuskytkintä, kaasunpuhdistussäiliön pesurin paine laskee ilmakehän paineeseen, kaasunpuhdistussäiliön lämpötila nousee yli 150 celsiusastetta, polttimen lämpötila nousee yli 100 celsiusastetta, joka ilmoittaa polttoaineen loppuvan ja jos moottorin voiteluöljyn paine laskee alle kahden ja puolen bar: in. Kaasunpuhdistussäiliön vedenpinnan tasoa valvoo kaksi anturia, yläraja-anturi ja alarajaanturi. Kun vedenpinta saavuttaa ylärajan, aukeaa venttiili ja on auki niin kauan, kunnes vedenpinta on alle alarajan.

8 4 TYÖSSÄ KÄYTETTÄVÄT LAITTEET JA OHJELMAT Tässä kappaleessa kerron mitä suunnittelutyökalua käytän ja minkä logiikkapiirin valitsen. Käydään myös sisään- ja ulostulot läpi, sekä suunnitellaan ajastuksien toteutusta. 4.1 Altera MAX 7000S Tähän työhön valitsin Alteran MAX 7000S sarjan EPM7128SLC84-7 CPLD-piirin. Piirillä on 84-pinninen PLCC(Plastic Leader Chip Carrier)-kotelointi ja se sisältää 128 makrosolua. Piirin valintaan vaikutti sen sisältämä EEPROM-muisti, jonka vuoksi piirin konfigurointi säilyy, vaikka piiristä katkaistaan virta, lisäksi piirin voi konfiguroida uudestaan. Lisäksi piirin valintaan vaikutti Timo Törmälehdon kotiautomaation toteutus ohjelmoitavalla logiikkapiirillä opinnäytetyön onnistuneet tulokset kyseisellä piirillä. KUVA 4. EPM7128S-piirin 84-pinninen PLCC-kotelointi(Altera Corporation 2005,61)

9 4.2 UP1-kehitysalusta UP1 on Alteran valmistama ohjelmoitavien logiikkapiirien kehitys- ja testausalusta. Kehitysalustaan sopii MAX 7000-sarjan CPLD-piiri sekä FLEX 10K-sarjan FPGA-piiri. Kehitysalusta on tehty nimenomaan opetuskäyttöön ja laboratoriopohjaisiin suunnitteluympäristöihin.(altera Corporation 1997, 1-2.) Kehitysalustalla on EPM7128-piiriä varten kaksi painonappia, sekä 16 kytkintä, jotka saadaan kytkettyä piirin tuloihin. Ulostuloihin on mahdollisuus kytkeä kaksi 7- segmenttinäyttöä, jotka on valmiiksi kytketty piirin jalkoihin. Lähtöihin on mahdollisuus kytkeä vielä 16 lediä, mutta ne täytyy kytkeä samoin kuin kytkimetkin, hyppylangoilla oikeisiin pinneihin. KUVA 5. Alteran UP1-kehitysalusta.(Altera Corporation 1997, 3) 4.3 Quartus II Suunnittelutyökalun valinta ei teettänyt ongelmia, ohjelmaksi valitsin Alteran Quartus II, jota käytetään myös Ohjelmoitavat Logiikkapiirit -kurssilla. Alteran kotisivuilta saa rekisteröitymällä ladattua ilmaisen ohjelman ja siihen puolen vuoden käyttöoikeuslisenssin. Käyttämäni versio on 7.2 Web Edition.

10 Quartus II on piirivalmistaja Alteran kehittämä monipuolinen suunnittelutyökalu ohjelmoitavien logiikkaverkkojen suunnitteluun ja kehitykseen. Tällä ohjelmalla voidaan käyttää useita eri kuvauskieliä ja sillä voi myös piirtää piirikaavio muodossa, jolla on helppo ja nopea tehdä yksinkertaisimmat koodit. Quartus II-ohjelmalla voidaan tehdä kaikki suunnittelussa tarvittavat eri vaiheet kuten esimerkiksi piirin valinta, analyysi ja synteesi, pinnien yhdistäminen, kääntäminen, simulointi ja myös itse piirin ohjelmointi. KUVA 3. Quartus II-suunnitteluohjelma.

11 4.4 Viiveet Tässä työssä tarvitaan viisi eripituista viivettä, kaksi hieman pidempää ja kolme lyhyttä viivettä. 10 ja 30 sekunnin viiveet päätin tehdä ohjelmallisesti 100Hz kellopulssia apuna käyttäen, koska se tuodaan piirille joka tapauksessa kytkinvärähtelyn eston takia. Kolmen ja viiden minuutin, sekä lyhyen viiden sekunnin viiveet päätin tehdä aikareleillä. Pidemmät viiveet aikareleillä sen takia, koska ne veisivät ohjelmallisesti suuren määrän piirin kapasiteettia ja toiseksi nämä ajat saadaan helposti säädettyä optimaalisiksi, kuten myös starttausaika pitää testaamalla hakea sopivaksi. 4.5 Kellopulssi 100Hz:n ulkoista kellopulssia tarvitaan kytkinvärähtelyn estoon, sekä kahteen ohjelmallisesti tehtävään viiveeseen. Kellopulssin tuottamiseen käytetään NE555- ajastinpiirin, sekä kahden kondensaattorin ja vastuksen oskillaattorikytkentää. Koska Timo Törmälehto oli havainnut Kotiautomaation toteutus ohjelmoitavalla logiikkapiirilläopinnäytetyössään, että CPLD-piiriin syötetty 100Hz:n kellopulssi oli kaksinkertaistunut 200Hz:ksi, joten tähän työhön syötetään 50Hz:n kellopulssi(törmälehto, T. 2007, 48.) Kuvasta 5 näkee oskillaattorikytkennän. KUVA 6. NE555-oskillaattorikytkentä. (Huhtama, Kari.2007)

12 Kondensaattori C1 arvoksi valitaan sama arvo 0,1uF:a kuin toisessakin kondensaattorissa. Vastus R2 saadaan laskettua seuraavasta kaavasta: R2 = 0.7 / ( f * C1), missä R2 = Vastuksen R2 resistanssi(ω) C1 = Kondensaattorin C1 kapasitanssi (F) f = tarvittava taajuus (Hz) Sijoitetaan arvot: R2 = 0.7 / (50Hz * 0.0000001F) = 140kΩ R1:n tulee olla noin kymmenesosa R2:sta, joten R1:n arvoksi tulee 14kΩ. KUVA 7. Kun komponenttien arvot ovat selvillä, voidaan laskea taajuus ja jaksonajat.( Huhtama, Kari.2007) 4.6 Input / Output Tässä automaatio-ohjauksessa tarvitaan 14 sisääntuloa ja kuusi relelähtöä, sekä mahdollisesti lähtöjä merkkivaloille. Sisääntuloja ovat: 100Hz:n kellopulssi, käynnistyskytkin, sammutuskytkin, imuputkenlämpötila-anturi, vakionopeudensäätimeltä tieto että käykö moottori, pesurin paineanturi, kaasunpuhdistussäiliön lämpötila-anturi, polttoaineen lämpötila-anturi,

13 voiteluöljyn paineanturi, puhdistusveden yläraja-anturi, puhdistusveden alaraja-anturi, kolmen minuutin aikarele, viiden minuutin aikarele ja viiden sekunnin aikarele. Relelähdöt ovat: huuhtelu, poltin, ilmaventtiili, startti, ylivuotoventtiili ja aikarele_5min_ulos. KUVA 8. Päälohkokaavio

14 5 OHJELMOINTI Alun perin oli tarkoitus tehdä ohjelma piirikaaviomuotoisena, koska Quartus IIsuunnitteluohjelmalla se on mahdollista, mutta koska tässä työssä on suurin osa toiminnoista peräkkäisiä, niin se olisi ollut liian vaikeaa. Tästä syystä päätettiin ohjelma tehdä VHDL-kuvauskielellä. Helpoin tapa tehdä peräkkäisiä toimintoja VHDLkuvauskielellä on tilakone(state Machine). Työ alkoi sillä, että vaatimusmäärittelyn perusteella täytyi piirtää päälohkokaavio, sekä päätöspuukaavio, jotka löytyvät liitteenä. 5.1 Pääohjelma Pääohjelma eli tässä tapauksessa tilakone tehtiin Actelin internet-sivuilta löytyvän valmiin VHDL -tilakoneen pohjalta. Ohjelma alkaa kirjastojen käyttöönotolla ja suunnitteluyksikön esittelyllä, josta selviää ulkoiset rajapinnat ja ohjelman nimi, tilakone. --Kirjastot käyttöön Library IEEE; USE IEEE.STD_LOGIC_1164.all; USE IEEE.STD_LOGIC_ARITH.all; USE IEEE.STD_LOGIC_UNSIGNED.all; --Entiteetin määritys ENTITY tilakone IS --Ulkoiset tulot ja lähdöt PORT määrittelyssä PORT (clk100hz,kaynnistys,sammutus,imuputken_lampotilaanturi,kayko_moottori,pesurin_pain eanturi,kaasunpuhdistussailion_lampotilaanturi,polttoaineen_lampotilaanturi,voiteluoljyn_ paineanturi,aikarele_5min,aikarele_3min,puhdistusveden_yla,puhdistusveden_ala,aikarele _5s : IN STD_LOGIC; --14 sisääntuloa huuhtelu,poltin,ilmaventtiili,startti, aikarele_5min_ulos,ylivuotoventtiili:out STD_LOGIC); -- 6 ulostuloa END tilakone; Seuraavana alkaa arkkitehtuurin määrittelyosa, joka koostuu komponenttien, signaalien, vakioiden, funktioiden, proseduurien ja tietotyyppien määrittelystä. Ensimmäisenä on tilojen esittely, jotka nimesin selkeyden vuoksi niin, että tilan nimi määräytyy sen mukaan

15 mitkä lähdöt ovat päällä kyseisessä tilassa, sekä sisäiset signaalit, jotka sisältävät tiedon hetkellisestä tilasta. --Käyttäytymiskuvaus ARCHITECTURE toiminta OF tilakone IS --Tilojen esittely TYPE tilatyyppi IS (alkutila,pelkka_huuhtelu,huuhtelu_poltin,pelkka_huuhtelu2,huuhtelu_venttiili, venttiili_start,venttiili,start_epaonnistui,yritys_epaonnistui); --Sisäinen signaali tila sisältää hetkellisen tilan tiedon SIGNAL nykytila,seuraava_tila: tilatyyppi; Seuraavana määritellään pääohjelman sisäiset signaalit, jotka ovat tavallaan muistielementtejä. STD_LOGIC tyyppiset signaalit ovat tässä tapauksessa joko ykkösiä, tai nollia. Viive_10s ja viive30s ovat INTEGER tyyppisiä signaaleja, jotka ovat kokonaislukuja. Viive_10s kasvaa nollasta tuhanteen, kun tuhat on täynnä ja sitä kasvatetaan jälleen, niin se pyörähtää ympäri ja alkaa taas nollasta. Ja samaan malliin myös signaali viive30s. Kaynnistyslaskuri ja yrityslaskuri ovat kaksibittisiä vektorityyppisiä signaaleja, joissa on neljä eri arvoa 00, 01, 10 ja 11. SIGNAL kaynnistys_deb, sammutus_deb,q,herate10,herate30: STD_LOGIC; SIGNAL viive_10s : INTEGER RANGE 0 TO 1000; SIGNAL viive30s : INTEGER RANGE 0 TO 3000; SIGNAL kaynnistyslaskuri: STD_LOGIC_VECTOR(1 DOWNTO 0 ); SIGNAL yrityslaskuri: STD_LOGIC_VECTOR(1 DOWNTO 0 ); Tämän jälkeen esitellään komponentit eli aliohjelmat, sekä niiden sisään- ja ulostulot. COMPONENT sanan jälkeen tulee aliohjelman nimi ja PORT käskyllä määritetään sisään- ja ulostulot. -- Värähtelyn esto COMPONENT debounce PORT(kytkin,clk100Hz : IN STD_LOGIC; kytkin_debounced : OUT STD_LOGIC); END COMPONENT; -- ylivuotoventtiiliohjaus COMPONENT ylivuotoventtiiliohjaus PORT(paalle,ylaraja,alaraja,clk100Hz : IN STD_LOGIC; q : OUT STD_LOGIC); END COMPONENT;

16 --Viive10s COMPONENT viive10sek PORT(clk100Hz,herate10,sammutus_deb : IN STD_LOGIC; viive10s : OUT INTEGER RANGE 0 TO 1000); END COMPONENT; --Viive30s COMPONENT viive30sek PORT(clk100Hz,sammutus_deb,herate30 : IN STD_LOGIC; viive30s : OUT INTEGER RANGE 0 TO 3000); END COMPONENT; Sitten pitää vielä yhdistää komponenttien signaalit pääohjelman välittäviin signaaleihin PORT MAP -käskyn avulla seuraavassa järjestyksessä: aliohjelman signaali => pääohjelman signaali. kaynnistys_debounce : debounce PORT MAP(kytkin=>kaynnistys,clk100Hz=>clk100Hz,kytkin_debounced=>kaynnistys_deb); sammutus_debounce : debounce PORT MAP(kytkin=>sammutus,clk100Hz=>clk100Hz,kytkin_debounced=>sammutus_deb); venttiiliohjaus : ylivuotoventtiiliohjaus PORT MAP(clk100Hz=>clk100Hz,ylaraja => puhdistusveden_yla,paalle=>kaynnistys_deb,alaraja => puhdistusveden_ala,q=>q); viive10 : viive10sek PORT MAP(clk100Hz=>clk100Hz,herate10=>herate10,sammutus_deb=>sammutus_deb, viive10s=>viive_10s); viive30 : viive30sek PORT MAP(clk100Hz=>clk100Hz,sammutus_deb=>sammutus_deb, viive30s=>viive30s,herate30=>herate30); Tämän jälkeen päästään arkkitehtuurin toiminnalliseen osaan mistä selviää, mitä ohjelma itse asiassa tekee. Siinä on määritelty tilasiirtymät ja niiden ehdot, sekä lähtöjen ohjaukset. Seuraavassa näytän alkutilasta siirtymisen pelkka_huuhtelu-tilaan. Ohjelmakoodit löytyvät kokonaisuudessaan liitteenä. WHEN alkutila => huuhtelu <= '0'; poltin <='0'; ilmaventtiili <='0'; startti <='0';

17 aikarele_5min_ulos<='0'; IF kaynnistys ='1' THEN seuraava_tila <= pelkka_huuhtelu; ELSE seuraava_tila <= alkutila; WHEN pelkka_huuhtelu => huuhtelu <= '1'; poltin <='0'; ilmaventtiili <='0'; startti <='0'; aikarele_5min_ulos<='0'; IF aikarele_3min = '0' THEN seuraava_tila <= pelkka_huuhtelu; ELSE seuraava_tila <= huuhtelu_poltin; Ohjelmassa lähdetään liikkeelle alkutila-tilasta. Kun ollaan alkutilassa, kaikki lähdöt ovat nollia. Jos kaynnistys (käynnistys kytkin) on yksi, silloin siirrytään tilaan pelkka_huuhtelu. Jos kaynnistys on nolla, pysytään alkutilassa. Kun ollaan tilassa pelkka_huuhtelu, niin kaikki muut lähdöt paitsi huuhtelu, ovat nollia. Jos aikarele_3min on yksi, eli huuhtelu on ollut kolme minuuttia päällä, siirrytään tilaan huuhtelu_poltin, muulloin pysytään tilassa pelkka_huuhtelu. Tilassa huuhtelu_poltin, lähdöt huuhtelu ja poltin ovat päällä ja muut lähdöt kiinni. Jos imuputken lämpötila-anturi on 100 celsiusastetta, siirrytään tilaan pelkka_huuhtelu2, muulloin pysytään tilassa huuhtelu_poltin. Tilassa pelkka_huuhtelu2, on taas lähdöistä aikarele_5min_ulos ja huuhtelu päällä. Kun aikarele_5min on yksi, eli huuhtelu on ollut viisi minuuttia päällä, siirrytään tilaan huuhtelu_venttiili. Muulloin pysytään samassa tilassa. Tilassa huuhtelu_venttiili, on nimensä mukaan lähdöistä päällä, huuhtelu ja ilmaventtiili. Jos viive_10s on saavuttanut arvon 1000, siirrytään tilaan venttiili_start, muulloin pysytään samassa tilassa ja odotetaan, että viive_10s on saavuttanut arvon 1000. Tilassa venttiili_start, on lähdöistä venttiili ja startti päällä. Jos kayko_moottori on nolla, eli moottori ei käy ja aikarele_5s on päällä, niin pysytään tilassa venttiili_start. Jos taas

18 moottori käy, siirrytään tilaan venttiili ja normaalikäyttö voi alkaa. Jos moottori ei käynnistynyt, siirrytään tilaan start_epaonnistui. Kun ollaan tilassa start_epaonnistui, niin kaikki lähdöt ovat nollia. Jos kaynnistyslaskuri on 11 eli käynnistystä on yritetty kolme kertaa, siirrytään tilaan yritys_epaonnistui. Jos taas kaynnistyslaskuri on pienempi kuin 11 ja viive30s on saavuttanut arvon 3000, siirrytään tilaan venttiili_start, muulloin pysytään samassa tilassa. Tilassa yritys_epaonnistui, kaikki lähdöt ovat nollia. Jos yrityslaskuri on 10 eli käynnistysprosessin kierto on tapahtunut kaksi kertaa, niin siirrytään tilaan alkutila. Jos taas yrityslaskuri on pienempi kuin 10, siirrytään tilaan huuhtelu_poltin. Kun ollaan tilassa venttiili, lähdöistä pelkästään ilmaventtiili on päällä. Tilassa venttiili ollaan silloin, kun moottori on käynnistynyt. Tästä tilasta ei ole tilasiirtymiä muualle. Ja viimeisenä arkkitehtuurissa prosessin ulkopuolella on ylivuotoventtiiliin ohjaus, sekä kasvatetaan sisäisten signaalien, eli muistielementtien arvoa. ylivuotoventtiili <= '1' WHEN q = '1' ELSE '0'; herate10 <= '1' WHEN seuraava_tila = huuhtelu_venttiili ELSE '0'; kaynnistyslaskuri <= kaynnistyslaskuri + '1' WHEN seuraava_tila = start_epaonnistui; yrityslaskuri <= yrityslaskuri + '1' WHEN seuraava_tila = yritys_epaonnistui; herate30 <= '1' WHEN seuraava_tila = start_epaonnistui AND kaynnistyslaskuri < "11" ELSE '0'; Ylivuotoventtiili menee päälle kun signaali q on yksi. Herate10 on herätesignaali aliohjelmalle viive_10s, tämä saa arvon yksi silloin, kun ollaan tilassa huuhtelu_venttiili, muulloin se on nolla. Kaynnistyslaskuria kasvatetaan yhdellä aina kun ollaan tilassa start_epaonnistui. Samaan tapaan yrityslaskuria kasvatetaan aina yhdellä, kun ollaan tilassa yritys_epaonnistui. Herate30 on herätesignaali aliohjelmalle viive30s. Tämä saa arvon yksi silloin, kun tilana on start_epaonnistui ja kaynnistyslaskuri on pienempi kuin 11.

19 5.2 Aliohjelmat Työssä tarvittiin neljä eri komponenttia, eli aliohjelmaa, jotka ovat debounce, viive10sek, viive30sek ja ylivuotoventtiiliohjaus. Kaikkien komponenttien koodit löytyvät kokonaisuudessaan liitteenä. Debounce on värähtelynestokomponentti, jolla suodatetaan kytkinvärähtelyt pois. Lähtöä ohjaa nelibittinen sisäinen signaali siirtorekisteri, joka kellon nousevalla reunalla siirtää bittejä yhden oikealle ja rekisterin vasemmanpuoleiseksi bitiksi tulee kytkimen senhetkinen tila. Jos jokin siirtorekisterin neljästä bitistä on 1, on myös lähtö ykköstilassa, jos kaikki bitit ovat nollia, on lähtö myös nollatilassa. -- kun kellopulssin tila muuttuu nollasta ykköseksi WAIT UNTIL (clk100hz'event) AND (clk100hz = '1'); -- siirto oikealle siirtorekisteri(2 DOWNTO 0) <= siirtorekisteri(3 DOWNTO 1); -- kytkimen tila tallennetaan rekisterin vasemmanpuoleiseksi bitiksi siirtorekisteri(3) <= kytkin; -- jos kaikki bitit nollia IF siirtorekisteri(3 DOWNTO 0)="0000" THEN -- lähtö on nollatilassa kytkin_debounced <= '0'; ELSE -- muulloin lähtö menee ykköstilaan kytkin_debounced <= '1'; Komponentilla viive10sek tuotetaan nimensä mukaan 10 sekunnin viive. Ohjelma sisältää kokonaislukutyyppisen sisäisen signaalin viive, jota kasvatetaan yhdellä aina kellopulssin nousevalla reunalla. Kun viive saavuttaa luvun tuhat, se pyörähtää automaattisesti ympäri ja alkaa laskea uudelleen, jos kaikki vaadittavat ehdot täyttyvät. Viive30sek-komponentti toimii täysin samalla periaatteella. SIGNAL viive : INTEGER RANGE 0 TO 1000; -- kun 1000 täynnä laskuri nollautuu itsestään BEGIN

20 PROCESS( clk100hz,herate10,sammutus_deb) IS BEGIN IF sammutus_deb = '1' THEN --sammutuskytkin nollaa laskurin viive <= 0; ELSIF (clk100hz'event AND clk100hz = '1') THEN IF viive < 999 AND herate10 = '1' THEN viive <= viive + 1; ELSE viive <= 0; END PROCESS; viive10s <= viive; END toiminta; Viimeisenä komponenttina on ylivuotoventtiiliohjaus, jolla valvotaan kaasunpuhdistussäiliön vedenpinnan tasoa. Tasoa valvoo kaksi anturia yläraja-anturi ja alaraja-anturi. Kun vedenpinta saavuttaa ylärajan aukeaa venttiili ja on auki niin kauan, kunnes vedenpinta on alle alarajan. Komponentti tehtiin tilakoneena, jossa on kolme eri tilaa, alkutila, paalla ja kiinni. Lähtöä q ohjataan valikoivalla signaalin sijoituksella. CASE nykytila IS WHEN alkutila => IF ylaraja = '1' THEN nykytila <= paalla; ELSE nykytila <= kiinni; WHEN paalla => IF alaraja = '0' THEN nykytila <= kiinni; WHEN kiinni => IF ylaraja = '1' THEN nykytila <= paalla; END CASE; WITH nykytila SELECT q <= '0' WHEN alkutila, '1' WHEN paalla, '0' WHEN kiinni; 5.3 Analyysi & synteesi Analyysissä Quartus II-ohjelma käy läpi kaikki suunnittelutiedostot ja tämän jälkeen ilmoittaa mahdollisista virheistä. Synteesivaiheessa ohjelma muodostaa

21 suunnittelutiedostoista yhteisen tietokannan. Ensimmäisen kerran kun suoritin analyysin ja synteesin tuli virheilmoituksia melkein 30 kappaletta. Joukossa oli helpohkoja virheitä, muun muassa puolipisteen puuttumisia ja väärinkirjoitettuja signaalien nimiä, mutta oli siellä vakavampiakin virheitä, joitten takia joutui ohjelmaan muuttamaan moneen kertaan eri muotoon. 5.4 Kääntäminen Käännöksessä on neljä eri vaihetta, ensimmäisenä jo äsken mainittu analyysi ja synteesi, toinen vaihe on fitting, jossa Quartus sovittaa koodin valitulle logiikkapiirille. Kolmas vaihe on assembly, joka laatii ohjelmointitiedostot piirin ohjelmointia varten. Viimeinen vaihe on timing analysis, joka selvittää piirin viiveet ja ilmoittaa mahdollisista viiveisiin liittyvistä virheistä. 5.5 Simulointi Simuloinnissa tutkitaan piirin signaalien arvoja, kun sen tulosignaaleille annetaan peräkkäin erilaisia herätesignaaleja. Simuloinnilla on tarkoitus tutkia toimiiko ohjelma halutulla tavalla, tai toimiiko ohjelma ylipäätään ollenkaan. Simulointi tiedosto tehdään aaltomuotoeditorilla(waveform editor) ja itse simulointi tehdään simulaattorilla. Tämän työn simuloinnit löytyvät liitteenä. 5.6 Piirin ohjelmointi Piirin konfigurointi tehtiin Alteran UP1 kehitysalustalla. Alustan JTAG-liitännästä kytketään Byteblaster -ohjelmointikaapeli tietokoneen rinnakkaisporttiin. Tämän jälkeen Quartus II-ohjelmasta otetaan programmer -valikko, josta valitaan ohjelma mikä siirretään ja jos asetukset on kunnossa, painetaan start-kuvaketta, jonka jälkeen ohjelma siirtyy piirille. Ohjelma siirtyi noin sekunnissa piirille, eli todella nopeasti.

22 6 TESTAUS Testaus suoritettiin Quartus II-suunnittelutyökalulla, jolla simuloitiin itse pääohjelma, sekä aliohjelmat. Testauksessa täytyi käydä kaikki mahdolliset tilat ja tilasiirtymät läpi, jotta voitiin varmistua toimiiko ohjelma halutulla tavalla. Alun perin testaus oli tarkoitus suorittaa kehitysalustan ja myöhemmin laitteen oman piirilevyn kanssa. Puuttuvien komponenttien, aikareleiden, sekä piirilevyn vuoksi, testaus jäi pelkästään simuloinnin varaan. Simuloinnissa ohjelma toimi kuten pitikin, mutta ohjelman toimivuudesta ei ole täyttä varmuutta, kun sitä ei päästy testaamaan omalla piirilevyllä. Alla olevasta taulukosta selviää simuloinnin testaussuunnitelma, sekä ohjelman toimivuus. TAULUKKO 1. Testaustaulukko

23 7 YHTEENVETO Tämän opinnäytetyön tekeminen oli todella mielenkiintoista ja haastavaa, koska en ollut aiemmin ohjelmoinut VHDL-kielellä. Olen tyytyväinen siihen mitä sain aikaiseksi, ottaen huomioon sen, etten osannut ohjelmoida VHDL-kielellä opinnäytetyötä aloittaessani. Vaikka ohjelma toimi simuloitaessa niin kuin pitikin, ei ohjelman toimivuudesta ole täyttä varmuutta, koska sitä ei päästy testaamaan itse piirilevyllä. Pelkästään simuloimalla testaamiseen ei voi täysin luottaa. Quartus II-ohjelma ilmoitti koodin vievän 128:sasta makrosolusta yhteensä 95 makrosolua, joka on 74 prosenttia piirin kapasiteetista. Piirin 68:sta I/O-pinnistä on käytössä 24 pinniä. Kehitettävää koodiin jäi varmasti paljon, koska tämä oli ensimmäinen ohjelma, jonka tein VHDL-kielellä. Lisäksi hyvä kehitysidea olisi, jos laitteeseen tulee vikatilanne, niin siitä lähtisi matkapuhelimeen tieto, että järjestelmä on ajettu alas ja mistä syystä. Olisi myös hyvä, jos matkapuhelimella pystyisi seuraamaan, että missä tilassa järjestelmä on.

24 LÄHTEET Julkaisemattomat Törmälehto, T. 2007. Kotiautomaation toteutus ohjelmoitavalla logiikkapiirillä. Opinnäytetyö. Keski-Pohjanmaan ammattikorkeakoulu. Tekniikan toimipiste. Ylivieska. Valli, P. 2006. Kotiautomaation ohjaus FPGA- toteutuksena. Erikoistyö. Keski- Pohjanmaan ammattikorkeakoulu. Tekniikan toimipiste. Ylivieska. Jämsä, J. 2008. Ohjelmoitavat logiikkapiirit. Luentomuistiinpanot. Keski-Pohjanmaan ammattikorkeakoulu. Tekniikan toimipiste. Ylivieska. Painetut Lipsett, R., Schaefer, C. & Ussery, C. 1989. VHDL: Hardware Description and Design. Boston, Massachusetts, USA: Kluwer Academic Publishers. Haltsonen, S., Levomäki, J. & Rautanen, E. 2004. Digitaalitekniikka. Helsinki: Edita Prima Oy. Sähköiset julkaisut Actel. 1997. Designing State Machines For Fpga s. PDF dokumentti. Saatavissa : http://www.actel.com/documents/state_machine_an.pdf. Luettu 1.4.2008. Altera Corporation. 1997. University Program Design Laboratory Package, User Guide. PDF dokumentti. Saatavissa : http://users.ece.gatech.edu/~hamblen/altera/univ.pdf. Luettu 20.3.2008 Altera Corporation. 2005. MAX 7000 Programmable Logic Device Family, Data Sheet. PDF dokumentti. Saatavissa : http://www.altera.com/literature/ds/m7000.pdf. Luettu 1.3.2008. Designing safe VHDL state machines with Synplify. PDF dokumentti. Saatavissa : http://www.synplicity.com/university/pdfs/designing_safe_vhdl.pdf. Luettu 2.4.2008. Huhtama, Kari.2007. NE555 ajastinpiiri. WWW dokumentti. Saatavissa: http://koti.mbnet.fi/~huhtama/ele/index.php?si=ml10.sis&pa=j. Luettu 1.5.2008. Rautanen, E.2008. Luentokalvoja. PDF dokumentti. Saatavissa: http://opetus.stadia.fi/rautanen/dtpb2008k/kotisivu/luennot.htm. Luettu 25.4.2008. State Machines in VHDL. PDF dokumentti. Saatavissa : http://web.engr.oregonstate.edu/~traylor/ece474/new_vhdl_pdfs/state_machines_in_vhdl.p df. Luettu 2.4.2008.

25 LIITELUETTELO Kuvaajat LIITE 1. Päätöspuu LIITE 2. Käytössä olevat I/O -pinnit VHDL koodit LIITE 3. Pääohjelma, tilakone LIITE 4. Debounce, kytkinvärähtelynesto LIITE 5. 10 sekunnin viive LIITE 6. 30 sekunnin viive LIITE 7. Kaasunpuhdistussäiliön vedenpinnan tason ohjaus Quartus II simulointikuvat LIITE 8. Pääohjelma, tilakone LIITE 9. Debounce, kytkinvärähtelynesto LIITE 10. 10 sekunnin viive LIITE 11. 30 sekunnin viive LIITE 12. Kaasunpuhdistussäiliön vedenpinnan tason ohjaus

LIITE 1

LIITE 2

LIITE 3/1 --Pyrolyysigeneraattorin automaatio-ohjaus ohjelmoitavalla logiikkapiirillä --Opinnäytetyö --Joni Heikkilä --kevät 2008 --Kirjastot käyttöön Library IEEE; USE IEEE.STD_LOGIC_1164.all; USE IEEE.STD_LOGIC_ARITH.all; USE IEEE.STD_LOGIC_UNSIGNED.all; --Entiteetin määritys ENTITY tilakone IS --Ulkoiset tulot ja lähdöt PORT määrittelyssä PORT (clk100hz,kaynnistys,sammutus,imuputken_lampotilaanturi,kayko_moottori,pesurin_pain eanturi,kaasunpuhdistussailion_lampotilaanturi,polttoaineen_lampotilaanturi,voiteluoljyn_ paineanturi,aikarele_5min,aikarele_3min,puhdistusveden_yla,puhdistusveden_ala,aikarele _5s :IN STD_LOGIC; --14 sisääntuloa huuhtelu,poltin,ilmaventtiili,startti,aikarele_5min_ulos,ylivuotoventtiili STD_LOGIC);-- 6 ulostuloa :OUT END tilakone; --Käyttäytymiskuvaus ARCHITECTURE toiminta OF tilakone IS --Tilojen esittely TYPE tilatyyppi IS (alkutila,pelkka_huuhtelu,huuhtelu_poltin,pelkka_huuhtelu2,huuhtelu_venttiili, venttiili_start,venttiili,start_epaonnistui,yritys_epaonnistui); --Sisäinen signaali tila sisältää hetkellisen tilan tiedon SIGNAL nykytila,seuraava_tila: tilatyyppi; --Määritetään aliohjelmien liitynnät --ja sisäiset signaalit SIGNAL kaynnistys_deb, sammutus_deb,q,herate10,herate30: STD_LOGIC; SIGNAL viive_10s : INTEGER RANGE 0 TO 1000; SIGNAL viive30s : INTEGER RANGE 0 TO 3000; SIGNAL kaynnistyslaskuri: STD_LOGIC_VECTOR(1 DOWNTO 0 ); SIGNAL yrityslaskuri: STD_LOGIC_VECTOR(1 DOWNTO 0 ); -- Värähtelyn esto COMPONENT debounce PORT(kytkin,clk100Hz : IN STD_LOGIC; kytkin_debounced : OUT STD_LOGIC); END COMPONENT; -- ylivuotoventtiiliohjaus COMPONENT ylivuotoventtiiliohjaus

LIITE 3/2 PORT(paalle,ylaraja,alaraja,clk100Hz : IN STD_LOGIC; q : OUT STD_LOGIC); END COMPONENT; --Viive10s COMPONENT viive10sek PORT(clk100Hz,herate10,sammutus_deb : IN STD_LOGIC; viive10s : OUT INTEGER RANGE 0 TO 1000); END COMPONENT; --Viive30s COMPONENT viive30sek PORT(clk100Hz,sammutus_deb,herate30 : IN STD_LOGIC; viive30s : OUT INTEGER RANGE 0 TO 3000); END COMPONENT; BEGIN --Yhdistetään PORT MAP:lla komponentin signaalit välittäviin signaaleihin kaynnistys_debounce : debounce PORT MAP(kytkin=>kaynnistys,clk100Hz=>clk100Hz,kytkin_debounced=>kaynnistys_deb); sammutus_debounce : debounce PORT MAP(kytkin=>sammutus,clk100Hz=>clk100Hz,kytkin_debounced=>sammutus_deb); venttiiliohjaus : ylivuotoventtiiliohjaus PORT MAP(clk100Hz=>clk100Hz,ylaraja => puhdistusveden_yla,paalle=>kaynnistys_deb,alaraja => puhdistusveden_ala,q=>q); viive10 : viive10sek PORT MAP(clk100Hz=>clk100Hz,herate10=>herate10,sammutus_deb=>sammutus_deb, viive10s=>viive_10s); viive30 : viive30sek PORT MAP(clk100Hz=>clk100Hz,sammutus_deb=>sammutus_deb, viive30s=>viive30s,herate30=>herate30); --Prosessin herätteet PROCESS (clk100hz,sammutus_deb,pesurin_paineanturi,kaasunpuhdistussailion_lampotilaanturi, polttoaineen_lampotilaanturi,voiteluoljyn_paineanturi) BEGIN IF (sammutus_deb = '1' OR pesurin_paineanturi = '1' OR kaasunpuhdistussailion_lampotilaanturi = '1' OR polttoaineen_lampotilaanturi = '1' OR voiteluoljyn_paineanturi = '1') THEN nykytila <= alkutila; ELSIF (clk100hz'event AND clk100hz ='1') THEN nykytila <= seuraava_tila; END PROCESS;

LIITE 3/3 PROCESS (nykytila,seuraava_tila,aikarele_3min,imuputken_lampotilaanturi,aikarele_5min,viive_10s, kayko_moottori,aikarele_5s,kaynnistyslaskuri,viive30s,yrityslaskuri,kaynnistys_deb) BEGIN --Tilasiirtymäehdot kaikille tiloille CASE nykytila IS WHEN alkutila => huuhtelu <= '0'; poltin <='0'; ilmaventtiili <='0'; startti <='0'; aikarele_5min_ulos <='0'; IF kaynnistys_deb ='1' THEN seuraava_tila <= pelkka_huuhtelu; ELSE seuraava_tila <= alkutila; WHEN pelkka_huuhtelu => huuhtelu <= '1'; poltin <='0'; ilmaventtiili <='0'; startti <='0'; aikarele_5min_ulos <='0'; IF aikarele_3min = '0' THEN seuraava_tila <= pelkka_huuhtelu; ELSE seuraava_tila <= huuhtelu_poltin; WHEN huuhtelu_poltin => huuhtelu <= '1'; poltin <='1'; ilmaventtiili <='0'; startti <='0'; aikarele_5min_ulos <='0'; IF imuputken_lampotilaanturi = '0' THEN seuraava_tila <= huuhtelu_poltin; ELSE seuraava_tila <= pelkka_huuhtelu2; WHEN pelkka_huuhtelu2 => huuhtelu <= '1'; poltin <='0'; ilmaventtiili <='0'; startti <='0'; aikarele_5min_ulos <='1';

LIITE 3/4 IF aikarele_5min = '0' THEN seuraava_tila <= pelkka_huuhtelu2; ELSE seuraava_tila <= huuhtelu_venttiili; WHEN huuhtelu_venttiili => huuhtelu <= '1'; poltin <='0'; ilmaventtiili <='1'; startti <='0'; aikarele_5min_ulos <='0'; IF viive_10s = 1000 THEN seuraava_tila <= venttiili_start; ELSE seuraava_tila <= huuhtelu_venttiili; WHEN venttiili_start => huuhtelu <= '0'; poltin <='0'; ilmaventtiili <='1'; startti <='1'; aikarele_5min_ulos <='0'; IF (kayko_moottori = '0' AND aikarele_5s = '1') THEN seuraava_tila <= venttiili_start; ELSIF (kayko_moottori = '1'AND aikarele_5s = '0') THEN seuraava_tila <= venttiili; --normaali käyttö alkaa ELSIF (kayko_moottori = '1'AND aikarele_5s = '1') THEN seuraava_tila <= venttiili; --normaali käyttö alkaa ELSE seuraava_tila <= start_epaonnistui; WHEN start_epaonnistui => huuhtelu <= '0'; poltin <='0'; ilmaventtiili <='0'; startti <='0'; aikarele_5min_ulos <='0'; IF kaynnistyslaskuri = "11" THEN seuraava_tila <= yritys_epaonnistui; ELSIF viive30s = 3000 AND kaynnistyslaskuri < "11" THEN seuraava_tila <= venttiili_start; ELSE seuraava_tila <= start_epaonnistui; WHEN yritys_epaonnistui => huuhtelu <= '0'; poltin <='0'; ilmaventtiili <='0'; startti <='0'; aikarele_5min_ulos <='0'; IF yrityslaskuri = "10" THEN seuraava_tila <= alkutila;

LIITE 3/5 ELSE seuraava_tila <= huuhtelu_poltin; WHEN venttiili => huuhtelu <= '0'; poltin <='0'; ilmaventtiili <='1'; startti <='0'; aikarele_5min_ulos <='0'; seuraava_tila <= venttiili; END CASE; END PROCESS; ylivuotoventtiili <= '1' WHEN q = '1' ELSE '0'; herate10 <= '1' WHEN seuraava_tila = huuhtelu_venttiili ELSE '0'; kaynnistyslaskuri <= kaynnistyslaskuri + '1' WHEN seuraava_tila = start_epaonnistui; yrityslaskuri <= yrityslaskuri + '1' WHEN seuraava_tila = yritys_epaonnistui; herate30 <= '1' WHEN seuraava_tila = start_epaonnistui AND kaynnistyslaskuri < "11" ELSE '0'; END toiminta;

LIITE 4 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.all; USE IEEE.STD_LOGIC_ARITH.all; USE IEEE.STD_LOGIC_UNSIGNED.all; -- suodattaa värähtelyn pois -- suunnitteluyksikön esittely ENTITY debounce IS PORT(kytkin, clk100hz : IN STD_LOGIC; --tulot kytkin_debounced : OUT STD_LOGIC); --lähtö END debounce; -- rakennekuvaus ARCHITECTURE toiminta OF debounce IS -- nelibittinen sisäinen signaali SIGNAL siirtorekisteri : STD_LOGIC_VECTOR(3 DOWNTO 0); BEGIN PROCESS BEGIN -- kun kellopulssin tila muuttuu nollasta ykköseksi WAIT UNTIL (clk100hz'event) AND (clk100hz = '1'); -- siirto oikealle siirtorekisteri(2 DOWNTO 0) <= siirtorekisteri(3 DOWNTO 1); -- kytkimen tila tallennetaan rekisterin vasemmanpuoleiseksi bitiksi siirtorekisteri(3) <= kytkin; -- jos kaikki bitit nollia IF siirtorekisteri(3 DOWNTO 0)="0000" THEN -- lähtö on nollatilassa kytkin_debounced <= '0'; ELSE -- muulloin lähtö menee ykköstilaan kytkin_debounced <= '1'; END PROCESS; END toiminta;

LIITE 5 --viive 10s -- 100Hz sisään => 10ms * 1000 = 10s LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.all; USE IEEE.STD_LOGIC_ARITH.all; USE IEEE.STD_LOGIC_UNSIGNED.all; ENTITY viive10sek IS PORT( clk100hz,herate10,sammutus_deb : IN BIT; viive10s : OUT INTEGER RANGE 0 TO 1000); END viive10sek; ARCHITECTURE toiminta OF viive10sek IS SIGNAL viive : INTEGER RANGE 0 TO 1000; -- kun 1000 täynnä laskuri nollautuu itsestään BEGIN PROCESS( clk100hz,herate10,sammutus_deb) IS BEGIN IF sammutus_deb = '1' THEN --sammutuskytkin nollaa laskurin viive <= 0; ELSIF (clk100hz'event AND clk100hz = '1') THEN IF viive < 999 AND herate10 = '1' THEN viive <= viive + 1; ELSE viive <= 0; END PROCESS; viive10s <= viive; END toiminta;

LIITE 6 --viive 30s --sisään 100Hz => 10ms * 3000 = 30s LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.all; USE IEEE.STD_LOGIC_ARITH.all; USE IEEE.STD_LOGIC_UNSIGNED.all; ENTITY viive30sek IS PORT( clk100hz,sammutus_deb,herate30 : IN BIT; viive30s : OUT INTEGER RANGE 0 TO 3000); END viive30sek; ARCHITECTURE toiminta OF viive30sek IS SIGNAL viive : INTEGER RANGE 0 TO 3000; --laskuri nollaantuu kun 3000 on täynnä BEGIN PROCESS( clk100hz,sammutus_deb,herate30) IS BEGIN IF sammutus_deb = '1' THEN --sammutuskytkin nollaa laskurin viive <= 0; ELSIF (clk100hz'event AND clk100hz = '1') THEN IF herate30 = '1' THEN viive <= viive + 1; END PROCESS; viive30s <= viive; END toiminta;

LIITE 7 --ylivuotoventtiiliohjaus LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.all; ENTITY ylivuotoventtiiliohjaus IS PORT( paalle,ylaraja, alaraja,clk100hz : IN STD_LOGIC; q : OUT STD_LOGIC); END ylivuotoventtiiliohjaus; ARCHITECTURE toiminta OF ylivuotoventtiiliohjaus IS TYPE tilatyyppi IS (paalla,kiinni,alkutila); SIGNAL nykytila : tilatyyppi; BEGIN PROCESS(paalle,clk100Hz) BEGIN IF paalle = '0' THEN nykytila <= alkutila; ELSIF (clk100hz'event AND clk100hz ='1') THEN CASE nykytila IS WHEN alkutila => IF ylaraja = '1' THEN nykytila <= paalla; ELSE nykytila <= kiinni; WHEN paalla => IF alaraja = '0' THEN nykytila <= kiinni; WHEN kiinni => IF ylaraja = '1' THEN nykytila <= paalla; END CASE; END PROCESS; WITH nykytila SELECT q <= '0' WHEN alkutila, '1' WHEN paalla, '0' WHEN kiinni; END toiminta;

LIITE 8

LIITE 9

LIITE 10

LIITE 11

LIITE 12