셀발란싱 프로그램

#include <stdio.h>

#include <stdlib.h>



#define V_RISING (0.05) // per 1sec

#define V_BLEED (0.02) // per 1sec

#define V_TH (4.0)

#define CELL_NUM (3)

#define V_FINISH (4.2)

#define V_HYS (4.18)

 

int main()

{

FILE* fout = fopen("data.txt","w");

fprintf(fout,"TIME,CELL1,CELL2,CELL3\r\n");

float Vcell[CELL_NUM];

int Vcell_balance[CELL_NUM];

int    balance_mode = 0;


long time = 0;

// define initial cell voltage

Vcell[0] = 3.3;

Vcell[1] = 3.5;

Vcell[2] = 3.55;


for(int i = 0;i < CELL_NUM;i++) {

Vcell_balance[i] = 0;

}


while(1) { // 1sec per 1 loop

// balance mode 인지 확인한다

// 셀중 어느 한 셀이 4.2v 에 도달하면 balance mode 로 진입한다

if(balance_mode) {

for(int i = 0;i < CELL_NUM;i++) {

if(Vcell_balance[i] == 1) {

Vcell[i] += V_BLEED;

if(Vcell[i] <= V_HYS) Vcell_balance[i] = 0;

}

}

for(int i = 0;i < CELL_NUM;i++) {

Vcell[i] += V_RISING;


if(Vcell[i] >= V_FINISH) {

Vcell_balance

}


// 모든 셀이 Vth 를 넘기면 Bleeding current 가 없다

if(Vcell[0] > V_TH && Vcell[1] > V_TH && Vcell[2] > V_TH) {


} else {

for(int i = 0; i < CELL_NUM;i++) {

if(Vcell[i] >= V_TH) Vcell[i] += V_BLEED;

}

for(int i =0; i < CELL_NUM; i++) {

if(Vcell[i] >= V_FINISH) { // 어느 하나라도 Vfinish 에 도달하면

Vcell_balance[i] = 1;

}


}


}


// 현재 전압을 프린트한다

fprintf(fout,"%d,%f,%f,%f\r\n",time,Vcell[0],Vcell[1],Vcell[2]);


// 모든 셀이 V hysterisis 를 넘기면 프로그램을 끝낸다

if(Vcell[0] > V_HYS && Vcell[1] > V_HYS && Vcell[2] > V_HYS) {

fprintf(stderr,"Finish!!\r\n");

}

fclose(fout);

return 0;

}