Inhaltsverzeichnis:

Arduino Sinewave für Wechselrichter - Gunook
Arduino Sinewave für Wechselrichter - Gunook

Video: Arduino Sinewave für Wechselrichter - Gunook

Video: Arduino Sinewave für Wechselrichter - Gunook
Video: wie man einen einfachen Wechselrichter 4500W, Sinuswelle, 8 Mosfet, IRFz 44n, jlcpcb, herstellt 2024, November
Anonim
Arduino Sinewave für Wechselrichter
Arduino Sinewave für Wechselrichter

In diesem Projekt habe ich ein SPWM-Signal (sine wave pulse wide modulated) aus zwei Arduino-PWM-Digitalausgängen generiert.

Um ein solches Programm zu erstellen, muss ich über viele andere Funktionen und Eigenschaften des Arduino sprechen. Das gesamte Projekt einschließlich Oszilloskopbilder und für verschiedene Frequenzen besuchen Sie bitte meine Website:

eprojectszone

Schritt 1: Generieren des PWM-Signals für 50Hz

Um ein 50Hz-Signal mit einer höheren Frequenz zu erzeugen, sind einige Berechnungen erforderlich. Frequenzen von Arduino können bei 8 MHz liegen, aber wir wollen ein Signal mit variablem Tastverhältnis.

Um die Arten der variablen Arbeitszyklen von Arduino zu verstehen, können Sie diese 3 Teile desselben Beitrags 1, 2 und 3 lesen.

Nehmen wir an, unsere Frequenz beträgt 50 Hz, was bedeutet, dass die Zeitspanne 20 ms beträgt. 10ms ist also eine Halbzyklusperiode. In diesen 10 ms müssen wir viele Impulse mit unterschiedlichen Tastverhältnissen haben, beginnend mit kleinen Tastverhältnissen, in der Mitte des Signals haben wir maximale Tastverhältnisse und enden auch mit kleinen Tastverhältnissen. Um eine Sinuswelle zu erzeugen, verwenden wir zwei Pins, einen für positive Halbwelle und eine für negative Halbwelle. In unserem Beitrag verwenden wir dafür die Pins 5 und 6, das heißt Timer 0.

Für ein glattes Signal wählen wir phasenkorrektes PWM bei einer Frequenz von 31372 Hz - siehe vorheriger Beitrag. Eines der größten Probleme besteht darin, wie wir das erforderliche Tastverhältnis für jeden Impuls berechnen. Da unsere Frequenz f = 31372 Hz beträgt, beträgt die Periode für jeden Impuls T = 1/31372 = 31,8 us, die Anzahl der Impulse für einen Halbzyklus beträgt also N = 10 ms / 31,8 us = 314 Impulse. Um nun das Tastverhältnis für jeden Impuls zu berechnen, haben wir y = sinx, aber in dieser Gleichung brauchen wir Grad, so dass der halbe Zyklus 180 Grad für 314 Impulse hat. Für jeden Puls haben wir 180/314 = 0,57 Grad/Puls. Das heißt für jeden Puls bewegen wir uns mit 0,57deg vorwärts.

y ist das Tastverhältnis und x der Wert der Position im halben Tastverhältnis. Zuerst ist x 0, danach x=0.57, x=1.14 und so weiter bis x= 180.

Wenn wir alle 314 Werte berechnen, erhalten wir ein Array 314 Elemente (Typ "int", um von Arduino einfacher berechnet zu werden).

Ein solches Array ist:

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

Sie können sehen, dass das Tastverhältnis wie bei einer Sinuswelle am ersten und letzten Element am niedrigsten und in der Mitte am höchsten ist.

Schritt 2: Arduino-Programm für variable Einschaltdauer

Arduino-Programm für variable Einschaltdauer
Arduino-Programm für variable Einschaltdauer

Im obigen Bild haben wir Signale mit variablem Tastverhältnis mit Werten aus dem Array.

Aber wie macht man ein solches Signal??

der folgende Teil des Programms verwendet Interrupts, um die Werte der Arbeitszyklen zu ändern

sei(); // Unterbrechungen aktivieren

}

ISR(TIMER1_COMPA_vect){// Interrupt, wenn Timer 1 mit dem OCR1A-Wert übereinstimmt

if(i>313 && OK==0){// Endwert vom Vektor für Pin 6

i=0; // gehe zum ersten Wert des Vektors (Array)

OK=1; // Pin 5 aktivieren

}

x=sinPWM;// x nehme den Wert vom Vektor entsprechend der Position i(i ist null indiziert)-Wert des Tastverhältnisses

i=i+1;// gehe zur nächsten Position

}

Schritt 3: Abwechselnd mit 50Hz Arduino Pins

Abwechselnd mit 50Hz Arduino Pins
Abwechselnd mit 50Hz Arduino Pins

Da jeder Pin nur ein halbes Tastverhältnis erzeugt, um eine volle Sinuswelle zu erzeugen, verwenden wir zwei Pins, die sich nach genau 10 ms (für 50 Hz) nacheinander abwechseln. Diese Änderung der Pins erfolgt am Ende des Arrays - nachdem Pin 5 314 Impulse erzeugt hat, wird dieser Pin ausgeschaltet und Pin 6 aktiviert, was dasselbe macht, außer für den negativen Arbeitszyklus.

Da Arduino nur positive Signale erzeugen kann, wird ein negatives Tastverhältnis in der h-Brücke gemacht - Sie können hier darüber lesen

Das Programm zum Pinwechsel:

sei(); // Unterbrechungen aktivieren

}

ISR(TIMER1_COMPA_vect){// Interrupt, wenn Timer 1 mit dem OCR1A-Wert übereinstimmt

if(i>313 && OK==0){// Endwert vom Vektor für Pin 6

i=0; // gehe zum ersten Wert des Vektors

OK=1; // Pin 5 aktivieren

}

if(i>313 && OK==1){// Endwert vom Vektor für Pin 5

i=0; // gehe zum ersten Wert des Vektors

OK=0; // Pin 6 aktivieren

}

x=sinPWM; // x nimm den Wert aus dem Vektor, der der Position i entspricht (i ist null indiziert)

i=i+1;// gehe zur nächsten Position

wenn(OK==0){

OCR0B = 0; // Pin 5 0 machen

OCR0A=x; // Pin 6 auf entsprechenden Arbeitszyklus aktivieren

wenn(OK==1){

OCR0A=0; // Pin 6 0 machen

OCR0B=x; // Pin 5 auf entsprechenden Arbeitszyklus aktivieren

}

}

Schritt 4: Fahren einer H-Brücke und Filtern des PWM-Signals

Die von Arduino erhaltenen Signale sind der Steuerteil für Wechselrichteranwendungen, da beide positiv sind. Um eine volle Sinuswelle und einen praktischen Wechselrichter zu erzeugen, müssen wir eine h-Brücke und zum Löschen des PWM einen Tiefpassfilter verwenden.

Die H-Brücke wird hier vorgestellt.

Der Tiefpassfilter mit kleinen AC-Motoren getestet - hier.

Empfohlen: