Turinys:

„Arduino Sinewave“inverteriams: 4 žingsniai
„Arduino Sinewave“inverteriams: 4 žingsniai

Video: „Arduino Sinewave“inverteriams: 4 žingsniai

Video: „Arduino Sinewave“inverteriams: 4 žingsniai
Video: Output DC or AC Voltage using MCP4725 DAC with LCD and PWM to Voltage Converter with Arduino 2024, Lapkritis
Anonim
„Arduino Sinewave“inverteriams
„Arduino Sinewave“inverteriams

Šiame projekte aš sukūriau SPWM (sinusinės bangos plataus moduliavimo) signalą iš dviejų arduino pwm skaitmeninių išėjimų.

Kadangi, norėdamas sukurti tokią programą, turiu kalbėti apie daugelį kitų „arduino“funkcijų ir savybių, visas projektas, įskaitant osciloskopo vaizdus ir skirtingus dažnius, apsilankykite mano svetainėje:

eprojectszone

1 žingsnis: generuokite 50 Hz Pwm signalą

Norint generuoti 50 Hz signalą aukštesniu dažniu, būtina atlikti tam tikrus skaičiavimus. Arduino dažnis gali būti 8 MHz, bet mes norime signalo su kintančiu darbo ciklu.

Norėdami suprasti arduino kintamo darbo ciklų tipus, galite perskaityti šias 3 to paties įrašo dalis 1, 2 ir 3.

Tarkime, kad mūsų dažnis yra 50 Hz, o tai reiškia, kad laikotarpis yra 20 ms. Taigi 10 ms yra pusė ciklo. Per tuos 10 ms turime turėti daug impulsų su skirtingais darbo ciklais, pradedant mažais darbo ciklais, signalo viduryje turime maksimalius darbo ciklus ir baigiame taip pat mažais darbo ciklais. Norėdami sukurti sinusinę bangą, mes naudosime du kaiščius, skirtus vienam teigiamas pusinis ciklas, o kitas - neigiamas. Savo įraše tam naudojame 5 ir 6 kaiščius, tai reiškia 0 laikmatį.

Kad signalas būtų sklandus, mes pasirenkame fazės teisingą pwm dažniu 31372 Hz-žr. Ankstesnį įrašą. Viena didžiausių problemų yra ta, kad mes apskaičiuojame reikiamą kiekvieno ciklo darbo ciklą. Taigi, kadangi mūsų dažnis yra f = 31372Hz, kiekvieno impulso laikotarpis yra T = 1/31372 = 31,8 mus, taigi pusės ciklo impulsų skaičius yra N = 10ms/31,8us = 314 impulsų. Dabar, norėdami apskaičiuoti kiekvieno impulso veikimo ciklą, turime y = sinx, tačiau šioje lygtyje mums reikia laipsnių, todėl pusė ciklo turi 180 laipsnių 314 impulsų. Kiekvienam impulsui turime 180/314 = 0,57deg/impulsą. Tai reiškia, kad kiekvieno pulso metu mes judame į priekį 0,57 laipsniu.

y yra darbo ciklas, o x - pozicijos vertė per pusę darbo ciklo. iš pradžių x yra 0, tada x = 0,57, x = 1,14 ir taip toliau, kol x = 180.

jei apskaičiuosime visas 314 reikšmes, gausime 314 masyvo elementų (tipą „int“lengviau apskaičiuoti arduino).

Toks masyvas yra:

int sinPWM = {1, 2, 5, 7, 10, 12, 15, 17, 19, 22, 24, 27, 30, 32, 34, 37, 39, 42, 44, 47, 49, 52, 54, 57, 59, 61, 64, 66, 69, 71, 73, 76, 78, 80, 83, 85, 88, 90, 92, 94, 97, 99, 101, 103, 106, 108, 110, 113, 115, 117, 119, 121, 124, 126, 128, 130, 132, 134, 136, 138, 140, 142, 144, 146, 148, 150, 152, 154, 156, 158, 160, 162, 164, 166, 168, 169, 171, 173, 175, 177, 178, 180, 182, 184, 185, 187, 188, 190, 192, 193, 195, 196, 198, 199, 201, 202, 204, 205, 207, 208, 209, 211, 212, 213, 215, 216, 217, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 237, 238, 239, 240, 240, 241, 242, 242, 243, 243, 244, 244, 245, 245, 246, 246, 247, 247, 247, 248, 248, 248, 248, 249, 249, 249, 249, 249, 250, 250, 250, 250, 250, 249, 249, 249, 249, 249, 248, 248, 248, 248, 248, 247, 247, 247, 246, 246 245, 245, 244, 244, 243, 243, 242, 242, 241, 240, 240, 239, 238, 237, 237, 236, 235, 234, 233, 232, 231, 230, 229, 228, 227, 226, 225, 224, 223, 222, 221, 220, 219, 217, 21 6, 215, 213, 212, 211, 209, 208, 207, 205, 204, 202, 201, 199, 198, 196, 195, 193, 192, 190, 188, 187, 185, 184, 182, 180, 178, 177, 175, 173, 171, 169, 168, 166, 164, 162, 160, 158, 156, 154, 152, 150, 148, 146, 144, 142, 140, 138, 136, 134, 132, 130, 128, 126, 124, 121, 119, 117, 115, 113, 110, 108, 106, 103, 101, 99, 97, 94, 92, 90, 88, 85, 83, 80, 78, 76, 73, 71, 69, 66, 64, 61, 59, 57, 54, 52, 49, 47, 44, 42, 39, 37, 34, 32, 30, 27, 24, 22, 19, 17, 15, 12, 10, 7, 5, 2, 1};

