perjantai 10. marraskuuta 2017

TEHOHAKKURI

Ohjaamalla virtaa kelan läpi, syntyy siihen magneettikenttä. Kun virta katkaistaan, on sillä hetkellä magneettikenttä vielä olemassa ja se pyrkii purkautumaan heti virran katkettua. Jos sillä ei ole galvaanista yhteyttä muualle kytkentään, nousee jännite hyvin suureksi. Tällä periaatteella toimii esimerkiksi bensiinikäyttöisen moottorin sytytys. Jännite nousee, kunnes se on niin korkea, että tulpassa tapahtuu läpilyönti ja magneettikenttä pääsee purkautumaan tätä kautta.


Jännitteen alentamista varten kytkentä olikin jo edellisessä blogissa, missä hakkurilla (pulssinleveysmodulaatiolla, PWM) jännitettä nostettiin nollasta (0) sinimuotoisen jännitteen huippuarvoon, ja seuraavalla neljänneksellä päin vastoin. Tällöin kytkintransistori on kelan (L) etu, eli syöttöpuolella ja diodi poikittain samassa pisteessä. Kun kytkin aukeaa, pääsee magneettikentän luoma virta purkautumaan diodin kautta. Lähdön jännite voi täten muuttua nollasta (0) tulojännitteeseen.

Tämän kertaisessa jaksossa jännitettä nostetaan syöttöjännitteestä ylöspäin. Nyt kytkintransistori sijaitsee kelan jälkeen, ja sitä seuraa diodi. Kun kytkin aukeaa, purkautuu magneettikentän luoma virta diodin kautta kuormaan. Muuttamalla pulssisuhdetta, voidaan lähtöjännitettä säätää.

