Circuitul generatorului Arduino SPWM - detalii și diagramă de cod

Încercați Instrumentul Nostru Pentru Eliminarea Problemelor





În această postare învățăm cum să generăm modulare de lățime a impulsului sinusoidal sau SPWM prin Arduino, care poate fi utilizat pentru realizarea unui circuit invertor cu undă sinusoidală pură sau gadget-uri similare.

Arduino codul este dezvoltat de mine și este primul meu cod Arduino, ... și arată destul de bine



Ce este SPWM

Am explicat deja cum se generează SPWM folosind opamps într-unul din articolele mele anterioare, ați putea să îl parcurgeți pentru a înțelege modul în care poate fi creat folosind componente discrete și cu privire la importanța sa.

Practic, SPWM, care reprezintă modulația lățimii impulsului undei sinusoidale, este un tip de modulație a impulsurilor în care impulsurile sunt modulate pentru a simula o formă de undă sinusoidală, astfel încât modulația să poată atinge proprietățile unei unde sinusoidale pure.



Pentru a implementa un SPWM impulsurile sunt modulate cu o lățime inițială mai îngustă care se extinde treptat la centrul ciclului și, în cele din urmă, se termină fiind mai înguste la sfârșit pentru a termina ciclul.

Pentru a fi mai precis, impulsurile încep cu lățimi mai înguste, care treptat devin mai largi cu fiecare impulsuri ulterioare și devin mai largi la impulsul central, după aceea, secvența continuă, dar cu o modulație opusă, adică impulsurile încep treptat acum să se îngusteze până se termină ciclul.

Demo video

Acesta constituie un ciclu SPWM și acest lucru se repetă de-a lungul timpului la o anumită rată, determinată de frecvența aplicației (de obicei 50Hz sau 60Hz). În mod obișnuit, SPWM este utilizat pentru conducerea dispozitivelor de putere, cum ar fi mosfete sau BJT-uri în invertoare sau convertoare.

Acest model special de modulație asigură faptul că ciclurile de frecvență sunt executate cu o valoare medie a tensiunii care se schimbă treptat (numită și valoarea RMS), în loc să arunce vârfuri bruste de înaltă / joasă tensiune, așa cum se vede în mod normal în ciclurile de undă pătrată.

Această modificare treptată a PWM-urilor într-un SPWM este pusă în aplicare în mod intenționat, astfel încât să reproducă îndeaproape modelul exponențial de creștere / scădere al unei unde sinusoidale standard sau a unei forme de undă sinusoidale, de unde și numele de undă sinusoidală PWM sau SPWM.

Generarea SPWM cu Arduino

SPWM-ul explicat mai sus poate fi implementat cu ușurință utilizând câteva părți discrete și, de asemenea, folosind Arduino, care vă va permite probabil să obțineți mai multă precizie cu perioadele de formă de undă.

Următorul cod Arduino poate fi utilizat pentru implementarea SPWM-ului destinat unei aplicații date.

Doamne!! care arată îngrozitor de mare, dacă știi cum să-l scurți, s-ar putea să te simți liber să o faci la sfârșitul tău.

// By Swagatam (my first Arduino Code)
void setup(){
pinMode(8, OUTPUT)
pinMode(9, OUTPUT)
}
void loop(){
digitalWrite(8, HIGH)
delayMicroseconds(500)
digitalWrite(8, LOW)
delayMicroseconds(500)
digitalWrite(8, HIGH)
delayMicroseconds(750)
digitalWrite(8, LOW)
delayMicroseconds(500)
digitalWrite(8, HIGH)
delayMicroseconds(1250)
digitalWrite(8, LOW)
delayMicroseconds(500)
digitalWrite(8, HIGH)
delayMicroseconds(2000)
digitalWrite(8, LOW)
delayMicroseconds(500)
digitalWrite(8, HIGH)
delayMicroseconds(1250)
digitalWrite(8, LOW)
delayMicroseconds(500)
digitalWrite(8, HIGH)
delayMicroseconds(750)
digitalWrite(8, LOW)
delayMicroseconds(500)
digitalWrite(8, HIGH)
delayMicroseconds(500)
digitalWrite(8, LOW)
//......
digitalWrite(9, HIGH)
delayMicroseconds(500)
digitalWrite(9, LOW)
delayMicroseconds(500)
digitalWrite(9, HIGH)
delayMicroseconds(750)
digitalWrite(9, LOW)
delayMicroseconds(500)
digitalWrite(9, HIGH)
delayMicroseconds(1250)
digitalWrite(9, LOW)
delayMicroseconds(500)
digitalWrite(9, HIGH)
delayMicroseconds(2000)
digitalWrite(9, LOW)
delayMicroseconds(500)
digitalWrite(9, HIGH)
delayMicroseconds(1250)
digitalWrite(9, LOW)
delayMicroseconds(500)
digitalWrite(9, HIGH)
delayMicroseconds(750)
digitalWrite(9, LOW)
delayMicroseconds(500)
digitalWrite(9, HIGH)
delayMicroseconds(500)
digitalWrite(9, LOW)
}
//-------------------------------------//

În următoarea postare vă voi explica cum să utilizați generatorul SPWM bazat pe Arduino faceți un circuit invertor pur cu undă sinusoidală ....continua să citești!

Codul SPWM de mai sus a fost îmbunătățit în continuare de domnul Atton pentru îmbunătățirea performanței sale, după cum se arată mai jos:

/*
This code was based on Swagatam SPWM code with changes made to remove errors. Use this code as you would use any other Swagatam’s works.
Atton Risk 2017
*/
const int sPWMArray[] = {500,500,750,500,1250,500,2000,500,1250,500,750,500,500} // This is the array with the SPWM values change them at will
const int sPWMArrayValues = 13 // You need this since C doesn’t give you the length of an Array
// The pins
const int sPWMpin1 = 10
const int sPWMpin2 = 9
// The pin switches
bool sPWMpin1Status = true
bool sPWMpin2Status = true
void setup()
{
pinMode(sPWMpin1, OUTPUT)
pinMode(sPWMpin2, OUTPUT)
}
void loop()
{
// Loop for pin 1
for(int i(0) i != sPWMArrayValues i++)
{
if(sPWMpin1Status)
{
digitalWrite(sPWMpin1, HIGH)
delayMicroseconds(sPWMArray[i])
sPWMpin1Status = false
}
else
{
digitalWrite(sPWMpin1, LOW)
delayMicroseconds(sPWMArray[i])
sPWMpin1Status = true
}
}
// Loop for pin 2
for(int i(0) i != sPWMArrayValues i++)
{
if(sPWMpin2Status)
{
digitalWrite(sPWMpin2, HIGH)
delayMicroseconds(sPWMArray[i])
sPWMpin2Status = false
}
else
{
digitalWrite(sPWMpin2, LOW)
delayMicroseconds(sPWMArray[i])
sPWMpin2Status = true
}
}
}




Precedent: 8X Overunity de la Joule Thief - Design dovedit În continuare: Circuitul invertorului cu undă sinusoidală Arduino cu cod complet de program