- Cos'è SPWM (Sinusoidal Pulse Width Modulation)?
- Come funziona l'inverter SPWM
- Componenti necessari per costruire l'inverter SPWM
- Costruzione del circuito inverter SPWM
- Programma Arduino per inverter SPWM
- Test del circuito inverter PWM TL494
I circuiti inverter sono spesso necessari dove non è possibile ottenere l'alimentazione CA dalla rete. Un circuito inverter viene utilizzato per convertire l' alimentazione CC in alimentazione CA e può essere suddiviso in due tipi: inverter a onda sinusoidale pura o inverter a onda quadra modificata. Questi inverter a onda sinusoidale pura sono molto costosi, mentre gli inverter a onda quadra modificati sono economici. Ulteriori informazioni sui diversi tipi di inverter qui.
In un precedente articolo vi ho mostrato come non realizzare un inverter ad onda quadra modificato affrontando i problemi ad esso associati. Quindi, in questo articolo, realizzerò un semplice inverter a onda sinusoidale pura usando Arduino e spiegherò il principio di funzionamento del circuito.
Se stai realizzando questo circuito, tieni presente che questo circuito non presenta feedback, nessuna protezione da sovracorrente, nessuna protezione da cortocircuito e nessuna protezione dalla temperatura. Quindi questo circuito è costruito e dimostrato solo a scopo didattico, ed è assolutamente sconsigliato costruire e utilizzare questo tipo di circuito per apparecchi commerciali. Tuttavia è possibile aggiungerli al circuito se necessario, i circuiti di protezione comunemente usati come
Sono già stati discussi la protezione da sovratensione, protezione da sovracorrente, protezione da inversione di polarità, protezione da cortocircuito, controller hot swap, ecc.
ATTENZIONE: se si sta realizzando questo tipo di circuito, prestare particolare attenzione all'alta tensione e ai picchi di tensione generati dal segnale di commutazione all'ingresso.
Cos'è SPWM (Sinusoidal Pulse Width Modulation)?
Come suggerisce il nome, SPWM sta per S inusoidal P ulse W idth M odulation. Come forse già saprai, un segnale PWM è un segnale in cui possiamo cambiare la frequenza dell'impulso così come il tempo di accensione e il tempo di spegnimento, noto anche come duty cycle. Se vuoi saperne di più sul PWM, puoi leggerlo qui. Quindi, variando il duty cycle, alteriamo la tensione media dell'impulso. L'immagine sotto mostra che-
Se consideriamo un segnale PWM che sta commutando tra 0 - 5V che ha un duty cycle del 100%, otterremo una tensione di uscita media di 5V, ancora se consideriamo lo stesso segnale con un duty cycle del 50%, lo faremo ottenere la tensione di uscita di 2,5 V, e per il ciclo di lavoro del 25%, è la metà. Ciò riassume il principio di base del segnale PWM e possiamo passare alla comprensione del principio di base del segnale SPWM.
Una tensione sinusoidale è principalmente una tensione analogica che altera la sua grandezza nel tempo, e possiamo riprodurre questo comportamento di un'onda sinusoidale cambiando continuamente il ciclo di lavoro dell'onda PWM, l'immagine sotto lo mostra.
Se guardi lo schema qui sotto, vedrai che c'è un condensatore collegato all'uscita del trasformatore. Questo condensatore è responsabile del livellamento del segnale CA dalla frequenza portante.
Il segnale di ingresso utilizzato caricherà e scaricherà il condensatore in base al segnale di ingresso e al carico. Poiché abbiamo utilizzato un segnale SPWM ad altissima frequenza, avrà un ciclo di lavoro molto piccolo che è come l'1%, questo ciclo di lavoro dell'1% caricherà un po 'il condensatore, il ciclo di lavoro successivo è del 5%, questo si caricherà di nuovo il condensatore un po 'di più, l'impulso successivo avrà un duty cycle del 10% e il condensatore si caricherà un po' di più, applicheremo il segnale fino a quando non avremo raggiunto un duty cycle del 100% e da lì torneremo a scendere all'1%. Questo creerà una curva molto liscia come un'onda sinusoidale in uscita. Quindi, fornendo valori corretti del ciclo di lavoro in ingresso, avremo un'onda molto sinusoidale in uscita.
Come funziona l'inverter SPWM
L'immagine sopra mostra la sezione di pilotaggio principale dell'inverter SPWM e, come puoi vedere, abbiamo utilizzato due MOSFET a canale N in configurazione half-bridge per pilotare il trasformatore di questo circuito, per ridurre il rumore di commutazione indesiderato e per proteggere il MOSFET, abbiamo utilizzato diodi 1N5819 paralleli ai MOSFET. Per ridurre eventuali picchi dannosi generati nella sezione del gate, abbiamo utilizzato resistori da 4,7 ohm paralleli ai diodi 1N4148. Infine, i 140 transistor BD139 e BD sono configurati in un push-pull configurazioneper pilotare il gate del MOSFET, perché questo MOSFET ha una capacità di gate molto elevata e richiede un minimo di 10V alla base per accendersi correttamente. Scopri di più sul funzionamento degli amplificatori Push-Pull qui.
Per comprendere meglio il principio di funzionamento del circuito, lo abbiamo ridotto al punto in cui questa sezione del MOSFET è ON. Quando il MOSFET è sulla corrente, scorre prima attraverso il trasformatore e poi viene messo a terra dal MOSFET, quindi anche un flusso magnetico verrà indotto nella direzione in cui scorre la corrente, e il nucleo del trasformatore passerà il flusso magnetico nell'avvolgimento secondario, e otterremo il semiciclo positivo del segnale sinusoidale in uscita.
Nel ciclo successivo, la parte inferiore del circuito è sulla parte superiore del circuito è spenta per questo motivo ho rimosso la parte superiore, ora la corrente scorre nella direzione opposta e genera un flusso magnetico in quella direzione, invertendo così la direzione del flusso magnetico nel nucleo. Scopri di più sul funzionamento del MOSFET qui.
Ora, sappiamo tutti che un trasformatore funziona con cambiamenti di flusso magnetico. Quindi, accendere e spegnere entrambi i MOSFET, uno invertito e farlo 50 volte in un secondo, genererà un bel flusso magnetico oscillante all'interno del nucleo del trasformatore e il flusso magnetico variabile indurrà una tensione nella bobina secondaria come sappiamo dalla legge di Faraday. Ecco come funziona l'inverter di base.
Di seguito è riportato il circuito inverter SPWM completo utilizzato in questo progetto.
Componenti necessari per costruire l'inverter SPWM
Sl.No |
Parti |
genere |
Quantità |
1 |
Atmega328P |
CIRCUITO INTEGRATO |
1 |
2 |
IRFZ44N |
Mosfet |
2 |
3 |
BD139 |
Transistor |
2 |
4 |
BD140 |
Transistor |
2 |
5 |
22pF |
Condensatore |
2 |
6 |
10.000, 1% |
Resistore |
1 |
7 |
16 MHz |
Cristallo |
1 |
8 |
0.1uF |
Condensatore |
3 |
9 |
4.7R |
Resistore |
2 |
10 |
1N4148 |
Diodo |
2 |
11 |
LM7805 |
Regolatore di tensione |
1 |
12 |
200uF, 16V |
Condensatore |
1 |
13 |
47uF, 16V |
Condensatore |
1 |
14 |
2,2uF, 400V |
Condensatore |
1 |
Costruzione del circuito inverter SPWM
Per questa dimostrazione, il circuito è costruito su Veroboard, con l'aiuto dello schema, All'uscita del trasformatore, un'enorme quantità di corrente fluirà attraverso la connessione, quindi i ponticelli di connessione devono essere il più spessi possibile.
Programma Arduino per inverter SPWM
Prima di andare avanti e iniziare a capire il codice, chiariamo le basi. Dal principio di funzionamento di cui sopra, hai imparato come apparirà il segnale PWM in uscita, ora rimane la domanda su come possiamo creare un'onda così variabile sui pin di uscita di Arduino.
Per rendere il segnale PWM variabile, utilizzeremo il timer1 a 16 bit con un'impostazione del prescaler di 1, che ci darà 1600/16000000 = 0,1 ms di tempo per ogni conteggio se consideriamo un singolo semiciclo di un'onda sinusoidale, che si adatta esattamente 100 volte all'interno di un mezzo ciclo dell'onda. In termini semplici, saremo in grado di campionare la nostra onda sinusoidale 200 volte.
Successivamente, dobbiamo dividere la nostra onda sinusoidale in 200 pezzi e calcolare i loro valori con una correlazione dell'ampiezza. Successivamente, dobbiamo convertire questi valori in valori di contatore del timer moltiplicandolo per il limite del contatore. Infine, dobbiamo inserire questi valori in una tabella di ricerca per inviarli al contatore e otterremo la nostra onda sinusoidale.
Per rendere le cose un po 'più semplici, sto usando un codice SPWM scritto molto bene da GitHub, creato da Kurt Hutten.
Il codice è molto semplice, iniziamo il nostro programma aggiungendo i file di intestazione richiesti
#include #include
Successivamente, abbiamo le nostre due tabelle di ricerca da cui ottenere i valori del contatore del timer.
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};
Successivamente, nella sezione di configurazione , inizializziamo i registri di controllo del contatore del timer in modo che siano chiari su ciascuno. Per ulteriori informazioni, è necessario consultare la scheda tecnica del circuito integrato atmega328.
TCCR1A = 0b10100010; / * 10 chiaro sulla partita, impostato su BOTTOM per compA. 10 chiaro sulla partita, impostato su BOTTOM per compB. 00 10 WGM1 1: 0 per la forma d'onda 15. * / TCCR1B = 0b00011001; / * 000 11 WGM1 3: 2 per forma d'onda 15. 001 nessuna prescala sul contatore. * / TIMSK1 = 0b00000001; / * 0000000 1 TOV1 Abilitazione interrupt flag. * /
Successivamente, inizializziamo il registro di acquisizione dell'input con un valore predefinito di 16000 poiché questo ci aiuterà a generare esattamente 200 campioni.
ICR1 = 1600; // Periodo per cristallo da 16 MHz, per una frequenza di commutazione di 100 KHz per 200 suddivisioni per ciclo sinusoidale di 50 Hz.
Successivamente, abilitiamo gli interrupt globali chiamando la funzione, sei ();
Infine, impostiamo i pin 9 e 10 di Arduino come output
DDRB = 0b00000110; // Imposta PB1 e PB2 come uscite.
Questo segna la fine della funzione di configurazione.
La sezione del ciclo del codice rimane vuota in quanto è un programma basato su interruzioni del contatore del timer.
void loop () {; /*Fare niente…. per sempre!*/}
Successivamente, abbiamo definito il vettore di overflow timer1, questa funzione di interrupt riceve una chiamata una volta che il timer1 viene superato e genera un interrupt.
ISR (TIMER1_OVF_vect) {
Successivamente, dichiariamo alcune variabili locali come variabili statiche e abbiamo iniziato a fornire i valori al resistore di cattura e confronto.
static int num; char trig statico; // cambia il duty-cycle ogni periodo. OCR1A = lookUp1; OCR1B = lookUp2;
Infine, pre-incrementiamo il contatore per fornire i valori successivi alla cattura e confrontare i resistori, che segna la fine di questo codice.
if (++ num> = 200) {// Pre-increment num allora controlla che sia inferiore a 200. num = 0; // Reimposta num. trig = trig ^ 0b00000001; digitalWrite (13, trig); }
Test del circuito inverter PWM TL494
Per testare il circuito, viene utilizzata la seguente configurazione.
- Batteria piombo-acido 12V.
- Un trasformatore che ha una presa 6-0-6 e una presa 12-0-12
- Lampadina ad incandescenza da 100W come carico
- Multimetro Meco 108B + TRMS
- Multimetro Meco 450B + TRMS
Segnale di uscita da Arduino:
Una volta caricato il codice. Ho misurato il segnale SPWM in uscita dai due pin di Arduino che assomiglia all'immagine qui sotto,
Se ingrandiamo un po 'possiamo vedere il ciclo di lavoro in continua evoluzione dell'onda PWM.
Successivamente, l'immagine sotto mostra il segnale di uscita dal trasformatore.
Circuito inverter SPWM in stato ideale:
Come puoi vedere dall'immagine sopra, questo circuito assorbe circa 13 W durante il funzionamento ideale
Tensione di uscita senza carico:
La tensione di uscita del circuito dell'inverter è mostrata sopra, questa è la tensione che esce all'uscita senza alcun carico collegato.
Consumo energetico in ingresso:
L'immagine sopra mostra la potenza in ingresso che il ic consuma quando è collegato un carico di 40 W.
Consumo energetico in uscita:
L'immagine sopra mostra la potenza di uscita che viene consumata da questo circuito, (il carico è una lampadina a incandescenza da 40W)
Con ciò, concludiamo la parte di test del circuito. Puoi guardare il video qui sotto per una dimostrazione. Spero che questo articolo ti sia piaciuto e che abbia imparato qualcosa su SPWM e le sue tecniche di implementazione. Continua a leggere, continua ad imparare, continua a costruire e ci vediamo nel prossimo progetto.