Tässä ohjelmassa trimmeripotikan jännite johdetaan analogiatuloon, jaetaan luvulla sata (100), jolloin säätöön saadaan kymmenen (19) porrasta. Tässä tapauksessa kytkentätaajuus on noin 83 kHz. Lähtöä ei voida säätää 100 prosenttiin, vaan ohjauksessa on minimissään 2 us tauko. Aliohjelmassa (void Fun_PWM(int pulssi){) on 100 kierroksen looppi. Kun nämä ”pumppaukset” on suoritettu, palataan pääohjelmaan, missä luetaan trimmeripotikan arvo ja kutsutaan aliohjelmaa uudestaan. Säätöä luetaan siis noin 1,2 – 2 ms välin, mikä on niin nopea, että ihminen kokee sen olevan jatkuva säätö.

 
Tuo kuormana oleva lamppu on 12 V, 7W. Tuo 470 uF:in elektrolyyttikondensaattori jaksaa syöttää lamppua myös tauon (OFF) aikana. Lampulle siirtyy siis tasavirtaa, mutta el-konkka ei ole enää näillä taajuuksilla oikein toimiva. Se näkyy siinä, että transistorin kytkentähetkillä jännitteessä näkyy suurtaajuista värähtelyä. Jos käyttöön tarvitaan puhtaampaa tasajännitettä, on lähtöön syytä sijoittaa kelalla (L) ja kondensaattorilla (C) toteutettu alipäästösuodin. Kuvista voi huomata, että ohjauksen ollessa minimissään, lamppu edelleen hehkuu. Sinne johtuu virtalähteen jännite. Tässä tapauksessa 7 V. Kasvattamalla potikalla ON-tilan pituutta, jännite lampun navoissa nousi hiukan yli 15 V:iin.

 
OHJELMA 51
/*******************************
* Ohjelma TehoHakkuri_51
* 10.11.2017
* DC-jännitteen korotus
* pulssinleveysmodulaatiolla (PWM)
*/

// Määrittelyt
    const int Con_AnaTulo = 0;
    int Int_AnaTulo = 0;
    const int Con_Pulssit = 3;


// FUNKTIOT
// Pulssien muodostus (PWM)
    void Fun_PWM(int pulssi){
        const int jakso = 12; // = 12 us ON + OFF
        int ON = pulssi;
        int OFF = jakso - pulssi;
            for(int i = 0; i < 100; i++){
                bitSet(PORTD,Con_Pulssit);
                delayMicroseconds(ON);
                bitClear(PORTD,Con_Pulssit);
              delayMicroseconds(OFF);
            } // for-loopin loppu
    }// pulssien muodostus loppu

void setup() {
    pinMode(Con_Pulssit, OUTPUT);
    Serial.begin(9600);
} // Asetusten loppu

// Pääohjelma, missä luetaan potentiometri
    void loop() {
        Int_AnaTulo = analogRead(Con_AnaTulo);
        Fun_PWM(Int_AnaTulo / 100);
    } // Pääohjelma loppu

keskiviikko 8. marraskuuta 2017

KANTTIAALTOINVERTTERI

Jos tyydytään suorakulma-aaltoon, tulee kytkennästä yksinkertainen. Edelleenkin on Arduino hyvä eristää tehopuolesta galvaanisesti. Lisäksi tarvitaan tehotransistorit kytkemään muuntajan reunoja maahan (miinukseen), muuntajan, minkä ensiön väliottoon syötetään esim. 12 V akkujännite. Käyttämälläni muuntajalla (mikä oli myös siniaaltoinvertterissä: ensiö 2 x 115 V, toisio 2 x 6 V ja jälleen päinvastoin kytkettynä), syöttöjännitteeksi tuli 8,8 V, jolloin lähtöön muodostui 230 VAC (RMS). Tuo lamppu palaa nyt hiukan kirkkaammin, koska kanttiaallon huippujännite kestää kauemmin.

Jos toteuttaa tällaisen esimerkiksi kännyköiden ja läppäreiden latausta varten, on tuon muuntajan ensiön syytä olla vaikkapa 10 V tai 12 V. Niiden latureilla on laaja tulojännitealue, joten jännitteen arvon ei tarvitse olla tiukissa rajoissa. Toisaalta syöttöjännite voi olla myös säädettävä, jolloin lähtöjännitettä voi myös säätää kuormituksen muutosten mukaan. Jos säätö on analoginen, syntyy enemmän lämpöhäviöitä, ja jos hakkuriperiaatteella, niin vähemmän. Jännitteen lasku hakkurilla on nähtävissä tuossa edellisessä, osana siniaaltoinvertterin toteutusta.

Tällaisen hakkuri-invertterin ohjauksessa on ainoastaan tärkeätä huolehtia siitä, että tehotransistorit eivät jännitteen napaisuuden vaihtohetkellä ole samanaikaisesti johtavassa tilassa. Siksi ohjelmassa on jokaisen ”vuoronvaihdon” välissä 2 ms tauko. Tänä aikana muuntajassa oleva magneettivuo ehtii purkautua.

OHJELMA 50
/*******************************
* Ohjelma KanttiInvertteri_50
* 08.11.2017
* 230 VAC-jännitteen muodostus
* suorakulma-aallolla.
*/
// Määrittelyt
   const int Con_VasenTr = 8;
   const int Con_OikeaTr = 9;
   boolean Bol_Vaihto = false;

// Alustukset
   void setup() {
      pinMode(Con_VasenTr, OUTPUT);
      pinMode(Con_OikeaTr, OUTPUT);
      Serial.begin(9600);
}

// Pääohjelma
void loop() {
   digitalWrite(Con_VasenTr, HIGH); delay(8);
   digitalWrite(Con_VasenTr, LOW); delay(2);
   digitalWrite(Con_OikeaTr, HIGH); delay(8);
   digitalWrite(Con_OikeaTr, LOW); delay(2);
}// Pääohjelma loppu

SINIAALTOINVERTTERI

Kun siniaalto kokoaaltotasasuunnataan, muodostuu sykkivää tasajännitettä, mistä voidaan suodattamalla ja reguloimalla sada stabiilia tasajännitettä kulloiseenkin tarpeeseen. Kokoaaltotasasuuntauksen jälkeen signaali näyttää oheisin kuvan kaltaiselta. Siinä nollatason yläpuolella on 50 Hz siniaallon puolikkaita.
   Tässä päivityksessä teen täsmälleen päin vastoin. Arduinon avulla ”hakkaan” siniaallon puolikkaita, joita sitten kytkintransistorien avulla jaan muuntajan ensiön puolelta toiselle. Itse asiassa muuntajaakin käytän väärinpäin, sillä sen merkinnät ovat: ensiö 2 x 115V/50 – 60 Hz ja toisio 2 x 6V 1,25A. Eli tässä toisio muutetaan ensiöksi. Molemmat puoliskot kytketään sarjaan siten että keskikohtaan syötetään näitä aallon puolikkaita ja reunoja kytketään maahan aina puolijakson keston ajaksi. Toision puolikkaat kytketään sarjaan, jolloin lähdössä on 230V:in sinimuotoinen vaihtojännite.
  
Vaikka tämä nyt onkin lähinnä vain yksi Arduinon ohjelman sovellusesimerkki, tulee inverttereiden käyttö tulevaisuudessa voimakkaasti kasvamaan, koska sähköautot lisääntyvät ja mm. niiden akkuja tullaan käyttämään energiavarastona. Kaikki muukin uusiutuvan energia käyttö kasvaa tulevaisuudessa voimakkaasti. 
    Tätä laitetta ei kuitenkaan saa mennä kytkemään verkkoon, sillä se vaatii kytkijältä koulutuksen, osaamisen ja asianomaiset luvat. Invertterin kytkeminen verkkoon energian syöttötarkoituksessa ei ole jokamiehen oikeus, kuten marjastus ja sienestys.
   Videolla (antinarduvideo49.youtube.com) näkyy kylläkin, että kytkin tämän johtohässäkän verkkoon osoittaakseni sen, että tämä voitaisiin myös synkronoida verkkojännitteen tahtiin, jolloin energian syöttö sähköverkon suuntaan olisi mahdollista. Indikaattorina tässä on kaksi hohtopurkauslamppua sarjassa (jännite on maksimissaan siniaaltojen puolikkaiden ollessa vastakkaisvaiheisina 460V RMS, eli 649V (huippu on tehollisarvo (RMS) kertaa neliöjuuri 2, eli 460 * 1,41 = 648,6V)). Hehkulamppu (tai analoginen jännitemittari) olisi parempi osoittamaan synkronointia, mutta sopivan tehoisia ei ”miljoonalaatikko” sattunut sisältämään. Tuollainen glimlamppu syttyy ja sammuu noin 210 voltin (noin 150V RMS sinimuotoisella) jännitteellä. Kun nuo kaksi sarjassa olevaa lamppua palavat kirkkaimmillaan, ovat verkkojännite ja tämän invertterin jännitteet vastakkaisvaiheisia (huippujännite kaksinkertainen) ja puolessa välissä pimeäaikana samanvaiheisia. Tämä tarkkuus riittäkköön, sillä tarkoitus ei ole kytkeä tätä verkkoon. Jaksonaikaa on mahdollista säätää muuttujalla int Int_Kesto = 380; Tässä olen säätänyt sen havainnollisuuden vuoksi hiukan pieleen, jotta verkkojännitteen ja invertterin taajuusero tulisi videolla havainnollisemmaksi. Lamppujen värinästä voi myös nähdä, että invertterin jännite ei ole aivan puhdasta siniaaltoa (lähelle kylläkin), vaan siinä on säröä johtuen siniaallon muodostamisesta pulssinleveysmodulaatiolla (taajuus noin 200 kHz).
    Kuvassa näkyy koko hässäkkä. Kun käytetään suurempia tehoja, on hyvä kytkeä Arduinon ja tehoelektroniikan väliin optoerottimet. Tässä kuvassa nämä ovat kokonaan galvaanisesti erossa toisistaan, koska Arduino UNO saa syöttönsä tietokoneelta. Jos tämä olisi todellinen laite, jolloin kaikki tehosyöttö tulisi yhdestä lähteestä, esimerkiksi akusta, olisi erotus silloinkin tarpeen ja maat (- potentiaali) kytkeä yhteen ainoastaan yhdestä pisteestä, jolloin maajohtojen virrat ja niissä syntyvät jännitehäviöt eivät aiheuttaisi häiriöitä. Seuraavassa ”hässäkän” kytkentä:

Tuosta kytkentäkaaviosta on hyvä huomioida seuraavaa: 6 voltin muuntajan syöttöön tarvitaan kuitenkin 18V syöttöjännite? Tuon verkkomuuntajan arvot ovat ensiö 230V (käämit sarjaan kytkettynä) ja toiso 2 x 6V. Nämä ovat nimellisarvot, mitkä toteutuvat nimelliskuormituksella. Tuo verkkomuuntaja on tarkoitettu käytettäväksi päinvastaiseen suuntaan. Kun sen ensiöön kytketään 230 V, on toisiossa kuormittamattomana 2 x 7 V. Eli muuntosuhde nyt käytettyyn suuntaan ei ole tuo 230/6. Lisäksi muuntajan ensiöön (siis tässä käytössä) pitää tulla jännite 9,87 V, eli sinijännitteen huippuarvo. Lisäksi muuntajan häviöt ovat nyt tähän suuntaan. Seuraavaksi kuristimen (tässä 3,1 mH, mikä ei ole optimoitu tähän käyttöön) yli pitää olla jännitettä myös siniaallon huipun kohdalla. Lisäksi pulssimodulaation kutsussa vähennetään (Fun_Pulssit(Int_Kesto - 50);) maksimista ”jotain, tässä tapauksessa 50 us. Tällöin induktanssin jälkeinen huippujännite jään alle maksimin. Tällä vähennyksellä voidaan säätää jännitettä kuormituksen tarpeen mukaan. Tätä säätöä ei ole toteutettu tässä esityksessä. Tietysti myös kytkintransistorin BDX34C yli jää myös pieni jännite, vaikka se ohjataankin täysin johtavaan tilaan.
   Transistorin kollektorilla oleva diodi (NFC25G) on välttämätön, sillä tuon kytkintransistorin siirtyessä johtamattomaan tilaan, on induktanssissa edelleen olemassa magneettivuo, mikä purkautuessaan synnyttää virran, millä täytyy olla purkaustie kondensaattoriin ja muuntajaan.
   Tässä käyttämäni puolijohteet eivät tietenkään ole ainoita mahdollisia, vaan sellaisia, mitä sattui olemaan. Toiminta ja komponenttien jännite- ja tehon kestot ovat oleellisia. Ongelmana minulla onkin, että lajitelmani alkaa olla niin iäkästä, että datan löytyminen netistä on toisinaan mahdotonta.

Toteutuksessa pääohjelman osuus on varsin vaatimaton. Siinä ainoastaan kutsutaan aliohjelmaa, missä muodostetaan siniaallon puolikkaita ja varmennetaan niiden välissä nollajännite. Sen jälkeen vaihdetaan muuntajan ohjaustransistoreiden tila.
Neljän kanavan optoerotin.
   Aliohjemassa on kolme (3) osaa: 1. Lasketaan ja ohjataan nousevan siniaallon arvo ja vastaava pulssin leveys yhdeksän (9) asteen välein. Koska Sini-funktio (Arduinon C-kielessä) käyttää radiaaneja, on asteiden ja radiaanin suhde laskettu valmiiksi ( 0.01744). 2. Saadulla sinin arvolla kerrotaan perusviive ja saadaan kullekin kulmalle kytkintransistorin (2N3904 ja BDX34C) johtavuusaika (ON). 3. Perusviiveestä vähentämällä johtavuusaika, saadaan taukoaika (OFF). Tämän muuttuvan suhteen ansiosta jännite muuntajan syötössä kasvaa siniaallon mukaan.
Tehot pieniä, mutta tukeva kiinnitys.
   Seuraavaksi muodostetaan laskevan siniaallon (eli kokoaallon neljännes) päinvastaisessa järjestyksessä. Periaate on kuitenkin sama. Lopuksi ohjataan nollaustransistori (IRFZ44N) johtavaksi, eli oikosulkuun, jotta päätetransistorien vaihdon aikana muuntajan syöttöpisteen jännite on varmasti nolla (0) volttia.
   Miksi sitten ei käytetä Arduinon tarjoamaa analogialähtöä (PWM), mikä on myös pulssinleveysmoduloitu, johtuu siitä että sen taajuus on 1 ms, jolloin 50 Hz taajuudella neljännesaallolle tulisi ainoastaan viisi (5) porrasta. Tämä on liian karkea ohjaus. Mitä korkeampi ohjauksen kytkintaajuus on, sitä paremmin ohjaus noudattaa siniaallon muotoa.

OHJELMA 49
/*******************************
* Ohjelma SiniInvertteri_49
* 07.11.2017
* Muodostetaan 230V:in 50H:n siniaaltoa
*/

// Määrittelyt
    const int Con_Pulssit = 6;
    const int Con_Nollaus = 5;
    const int Con_VasenTr = 8;
    const int Con_OikeaTr = 9;
    boolean Bol_Vaihto = false;
    int Int_Kesto = 380; // Määrittää puolijakson keston
    int Int_MaxArvo = Int_Kesto;

// Siniaallon puolikkaan aliohjelma
void Fun_Pulssit(int maksimi){
    int Viive = maksimi;
    int kulma = 9;
    float radian = 0.0;
    double sini = 0.0;
    int ONviive = 0;
    int OFFviive = 0;

// Kasvava looppi
    for(int i = 0; i < 91; i = i + kulma){
        radian = 0.01744 * i;
        sini = sin(radian);
        ONviive = sini * Viive;
        OFFviive = 380 - ONviive; //Int_Kesto - ONviive;

    // Kasvava sinineljännes
        bitSet(PORTD,Con_Pulssit);
        delayMicroseconds(ONviive);
        bitClear(PORTD,Con_Pulssit);
       delayMicroseconds  (OFFviive);
    } // Kasvava neljännes loppu

// Laskeva sinineljännes
   for  (int i = 90; i > 0; i = i - kulma){
        radian = 0.01744 * i;
        sini = sin(radian);
        ONviive = sini * Viive;
        OFFviive = Int_Kesto - ONviive;

    // Laskeva sinineljännes
       bitSet  (PORTD,Con_Pulssit);
       delayMicroseconds  (ONviive);
       bitClear  (PORTD,Con_Pulssit);
       delayMicroseconds  (OFFviive);
    } // Laskeva neljännes loppu

// Puolijakson nollaus
   bitSet  (PORTD,Con_Nollaus);
   delayMicroseconds  (70);
   bitClear  (PORTD,Con_Nollaus);
   delayMicroseconds  (70);
} // Pulssien aliohjelma loppu

// Asetukset
    void setup() {
    pinMode(Con_Pulssit, OUTPUT);
    pinMode(Con_Nollaus, OUTPUT);
    pinMode(Con_VasenTr, OUTPUT);
    pinMode(Con_OikeaTr, OUTPUT);
    Serial.begin(9600);
}

//Pääohjelma
 void loop() {
    Fun_Pulssit(Int_Kesto - 50);// Vakiolla voi säätää jännitettä
    digitalWrite(Con_VasenTr, Bol_Vaihto);
    digitalWrite(Con_OikeaTr, !Bol_Vaihto);
    Bol_Vaihto = !Bol_Vaihto;
} // Pääohjelma loppu
 

lauantai 14. lokakuuta 2017

KORKEAMPI JÄNNITE II

Tuo otsikko pitää kyllä paikkansa, vaikka ohjelmallinen idea tässä sovelluksessa onkin keskeytyksen toiminta. Nämä kaksi asiaa palvelevat hyvin toisiaan tässä sovelluksessa. Lähtökohtana oli 12 V:in jännite nostaa ensin muuntajalla suuremmaksi – korkeampi vaihtojännite – ja sen jälkeen tasasuunnata ja ”pumpata” diodi / kondensaattoriketjulla suurjännitteeksi. Näin saatu tulos ei kuitenkaan riittänyt tuolle vanhalle geigerputkelle. Sen dataa en enää netistä löytänyt.
    Uudemmilla geigerputkilla jännite näyttää olevan 400 .. 500 voltin luokkaa, joten sillä aluksi yritin, mutta putki ei toiminut. 

Taistelu jatkui. Onneksi oli kuitenkin tuo vanha analoginen 1980 luvulla rakentamani geigermittari, josta saatoin hakea tuskaani apua. En muista tarkkaan, milloin sen tein, mutta joka tapauksessa ennen 26.04.1986, sillä silloin se oli minulla jo käytössä, ja myös sille oli käyttöä. Muistan, kun joskus kesäkuun lopulla -86 olin käymässä vanhempieni luona keskisuomessa heidän omakotitalollaan. Tuli kuurosade ja menin vehkeeni kanssa rännin viereen mittaamaan. Nuo videolla kuuluvat suurimmatkin rätinät ovat vain pientä       huminaa siihen verrattuna, miten laitteeni kiljui alas syöksyvän veden vieressä. Menin nopeasti sisälle suojaan. Siellä säteilytaso laski aivan oleellisesti. Olin myös iloinen siitä, että ihmiset eivät tajunneet, millainen Tsernobyli-annos heidän niskaansa silloin sälytettiin. Sienet, marjat ja jäkäläthän sen joutuivat ottamaan vastaan. Varmaan on parempi, ettei aina tiedä kaikkea.
  
Monet komponenttivalinnat tapahtuivat ”miljoonalaatikkopohjalta”, eli mitä sattui olemaan. Muuntajan (2) ensiöön käämin 0,5 mm emalieristettyä kuparilankaa – kaksi lankaa samanaikaisesti, jotta symmetria säilyy – lokero täyteen. Ensimmäisen johdon loppupää kytketään toisen käämin alkupäähän. Tällöin virran ja magneettikentän suunta muuttuu jokaisella puolijaksolla ja toisiosta tulee vaihtojännitettä. Toisiokäämiksi 0,3 mm emalieristeistä kuparilankaa lokero täyteen. Näin saatu jännite oli noin 650 V:in luokkaa 12 V syötöllä. (12 V olisi hyvä, jos haluaisi esimerkiksi tehdä sääaseman, missä säteilymittaus on mukana. Kun noita ”rakettimiehiä” tuntuu olevan siellä sun täällä, niin voisihan se olla hyvä ajoissa tietää, milloin on syytä lähteä hakemaan joditabletteja apteekista.)
  
Tuollaisen ”pumppuketjun” (3) sisäinen vastus on niin suuri, että mittari kuormittaa lähdettä, joten noiden jännitteiden arvot eivät ole tarkkoja. Joka tapauksessa tuo jännite ei riittänyt tälle geigerputkelle (1). Erilaisten hakemisten ja mittausten (myös vertailu siihen vanhaan analogiseen mittariin) tuloksena oli, että jännitteen pitäisi olla 800 voltin suuruusluokkaa.
    Oli kolme mahdollisuutta ratkaista ongelma: 1) Purkaa ensiöstä kierroksia (molemmista yhtä paljon, jotta symmetria säilyy), 2) käämiä toisiokäämi ohuemmalla johdolla, jolloin kierroksia tulisi enemmän ja jännite muuntajan toisiossa nousisi sekä 3) tehdä diodi / kondensaattoriketjua lisää. En kuitenkaan valinnut mitään näistä, koska en ollut rakentamassa pysyvää laitteistoa, joten nostin vain syöttöjännitettä sopivaksi, aina noin 23 volttiin saakka, jolloin putkeen osuvat partikkelit – ionisoivan säteilyn alfa-, beta, ja gammahiukkaset saivat putkessa aikaan purkauksen.


Kun pääsin näin pitkälle, saatoin alkaa kehitellä itse ohjelmaa. Purkaus geigerilmaisimessa on hyvin nopea. Mikrosekuntien luokkaa, mutta tämäkin on hankala mitata, koska mittapäät vaikuttavat tulokseen.
    Putken sisäinen vastus on myös suuri. Sen vuoksi ilmaisinputki on osa hyvin suurten vastusten (kaksi 4,7 megaohmin vastusta) kanssa sarjassa. Purkauksen aiheuttamaa läpilyöntiä ja siitä johtuvaa virtaa hidastetaan (ladataan hetkellisesti) 100 pF kondensaattorilla. Tämä pulssi on joka tapauksessa aivan liian nopea normaalin pääohjelmakierroksen luotettavaan tunnistamiseen. Siksi keskeytys.

Arduinolevyillä, jotka perustuvat ATmega 328 piiriin (esim. UNO), keskeytystuloja (interrupt) ovat digipinnit 2 ja 3. Tässä käytän tuloa 2 konfiguroituna laskevasta reunasta (FALLING). Tämä tulo (DI2) on asetuksissa määritelty siten, että siinä on sisäinen ylösvetovastus (pinMode(Con_KeskTulo, INPUT_PULLUP); Geigerputkelta tuleva pulssi (noin 1 – 2 voltin luokkaa) ohjataan komparaattorin (LM-339AN yhden piirin) miinus (-) tuloon. Komparaattorin + tuloon tuodaan trimmeripotentiometrilta vertailujännite (noin 0,9 V). Pulssin ylittäessä tämän, romahtaa jännite (tulo DI2) nollaan ja ohjelman suoritus hyppää välittömästi aliohjelmaan Fun_Keskeytys(); missä ainoastaan asetetaan geigeranturin tilatieto (volatile boolean Bol_Tila todeksi (true)). Keskeytyksen käyttämä muuttuja pitää määritellä volatile, minkä johdosta kääntäjä tietää, että tämä muistipaikka on muuttujarekisterin ulkopuolella, jolloin se ei voi muuttua dynaamisesti ohjelman suorituksen aikana. Varsinainen keskeytystoiminta määritellään asetuksissa: attachInterrupt(digitalPinToInterrupt(Con_KeskTulo),Fun_Keskeytys,FALLING);
Parametrit tarkoittavat seuraavaa: 1) määritellään keskeytystulo. Tässä tapauksessa pinni DI2. 2) määritellään aliohjelma, mihin keskeytys osoittaa suorituksen. 3) mikä herättää keskeytyksen. Tässä tapauksessa laskeva reuna.
Muita mahdollisuuksia ovat: nouseva reuna, muutos, nollatulo (0), ja joissakin malleissa myös tulon tila +5 V (HIGH).

