Sunteți pe pagina 1din 9

Universitatea tehnica Ghe Asachi Fcacultatea de electronica telecomunicatii si tehnologia informatiei

Sistem Fuzzy pentru reglarea puterii unei baterii de masini elecrice

Sistem fuzzy pentru reglarea incarcarii unei baterii de masini electrice

Introducere In viitor sursa de energie petroliera se va termina si in acel moment marii producatori de autovehicule vor fi nevoiti sa dezvolte vehicule bazate pe surse alternative de energie cum ar fi hidrogen , energie electrica, energie solara. Vehiculele care sunt puse in miscare pe baza de energie electrica, au la baza o baterie ce are o putere mare de ordinul kW-lor, ce stocheaza energia necesara alimentarii motorului electric ce pune in miscare autovehiculul.

O solutie in acest sens se obtine utilizand logica fuzzy. Spre deosebire de logica clasica care utlizeaza valori logice exacte (1 pentru adevarat si 0 pentru fals), logica fuzzy foloseste o plaja continua de valori cuprinse intre 0 si 1, astfel incat 0 indica falsitatea completa iar 1 adevarul complet.

II DESCRIEREA SISREMULUI FUZZY Pentru realizarea acestui sistem avem nevoie ca date de intrare de nivelul de incarcare al bateriei si folosim ca variabile de intrare urmatoarele: 1) tensiune de pe baterie

Aceasta intrare are 5 grade de apartenenta (Vmin1, Vmin, Vnom, Vmax, Vmax1)

Fig 1 Tensiunea de pe baterie (Volti)

2) curentul din baterie Curentul va fi codificat in curent minim (Imin), curent nominal (Inom) si curent maxim (Imax)

Fig 2 Curentul care este injectat in baterie (Amperi)

Iesirea sistemului este tot curentul ce trebuie injectat in baterie dar in momentul urmator de timp, deci acest sistem este cu bucla de reglaj. Acest curent este reprezentata de functiile singleton B0, B1, B2, B3, B4 ce reprezinta (curent foarte mic, curent mediu, curent nominal, curent mare, curent foarte mare)

Fig 3 Functia de iesire

Descrierea sistemului: in momentul in care baterie este descarcata vom folosi un control in curent, adica vom injecta un curent mare pentru a incarca bateria cat mai repede, in acelasi moment va creste si tensiunea pe baterie si se va face un control si in functie de tensiune. Cu cat creste puterea din baterie (tensiunea si curentul), in momentul in care vom ajunge la o tensiune fixata, putin mai mare decat tensiunea nominala ce trebuie sa fie in momentul in care vom deconecta bateria de la incarcator, convertor. In momentul in care vom ajunge cu tensiunea la valoare maxima curentul care intra in baterie va incepe sa scada pana cand puterea va fi cat mai aproape de valoarea dorita (3kW)

Iin Vin Vmin1 Vmin Vnom Vmax Vmax1

Imin B4 B4 B2 B2 B2

Inom B3 B2 B2 B1 B1

Imax B1 B1 B0 B0 B0

Fig 4 Tabelul de regului

Prezentare algoritm sistem Fuzzy Algoritmul pentru realizarea sistemului de fuzzificare, implementarea regulilor si defuzzificare va fi prezentat mai jos.

START Intializare: Vin, Iin, iesire, reguli, contori; definire functie_apartenenta1(x); definire functie_apartenenta2(x); program principal: fuzzificare: pentru i=1 la nr.multimi.intrare1

miux1(i)=functie_apartenenta1(i) pentru i=1 la nr.multimi.intrare2 miux2(i)=functie_apartenenta2(i) implem.reguli: pentru i=1 la nr.multimi.intrare1 pentru j=1 la nr.multimi.intrare2 { x=minim(miux1(i),miux2(i)) miuy(i+j)=max(miuy(i+j),x) } defuzzificare: s1=0, s2=0 pentru i=1 la nr multimi iesire { s1=s1+miuy(i)*iesire(i) s2=s2+ miuy(i)} yc=s1/s2 STOP

