MPPT CHARGE CONTROLLER |
Detecting your power needs and delivering exactly what you need is a fantastic work of the MAXIMUM POWER POINT TRACKING (MPPT) charge controller.
for inverter repairs in Ghana. click here
Below is the circuit diagram of DSPIC30f2010 3 interleaved buck mppt charger controller circuit.
70A MPPT CHARGER CIRCUIT
IGBT BUCK MPPT CIRCUIT
CONTROL CARD SUPPLY AND DRIVE CIRCUIT
MPPT CONTROL CARD CIRCUIT
IGBT SATURATION PROTECTION CIRCUIT
FUNCTIONS IN THE DSPIC30F2010 MPPT CONTROLLER
1. High efficiency 92%
2. High input voltage (250V PV voltage)
3. High charging current 70A max
4. Battery system is automatically detected by the controller. It can charge 12V, 24V, 36V, 48V, 72V, 96V, 120V, 144V battery system.
5. IGBT Driver system.
6. IGBT protection circuit.
7. Over current protection,
8. PV surge protection
9. Three stages charging algorithm.
10. It can be used to replace other MPPT controller boards.
11. Over temperature protection;
12. Over PV voltage protection
13. Three Interleaved switching topology
13. No programming required since everything is already done for you.
MPPT CONTROL BOARD IMAGE
MPPT CONTROL CARD IMAGE
MPPT SCREEN IMAGE
HOW TO BUY dspic30F2010 MPPT SOURCE CODE
To buy source code, send me email on opanin17@gmail.com or you can whatsapp me on 00233273315313.
Please state what you want in the mail or in your whatsapp message.
Cost of source code is 350 USD.
source code comes with the following files:
1. circuit diagram,
2. Gerber files for the mppt PCBs. (you can print your pcb with this file)
3. C source code which contains the hex file for programming the micro controller.
4. support service until first mppt is successfully built.
BUY MPPT CARD AND BUILT YOUR OWN MPPT INDUCTOR BOARD
Buy mppt card with programmed IC and free circuit at 30 USD to make your own mppt boards .
Please note that this is not a student project. Don't call or whatsapp if you are not ready.
DSPIC30F2010 MPPT SOURCE CODE
THIS IS JUST SAMPLE CODE not complete. Buy complete one if you are intrested.
#include "lcdsoft1.h"
#include "functions.h"
#define buzzer LATDbits.LATD1
#define connect LATEbits.LATE0
#define fan LATEbits.LATE2
#define protect LATEbits.LATE8
#define heat 700
///////////////////////////////////////////////////////////////////////////////////////////
signed int global_duty;
signed int duty_1,duty_2,duty_3;
int switch_condition;
int ad_switch=0;
int factory[15]={1,800,12,12,2500,40,00,148,138,140,120,50,80,88};
int setting[15];
char arr[6];
int speedlimit=20;
struct
{
unsigned int downkey:1;
unsigned int upkey:1;
unsigned int setkey:1;
unsigned int setup:1;
unsigned int gravity:1;
unsigned int loadon:1;
unsigned int solon:1;
unsigned int chrcorrect:1;
unsigned int chon:1;
unsigned int swon:1;
unsigned int pwmopen:1;
unsigned int solraising:1;
unsigned int chrraising:1;
unsigned int fault:1;
unsigned int stop:1;
unsigned int msgrtn:1;
unsigned int pvtemp:1;
unsigned int loadonled:1;
unsigned int bklte:1;
unsigned int faultled:1;
}flags;
unsigned int rising=0;
unsigned int pol=0;
unsigned int *adjust;
unsigned int *ptr;
unsigned int adj;
unsigned int *value;
signed int moov,mwhtmp;
unsigned int pvmax;
unsigned int pvmin;
unsigned int counter,post;
unsigned int fault=0;
unsigned int millisec=0;
unsigned int sec=0;
unsigned int min=0;
unsigned int mintemp=0;
unsigned long hrs=0;
long btv;
///functions
unsigned int pv_sense();
void interrupt_Init(void);
////////////////////////////////////
unsigned int solwattdisp,max_solwatt,chrtemp,chrtmr,batwatts,bat_v,soladc,hes1adc,ttmr,bzdly,batfultemp;
unsigned int soldisp,batdisp,chdisp,bath,batl,batfloat,batful,stmr,setuptmr,kwhtemp,kwh,mwh,lcdtmr,champs,ofset1,ofset2;
unsigned int solvolt,solh,soll,batvolt,batamps,solamps,keyvalue,heatntc,keyavg,ktmr,btmr,exittmr,hes1tmr,batcurtmr;
unsigned int batsel,ampsel,sol_mv,bat_mv,loadonv,loadofv,batnos,solmax,eraser,solhes,bathes,ct2,batcurrent,solampdisp;
signed int batclb,solclb,dummy_cycle;
int flag=0;
long result,result1,ch_amps,chpower;
int batfunction=0;
int solfunction=0;
int pptfunction=0;
int tlimit=500;
unsigned int tmrs=0;
unsigned int defaults,batavg,solavg,*temp;
unsigned int New_PW_Out;
unsigned int mode;
unsigned int code,adchanel;
int dec=0;
int ctmr;
int keytmr=0;
unsigned int track=0;
unsigned int backlite=0;
unsigned int initcount,yaxis;
unsigned int litedly=0;
///////////////////////////////////////////
void beep(int s)
{
char ts;
for(ts=0;ts
{
buzzer=1;
delay_ms(7);
buzzer=0;
delay_ms(7);
}
}
///long chpower();
void pwm_control(void)
{
if(global_duty > 2390)
global_duty = 2390 ;
if(global_duty<1 font="">1>
global_duty=0;
switch(switch_condition)
{
case 0:
duty_1=(global_duty-0);
PDC1=dutycyle_limit(duty_1);
duty_2=(global_duty-820);
PDC2=dutycyle_limit(duty_2);
duty_3=(global_duty-1640);
PDC3=dutycyle_limit(duty_3);
switch_condition=1;
break;
case 1:
duty_1=(global_duty-820);
PDC1=dutycyle_limit(duty_1);
duty_2=(global_duty-1640);
PDC2=dutycyle_limit(duty_2);
duty_3=(global_duty-0);
PDC3=dutycyle_limit(duty_3);
switch_condition=2;
break;
case 2:
duty_1=(global_duty-1640);
PDC1=dutycyle_limit(duty_1);
duty_2=(global_duty-0);
PDC2=dutycyle_limit(duty_2);
duty_3=(global_duty-820);
PDC3=dutycyle_limit(duty_3);
switch_condition=0;
break;
}
}
void __attribute__((__interrupt__, __auto_psv__))_INT0Interrupt(void)
{
if(IFS0bits.INT0IF==1)
{
IFS0bits.INT0IF == 0;
__asm__ volatile ("reset");
OVDCON=0X0000;
PDC1=PDC2=PDC3=0;
lcd_init();
}
}
////////////////////////////////////////////////////////////
void __attribute__((__interrupt__, __auto_psv__)) _ADCInterrupt(void)
{
IFS0bits.ADIF = 0;
batavg+=ADCBUF2;
btmr++;
if(btmr==63)
{
batvolt=batavg>>6;
bat_v=batvolt;
batavg=0;
btmr=0;
switch(batfunction)
{
case 0:
batvolt*=12;
batvolt/=10;
batfunction=1;
bath=(batvolt*batnos)+batclb;
break;
case 1:
batvolt*=10;
batvolt/=10;
batfunction=0;
batl=(batvolt*batnos)+batclb;
batdisp=__builtin_divsd((bath+batl),10);
if(batdisp>batful+30)
{
fault=2; // battery devider failure
OVDCON=0X0000;
PDC1=PDC2=PDC3=0;
}
break;
}
}
solavg+=ADCBUF0;
stmr++;
if(stmr==63)
{
solvolt=solavg>>6;
soladc=solvolt;
if((signed int)soladc<0 font="">0>
soladc=0;
solavg=0;
stmr=0;
soldisp=(solvolt*2)+100;
if(soldisp<((130*batnos)+150))//not solar
{
OVDCON=0X0000;
PDC1=PDC2=PDC3=0;
soldisp=0;
flags.solon=0;
litedly++;
if(fault==0)
{
if(litedly>1000)
flags.bklte=0;
}
}
else
{
if(soldisp>2500)
{
fault=1;// solar devider failure
OVDCON=0X0000;
PDC1=PDC2=PDC3=0;
connect =0;
}
//////////////////////////////////////
/////////////////////////////////////
if(fault==0)//&&(protect==!0))
{
litedly=0;
flags.bklte=1;
connect=1;
flags.solon=1 ;
LCD_DB5=1; //solar led on
//delay_ms(8000);
{
OVDCON= 0b0010101000010101;
}
}
}
}
keyavg+=ADCBUF5;
ktmr++;
if(ktmr==63)
{
ktmr=0;
keyvalue=keyavg>>6;
keyavg=0;
if(flags.setup==0)
{
if((keyvalue<790 amp="" keyvalue="">700))790>
flags.loadon=1;
else
flags.loadon=0;
}
if(flags.setup==1)
{
litedly=0;
flags.bklte=1;
if(keyvalue>700)
{
exittmr++;
if(exittmr>32000)
__asm__ volatile ("reset");
}
else
exittmr=0;
}
if((keyvalue<900 amp="" keyvalue="">525))900>
{
litedly=0;
flags.bklte=1;
flags.upkey=1;
return;
}
else
flags.upkey=0;
if((keyvalue<600 amp="" keyvalue="">225))600>
{
litedly=0;
flags.bklte=1;
flags.downkey=1;
return;
}
else
flags.downkey=0;
if(keyvalue<300 font="">300>
{
if(flags.setup==0)
{
setuptmr++;
if(setuptmr>100)
{
OVDCON=0X0000;
PDC1=PDC2=PDC3=0;
flags.setup=1;
flags.msgrtn=1;
}
}
flags.setkey=1;
exittmr=0;
}
else
{
setuptmr=0;
flags.setkey=0;
return;
}
}
if(flags.setup==0)
{
heatntc=ADCBUF4;
if(heatntc>1100)
fault=3; // heat sensor failure
if(heatntc
fan=1;
//*****************************************************************************/
int main()
{
TRISF=0X0000;
TRISE=0X0080;
TRISD=0X0000;
TRISC=0X0000;
TRISB=0XFFFF;
OVDCON=0X0000;
PWMCON1 = 0x0000;
PTCONbits.PTEN = 0;
buzzer=0;
fan=0;
CNPU1bits.CN0PUE=1;
//opto=0;
//change=0;
connect =0;
lcd_init();
flags.setup=0;
flags.stop=1;
flags.pwmopen=0;
global_duty=0;
flags.bklte=1;
pol=0;
memread();
defaults=Eeprom_ReadWord(11);
if(defaults!=50)
{
memwrite();
__asm__ volatile ("reset");
}
init_PWM();
batnos=setting[0];
// batnos=8;
batsel=batnos*12;
ampsel=setting[1];
sol_mv=setting[2];
bat_mv=setting[3];
solmax=setting[4];
batclb = setting[5];
solclb=setting[6];
batful = setting[7]*batnos;
batfloat=setting[8]*batnos;
loadonv=setting[9]*batnos;
loadofv=setting[10]*batnos;
defaults=setting[11];
kwh=Eeprom_ReadWord(50);
kwhtemp=kwh;
ofset1=setting[12];
ofset2=setting[13];
// ofset2=494;
init_PWM();
interrupt_Init();
InitADC1();
__delay32(55000);
__delay32(55000);
while(1)
{
while(PORTEbits.RE8==0)
{
backlite=1;
flags.faultled=1;
printmes(str80,100,1);
printmes(str81,100,2);
}
flags.loadonled=0;
pptfunction=0;
flags.stop=0;
track=1;
dec=1;
//printmes(str26,100,1); // TITLE NAME
pol=1;
temp=&chdisp;
printmes(str14,1,3); //"CHARGING: "
pol=0;
dec=1;
dec=1;
temp=&batdisp;
printmes(str12,1,1); //"BATT VOLT: V"
temp=&soldisp;
printmes(str13,1,2); //"SOLAR VOLT: "
//temp=&solampdisp;
//printmes(str15,1,3); //"SOL-AMPS "
dec=1;
temp=&chpower;
printmes(str09,1,4); //"TOTAL KW "
if(kwh!=kwhtemp)
Eeprom_WriteWord(50,kwh);
if(flags.setup==1)
{
function_set();
}
if(fault==1)
{
while(1)
{
OVDCON=0X0000;
PDC1=PDC2=PDC3=0;
buzzer=1;
printmes(str22,100,1); // fault1
if(keyvalue>1000)
{
while(keyvalue>1000);
__asm__ volatile ("reset");
}
if(keyvalue<1000 p="">1000>
{
while(keyvalue<1000 p="">1000>
__asm__ volatile ("reset");
}
}
}
if(fault==2)
{
while(1)
{
OVDCON=0X0000;
PDC1=PDC2=PDC3=0;
buzzer=1;
printmes(str23,100,1); // fault2
if(keyvalue>1000)
{
while(keyvalue>1000);
__asm__ volatile ("reset");
}
if(keyvalue<1000 p="">1000>
{
while(keyvalue<1000 p="">1000>
__asm__ volatile ("reset");
}
}
}
if(fault==3)
{
while(1)
{
OVDCON=0X0000;
PDC1=PDC2=PDC3=0;
buzzer=1;
printmes(str24,100,1); // fault3
if(keyvalue>1000)
{
while(keyvalue>1000);
__asm__ volatile ("reset");
}
if(keyvalue<1000 p="">1000>
{
while(keyvalue<1000 p="">1000>
__asm__ volatile ("reset");
}
}
}
if((ofset1==0)||(ofset2==0))
{
OVDCON=0X0000;
PDC1=PDC2=PDC3=0;
fault=4;
while(1)
{
buzzer=1;
printmes(str25,100,1); // fault4
if(keyvalue>1000)
{
while(keyvalue>1000);
__asm__ volatile ("reset");
}
if(keyvalue<1000 p="">1000>
{
while(keyvalue<1000 p="">1000>
__asm__ volatile ("reset");
}
}
}
flags.pwmopen=1;
}
}
//main
///////////////////////////////////////////////////////////////////////////////////////
void InitADC1()
{
_ADON = 1; // Turn ADC ON
ADCON1 = 0x00EC;
ADCON3 = 0x0003;
ADPCFG = 0x0000;
_SMPI=0x07;
_ADCS=0b111111;
_SAMC=0b11111;
_ADRC=1;
ADCON2bits.CHPS=0;
_BUFM=0;
_ALTS=0;
_CH0NA=0;
_CSCNA=1;
ADCSSL=0b111111;
ADCON1bits.ADON=1;
IEC0bits.ADIE = 1;
//interrupt_Init();
}
//////////////////////////////////////////
void delay_ms(unsigned int gs)
{
while(gs--)
{
__delay32(55000);
}
}
///////////////////////////////////////////////////////////
void delay_us(unsigned int gs)
{
while(gs--)
__delay32(3000);
}
//////////////////////////////////////
int getvalue(int ch)
{
ADCON1bits.DONE=0;
ADCHS = ch;
ADCON1bits.SAMP = 1;
__delay32(50);
ADCON1bits.SAMP = 0;
while (!ADCON1bits.DONE);
return ADCBUF1;
}
void interrupt_Init(void)
{
INTCON2 = 0x0001; //set up INTO on falling edge of MMA8452Q interrupt output signal
IFS0bits.INT0IF = 0; //clear INT0 interrupt flag
IEC0bits.INT0IE = 1; //enable INT0 ISR
IPC0bits.INT0IP = 7; //set highest priority
IFS0bits.CNIF = 0;
}
/////////////////////////////////////////////////////
//THIS IS JUST SAMPLE CODE not complete
this is very nice system to go by. Weldon my great engineer. your blog is wonderful very educative and highly reliable.
ReplyDeleteWELDONE BOSS....FINALLY THE LONG AWAITED dsPIC30F2010 MPPT CHARGE CONTROLLER IS HERE.....IT'Z BEEN AWHILE THOUGH!!!
ReplyDeleteexcellent
ReplyDeleteMy great friend ,you are doing great more winning winning
ReplyDelete