Kun pääohjelma havaitsee tämän tilan, asetetaan indikaattorilähtö (DO8) ylös (HIGH), mikä puolestaan ohjaa kaiutinta (4) ja mittaria. Yhden millisekunnin kuluttua tämä lähtö (DO8) palautetaan nollaan. Pulssi kuuluu kaiuttimesta pienenä rasahduksena ja mittarissa (5) pienenä viisarin liikkeenä. Kun säteily kasvaa, rätinä nopeutuu ja mittarin kondensaattori latautuu joka pulssilla ylemmäs ja viisari osoittaa enemmän. Parhaan kuvan tapahtumasta saa katsomalla videon (antinarduvideo48.youtube.com).

Kuvissa näkyy myös vanha rannekellon (6) romu. Tässä kellossa on fluoresenssinäyttö. Toisin sanoen viisarit ja numerot hohtavat pimeässä. Kello taitaa olla siltä ajalta (-50 luvulta), kun kenkäkaupoissakin oli röntgenlaitteet kenkien sopivuuden tutkimiseksi. Tuo vaihe ei onneksi kestänyt pitkään, kun tajuttiin, miten vaarallista henkilökunnan oli altistua jatkuvalle röntgensäteilylle.
Tällä hetkellä normaalia taustasäteilyä on sangen vähän. Ilmaisin purkautuu muutaman sekunnin välein. Tämän sovelluksen tutkimiseen ja havainnollistamiseen tuo vanha kello on siis oivallinen apuväline. Videolta myös näkee, miten säteily voimistuu etäisyyden pienetessä. Kellon lojuessa pöydällä se ei juurikaan lisää säteilyannosta lähellä olevalle ihmiselle.

