#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;
}