Circuito generatore Arduino SPWM - Dettagli codice e diagramma

Prova Il Nostro Strumento Per Eliminare I Problemi





In questo post impariamo come generare una modulazione di larghezza di impulso a onda sinusoidale o SPWM tramite Arduino, che può essere utilizzato per creare un circuito inverter a onda sinusoidale pura o gadget simili.

Il Arduino codice è sviluppato da me, ed è il mio primo codice Arduino, ... e sembra piuttosto buono



Cos'è SPWM

Ho già spiegato come generare SPWM usando gli opamp in uno dei miei articoli precedenti, potresti esaminarlo per capire come può essere creato utilizzando componenti discreti e per quanto riguarda la sua importanza.

Fondamentalmente, SPWM che sta per modulazione della larghezza dell'impulso dell'onda sinusoidale, è un tipo di modulazione dell'impulso in cui gli impulsi vengono modulati per simulare una forma d'onda sinusoidale, in modo che la modulazione sia in grado di raggiungere le proprietà di un'onda sinusoidale pura.



Per implementare un SPWM gli impulsi vengono modulati con larghezze iniziali più strette che gradualmente si allargano al centro del ciclo, e infine terminano essendo più strette alla fine per terminare il ciclo.

Per essere più precisi, gli impulsi iniziano con larghezze più strette che gradualmente si allargano ad ogni impulso successivo, e si allargano al centro dell'impulso, dopodiché la sequenza continua ma con una modulazione opposta, cioè gli impulsi ora iniziano gradualmente a restringersi fino al termine del ciclo.

Demo video

Ciò costituisce un ciclo SPWM e si ripete per tutto il tempo a una velocità particolare determinata dalla frequenza dell'applicazione (solitamente 50 Hz o 60 Hz). In genere, SPWM viene utilizzato per pilotare dispositivi di alimentazione come mosfet o BJT in inverter o convertitori.

Questo speciale modello di modulazione garantisce che i cicli di frequenza vengano eseguiti con un valore di tensione medio che cambia gradualmente (chiamato anche valore RMS), invece di generare improvvisi picchi di alta / bassa tensione come normalmente si osserva nei cicli a onda quadra piatta.

Questa modifica graduale dei PWM in un SPWM viene applicata di proposito in modo da replicare da vicino il modello di salita / discesa esponenziale di un'onda sinusoidale standard o di una forma d'onda sinusoidale, da cui il nome PWM a onda sinusoidale o SPWM.

Generazione di SPWM con Arduino

L'SPWM sopra spiegato può essere facilmente implementato utilizzando alcune parti discrete e anche utilizzando Arduino che probabilmente ti consentirà di ottenere una maggiore precisione con i periodi della forma d'onda.

Il seguente codice Arduino può essere utilizzato per implementare l'SPWM previsto per una determinata applicazione.

Perbacco!! sembra terribilmente grande, se sai come accorciarlo, potresti sicuramente sentirti libero di farlo alla tua fine.

// 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)
}
//-------------------------------------//

Nel prossimo post spiegherò come utilizzare il generatore SPWM basato su Arduino sopra per creare un circuito inverter sinusoidale puro ....continua a leggere!

Il codice SPWM sopra è stato ulteriormente migliorato dal signor Atton per migliorare le sue prestazioni, come indicato di seguito:

/*
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
}
}
}




Precedente: 8X Overunity di Joule Thief - Design collaudato Avanti: Circuito inverter a onda sinusoidale pura Arduino con codice programma completo