Cuprins:

Arduino Sinewave pentru invertoare: 4 pași
Arduino Sinewave pentru invertoare: 4 pași

Video: Arduino Sinewave pentru invertoare: 4 pași

Video: Arduino Sinewave pentru invertoare: 4 pași
Video: как сделать простой инвертор 4500W, синусоида, 8 MOSFET, IRFz 44n, jlcpcb 2024, Iulie
Anonim
Arduino Sinewave pentru invertoare
Arduino Sinewave pentru invertoare

În acest proiect am generat un semnal SPWM (impuls de undă sinusoidală larg modulat) de la două ieșiri digitale arduino pwm.

Deoarece pentru a crea un astfel de program, trebuie să vorbesc despre multe alte funcții și proprietăți ale arduino, proiectul complet, inclusiv imagini de osciloscop și pentru diferite frecvențe, vă rugăm să vizitați site-ul meu web:

eprojectszone

Pasul 1: Generarea semnalului Pwm pentru 50Hz

Pentru a genera un semnal de 50Hz la o frecvență mai mare, este necesar să faceți câteva calcule. Frecvențele de la arduino pot fi la 8 MHz, dar dorim un semnal cu ciclu de funcționare variabil.

Pentru a înțelege tipurile de cicluri variabile ale arduino puteți citi aceste 3 părți ale aceluiași post 1, 2 și 3.

Să presupunem că frecvența noastră este de 50Hz, ceea ce înseamnă că perioada de timp este de 20 ms. Deci 10 ms este perioada de jumătate de ciclu. În acei 10 ms trebuie să avem multe impulsuri cu cicluri de sarcină diferite începând cu cicluri de sarcină mici, în mijlocul semnalului avem cicluri de sarcină maxime și terminăm și cu cicluri de sarcină mici. Pentru a genera o undă sinusoidală vom folosi doi pini unul pentru jumătate de ciclu pozitiv și unul pentru jumătate de ciclu negativ. În postarea noastră pentru aceasta folosim pinii 5 și 6, ceea ce înseamnă Timer 0.

Pentru un semnal neted, alegem fm corectă la o frecvență de 31372 Hz - vezi postarea anterioară. Una dintre cele mai mari probleme este modul în care calculăm ciclul de funcționare necesar pentru fiecare impuls. Deci, deoarece frecvența noastră este f = 31372Hz, perioada pentru fiecare impuls este T = 1/31372 = 31,8 us, deci numărul de impulsuri pentru un semiciclu este N = 10ms / 31,8us = 314 impulsuri. Acum, pentru a calcula ciclul de funcționare pentru fiecare impuls, avem y = sinx, dar în această ecuație avem nevoie de grade, astfel încât jumătate de ciclu are 180 de grade pentru 314 impulsuri. Pentru fiecare impuls avem 180/314 = 0,57deg / impuls. Asta înseamnă că pentru fiecare impuls mergem înainte cu 0,57 grade.

y este ciclul de lucru și x valoarea poziției în jumătate de ciclu de lucru. la început x este 0, după care x = 0,57, x = 1,14 și așa mai departe până la x = 180.

dacă calculăm toate cele 314 de valori, obținem o matrice de 314 de elemente (tastați "int" pentru a fi calculat mai ușor de către arduino).

O astfel de matrice este:

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, 249, 249, 249, 249, 249, 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};

Puteți vedea că, ca o undă sinusoidală, ciclul de funcționare este cel mai mic la primul și ultimul element și cel mai mare la mijloc.

Pasul 2: Programul Arduino pentru ciclul de funcționare variabilă

Program Arduino pentru ciclu de funcționare variabilă
Program Arduino pentru ciclu de funcționare variabilă

În imaginea de mai sus avem semnale cu cicluri de funcționare variabile cu valori din matrice.

Dar cum să faci un astfel de semnal ??

partea programului de mai jos se întrerupe pentru a modifica valorile ciclurilor de funcționare

sei (); // activate interrupts

}

ISR (TIMER1_COMPA_vect) {// întrerupe când timerul 1 se potrivește cu valoarea OCR1A

if (i> 313 && OK == 0) {// valoarea finală din vector pentru pinul 6

i = 0; // mergeți la prima valoare a vectorului (matrice)

OK = 1; // activați pinul 5

}

x = sinPWM ; // x ia valoarea din vectorul corespunzător poziției i (i este zero indexat) -valoarea ciclului de funcționare

i = i + 1; // treceți la următoarea poziție

}

Pasul 3: alternare la 50Hz Pin Arduino

Alternând la pini Arduino de 50Hz
Alternând la pini Arduino de 50Hz

Pentru că fiecare pin generează doar un ciclu de jumătate de sarcină pentru a face o undă sinusoidală completă, folosim doi pini care alternează unul după altul după 10 msecunde exacte (pentru 50Hz). Această schimbare a pinilor se face la sfârșitul matricei - după ce să presupunem că pinul 5 a generat 314 impulsuri, acest pin este oprit și activat pinul 6, ceea ce face același lucru, dar pentru ciclul de funcționare negativ.

Deoarece arduino poate genera numai semnale pozitive, ciclul de funcționare negativ este realizat în h bridge - puteți citi aici despre el

Programul pentru schimbarea pinilor:

sei (); // activate interrupts

}

ISR (TIMER1_COMPA_vect) {// întrerupe când timerul 1 se potrivește cu valoarea OCR1A

if (i> 313 && OK == 0) {// valoarea finală din vector pentru pinul 6

i = 0; // mergeți la prima valoare a vectorului

OK = 1; // activați pinul 5

}

if (i> 313 && OK == 1) {// valoarea finală din vector pentru pinul 5

i = 0; // mergeți la prima valoare a vectorului

OK = 0; // activați pinul 6

}

x = sinPWM ; // x ia valoarea din vectorul corespunzător poziției i (i este zero indexat)

i = i + 1; // treceți la următoarea poziție

if (OK == 0) {

OCR0B = 0; // faceți pinul 5 0

OCR0A = x; // activați pinul 6 la ciclul de funcționare corespunzător

if (OK == 1) {

OCR0A = 0; // faceți pinul 6 0

OCR0B = x; // activați pinul 5 la ciclul de funcționare corespunzător

}

}

Pasul 4: Conducerea unui pod H și filtrarea semnalului Pwm

Semnalele obținute de la arduino sunt partea de control pentru aplicațiile invertorului, deoarece ambele sunt pozitive. Pentru a realiza o undă sinusoidală completă și un invertor practic, trebuie să folosim un pod h și pentru a șterge pwm un filtru trece jos.

Podul H este prezentat aici.

Filtrul trece-jos testat cu motoare AC mici.

Recomandat: