- Wat is SPWM (Sinusoidal Pulse Width Modulation)?
- Hoe de SPWM-omvormer werkt
- Componenten die nodig zijn om een SPWM-omvormer te bouwen
- SPWM-omvormercircuitconstructie
- Arduino-programma voor SPWM-omvormer
- Testen van het TL494 PWM-omvormercircuit
Omvormercircuits zijn vaak nodig waar het niet mogelijk is om wisselstroom van het net te krijgen. Een invertercircuit wordt gebruikt om gelijkstroom om te zetten in wisselstroom en het kan worden onderverdeeld in twee typen: Pure Sine Wave-omvormers of Modified Square Wave-omvormers. Deze zuivere sinusomvormers zijn erg duur, terwijl de gemodificeerde blokgolfomvormers niet duur zijn. Lees hier meer over verschillende soorten omvormers.
In een vorig artikel heb ik je laten zien hoe je geen gemodificeerde blokgolfomvormer kunt maken door de bijbehorende problemen aan te pakken. Dus in dit artikel zal ik een eenvoudige zuivere sinusomvormer maken met Arduino en het werkingsprincipe van het circuit uitleggen.
Als u dit circuit maakt, houd er dan rekening mee dat dit circuit geen feedback, geen overstroombeveiliging, geen kortsluitbeveiliging en geen temperatuurbeveiliging heeft. Daarom is dit circuit alleen gebouwd en gedemonstreerd voor educatieve doeleinden, en het is absoluut niet aanbevolen om dit type circuit te bouwen en te gebruiken voor commerciële apparaten. U kunt ze echter desgewenst aan uw circuit toevoegen, de veelgebruikte beveiligingscircuits zoals
Overspanningsbeveiliging, overstroombeveiliging, bescherming tegen omgekeerde polariteit, kortsluitbeveiliging, hot swap-controller, enz. Zijn al besproken.
LET OP: Als u dit type schakeling maakt, moet u extra voorzichtig zijn met hoogspanning en spanningspieken die worden gegenereerd door het schakelsignaal naar de ingang.
Wat is SPWM (Sinusoidal Pulse Width Modulation)?
Zoals de naam suggereert, staat SPWM voor S inusoidal P ulse W idth M odulation. Zoals u wellicht al weet, is een PWM-signaal een signaal waarin we zowel de frequentie van de puls als de aan-tijd en uit-tijd kunnen wijzigen, ook wel de duty-cycle genoemd. Als je meer wilt weten over PWM, kun je het hier lezen. Dus door de duty-cycle te variëren, veranderen we de gemiddelde spanning van de puls. De onderstaande afbeelding laat zien dat-
Als we een PWM-signaal beschouwen dat schakelt tussen 0 - 5V met een duty-cycle van 100%, krijgen we een gemiddelde uitgangsspanning van 5V, nogmaals als we hetzelfde signaal beschouwen met een duty-cycle van 50%, zullen we dat doen haal de uitgangsspanning van 2,5 V, en voor de inschakelduur van 25% is dat de helft daarvan. Dat vat het basisprincipe van het PWM-signaal samen, en we kunnen het basisprincipe van het SPWM-signaal gaan begrijpen.
Een sinusspanning is in de eerste plaats een analoge spanning die in de loop van de tijd van grootte verandert , en we kunnen dit gedrag van een sinusgolf reproduceren door de duty-cycle van de PWM-golf voortdurend te veranderen, de onderstaande afbeelding laat dat zien.
Als je naar het onderstaande schema kijkt , zie je dat er een condensator is aangesloten op de uitgang van de transformator. Deze condensator is verantwoordelijk voor het afvlakken van het AC-signaal van de draaggolffrequentie.
Het gebruikte ingangssignaal laadt en ontlaadt de condensator in overeenstemming met het ingangssignaal en de belasting. Omdat we een zeer hoogfrequent SPWM-signaal hebben gebruikt, heeft het een zeer kleine inschakelduur van 1%, deze inschakelduur van 1% zal de condensator een beetje opladen, de volgende inschakelduur is 5%, deze wordt opnieuw opgeladen de condensator een beetje meer, de volgende puls heeft een duty-cycle van 10% en de condensator zal een beetje meer opladen, we passen het signaal toe totdat we een duty-cycle van 100% hebben bereikt en vanaf daar gaan we terug naar beneden tot 1%. Dit zorgt voor een zeer vloeiende curve zoals een sinusgolf aan de uitgang. Dus door de juiste waarden van de duty-cycle aan de ingang te leveren, hebben we een zeer sinusvormige golf aan de uitgang.
Hoe de SPWM-omvormer werkt
De bovenstaande afbeelding toont het hoofdaandrijfgedeelte van de SPWM-omvormer, en zoals u kunt zien, hebben we twee N-kanaals MOSFET's in halve brugconfiguratie gebruikt om de transformator van dit circuit aan te drijven, om ongewenste schakelruis te verminderen en om de MOSFET te beschermen hebben we 1N5819-diodes parallel aan de MOSFET's gebruikt. Om eventuele schadelijke pieken in het poortgedeelte te verminderen, hebben we de weerstanden van 4,7 ohm parallel met 1N4148-diodes gebruikt. Ten slotte zijn de transistors BD139 en BD 140 geconfigureerd in een push-pull- configuratieom de poort van de MOSFET aan te sturen, omdat deze MOSFET een zeer hoge poortcapaciteit heeft en minimaal 10V aan de basis vereist om correct in te schakelen. Lees hier meer over de werking van Push-Pull versterkers.
Om het werkingsprincipe van het circuit beter te begrijpen, hebben we het teruggebracht tot een punt waarop dit gedeelte van de MOSFET AAN staat. Wanneer de MOSFET op stroom staat, stroomt hij eerst door de transformator en wordt hij vervolgens geaard door de MOSFET, dus een magnetische flux zal ook worden geïnduceerd in de richting waarin de stroom vloeit, en de kern van de transformator zal de magnetische flux passeren in de secundaire wikkeling, en we krijgen de positieve halve cyclus van het sinusvormige signaal aan de uitgang.
In de volgende cyclus bevindt het onderste deel van het circuit zich op het bovenste deel van het circuit is uitgeschakeld, daarom heb ik het bovenste deel verwijderd, nu stroomt de stroom in de tegenovergestelde richting en genereert een magnetische flux in die richting, waardoor het omkeert de richting van de magnetische flux in de kern. Lees hier meer over de werking van MOSFET.
Nu weten we allemaal dat een transformator werkt door veranderingen in de magnetische flux. Dus het in- en uitschakelen van beide MOSFET's, de ene omgekeerd naar de andere en dat 50 keer in een seconde doet, genereert een mooie oscillerende magnetische flux in de kern van de transformator en de veranderende magnetische flux zal een spanning induceren in de secundaire spoel zoals we kennen de wet van Faraday. Dat is hoe de basisomvormer werkt.
Het volledige SPWM-invertercircuit dat in dit project wordt gebruikt, wordt hieronder weergegeven.
Componenten die nodig zijn om een SPWM-omvormer te bouwen
Sl. Nr |
Onderdelen |
Type |
Aantal stuks |
1 |
Atmega328P |
IC |
1 |
2 |
IRFZ44N |
Mosfet |
2 |
3 |
BD139 |
Transistor |
2 |
4 |
BD140 |
Transistor |
2 |
5 |
22pF |
Condensator |
2 |
6 |
10K, 1% |
Weerstand |
1 |
7 |
16 MHz |
Kristal |
1 |
8 |
0.1uF |
Condensator |
3 |
9 |
4.7R |
Weerstand |
2 |
10 |
1N4148 |
Diode |
2 |
11 |
LM7805 |
Spanningsregelaar |
1 |
12 |
200uF, 16V |
Condensator |
1 |
13 |
47uF, 16V |
Condensator |
1 |
14 |
2.2uF, 400V |
Condensator |
1 |
SPWM-omvormercircuitconstructie
Voor deze demonstratie is het circuit gebouwd op Veroboard, met behulp van het schema. Aan de uitgang van de transformator zal een enorme hoeveelheid stroom door de verbinding stromen, dus de verbindingsjumpers moeten zo dik mogelijk zijn.
Arduino-programma voor SPWM-omvormer
Voordat we verder gaan en de code gaan begrijpen, moeten we eerst de basisprincipes ophelderen. Van het bovenstaande werkingsprincipe heb je geleerd hoe het PWM-signaal er aan de output uit zal zien, nu blijft de vraag hoe we zo'n variërende golf kunnen maken aan de outputpinnen van de Arduino.
Om het variërende PWM-signaal te maken, gaan we de 16-bit timer1 gebruiken met een presaler-instelling van 1, wat ons 1600/16000000 = 0,1 ms tijd geeft voor elke telling als we een enkele halve cyclus van een sinusgolf beschouwen, dat past precies 100 keer binnen een halve cyclus van de golf. In eenvoudige bewoordingen kunnen we 200 keer onze sinusgolf bemonsteren.
Vervolgens moeten we onze sinusgolf in 200 stukjes verdelen en hun waarden berekenen met een correlatie van de amplitude. Vervolgens moeten we die waarden converteren naar timer-tellerwaarden door deze te vermenigvuldigen met de tellerlimiet. Ten slotte moeten we die waarden in een opzoektabel plaatsen om deze naar het loket te sturen en we krijgen onze sinusgolf.
Om de zaken een beetje eenvoudiger te maken, gebruik ik een zeer goed geschreven SPWM-code van GitHub die is gemaakt door Kurt Hutten.
De code is heel eenvoudig. We beginnen ons programma door de vereiste headerbestanden toe te voegen
#include #include
Vervolgens hebben we onze twee opzoektabellen waaruit we de timer-tellerwaarden gaan halen.
int lookUp1 = {50, 100, 151, 201, 250, 300, 349, 398, 446, 494, 542, 589, 635, 681, 726, 771, 814, 857, 899, 940, 981, 1020, 1058, 1095, 1131, 1166, 1200, 1233, 1264, 1294, 1323, 1351, 1377, 1402, 1426, 1448, 1468, 1488, 1505, 1522, 1536, 1550, 1561, 1572, 1580, 1587, 1593, 1597, 1599, 1600, 1599, 1597, 1593, 1587, 1580, 1572, 1561, 1550, 1536, 1522, 1505, 1488, 1468, 1448, 1426, 1402, 1377, 1351, 1323, 1294, 1264, 1233, 1200, 1166, 1131, 1095, 1058, 1020, 981, 940, 899, 857, 814, 771, 726, 681, 635, 589, 542, 494, 446, 398, 349, 300, 250, 201, 151, 100, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0}; int lookUp2 = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 100, 151, 201, 250, 300, 349, 398, 446, 494, 542, 589, 635, 681, 726, 771, 814, 857, 899, 940, 981, 1020, 1058, 1095, 1131, 1166, 1200, 1233, 1264, 1294, 1323, 1351, 1377, 1402, 1426, 1448, 1468, 1488, 1505, 1522, 1536, 1550, 1561, 1572, 1580, 1587, 1593, 1597, 1599, 1600, 1599, 1597, 1593, 1587, 1580, 1572, 1561, 1550, 1536, 1522, 1505, 1488, 1468, 1448, 1426, 1402, 1377, 1351, 1323, 1294, 1264, 1233, 1200, 1166, 1131, 1095, 1058, 1020, 981, 940, 899, 857, 814, 771, 726, 681, 635, 589, 542, 494, 446, 398, 349, 300, 250,201, 151, 100, 50, 0};
Vervolgens initialiseren we in de setup- sectie de registers van de timer-teller, zodat ze op elk ervan leeg zijn. Voor meer informatie moet u de datasheet van de atmega328 IC doornemen.
TCCR1A = 0b10100010; / * 10 foutloos op wedstrijd, ingesteld op BOTTOM voor compA. 10 foutloos op wedstrijd, ingesteld op BOTTOM voor compB. 00 10 WGM1 1: 0 voor golfvorm 15. * / TCCR1B = 0b00011001; / * 000 11 WGM1 3: 2 voor golfvorm 15. 001 geen voorverkoop op de teller. * / TIMSK1 = 0b00000001; / * 0000000 1 TOV1 Vlagonderbreking inschakelen. * /
Daarna initialiseren we het invoerregistratieregister met een vooraf gedefinieerde waarde van 16000, omdat dit ons zal helpen om precies 200 monsters te genereren.
ICR1 = 1600; // Periode voor 16MHz kristal, voor een schakelfrequentie van 100KHz voor 200 onderverdelingen per 50Hz sinusgolfcyclus.
Vervolgens maken we globale interrupts mogelijk door de functie in te roepen, sei ();
Ten slotte stellen we Arduino pin 9 en 10 in als output
DDRB = 0b00000110; // Stel PB1 en PB2 in als uitgangen.
Dat markeert het einde van de setup-functie.
Het lusgedeelte van de code blijft leeg omdat het een timer-telleronderbrekingsprogramma is.
leegte lus () {; /*Niets doen…. voor altijd!*/}
Vervolgens hebben we de timer1 overloopvector gedefinieerd, deze interruptfunctie krijgt een oproep zodra timer1 overloopt en een interrupt genereert.
ISR (TIMER1_OVF_vect) {
Vervolgens declareren we enkele lokale variabelen als statische variabelen en zijn we begonnen met het invoeren van de waarden naar de capture and Compare-weerstand.
statisch int num; statische char trig; // verander de duty-cycle elke periode. OCR1A = lookUp1; OCR1B = lookUp2;
Ten slotte verhogen we de teller vooraf om de volgende waarden naar de vastleg- en vergelijkingsweerstanden te sturen, wat het einde van deze code markeert.
if (++ num> = 200) {// Pre-increment num, controleer dan of het lager is dan 200. num = 0; // Reset nr. trig = trig ^ 0b00000001; digitalWrite (13, trig); }
Testen van het TL494 PWM-omvormercircuit
Om het circuit te testen, wordt de volgende opstelling gebruikt.
- 12V-loodzuuraccu.
- Een transformator met een 6-0-6 tap en een 12-0-12 tap
- 100W gloeilamp als belasting
- Meco 108B + TRMS-multimeter
- Meco 450B + TRMS-multimeter
Uitgangssignaal van Arduino:
Zodra ik de code heb geüpload. Ik heb het SPWM-uitgangssignaal van de twee pinnen van de Arduino gemeten, wat lijkt op de onderstaande afbeelding,
Als we een beetje inzoomen, kunnen we de steeds veranderende duty-cycle van de PWM-golf zien.
Vervolgens toont de onderstaande afbeelding het uitgangssignaal van de transformator.
SPWM-omvormercircuit in ideale staat:
Zoals je kunt zien op de bovenstaande afbeelding, verbruikt dit circuit ongeveer 13W terwijl het ideaal werkt
Uitgangsspanning zonder belasting:
De uitgangsspanning van het invertercircuit wordt hierboven weergegeven, dit is de spanning die aan de uitgang uitkomt zonder aangesloten belasting.
Input stroomverbruik:
De bovenstaande afbeelding toont het ingangsvermogen dat ik verbruikt als een belasting van 40W is aangesloten.
Uitgangsvermogen:
De bovenstaande afbeelding toont het uitgangsvermogen dat door dit circuit wordt verbruikt (de belasting is een gloeilamp van 40 W)
Daarmee sluiten we het testgedeelte van het circuit af. U kunt de onderstaande video bekijken voor een demonstratie. Ik hoop dat je dit artikel leuk vond en iets hebt geleerd over SPWM en de implementatietechnieken ervan. Blijf lezen, blijf leren, blijf bouwen en ik zie je in het volgende project.