Inhoudsopgave:
- Stap 1: Het Pwm-signaal genereren voor 50 Hz
- Stap 2: Arduino-programma voor variabele bedrijfscyclus
- Stap 3: Afwisselend op 50Hz Arduino Pins
- Stap 4: Een H-brug besturen en het Pwm-signaal filteren
Video: Arduino Sinewave voor omvormers - Ajarnpa
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:18
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
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
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:
Installatie voor externe Bluetooth GPS-provider voor Android-apparaten: 8 stappen
Installatie voor externe Bluetooth GPS-provider voor Android-apparaten: deze instructable legt uit hoe u uw eigen externe Bluetooth-compatibele GPS voor uw telefoon kunt maken, wat dan ook voor ongeveer $ 10. Materiaallijst: NEO 6M U-blox GPSHC-05 bluetooth-module Kennis van interface Blutooth Low energy-modulesArdui
Idee voor doe-het-zelf-activiteit voor weerstations voor 12+ jaar: 4 stappen
Idee voor doe-het-zelf-weerstationactiviteit voor 12-plussers: in deze activiteit zullen deelnemers hun weerstation opzetten, de lucht in sturen en de opnames (licht, temperatuur, vochtigheid) in realtime volgen via de Blynk-app. Bovendien leert u hoe u de geregistreerde waarden publiceert
Systeem voor het bewaken van de luchtkwaliteit voor fijnstofverontreiniging: 4 stappen
Systeem voor monitoring van luchtkwaliteit voor fijnstofverontreiniging: INTRO: 1 In dit project laat ik zien hoe ik een deeltjesdetector bouw met dataweergave, databack-up op SD-kaart en IOT. Visueel geeft een neopixels ringdisplay de luchtkwaliteit aan. 2 Luchtkwaliteit is een steeds belangrijker zorg t
Relaisbord voor Arduino voor minder dan $8: 5 stappen
Relaisbord voor Arduino voor minder dan $8.: Hallo vrienden, vandaag ga ik je vertellen hoe je een relaisbord voor Arduino maakt voor minder dan $8. In dit circuit gaan we geen IC of transistor gebruiken. Dus laten we het doen
3.3V Mod voor ultrasone sensoren (bereid HC-SR04 voor 3.3V Logic op ESP32/ESP8266, Particle Photon, enz.): 4 stappen
3.3V Mod voor ultrasone sensoren (bereid HC-SR04 voor 3.3V Logic op ESP32/ESP8266, Particle Photon, enz.): TL;DR: Knip op de sensor het spoor naar de Echo-pin en sluit het opnieuw aan met een spanningsdeler (Echo trace -> 2.7kΩ -> Echo pin -> 4.7kΩ -> GND). Bewerken: Er is enige discussie geweest over de vraag of de ESP8266 daadwerkelijk 5V-tolerant is op GPIO in