Matote, kad kaip sinusinė banga darbo ciklas yra mažiausias iš pirmojo ir paskutinio elemento ir aukščiausias viduryje.

2 žingsnis: „Arduino“programa kintamam darbo ciklui

„Arduino“programa kintamam darbo ciklui
„Arduino“programa kintamam darbo ciklui

Aukščiau esančiame paveikslėlyje turime kintamų darbo ciklų signalus su reikšmėmis iš masyvo.

Bet kaip duoti tokį signalą ??

toliau nurodyta programos dalis naudoja pertraukas, kad pakeistų darbo ciklų vertes

sei (); // įjungti pertraukas

}

ISR (TIMER1_COMPA_vect) {// pertraukti, kai 1 laikmatis atitinka OCR1A vertę

if (i> 313 && OK == 0) {// galutinė vertė iš 6 kaiščio vektoriaus

i = 0; // pereikite prie pirmosios vektoriaus (masyvo) vertės

Gerai = 1; // įjunkite 5 kaištį

}

x = sinPWM ; // x paimkite vertę iš vektoriaus, atitinkančio i poziciją (i yra nulinis indeksas)-darbo ciklo vertė

i = i+1; // pereiti į kitą poziciją

}

3 žingsnis: pakaitomis 50 Hz „Arduino“kaiščiai

Kintamas 50 Hz „Arduino“kaiščiais
Kintamas 50 Hz „Arduino“kaiščiais

Kadangi kiekvienas kaištis sukuria tik pusę darbo ciklo, kad sukurtų visą sinusinę bangą, mes naudojame du kaiščius, kurie keičiasi vienas po kito po tikslių 10 sekundžių (50 Hz). Šis kaiščių keitimas atliekamas masyvo pabaigoje- kai, tarkime, 5 kaištis sugeneruoja 314 impulsų, šis kaištis išjungiamas ir įjungiamas kaištis 6, kuris daro tą patį, bet neigiamam darbo ciklui.

Kadangi „arduino“gali generuoti tik teigiamus signalus, „h bridge“sukuriamas neigiamas darbo ciklas- apie tai galite perskaityti čia

Kaiščių keitimo programa:

sei (); // įjungti pertraukas

}

ISR (TIMER1_COMPA_vect) {// nutraukti, kai 1 laikmatis atitinka OCR1A vertę

if (i> 313 && OK == 0) {// galutinė vertė iš 6 kaiščio vektoriaus

i = 0; // pereikite prie pirmosios vektoriaus vertės

Gerai = 1; // įjunkite 5 kaištį

}

if (i> 313 && OK == 1) {// galutinė vertė iš 5 kaiščio vektoriaus

i = 0; // pereikite prie pirmosios vektoriaus vertės

Gerai = 0; // įjunkite 6 kaištį

}

x = sinPWM ; // x paimkite vertę iš vektoriaus, atitinkančio i padėtį (i yra indeksuotas nulis)

i = i+1; // pereiti į kitą poziciją

jei (gerai == 0) {

OCR0B = 0; // padaryti kaištį 5 0

OCR0A = x; // įjunkite 6 kaištį atitinkamam darbo ciklui

jei (gerai == 1) {

OCR0A = 0; // padaryti kaištį 6 0

OCR0B = x; // įjunkite 5 kaištį atitinkamam darbo ciklui

}

}

4 žingsnis: važiuokite H tiltu ir filtruokite Pwm signalą

Signalai, gauti iš arduino, yra inverterio taikymo valdymo dalis, nes abu yra teigiami. Norėdami sukurti visą sinusinę bangą ir praktišką keitiklį, turime naudoti h tiltą ir išvalyti pwm žemo dažnio filtrą.

Čia pateikiamas H tiltas.

Žemųjų dažnių filtras išbandytas su mažais kintamosios srovės varikliais-čia.

Rekomenduojamas: