Wednesday, March 8, 2017

Space Vector Modulation implementation for 3 level NPC inverter (R - Load)

Space Vector Logic (Simulink Model)



Generating gating pulses from SV references (Simulink model)



Output waveform (R-Load)




3 level Diode Clamped Multilevel Inverter based Induction Motor Drive

Stepped Wave Logic (simulink Model)



Stepped Wave output


 Phase Voltage


SPWM logic (Simulink Model)



SPWM output

  Phase Voltage



 Line Voltage


ADRUINO code for stepped wave logic

void setup()
{
  pinMode(2,OUTPUT);
  pinMode(3,OUTPUT);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
  pinMode(10,OUTPUT);
  pinMode(11,OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(13,OUTPUT);
  Serial.begin(9600);
}
void loop()
{
  digitalWrite(2,HIGH);
  digitalWrite(3,HIGH);
  digitalWrite(8,HIGH);
  digitalWrite(9,HIGH);
  digitalWrite(10,HIGH);
  digitalWrite(11,HIGH);
  delayMicroseconds(3333);
  digitalWrite(2,LOW);
  digitalWrite(3,LOW);
  digitalWrite(8,LOW);
  digitalWrite(9,LOW);
  digitalWrite(10,LOW);
  digitalWrite(11,LOW);

  digitalWrite(2,HIGH);
  digitalWrite(3,HIGH);
  digitalWrite(8,HIGH);
  digitalWrite(9,HIGH);
  digitalWrite(12,HIGH);
  digitalWrite(13,HIGH);
  delayMicroseconds(3333);
  digitalWrite(2,LOW);
  digitalWrite(3,LOW);
  digitalWrite(8,LOW);
  digitalWrite(9,LOW);
  digitalWrite(12,LOW);
  digitalWrite(13,LOW);

  digitalWrite(2,HIGH);
  digitalWrite(3,HIGH);
  digitalWrite(6,HIGH);
  digitalWrite(7,HIGH);
  digitalWrite(12,HIGH);
  digitalWrite(13,HIGH);
  delayMicroseconds(3334);
  digitalWrite(2,LOW);
  digitalWrite(3,LOW);
  digitalWrite(6,LOW);
  digitalWrite(7,LOW);
  digitalWrite(12,LOW);
  digitalWrite(13,LOW);

  digitalWrite(4,HIGH);
  digitalWrite(5,HIGH);
  digitalWrite(6,HIGH);
  digitalWrite(7,HIGH);
  digitalWrite(12,HIGH);
  digitalWrite(13,HIGH);
  delayMicroseconds(3333);
  digitalWrite(4,LOW);
  digitalWrite(5,LOW);
  digitalWrite(6,LOW);
  digitalWrite(7,LOW);
  digitalWrite(12,LOW);
  digitalWrite(13,LOW);

  digitalWrite(4,HIGH);
  digitalWrite(5,HIGH);
  digitalWrite(6,HIGH);
  digitalWrite(7,HIGH);
  digitalWrite(10,HIGH);
  digitalWrite(11,HIGH);
  delayMicroseconds(3333);
  digitalWrite(4,LOW);
  digitalWrite(5,LOW);
  digitalWrite(6,LOW);
  digitalWrite(7,LOW);
  digitalWrite(10,LOW);
  digitalWrite(11,LOW);


  digitalWrite(4,HIGH);
  digitalWrite(5,HIGH);
  digitalWrite(8,HIGH);
  digitalWrite(9,HIGH);
  digitalWrite(10,HIGH);
  digitalWrite(11,HIGH);
  delayMicroseconds(3334);
  digitalWrite(4,LOW);
  digitalWrite(5,LOW);
  digitalWrite(8,LOW);
  digitalWrite(9,LOW);
  digitalWrite(10,LOW);
  digitalWrite(11,LOW);
}






Arduino based Remote controlled servo - motorized pot





//////// ARDUINO
///////code by V. SaiKiran.......https://www.facebook.com/saikiran27


#include <IRremote.h>
#include <Servo.h>
Servo front;  // create servo object to control a servo
Servo center;
Servo rear;
Servo bass;
int LED=0;  //power status initially set OFF
int pos1=10;    // variable to store the servo position
int pos2=10;
int pos3=10;
int pos4=10;
int x=10;  // increment or decrement angle of any servo
int RECV_PIN = 11; //out pin of tsop sensor

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  front.attach(10);  // attaches the servo on pin 10 to the servo object
  front.write(10);
  center.attach(9);
  center.write(10);
  rear.attach(6);
  rear.write(10);
  bass.attach(5);
  bass.write(10);
  pinMode(13,OUTPUT);
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
}


void loop()
{
  if (irrecv.decode(&results))
  {
    Serial.println(results.value);
 
//POWER LOOP
    if(results.value==284131455)
    {
      if(LED==0)
      {
        LED=1;
        digitalWrite(13,HIGH);
      }
      else
      if(LED==1)
      {
        LED=0;
        digitalWrite(13,LOW);
      }
    }
//RESET LOOP
    if(results.value==284119215)
    {
      pos1=30;
      pos2=30;
      pos3=30;
      pos4=30;
      front.write(pos1);
      center.write(pos2);
      rear.write(pos3);
      bass.write(pos4);
      delay(15);
    }
//MUTE LOOP
      if(results.value==284151855)
    {
      pos1=10;
      pos2=10;
      pos3=10;
      pos4=10;
      front.write(pos1);
      center.write(pos2);
      rear.write(pos3);
      bass.write(pos4);
      delay(15);
    }  
//FRONT LOOP
    if (results.value==284157975)
    {
      pos1+=x;
      Serial.println(pos1);
      if(10<pos1<170)
      {
        front.write(pos1);
        delay(15);
      }
      else
      {
        pos1-=x;
      }
    }
    if (results.value==284104935)
    {
      pos1-=x;
      Serial.println(pos1);
      if(10<pos1<170)
      {
        front.write(pos1);
        delay(15);
      }
      else
      {
        pos1+=x;
      }
    }
 
//CENTER LOOP
    if (results.value==284141655)
    {
      pos2+=x;
      Serial.println(pos2);
      if(10<pos2<170)
      {
        center.write(pos2);
        delay(15);
      }
      else
      {
        pos2-=x;
      }
    }
    if (results.value==284109015)
    {
      pos2-=x;
      Serial.println(pos2);
      if(10<pos2<170)
      {
        center.write(pos2);
        delay(15);
      }
      else
      {
        pos2+=x;
      }
    }
 
//REAR LOOP
    if (results.value==284125335)
    {
      pos3+=x;
      Serial.println(pos3);
      if(10<pos3<170)
      {
        rear.write(pos3);
        delay(15);
      }
      else
      {
        pos3-=x;
      }
    }
    if (results.value==284106975)
    {
      pos3-=x;
      Serial.println(pos3);
      if(10<pos3<170)
      {
        rear.write(pos3);
        delay(15);
      }
      else
      {
        pos3+=x;
      }
    }

//MASTER VOLUME LOOP
    if(results.value==284102895)
    {
      pos1+=x;
      pos2+=x;
      pos3+=x;
      pos4+=x;
      if(10<pos1&&pos2&&pos3&&pos4<170)
      {
        front.write(pos1);
        center.write(pos2);
        rear.write(pos3);
        bass.write(pos4);
        delay(15);
      }
      else
      {
        pos1-=x;
        pos2-=x;
        pos3-=x;
        pos4-=x;
      }
    }
    if(results.value==284100855)
    {
      pos1-=x;
      pos2-=x;
      pos3-=x;
      pos4-=x;
      if(10<pos1&&pos2&&pos3&&pos4<170)
      {
        front.write(pos1);
        center.write(pos2);
        rear.write(pos3);
        bass.write(pos4);
        delay(15);
      }
      else
      {
        pos1+=x;
        pos2+=x;
        pos3+=x;
        pos4+=x;
      }
    }
//BASS LOOP
    if (results.value==284098815)
    {
      pos4+=x;
      Serial.println(pos4);
      if(10<pos4<170)
      {
        bass.write(pos4);
        delay(15);
      }
      else
      {
        pos4-=x;
      }
    }
    if (results.value==284113095)
    {
      pos4-=x;
      Serial.println(pos4);
      if(10<pos4<170)
      {
        bass.write(pos4);
        delay(15);
      }
      else
      {
        pos4+=x;
      }
    }
    irrecv.resume(); // Receive the next value
  }
}

1KW DC motor as Servo motor





Servo Operation





One Second Oscillations




10 Seconds Oscillations








//////// ARDUINO
///////code by V. SaiKiran.......https://www.facebook.com/saikiran27


 void setup()
 {
   pinMode(A0,INPUT);
   pinMode(A2,INPUT);
   pinMode(9,OUTPUT);
   pinMode(11,OUTPUT);
   pinMode(13,OUTPUT);
   digitalWrite(9,LOW);
   digitalWrite(11,LOW);
   Serial.begin(9600);

 }int x=0;
   int y=0;
 void loop()
 {
 
   int val;
   int ref;
   int valm;
   int refm;
   val=analogRead(A2);
   valm=map(val,0,1023,0,100);
   //Serial.println(val);
  Serial.println(valm);
   //Serial.println(x);
   //Serial.println(y);
   ref=analogRead(A0);
   refm=map(ref,0,1023,0,100);
   Serial.println(refm);
   //delay(10);
   if((valm)>(refm+3))
   {
     digitalWrite(9,HIGH);
     x=valm-refm;
     delay(10);
    // delay(map(x,0,30,1,5));
     digitalWrite(9,LOW);
   }
   else
  {
    //delay(10);
   if((valm)<(refm-3))
   {
     digitalWrite(11,HIGH);
     y=refm-valm;
     delay(10);
     //delay(map(y,0,30,1,5));
     digitalWrite(11,LOW);
   }

  }
 
 }

Boost Converter (12v to 120v) using ARDUINO




Tuesday, February 21, 2017

Multilevel inverter (5 level) based variable frequency drive



Concept:



















Important parts :


            1. Induction motor (0.5hp, 230V, 1.5A)

            2. Mosfets / IGBTs based on the machine voltage and current ratings.
            3. No. of  DC power supplies (depends on no. of levels).
                               Two power supplies - two mosfet bridges for 3 level
                               Four power supplies - four mosfet bridges for 5 level

            4. Each power supply consists of a rectifier bridge, filter capacitor and a fuse.
            5. Each power supply will be conncetd to the MOSFET bridge.
            6. The MOSFET bridges should be coonected to the power supplies.(The following Figure is for 9 level)
            7. 89s52 microcontroller is programmed in my project according to the switching logic of
                Cascaded inverter.

            8. The signals from MC will be given to the mosfet bridges through the optocoupler unit.
            9. Optocoupler unit requires seperate power supplies. A multiwinding transformer is used in
                my project to excite the optocoupler transistor.

We have re-wound the transformer as per our requirements. We just disassembled a transformer and calculated the number of turns required and then fixed it back.


We have done an experiment to see the stress experienced by the switches for the 0.5hp induction motor. We build a capacitor based potential divider to design diode clamped inverter. The diode clamped inverter is my next project and probably it will be a three phase drive.


This multilevel inverter is tested with a resistive load. Two transformers are used as the main power supplies. each 12V. The filtered output gave 18V for each bridge. The three levels are 0v 18v 36v.




            

Monday, March 10, 2014

Tower Pro Micro servo 99 sg90 control

Tower Pro Micro servo 99 sg90 control. 



The inbuilt controller of servo is already programmed with a closed loop control system using a pot. All that required is to give a pulse train with 5% to 10% duty cycle with 20ms as period.





 Most schematics on the internet shows a direct connection between micro controller and servo control pin. That is not correct.




It is required to use a buffer/ current driver for the servo. Use a transistor to connect control pin to micro controller.




The code:

#include<reg52.h>
sbit servo_pin = P1^0;
void delay(unsigned int);
void main()
{
int k,i=0,a[4]={6,12,21,12};
 pin = 0;
while(1)
{
for(k=0;k<100;k++)
{
servo_pin=1;
  delay(a[i]); // a[i] is Ton period  (Ton is precalculated)
  servo_pin=0; // The array a[i] values are calculated to stop the motor at 0, 90 and 180 degrees
  delay(200-a[i]);        //200 represents 20ms(i.e., 200x0.1ms)
}                 //200-a[i] is Toff(=T-Ton=20-Ton)
i++;
if(i==4)
i=0;
}
}

void delay(unsigned int ms)   \\ delay for 0.1ms (tested on oscilloscope)
{
int i,j;
for(i=0;i<ms;i++)
for(j=0;j<11;j++);
}


Solar Car

Solar Powered Electric Car Specifications: 1. Solar Panels -----  3 x 120W 2. BLDC Motor ------ 48v, 3KW  3. BLDC Motor Contro...