OHJELMA 48
/*******************************
* Ohjelma Keskeytys_48
* 12.10.2017
* Sovelluksella toteutetaan säteilymittaus geiger-putkella
* 1. Toteutetaan suurjännite, noin 800VDC
* 2. Ohjelmasuoritus haarautuu keskeytyksen kautta
* 3. Ohjataan analogiamittaria
* 4. Säteilypulssi ilmaistaan kaiuttimen kautta
*/

// Määrittelyt
    const int Con_KeskTulo = 2;
    const int Con_Pinni1 = 3;
    const int Con_Pinni2 = 4;
    const int Con_Pulssi = 8;
    volatile boolean Bol_Tila = false;


// Aliohjelmat
 void Fun_Keskeytys(){
     Bol_Tila = true;
  }// Keskeytysfunktio loppu

void Fun_Jannite(){
    int i = 0;
        for (i = 0; i < 10; i++){
            bitSet(PORTD,Con_Pinni1);
            delayMicroseconds(3);
            bitClear(PORTD,Con_Pinni1);
            delayMicroseconds(2);
            bitSet(PORTD,Con_Pinni2);
            delayMicroseconds(3);
            bitClear(PORTD,Con_Pinni2);
            delayMicroseconds(2);
        }
}// Jännitteen nostajan loppu

void setup() {
    pinMode(Con_Pinni1, OUTPUT);
    pinMode(Con_Pinni2, OUTPUT);
    pinMode(Con_Pulssi, OUTPUT);
    pinMode(Con_KeskTulo, INPUT_PULLUP); // sisäinen ylösveto
 attachInterrupt(digitalPinToInterrupt(Con_KeskTulo),Fun_Keskeytys,FALLING);
Serial.begin(9600);
Fun_Jannite();
}

// Pääohjelma
    void loop() {
        if (Bol_Tila == true){
            digitalWrite(Con_Pulssi, HIGH);
        } // paluu keskeytyksestä
        delay(1);
        digitalWrite(Con_Pulssi, LOW);
        Bol_Tila = false;
        Fun_Jannite(); // pumpataan jännitettä
    delay(1);
}// Pääohjelman loppu

lauantai 2. syyskuuta 2017

KORKEAMPI JÄNNITE I

Arduinon nopeutettua digitaaliohjausta voi hyödyntää pumppaamalla kondensaattorien ja diodien alulla jännitettä korkeammaksi. Tässä hyödynnetään ns. Dicksonin pumppu tai kertoja (Dickson charge pump, or Dickson multiplier ). Tällä menetelmällä voidaan tasajännitelähteen jännite nostaa korkeammaksi.

Tässä esimerkissä kytkentä on suoraan Arduinon digitaalilähdöissä ja syöttöjännitteenä on mikrokontrollerin +5 V:n lähtö. Jos lähtöjännitteenä on esim. 12 V, tarvitaan digitaalilähtöjen ja ”pumppupiirin” väliin erilliset kytkimet. 
    Suuria tehoja ei tällä (esimerkissä olevalla) kytkennällä voi saada aikaan. 
    Digitaalilähtöjen maksimi kuorma saa olla noin 40 mA. Saatu jännite on noin lähtöjännite kerrottuna diodi / kondensaattoriketjujen lukumäärällä ja vähennettynä diodien myötäjännitteen aiheuttamalla häviöllä. 


    Kuvassa mittari näyttö hiukan tuon ylikin, sillä viimeinen suodatuskondensaattori latautuu piirissä olevaan häiriöpiikkiin, sillä piiri on tässä tapauksessa kuormittamaton.
Kytkentä on varsin yksinkertainen, samoin ohjelma. Tässä ohjelmassa olen ”pumppausvaiheen” sijoittanut aliohjemaan kuvatakseni sitä, että pääohjelmassa voi tehdä jotain muuta tarvittaessa.
Arduino UNO:ssa sisäiset muistipaikat sijoittuvat siten, että digitaalipinnejä 0 .. 7 vastaa PORTD, pinnejä 8 .. 13 PORTB ja analogiapinnejä 0 .. 5 sekä samalla digitaalipinnejä 14 .. 19 PORTA. Fyysisiä analogiapinnejä voidaan käyttää myös digitaalituloina ja -lähtöinä.

OHJELMA 47
/*******************************
* Ohjelma OhjelmaTest_47v2
* 30.8.2017
* Jännitteen pumppaus korkeammaksi.
*
*/

// Määrittelyt
   const int Con_Pinni1 = 2;
   const int Con_Pinni2 = 3;

// Aliohjelmat
   void Fun_Muunnin(){
      int i = 0;
      for (i = 0; i < 10; i++){
         bitSet(PORTD,Con_Pinni1);
         delayMicroseconds(3);
         bitClear(PORTD,Con_Pinni1);
         delayMicroseconds(2);
         bitSet(PORTD,Con_Pinni2);
         delayMicroseconds(3);
         bitClear(PORTD,Con_Pinni2);
         delayMicroseconds(2);
      }
   }// Jännitteen nostajan loppu

// Asetukset
void setup() {
   pinMode(Con_Pinni1, OUTPUT);
   pinMode(Con_Pinni2, OUTPUT);
   Serial.begin(9600);
}

void loop() {
   Fun_Muunnin();
   delay(1);
}// Pääohjelman loppu