CIRCUIT
WAVEFORMS
GATE SIGNALS OF INVERTER MOSFET
Step-up transformer
The transformer rating is 12-0-12V,8A. AC (centre tapped) at primary and 230V,0.9A across the secondary winding. The 230V appearing across the secondary is the RMS value of the waveform and the peak value would be 230*1.414=325.22V.
PROGRAM ( COMPILER MIKRO C)
//used crystal of 4 MHz
// duty_50% = (clock frequency/ (output_frequency*4* 2*1)) -1 =19999
#define modeswitch PORTE.F8 //modeswitch
#define relay LATC.F14 //relay
#define charge_switch LATC.F13 //relay
int boostvoltage,solarvoltage;
int maximum_duty=5;
int maximum_duty_solar=5;
unsigned long int pwm_period, current_duty ;
unsigned int current_duty2,current_duty3;
unsigned int pwm_period2, pwm_period3;
int f=0;
void pins_init(void);
void inverter_init(void);
void solarboost_init(void);
void charger_boost_init(void);
void boostcontrol(void);
void solar_boost_control(void);
void off_inverter_and_boost(void);
void on_inverter_and_boost(void);
void mode_control(void);
void main()
{
pins_init() ;
inverter_init();
charger_boost_init();
solarboost_init();
ADC1_Init();
relay=0;
while (1)
{
if(f==0) //boost mode duty
{
boostcontrol();
}
solar_boost_control();
mode_control();
}
}
void mode_control(void)
{
if(modeswitch==0)
{
if(f==0) //change to rectifier mode
{
f=1; off_inverter_and_boost();Delay_ms(1000);
relay=1;charge_switch=1;
}
else //change to inverter mode
{
relay=0;charge_switch=0;Delay_ms(1000);
f=0;on_inverter_and_boost();
}
}
}
void off_inverter_and_boost(void)
{
PWM1_Mc_Stop(); PWM_Stop(2);
}
void on_inverter_and_boost(void)
{
PWM1_MC_Start(); PWM_Start(2);
}
void solar_boost_control(void)
{
solarvoltage = ADC1_Read(1)*0.054; Delay_ms(1);
if(solarvoltage>12)
{
current_duty2=current_duty2-1;
if(current_duty2<1)current_duty2=0;
PWM_Set_Duty(current_duty2, 1);
}
else if (solarvoltage<14 )
{
current_duty2=current_duty2+1;
if(current_duty2>maximum_duty_solar)current_duty2=maximum_duty_solar;
PWM_Set_Duty(current_duty2, 1);
}
}
void boostcontrol(void)
{
boostvoltage = ADC1_Read(0)*0.054; Delay_ms(100);
if(boostvoltage>13)
{
current_duty3=current_duty3-1;
if(current_duty3<1)current_duty3=0;
PWM_Set_Duty(current_duty3, 2);
}
else if (boostvoltage<11 )
{
current_duty3=current_duty3+1;
if(current_duty3>maximum_duty)current_duty3=maximum_duty;
PWM_Set_Duty(current_duty3, 2);
}
}
void inverter_init(void)
{
current_duty=20000; //duty ratio 50% =99
pwm_period = PWM1_MC_Init(50, 0, 0x11, 0); //enable 1L AND 1H pwm pins
PWM1_MC_Set_Duty (current_duty, 1) ;
PWM1_MC_Start();
DTCON1=511; //DEAD TIME CONTROL maximum 79
////Delay_ms(2000); PWM1_Mc_Stop();
}
void solarboost_init(void) //pwm 2
{
current_duty2 =1; //80% IS 24,MAXIMUM 33
pwm_period2 = PWM_Init(30000 , 1, 1, 2);//FREQ,CHANNEL,PRESCALE,TIMER NAME
PWM_Start(1);
PWM_Set_Duty(current_duty2, 1); // Set current duty for PWM1 // initial value for current_duty1
}
void charger_boost_init(void) //pwm 3
{
current_duty3 = 1; // initial value for current_duty1
pwm_period3 = PWM_Init(30000, 2, 1, 3);
PWM_Start(2);
PWM_Set_Duty(current_duty3, 2);
}
void pins_init(void) //pwm 3
{
TRISB.F0 = 1; TRISB.F1 = 1; //feed back
TRISE.F8 = 1; //mode switch
TRISD.F0 = 0; TRISD.F1 = 0; //pwm boost
TRISE.F0 = 0; TRISE.F1 = 0; //inverter
TRISC.F14 = 0; //RELAY
TRISC.F13 = 0; //charger mosfet
}