Sommario:

Arduino Sinewave per inverter: 4 passaggi
Arduino Sinewave per inverter: 4 passaggi

Video: Arduino Sinewave per inverter: 4 passaggi

Video: Arduino Sinewave per inverter: 4 passaggi
Video: How to Make Sine Wave inverter 12v to 220v using Arduino || Simple Inverter 2024, Novembre
Anonim
Onda sinusoidale Arduino per inverter
Onda sinusoidale Arduino per inverter

In questo progetto ho generato un segnale SPWM (sine wave pulse wide modulated) da due uscite digitali pwm di arduino.

Perché per fare un programma del genere devo parlare di molte altre funzioni e proprietà dell'arduino il progetto completo comprese le immagini dell'oscilloscopio e per diverse frequenze visita il mio sito web:

eprojectszone

Passaggio 1: generazione del segnale Pwm per 50Hz

Per generare un segnale a 50Hz a frequenza maggiore è necessario fare alcuni calcoli. Le frequenze da arduino possono essere a 8MHz, ma vogliamo un segnale con duty cycle variabile.

Per capire i tipi di cicli di lavoro variabili di arduino puoi leggere queste 3 parti dello stesso post 1, 2 e 3.

Supponiamo che la nostra frequenza sia 50Hz, il che significa che il periodo di tempo è 20 ms. Quindi 10 ms è il periodo di metà ciclo. In quei 10ms abbiamo bisogno di avere molti impulsi con diversi duty cycle che iniziano con piccoli duty cycle, nel mezzo del segnale abbiamo duty cycle massimi e finiamo anche con duty cycle piccoli. Per generare un'onda sinusoidale useremo due pin uno per semiciclo positivo e uno per semiciclo negativo. Nel nostro post per questo usiamo i pin 5 e 6 che significa Timer 0.

Per un segnale uniforme scegliamo pwm con correzione di fase a una frequenza 31372 Hz-vedi post precedente. Uno dei problemi più grandi è il modo in cui calcoliamo il ciclo di lavoro necessario per ogni impulso. Quindi, poiché la nostra frequenza è f=31372Hz, il periodo per ogni impulso è T=1/31372=31,8 us, quindi il numero di impulsi per un semiciclo è N=10ms/31.8us=314 impulsi. Ora per calcolare il ciclo di lavoro per ogni impulso abbiamo y=sinx, ma in questa equazione abbiamo bisogno di gradi, quindi il mezzo ciclo ha 180 gradi per 314 impulsi. Per ogni impulso abbiamo 180/314=0,57deg/pulse. Ciò significa che per ogni impulso avanziamo di 0,57 gradi.

y è il ciclo di lavoro e x il valore della posizione a metà ciclo di lavoro. all'inizio x è 0, dopo x=0,57, x=1,14 e così via fino a x= 180.

se calcoliamo tutti i 314 valori otteniamo un array di 314 elementi (digita "int" per essere calcolato più facilmente da arduino).

Tale matrice è:

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};

Puoi vedere che, come un'onda sinusoidale, il ciclo di lavoro è più basso nel primo e nell'ultimo elemento e più alto nel mezzo.

Passaggio 2: programma Arduino per ciclo di lavoro variabile

Programma Arduino per ciclo di lavoro variabile
Programma Arduino per ciclo di lavoro variabile

Nell'immagine sopra abbiamo segnali di duty cycle variabili con valori dall'array.

Ma come fare tale segnale??

la parte del programma sottostante utilizza gli interrupt per modificare i valori dei duty cycle

sei();// abilita gli interrupt

}

ISR(TIMER1_COMPA_vect){// interrompe quando il timer 1 corrisponde al valore OCR1A

if(i>313 && OK==0){// valore finale dal vettore per il pin 6

i=0;// va al primo valore di vector(array)

OK=1;//abilita pin 5

}

x=sinPWM;// x prende il valore dal vettore corrispondente alla posizione i(i è zero indicizzato)-valore del duty cycle

i=i+1;// vai alla posizione successiva

}

Passaggio 3: alternare i pin Arduino a 50Hz

Pin Arduino alternati a 50Hz
Pin Arduino alternati a 50Hz

Poiché ogni pin genera solo un mezzo ciclo di lavoro per creare un'onda sinusoidale completa, utilizziamo due pin che si alternano uno dopo l'altro dopo 10 ms esatti (per 50 Hz). Questo cambio di pin viene effettuato alla fine dell'array, dopo che diciamo che il pin 5 ha generato 314 impulsi, questo pin viene spento e abilitato il pin 6 che fa la stessa cosa ma per il ciclo di lavoro negativo.

Poiché arduino può generare solo segnali positivi, il duty cycle negativo è realizzato in h bridge, puoi leggere qui a riguardo

Il programma per cambiare i pin:

sei();// abilita gli interrupt

}

ISR(TIMER1_COMPA_vect){// interrompe quando il timer 1 corrisponde al valore OCR1A

if(i>313 && OK==0){// valore finale dal vettore per il pin 6

i=0;// vai al primo valore del vettore

OK=1;//abilita pin 5

}

if(i>313 && OK==1){// valore finale dal vettore per il pin 5

i=0;//vai al primo valore del vettore

OK=0;//abilita pin 6

}

x=sinPWM;// x prende il valore dal vettore corrispondente alla posizione i(i è indicizzato a zero)

i=i+1;// vai alla posizione successiva

if(OK==0){

OCR0B=0;//crea pin 5 0

OCR0A=x;//abilita il pin 6 al corrispondente ciclo di lavoro

if(OK==1){

OCR0A=0;//fare pin 6 0

OCR0B=x;//abilita il pin 5 al corrispondente ciclo di lavoro

}

}

Passaggio 4: pilotare un ponte H e filtrare il segnale Pwm

I segnali ottenuti da arduino sono la parte di controllo per applicazioni inverter perché entrambi sono positivi. Per realizzare un'onda sinusoidale completa e un pratico inverter dobbiamo utilizzare un ponte h e per azzerare il pwm un filtro passa basso.

Il ponte H è presentato qui.

Il filtro passa-basso testato con piccoli motori a corrente alternata, qui.

Consigliato: