Controler de Incarcare a Acumulatorilor din Energii Regenerabile, cu Algoritm Mppt
Bibliografie
ADRIAN TURTUREANU – Chimie generală, Editura ULB Sibiu 2004
ALI EMADI, ALIREZA KHALIGH, ZHONG NIE, YOUNG JOO LEE – Integrated Power Electronic Converters and Digital Control, Editura Taylor and Francis Group, 2009
ARPAD KELEMEN, MARIA IMECS – Electronică de putere, Editura Didactică și Pedagogică București
BERILIU ILIE – Microcontrolere, Note de curs
BERILIU ILIE – Semnale și sisteme, Note curs
E. VUTHCHHAY, C. BUNLAKSANANUSORN – Modeling and Control of a Zeta Converter, IEEE 2010 International Power Electronics Conference
EDMOND NICOLAU – Măsurări electrice și electronice
FLORIN IONESCU, JEAN-PAUL SIX și colectiv – Electronică de putere și convertoare statice, Editura Tehnică
FRANCISC TOROK – Electronică de putere, Note curs
FRED STEVENS – Getting started with PIC microcontrollers, Copyright (1997) A. L. Stevens
HORIA FALOTĂ – Surse regenerabile de energie, Note de curs
IOAN P. MIHU – Dispozitive și circuite electronice volumul II, editura Alma Mater Sibiu 2005
MIT ELECTRIC VEHICLE TEAM – A Guide to Understanding Battery Specifications, December 2008
Power Electronic in 40 lessons – curs Indian Institute of Technologies Kharagpur
TIM WILMSHURST – Design embedded system with pic microcontroller, second edition, Elsevier Ltd. 2012
http://en.wikipedia.org/wiki/Solar_power_tower
http://www.logwell.com/tech/components/resistor_values.html
http://ww1.microchip.com/downloads/en/AppNotes/01332B.pdf
http://www.ti.com/lit/an/slyt372/slyt372.pdf
http://www.exar.com/common/content/document.ashx?id=1251
http://www.hamill.co.uk/pdfs/ciabfbb_.pdf
http://www.scubaengineer.com/documents/lead_acid_battery_charging_graphs.pdf
Codul sursă
#include <xc.h>
#include <stdint.h>
#include "lcd_hd44780_pic16.h"
#include "myutils.h"
#include "custom_char.h"
#define LCD_DATA_PORT PORT(LCD_DATA)
#define LCD_DATA_TRIS TRIS(LCD_DATA)
#define LCD_E PORTBIT(LCD_E_PORT,LCD_E_POS)
#define LCD_E_TRIS TRISBIT(LCD_E_PORT,LCD_E_POS)
#define LCD_RS PORTBIT(LCD_RS_PORT,LCD_RS_POS)
#define LCD_RS_TRIS TRISBIT(LCD_RS_PORT,LCD_RS_POS)
#define LCD_RW PORTBIT(LCD_RW_PORT,LCD_RW_POS)
#define LCD_RW_TRIS TRISBIT(LCD_RW_PORT,LCD_RW_POS)
#define SET_E() (LCD_E=1)
#define SET_RS() (LCD_RS=1)
#define SET_RW() (LCD_RW=1)
#define CLEAR_E() (LCD_E=0)
#define CLEAR_RS() (LCD_RS=0)
#define CLEAR_RW() (LCD_RW=0)
#ifdef LCD_TYPE_162
#define LCD_TYPE_204
#endif
#ifdef LCD_TYPE_202
#define LCD_TYPE_204
#endif
#define I_IN_max 8*5/1024
#define I_OUT_max 8*5/1024
#define U_IN_min 9*5/1024
#define 12Volt 14,5*5/1024
#define 6Volt 7,2*5/1024
#define Led_in RC4
#define Led_out RC5
#define Buton_set RC6
#define Buton_plus RC7
#define Buton_minus RA5
#define On 0
#define Off 1
uint24_t NCOINC = 0;
uint8_t fifty_percent = 0;
uint16_t I_in;
uint16_t U_in:
uint16_t I_out;
uint16_t U_out;
uint32_t P_in;
uint32_t P_out;
uint32_t delta_P;
uint16_t delta_Duty_Cycle;
uint16_t Duty_Cycle;
uint16_t old_Duty_Cycle=0;
uint32_t old_P=0;
uint16_t U_out_calc;
string text;
Void Init_Port ()
void InitNCO();
void Init_ADC ();
unsigned int Get_ADC_Value (unsigned int Channel);
void FadeUp(void);
void FadeDown(void);
void main(void)
{
Void Init_Port ()
void InitNCO();
void Init_ADC ();
LCDInit(LS_NONE)//cursorul nu este vizibil
While (Buton_set!=On)
{
LCDWriteString("Apasă butonul select")
}
While (Buton_set!=On)
{
LCDWriteString("Selectează tensiunea de iesire din butoanele + -")
if (Buton_plus==On)
{
LCDWriteString("12 V”)
uint16_t U_out_calc=12volt;
}
if (Buton_minus==On)
{
LCDWriteString("6 V”)
uint16_t U_out_calc=12volt;
}
}
I_in= Get_ADC_Value(6);
U_out= Get_ADC_Value(7);
I_out= Get_ADC_Value(1);
U_in= Get_ADC_Value(2);
While(1)
{
While (I_in<I_IN_max&&I_out<I_OUT_max&&U_in<U_IN_min)
{
P_out=I_out*U_out;
P_in=I_in*U_in;
delta_P=P_out-old_P;
old_P=P_out;
delta_Duty_Cycle=Duty_Cycle-old_Duty_Cycle;
old_Duty_Cycle=Duty_Cycle;
if (delta_P>0)
{
if (delta_Duty_Cycle>=0)FadeDown();
else FadeUp();
}
else
{
if (delta_Duty_Cycle>=0)FadeUp ();
else FadeDown();
}
if(Duty_cycle>62) Duty_cycle=62;
if(Duty_cycle<28) Duty_cycle=28;
}
}
}
if(Duty_Cycle > 50)//setează variabila fifty_precent pe 1 dacă Duty_Cycle, factorul de umlere>50
fifty_percent = 1;
else
fifty_percent = 0;//setează variabila fifty_precent pe 1 altfel
NCOCalc();//calculează valoare ieșirii
while(1)//Bucla infinită
{
}
}
Void Init_Port ()
{
LATA = 0x00;
TRISA = 0x3F;
ANSELA = 0x17;
WPUA = 0x00;
LATB = 0x00;
TRISB = 0xF0;
ANSELB = 0x30;
WPUB = 0x00;
LATC = 0x00;
TRISC = 0xDD;
ANSELC = 0xCD;
OPTION_REGbits.nWPUEN = 0x01;
APFCON = 0x02;
}
void Init_ADC () //funcția de inițializare a modulului ADC
{
TRISA=0b00000110;//Setează pini RA1 și RA2 ca intrări
TRISC=0b00001100; // Setează pini RC2 și RC3 ca intrări
ANSELA=0b00000110;// Setează RA1 și RA2 pini analogici
ANSELC=0b00001100;// Setează RC2 și RC3 pini analogici
ADCON1= 0b11010000;//Aliniere la dreapta, FOSC/16 , VREF conectat la alimentare
}
unsigned int Get_ADC_Value (unsigned int Channel)//Citește valoare semnalului analogic de la un anumit pin
{
if (Channel>9) Channel=0;
switch (Channel)//Selectează canalul analogic de pe care se citește
{
case 0:
ADCON0=0b00000001; //Selectează AN0 și activează ADC
break;
case 1:
ADCON0=0b00000101;//Selectează AN1 și activează ADC
break;
case 2:
ADCON0=0b00001001; // Selectează AN2 și activează ADC
break;
case 3:
ADCON0=0b00001101; //Selectează AN3 și activează ADC
break;
case 4:
ADCON0=0b00010001;//Selectează AN4 și activează ADC
break;
case 5:
ADCON0=0b00010101; // Selectează AN5 și activează ADC
break;
case 6:
ADCON0=0b00011001; //Selectează AN6 și activează ADC
break;
case 7:
ADCON0=0b00011101;//Selectează AN7 și activează ADC
break;
case 8:
ADCON0=0b00100001; // Selectează AN8 și activează ADC
break;
case 9:
ADCON0=0b00100101; //Selectează AN9 și activează ADC
break;
case 10:
ADCON0=0b00101001;//Selectează AN10 și activează ADC
break;
case 11:
ADCON0=0b00101101; // Selectează AN11 și activează ADC
break;
}
GO_nDONE = 1; //Pornește achiziția
while (GO_nDONE); //Așteaptă ca să se realizeze achiziția
return ((ADRESH<<8)+ADRESL); //returnează valoarea inscripționată în regiștri ADC
}
void InitNCO()//funcție de inițializare a regișorilor pentru folosirea microcontrolerului în modul dorit
{
OSCCON = 0x78;
TRISC = 0x80;
PORTC = 0x00;
ANSELC = 0x00;
TRISA = 0x01;
ANSELA = 0x00;
APFCON = 0x02;
PR2 = 0x01;
T2CON = 0x05;
PWM4DCH = 0x00;
PWM4DCL = 0x40;
PWM4CON = 0x80;
NCO1CON = 0xC1;
NCO1CLK = 0x02;
NCO1INCH = 0x80;
NCO1INCL = 0x00;
}
void FadeUp(void) // setează registrul de incrementare al NCO
{
uint16_t i;
NCO1CONbits.N1POL = 0;//Setează semnalul de ieșire activ în 0 logic
CLC1GLS3 = 0x40;//Setează logica modulului 4 CLC
for (i = 32786; i < 65535; i++) //scrie în registrul de incrementare al NCO valoarea variabilei i
{
NCO1INCH = i >> 8;
NCO1INCL = i & 0xFF;
delay_us(25);
}
NCO1CONbits.N1POL = 1;//Setează semnalul de ieșire activ în 1 logic
CLC1GLS3 = 0x80;
for (i = 65535; i > 32786; i–)
{
NCO1INCH = i >> 8;
NCO1INCL = i & 0xFF;
__delay_us(25);
}
}
void FadeDown(void) setează registrul de incrementare al NCO
{
uint16_t i;
NCO1CONbits.N1POL = 1;
CLC1GLS3 = 0x80;
for (i = 32786; i < 65535; i++)
{
NCO1INCH = i >> 8;
NCO1INCL = i & 0xFF;
__delay_us(25);
}
NCO1CONbits.N1POL = 0;
CLC1GLS3 = 0x40;
for (i = 65535; i > 32786; i–)
{
NCO1INCH = i >> 8;
NCO1INCL = i & 0xFF;
__delay_us(25);
}
}
void NCOCalc(void)
{
if(fifty_percent == 1)
{
NCO1CONbits.N1POL = 1;
CLC1GLS3 = 0x80;
NCOINC = Constant/(Duty_Cycle+3);
NCO1INCH = NCOINC >> 8;
NCO1INCL = NCOINC & 0xFF;
}
else
{
NCO1CONbits.N1POL = 0;
CLC1GLS3 = 0x40;
NCOINC = Constant/(100-Duty_Cycle+3);
NCO1INCH = NCOINC >> 8;
NCO1INCL = NCOINC & 0xFF;
}
}
void LCDByte(uint8_t c,uint8_t isdata)
{
uint8_t hn,ln;
uint8_t temp;
hn=c>>4;
ln=(c & 0x0F);
if(isdata==0)
CLEAR_RS();
else
SET_RS();
__delay_us(0.5); //tAS
SET_E();
temp=(LCD_DATA_PORT & (~(0X0F<<LCD_DATA_POS)))|((hn<<LCD_DATA_POS));
LCD_DATA_PORT=temp;
__delay_us(1);
CLEAR_E();
__delay_us(1);
SET_E();
temp=(LCD_DATA_PORT & (~(0X0F<<LCD_DATA_POS)))|((ln<<LCD_DATA_POS));
LCD_DATA_PORT=temp;
__delay_us(1); //tEH
CLEAR_E();
__delay_us(1);
LCDBusyLoop();
}
void LCDBusyLoop()
{
uint8_t busy,status=0x00,temp;
LCD_DATA_TRIS|=(0x0f<<LCD_DATA_POS);
SET_RW();
CLEAR_RS();
__delay_us(0.5);
do
{
SET_E();
__delay_us(0.5);
status=(LCD_DATA_PORT>>LCD_DATA_POS);
status=status<<4;
__delay_us(0.5);
CLEAR_E();
__delay_us(1);
SET_E();
__delay_us(0.5);
temp=(LCD_DATA_PORT>>LCD_DATA_POS);
temp&=0x0F;
status=status|temp;
busy=status & 0b10000000;
__delay_us(0.5);
CLEAR_E();
__delay_us(1);
}while(busy);
CLEAR_RW();
LCD_DATA_TRIS&=(~(0x0F<<LCD_DATA_POS));
}
void LCDInit(uint8_t style)
{
LCD_DATA_TRIS&=(~(0x0F<<LCD_DATA_POS)); //Output
LCD_E_TRIS=0;
LCD_RS_TRIS=0;
LCD_RW_TRIS=0;
LCD_DATA_PORT&=(~(0x0F<<LCD_DATA_POS));
CLEAR_E();
CLEAR_RW();
CLEAR_RS();
__delay_us(0.5);
SET_E();
LCD_DATA_PORT|=((0b00000010)<<LCD_DATA_POS;
__delay_us(1);
CLEAR_E();
__delay_us(1);
LCDBusyLoop();
LCDCmd(0b00101000);
LCDCmd(0b00001100|style);
LCDCmd(0b01000000);
uint8_t __i;
for(__i=0;__i<sizeof(__cgram);__i++)
LCDData(__cgram[__i]);
}
void LCDWriteString(const char *msg)
{
while(*msg!='\0')
{
if(*msg=='%')
{
msg++;
int8_t cc=*msg-'0';
if(cc>=0 && cc<=7)
{
LCDData(cc);
}
else
{
LCDData('%');
LCDData(*msg);
}
}
else
{
LCDData(*msg);
}
msg++;
}
}
void LCDWriteInt(int val,int8_t field_length)
{
char str[5]={0,0,0,0,0};
int i=4,j=0;
if(val<0)
{
LCDData('-');
val=val*-1;
}
while(val)
{
str[i]=val%10;
val=val/10;
i–;
}
if(field_length==-1)
while(str[j]==0)
j++;
else
j=5-field_length;
for(i=j;i<5;i++)
{
LCDData(48+str[i]);
}
}
void LCDGotoXY(uint8_t x,uint8_t y)
{
if(x>=20) return;
#ifdef LCD_TYPE_204
switch(y)
{
case 0:
break;
case 1:
x|=0b01000000;
break;
case 2:
x+=0x14;
break;
case 3:
x+=0x54;
break;
}
#endif
#ifdef LCD_TYPE_164
switch(y)
{
case 0:
break;
case 1:
x|=0b01000000;
break;
case 2:
x+=0x10;
break;
case 3:
x+=0x50;
break;
}
#endif
x|=0b10000000;
LCDCmd(x);
}
Modul convertor schema electrică
Modul convertor layout top
Modul convertor layout bottom
Modul convertor așezare componente top
Modul convertor layout 3D
Modul convertor listă de componente
Modul driver schema electrică
Modul driver layout top
Modul driver layout bottom
Modul driver așezare componente top
Modul driver layout 3D
Modul driver lista de componente
Modul controler schema electrică
Modul controler layout top
Modul controler layout bottom
Modul controler așezare componente
Top
Bottom
Modul controler layout 3D
Top
Bottom
Modul controler listă de componente
Modul LCD schema electrică
Modul LCD layout
Top
Bottom
Modul LCD așezare componente
Top
Bottom
Modul LCD layout 3D
Top
Bottom
Modul LCD listă de componente
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Controler de Incarcare a Acumulatorilor din Energii Regenerabile, cu Algoritm Mppt (ID: 138443)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
