How to make a Variable Frequency Inverter for 3 Phase Induction Motor

Hello everyone! I have a VSI SPWM Inverter Project, but my supervisor ask me to upgrade it to a VFD Inverter. I've found a code about how to generate 3 phase SPWM in this article. It provides 6 SPWM outputs, and i think i need to invert 3 SPWM output to negative signals. Then someone told me that i can invert the lookup table or PWM, so the output will act as negative signals, but the other one told me that arduino can't generate negatives signal. So, i haven't find any methods to invert 3 SPWM signals. The output signal is so smooth. And i also need to improve the code to VFD code with range frequency 0-100 Hz. I've found a reference about VFD from this one and tried to modify the SPWM code, but failed. I have a Custom Gate Driver, a MOSFET bridge with IRFP460 MOSFET, then LC Low Pass Filter for each phase between Arduino Mega and 3 Phase Induction Motor. Right now, i can only provide MOSFET bridge schematic and 3 Phase Motor plate in attachment, because i accidentally deleted the gate driver schematic, but the gate driver output is 10 vdc and i think that's enough to provide IRFP460 MOSFET gate.The reason i haven't use the VFD code from the github is i want to learn how to implement and understand the code, not just simply using it in my project. Anyway, i don't think this VFD code works in my VSI circuit that i've built. Could anyone help me to invert 3 SPWM signals and improve the code to VFD Inverter, please? Here is the SPWM code..

int i=0;
int j=0;
int k=0;
int x=0;
int y=0;
int z=0;
int OK=0;
int OK1=0;
int OK2=0;
int OK3=0;
int OK4=0;

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,255,255,255,255,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,216,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};

void setup() {
Serial.begin(9600);

pinMode(4, OUTPUT);
pinMode(13,OUTPUT);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(5,OUTPUT);

cli();// stop interrupts
TCCR0A=0;//reset the value
TCCR0B=0;//reset the value
TCNT0=0;//reset the value
//0b allow me to write bits in binary
TCCR0A=0b10100001;//phase correct pwm mode
TCCR0B=0b00000001; //no prescaler



TCCR2A=0;//reset the value
TCCR2B=0;//reset the value
TCNT2=0;//reset the value
//0b allow me to write bits in binary
TCCR2A=0b10100001;//phase correct pwm mode
TCCR2B=0b00000001; //no prescaler

TCCR3A=0;//reset the value
TCCR3B=0;//reset the value
TCNT3=0;//reset the value
//0b allow me to write bits in binary
TCCR3A=0b10100001;//phase correct pwm mode
TCCR3B=0b00000001; //no prescaler
TCCR1A=0;//reset the value
TCCR1B=0;//reset the value
TCNT1=0;//reset the value
OCR1A=509;// compare match value
TCCR1B=0b00001001; //WGM12 bit is 1 for CTC mode and no prescaler

TIMSK1 |=(1 << OCIE1A);// enable interrupts

sei();//stop interrupts
}
ISR(TIMER1_COMPA_vect){// interrupt when timer 1 match with OCR1A value
if(i>313 && OK==0){// final value from vector for pin 13
i=0;// go to first value of vector
OK=1;//enable pin 4
}
if(i>313 && OK==1){// final value from vector for pin 4
i=0;//go to firs value of vector
OK=0;//enable pin 13
}
x=sinPWM[i];// x take the value from vector corresponding to position i(i is zero indexed)
i=i+1;// go to the next position
if(OK==0){
OCR0B=0;//make pin 4 0
OCR0A=x;//enable pin 13 to corresponding duty cycle
}
if(OK==1){
OCR0A=0;//make pin 13 0
OCR0B=x;//enable pin 4 to corresponding duty cycle
}

if ((i==209) || OK1==1){//if i equal with 209 enable second signal
OK1=1;//mantain if function
if(j>313 && OK2==0){// final value from vector for pin 10
j=0;// go to first value of vector
OK2=1;//enable pin 9
}
if(j>313 && OK2==1){// final value from vector for pin 9
j=0;//go to firs value of vector
OK2=0;//enable pin 10
}
y=sinPWM[j];// y take the value from vector corresponding to position j(j is zero indexed)
j=j+1;// go to the next position
if(OK2==0){
OCR2B=0;//make pin 9 0
OCR2A=y;//enable pin 10 to corresponding duty cycle
}
if(OK2==1){
OCR2A=0;//make pin 10 0
OCR2B=y;//enable pin 9 to corresponding duty cycle
}
}
if ((j==209) || OK3==1){//if j equal with 209 enable third signal
OK3=1;//mantain if function
if(k>313 && OK4==0){// final value from vector for pin 5
k=0;// go to first value of vector
OK4=1;//enable pin 2
}
if(k>313 && OK4==1){// final value from vector for pin 2
k=0;//go to firs value of vector
OK4=0;//enable pin 5
}
z=sinPWM[k];// z take the value from vector corresponding to position k(k is zero indexed)
k=k+1;// go to the next position
if(OK4==0){
OCR3B=0;//make pin 2 0
OCR3A=z;//enable pin 5 to corresponding duty cycle
}
if(OK4==1){
OCR3A=0;//make pin 5 0
OCR3B=z;//enable pin 2 to corresponding duty cycle
}
}
}
void loop() {

}

