Inhoudsopgave:

Arduino Sinewave voor omvormers - Ajarnpa
Arduino Sinewave voor omvormers - Ajarnpa

Video: Arduino Sinewave voor omvormers - Ajarnpa

Video: Arduino Sinewave voor omvormers - Ajarnpa
Video: как сделать простой инвертор 2500 Вт, синусоида, mosfet IRF44n, JLCpcb 2024, Juli-
Anonim
Arduino Sinewave voor omvormers
Arduino Sinewave voor omvormers

In dit project heb ik een SPWM-signaal (sine wave pulse wide gemoduleerd) gegenereerd uit twee arduino pwm digitale uitgangen.

Omdat ik om zo'n programma te maken over vele andere functies en eigenschappen van de arduino moet praten, het volledige project inclusief oscilloscoopbeelden en voor verschillende frequenties, bezoek mijn website:

eprojectszone

Stap 1: Het Pwm-signaal genereren voor 50 Hz

Om een 50Hz signaal op hogere frequentie te genereren is het nodig om wat berekeningen te maken. Frequenties van arduino kunnen 8 MHz zijn, maar we willen een signaal met variabele duty cycle.

Om de soorten variabele duty cycles van Arduino te begrijpen, kun je deze 3 delen van dezelfde post 1, 2 en 3 lezen.

Laten we aannemen dat onze frequentie 50 Hz is, wat betekent dat de tijdsperiode 20 ms is. Dus 10ms is een halve cyclusperiode. In die 10 ms hebben we veel pulsen nodig met verschillende duty cycles, beginnend met kleine duty cycles, in het midden van het signaal hebben we maximale duty cycles en eindigen ook met kleine duty cycles. Om een sinusgolf te genereren zullen we twee pinnen gebruiken, een voor positieve halve cyclus en één voor negatieve halve cyclus. In onze post hiervoor gebruiken we pin 5 en 6 dat betekent Timer 0.

Voor een vloeiend signaal kiezen we fase-correcte pwm op een frequentie van 31372 Hz - zie vorige post. Een van de grootste problemen is hoe we de benodigde duty cycle voor elke puls berekenen. Dus, omdat onze frequentie f=31372Hz is, is de periode voor elke puls T=1/31372=31,8 us, dus het aantal pulsen voor een halve cyclus is N=10 ms/31.8us=314 pulsen. Om de werkcyclus voor elke puls te berekenen, hebben we y=sinx, maar in deze vergelijking hebben we graden nodig, dus een halve cyclus heeft 180 graden voor 314 pulsen. Voor elke puls hebben we 180/314=0,57deg/puls. Dat betekent dat we voor elke puls 0,57 graden vooruit gaan.

y is de duty cycle en x de waarde van de positie in halve duty cycle. eerst is x 0, daarna x=0,57, x=1,14 enzovoort tot x= 180.

als we alle 314 waarden berekenen, krijgen we een array 314 elementen (type "int" om gemakkelijker te worden berekend door arduino).

Zo'n array is:

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

Je kunt zien dat als een sinusgolf de duty cycle het laagst is bij het eerste en laatste element en het hoogst in het midden.

Stap 2: Arduino-programma voor variabele bedrijfscyclus

Arduino-programma voor variabele bedrijfscyclus
Arduino-programma voor variabele bedrijfscyclus

In de bovenstaande afbeelding hebben we variabele duty cycles-signalen met waarden uit de array.

Maar hoe maak je zo'n signaal??

het deel van het programma hieronder gebruikt interrupts om de waarden van duty cycles te wijzigen

sei();//onderbrekingen inschakelen

}

ISR(TIMER1_COMPA_vect){// interrupt wanneer timer 1 overeenkomt met OCR1A-waarde

if(i>313 && OK==0){// uiteindelijke waarde van vector voor pin 6

i=0;// ga naar de eerste waarde van vector(array)

OK=1;//inschakelen pin 5

}

x=sinPWM;// x neem de waarde van de vector die overeenkomt met positie i (i is nul geïndexeerd)-waarde van de werkcyclus

i=i+1;// ga naar de volgende positie

}

Stap 3: Afwisselend op 50Hz Arduino Pins

Afwisselend op 50Hz Arduino Pins
Afwisselend op 50Hz Arduino Pins

Omdat elke pin slechts een halve duty cycle genereert om een volledige sinusgolf te maken, gebruiken we twee pinnen die elkaar afwisselen na exact 10 mseconden (voor 50 Hz). Deze verandering van pinnen wordt gemaakt aan het einde van de array - nadat laten we zeggen dat pin 5 314 pulsen heeft gegenereerd, wordt deze pin uitgeschakeld en wordt pin 6 ingeschakeld, wat hetzelfde maakt, maar voor de negatieve duty cycle.

Omdat arduino alleen positieve signalen kan genereren, wordt er een negatieve duty cycle gemaakt in h bridge - je kunt er hier meer over lezen

Het programma voor het verwisselen van pinnen:

sei();//onderbrekingen inschakelen

}

ISR(TIMER1_COMPA_vect){// interrupt wanneer timer 1 overeenkomt met OCR1A-waarde

if(i>313 && OK==0){// uiteindelijke waarde van vector voor pin 6

i=0;// ga naar de eerste waarde van vector

OK=1;//inschakelen pin 5

}

if(i>313 && OK==1){// uiteindelijke waarde van vector voor pin 5

i=0;//ga naar de eerste waarde van vector

OK=0;//inschakelen pin 6

}

x=sinPWM;// x neem de waarde van de vector die overeenkomt met positie i (i is nul geïndexeerd)

i=i+1;// ga naar de volgende positie

if(OK==0){

OCR0B=0;//maak pin 5 0

OCR0A=x;//inschakelen van pin 6 naar corresponderende duty cycle

if(OK==1){

OCR0A=0;//maak pin 6 0

OCR0B=x;//inschakelen van pin 5 naar corresponderende duty cycle

}

}

Stap 4: Een H-brug besturen en het Pwm-signaal filteren

De signalen die van Arduino worden verkregen, zijn het besturingsgedeelte voor toepassingen van de omvormer, omdat beide positief zijn. Om een volledige sinusgolf en een praktische omvormer te maken, moeten we een h-brug gebruiken en de pwm een laagdoorlaatfilter wissen.

De H-brug wordt hier gepresenteerd.

Het laagdoorlaatfilter getest met kleine AC-motoren - hier.

Aanbevolen: