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