Simulare sistem Simularea sistemului a fost facuta cu ajutorul mediului de programare C++ si a toolboxu-lui fuzzy din Mathlab Pentru urmatoarele valori crisp ale intrarilor am obtinut urmatoarele rezultate prezentate mai jos.

Anexa #include <stdio.h> #include <conio.h> float Ax[5][4]={{0,100,260,270},{250, 270, 290,300},{270, 290, 320,350},{290, 320, 350,360},{310, 350, 375, 383}}; float Ay[5][4]={{0,1,1,0},{0,1,0,0},{0,1,0,0},{0,1,0,0},{0,1,1,0}}; float Bx[3][3]={{0, 3, 6},{4, 5, 6},{4, 7, 10}}; float By[3][3]={{0,1,0},{0,1,0},{0,1,0}}; float c[5]={1,4.5,6,7.5,10}; int nmx1=5,nmx2=3,npx1=4,npx2=3; //int R[5][3]={{ -1,-0.5,-0.5},{-0.5,-0.5,0},{0.5,0,0.5},{0,0.5,0.5},{0.5,0.5,1}}; int R[5][3]={{4,3,1},{4,2,1},{2,2,0},{2,1,0},{2,1,0}}; int i,k,j,nmy=5; float s1=0,s2=0,yc,miur,x1c=200,x2c=0.1,miux1[5],miux2[3],miuy[5]; float faA(float x,int lin) {float x1,x2,y1,y2; x1=Ax[lin][0]; y1=Ay[lin][0]; if(x<x1) return y1;

for(i=1;i<3;i++) { x2=Ax[lin][i]; y2=Ay[lin][i]; if(x>=x1&&x<=x2) {if(y1<y2) return (x-x1)/(x2-x1)*(y2-y1)+y1; if(y1==y2) return y1; if(y1>y2) return (x2-x)/(x2-x1)*(y1-y2)+y2;} x1=x2; y1=y2; } return y2;}

float faB(float x,int lin) {float x1,x2,y1,y2; x1=Bx[lin][0]; y1=By[lin][0]; if(x<x1) return y1;

for(i=1;i<3;i++) {x2=Bx[lin][i]; y2=By[lin][i];

if(x>=x1&&x<=x2) {if(y1<y2) return (x-x1)/(x2-x1)*(y2-y1)+y1; if(y1==y2) return y1; if(y1>y2) return (x2-x)/(x2-x1)*(y1-y2)+y2; } x1=x2; y1=y2; } return y2;} float min(float a,float b) {if(a<b) return a; else return b;} float max(float a,float b) {if(a>b) return a; else return b;}

void main (void) { //clrscr(); int count=0; FILE *pfile; pfile = fopen("myfile.txt","w"); float pas1=400.0/200.0, pas2=10.0/20.0; float lim1=383, lim2=10.0;

// float pas1=-1.0,pas2=-4.0; // for(int m=0;m<100;m++,lim1+=pas1) // do { s1=0; s2=0; for(int t=0;t<20;t++,lim2+=pas2)

for(k=0;k<nmx1;k++) miux1[k]=faA(x1c,k); for(k=0;k<nmx2;k++) miux2[k]=faB(x2c,k); for(k=0;k<nmy;k++) miuy[k]=0; for(k=0;k<nmx1;k++) for(j=0;j<nmx2;j++) { miur=min(miux1[k],miux2[j]); miuy[R[k][j]]=max(miuy[R[k][j]],miur);} for(k=0;k<nmy;k++) {s1+=miuy[k]*c[k]; s2+=miuy[k]; } yc=s1/s2; //x2c=lim2-yc; //x1c=yc-x2c/ count++; printf("X1- %6.2f X2- %5.2f Y %6.3f \n",x1c, x2c, yc); fprintf(pfile, "%6.2f %5.2f %6.3f \n",x1c, x2c, yc); // fprintf(pfile, "%d ", count); }while(count < 200); getch(); fclose(pfile); } //numar maxim iteratii iter

S-ar putea să vă placă și