MOSFETbridge.png

1 Like

Are you simply too busy to provide the circuit schematic, and explain what all the problems are, or do you think those details aren't important?

jremington:
Are you simply too busy to provide the circuit schematic, and explain what all the problems are, or do you think those details aren't important?

jremington,
I am so sorry. Thanks for your concern. I will add the detail.

1 Like

Have you searched these forums for "3-phase PWM" and "3-phase induction motor" ?

MarkT,
Yes, i have. And i found your code too, but i haven't test the code yet (Mega code). Could you explain the code, please? I think there is DDS in the code, and as far as i know, DDS needs DAC for realizing the output, am i wrong? And could you tell me how to vary amplitude and frequency from the code using potmeter, please?
Thanks in advance.

1 Like

pejuangsst14:
MarkT,
Yes, i have. And i found your code too, but i haven't test the code yet (Mega code). Could you explain the code, please? I think there is DDS in the code, and as far as i know, DDS needs DAC for realizing the output, am i wrong? And could you tell me how to vary amplitude and frequency from the code using potmeter, please?
Thanks in advance.

DDS is just a phase incrementing loop - you can generate analog waveforms from it (requiring a DAC), or
just output numbers to the PWM unit, not requiring a DAC.

Its too long ago to remember, if you know how the ATmega counters work, and know how 3 phase PWM
works, it ought to follow from that.

MarkT:
Its too long ago to remember, if you know how the ATmega counters work, and know how 3 phase PWM
works, it ought to follow from that.

Ok, i'll to modify the code. Have you test the code to 3 phase motor?

Maybe not that version, but I'd have looked at the output on the 'scope.

MarkT:
Maybe not that version, but I'd have looked at the output on the 'scope.

Hi MarkT,
So i've tested your code, but still i don't know how to vary the amplitude and frequency in your code. Anyway, i found out how to vary the amplitude in my code. But not for the frequency. Could you help me?

BTW, these are details about my project.
The output inverter can be vary from range 0 to 100Hz. The MEGA's output are 6 SPWMs at 31372 Hz. There are 314 sine table vector, which is using for half cycle periode at 25 Hz for the inverter output.

  1. R phase (pin 4 as high signal and pin 13 as low signal at 31372 Hz PWM frequency, which are made for 1 sine period and outputting 50 Hz frequency after filtered with LC filter)

  2. S phase (pin 9 as high signal and pin 10 as low signal at 31372 Hz PWM frequency, which are made for 1 sine period and outputting 50 Hz frequency after filtered with LC filter)

  3. T phase (pin 2 as high signal and pin 5 as low signal at 31372 Hz PWM frequency, which are made for 1 sine period and outputting 50 Hz frequency after filtered with LC filter).

I think i should update the table to 50 Hz sine table ( half cycle, 25 Hz before ). Do you think it could be works?

MarkT:
Maybe not that version, but I'd have looked at the output on the 'scope.

I don't know how to implement your code to my gate driver. I need a code with 6 SPWM output. Could you guide me how to modify your Mega code which output 6 SPWM signal with variable amplitude and frequency?