KIT Solar Car Project / Mbed 2 deprecated BMS_ver1

Dependencies:   mbed INA226gfg

Committer:
MPPT51
Date:
Sat Jul 31 09:12:21 2021 +0000
Revision:
0:d92f936cf10d
commit_bms

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MPPT51 0:d92f936cf10d 1 #include "mbed.h"
MPPT51 0:d92f936cf10d 2 #include "bq769x0.h"
MPPT51 0:d92f936cf10d 3 #include "INA226.hpp"
MPPT51 0:d92f936cf10d 4
MPPT51 0:d92f936cf10d 5 Timer timer1;
MPPT51 0:d92f936cf10d 6
MPPT51 0:d92f936cf10d 7 Serial pc(USBTX,USBRX);
MPPT51 0:d92f936cf10d 8 I2C i2c(p9, p10); // SDA SCL
MPPT51 0:d92f936cf10d 9 bq769x0 bms( i2c, p26, 3, 0x18, false);
MPPT51 0:d92f936cf10d 10 I2C i2c_ina226(p28,p27);
MPPT51 0:d92f936cf10d 11 INA226 VCmonitor(i2c_ina226);
MPPT51 0:d92f936cf10d 12 CAN can(p30,p29);
MPPT51 0:d92f936cf10d 13 char counte=0;
MPPT51 0:d92f936cf10d 14 CANMessage CANbuf;
MPPT51 0:d92f936cf10d 15
MPPT51 0:d92f936cf10d 16 AnalogIn tempSens1(p16); // set p15 to analog input to read LM61 sensor's voltage output
MPPT51 0:d92f936cf10d 17 AnalogIn tempSens2(p17); // set p15 to analog input to read LM61 sensor's voltage output
MPPT51 0:d92f936cf10d 18 AnalogIn tempSens3(p18); // set p15 to analog input to read LM61 sensor's voltage output
MPPT51 0:d92f936cf10d 19 AnalogIn tempSens4(p19); // set p15 to analog input to read LM61 sensor's voltage output
MPPT51 0:d92f936cf10d 20 AnalogIn tempSens5(p20); // set p15 to analog input to read LM61 sensor's voltage output
MPPT51 0:d92f936cf10d 21 DigitalOut led1(LED1);
MPPT51 0:d92f936cf10d 22 DigitalOut led2(LED2);
MPPT51 0:d92f936cf10d 23 DigitalOut led3(LED3);
MPPT51 0:d92f936cf10d 24 DigitalOut led4(LED4);
MPPT51 0:d92f936cf10d 25
MPPT51 0:d92f936cf10d 26 float temp1, temp2, temp3, temp4, temp5;
MPPT51 0:d92f936cf10d 27 int cellVolt1[15]; //int cellVolt1[15]; /mv
MPPT51 0:d92f936cf10d 28 int cellVolt2[15]; //int cellVolt1[15]; /mv
MPPT51 0:d92f936cf10d 29 int cellMax1;
MPPT51 0:d92f936cf10d 30 int cellMin1;
MPPT51 0:d92f936cf10d 31 int cellAve1;
MPPT51 0:d92f936cf10d 32 int cellMax2;
MPPT51 0:d92f936cf10d 33 int cellMin2;
MPPT51 0:d92f936cf10d 34 int cellAve2;
MPPT51 0:d92f936cf10d 35 int cellMax0;
MPPT51 0:d92f936cf10d 36 int cellMin0;
MPPT51 0:d92f936cf10d 37 int cellAve0;
MPPT51 0:d92f936cf10d 38
MPPT51 0:d92f936cf10d 39 int sum1 = 0;
MPPT51 0:d92f936cf10d 40 int sum2 = 0;
MPPT51 0:d92f936cf10d 41
MPPT51 0:d92f936cf10d 42 void readTemp(void);
MPPT51 0:d92f936cf10d 43
MPPT51 0:d92f936cf10d 44 int main(){
MPPT51 0:d92f936cf10d 45 pc.printf("main program start\n\r");
MPPT51 0:d92f936cf10d 46 bms.init1();
MPPT51 0:d92f936cf10d 47 bms.init2();
MPPT51 0:d92f936cf10d 48 wait(1);
MPPT51 0:d92f936cf10d 49
MPPT51 0:d92f936cf10d 50 CANbuf.id = 0x30; //CAN送信側(slave)のIDを決定
MPPT51 0:d92f936cf10d 51
MPPT51 0:d92f936cf10d 52 //INA226の処理
MPPT51 0:d92f936cf10d 53 unsigned short val=0;
MPPT51 0:d92f936cf10d 54 double C;
MPPT51 0:d92f936cf10d 55 int count = 1;
MPPT51 0:d92f936cf10d 56 if(!VCmonitor.isExist()){
MPPT51 0:d92f936cf10d 57 pc.printf("VCmonitor NOT FOUND\n");
MPPT51 0:d92f936cf10d 58 while(1){;}
MPPT51 0:d92f936cf10d 59 }
MPPT51 0:d92f936cf10d 60 pc.printf("VCmonitor FOUND\n\r");
MPPT51 0:d92f936cf10d 61 if(VCmonitor.rawRead(0x00,&val) != 0){ //configResisterの値を読み取れるか確認(通信できてるか確認)
MPPT51 0:d92f936cf10d 62 pc.printf("VCmonitor READ ERROR\n");
MPPT51 0:d92f936cf10d 63 }
MPPT51 0:d92f936cf10d 64 VCmonitor.setConfigResister();
MPPT51 0:d92f936cf10d 65 wait(0.1);
MPPT51 0:d92f936cf10d 66 pc.printf("VCmonitor Reg 0x00 : 0x%04x\n\r",val); //configResisterの値表示
MPPT51 0:d92f936cf10d 67 VCmonitor.setCurrentCalibration();
MPPT51 0:d92f936cf10d 68
MPPT51 0:d92f936cf10d 69 //無限ループ開始
MPPT51 0:d92f936cf10d 70 while(1){
MPPT51 0:d92f936cf10d 71 bms.update1(); //1-15セル電圧の測定
MPPT51 0:d92f936cf10d 72 //wait(0.5);
MPPT51 0:d92f936cf10d 73 sum1 = 0;
MPPT51 0:d92f936cf10d 74 for( int i=1; i<=15; i++ ){ //1-15セルの電圧を格納する処理
MPPT51 0:d92f936cf10d 75 cellVolt1[i-1] = bms.getCellVoltage(i); //cellVolt1配列に値を格納
MPPT51 0:d92f936cf10d 76 sum1 = sum1 + cellVolt1[i-1]; //合計を算出(バッテリ電圧・セル平均電圧の算出に使用)
MPPT51 0:d92f936cf10d 77 }
MPPT51 0:d92f936cf10d 78 cellMax1 = bms.getMaxCellVoltage(); //1-15セルの最大セル電圧を格納
MPPT51 0:d92f936cf10d 79 cellMin1 = bms.getMinCellVoltage(); //1-15セルの最小セル電圧を格納
MPPT51 0:d92f936cf10d 80 cellAve1 = sum1/15; //1-15セルの平均セル電圧を格納
MPPT51 0:d92f936cf10d 81 pc.printf("max1:%d, ave1:%d, min1:%d\n\r", cellMax1, cellAve1, cellMin1 );
MPPT51 0:d92f936cf10d 82 pc.printf("cell1:%d,%d,%d,%d,%d %d,%d,%d,%d,%d %d,%d,%d,%d,%d\n\r",
MPPT51 0:d92f936cf10d 83 cellVolt1[0],cellVolt1[1],cellVolt1[2],cellVolt1[3],cellVolt1[4], cellVolt1[5],cellVolt1[6],cellVolt1[7],cellVolt1[8],cellVolt1[9], cellVolt1[10],cellVolt1[11],cellVolt1[12],cellVolt1[13],cellVolt1[14]);
MPPT51 0:d92f936cf10d 84 //pc.printf("\n\r");
MPPT51 0:d92f936cf10d 85 bms.update2(); //16-27セル電圧の測定
MPPT51 0:d92f936cf10d 86 //wait(0.5);
MPPT51 0:d92f936cf10d 87 sum2 = 0;
MPPT51 0:d92f936cf10d 88 for( int i=1; i<=15; i++ ){ //16-27セルの電圧を格納する処理
MPPT51 0:d92f936cf10d 89 cellVolt2[i-1] = bms.getCellVoltage(i); //
MPPT51 0:d92f936cf10d 90 sum2 = sum2 + cellVolt2[i-1];
MPPT51 0:d92f936cf10d 91 }
MPPT51 0:d92f936cf10d 92 sum2 = sum2 -(cellVolt2[3]+cellVolt2[8]+cellVolt2[13]); //4セル,9セル,14セルは未接続のため値を引く
MPPT51 0:d92f936cf10d 93 cellAve2 = sum2/12; //16-27セルの平均セル電圧を格納
MPPT51 0:d92f936cf10d 94 cellMax2 = bms.getMaxCellVoltage(); //16-27セルの最大セル電圧を格納
MPPT51 0:d92f936cf10d 95 cellMin2 = bms.getMinCellVoltage(); //16-27セルの最小セル電圧を格納
MPPT51 0:d92f936cf10d 96 pc.printf("max2:%d, ave2:%d, min2:%d\n\r", cellMax2, cellAve2, cellMin2 );
MPPT51 0:d92f936cf10d 97 pc.printf("cell2:%d,%d,%d,%d,%d %d,%d,%d,%d,%d %d,%d,%d,%d,%d\n\r",
MPPT51 0:d92f936cf10d 98 cellVolt2[0],cellVolt2[1],cellVolt2[2],cellVolt2[3],cellVolt2[4], cellVolt2[5],cellVolt2[6],cellVolt2[7],cellVolt2[8],cellVolt2[9], cellVolt2[10],cellVolt2[11],cellVolt2[12],cellVolt2[13],cellVolt2[14]);
MPPT51 0:d92f936cf10d 99
MPPT51 0:d92f936cf10d 100 if(cellMax1 >= cellMax2){
MPPT51 0:d92f936cf10d 101 cellMax0 = cellMax1; //27セル中の最大セル電圧を格納
MPPT51 0:d92f936cf10d 102 }else if(cellMax1 < cellMax2){
MPPT51 0:d92f936cf10d 103 cellMax0 = cellMax2; //27セル中の最大セル電圧を格納
MPPT51 0:d92f936cf10d 104 }
MPPT51 0:d92f936cf10d 105 if(cellMin1 <= cellMin2){
MPPT51 0:d92f936cf10d 106 cellMin0 = cellMin1; //27セル中の最小セル電圧を格納
MPPT51 0:d92f936cf10d 107 }else if(cellMin1 > cellMin2){
MPPT51 0:d92f936cf10d 108 cellMin0 = cellMin2; //27セル中の最小セル電圧を格納
MPPT51 0:d92f936cf10d 109 }
MPPT51 0:d92f936cf10d 110 cellAve0 = (sum1 + sum2) / 27; //27セルの平均セル電圧を格納
MPPT51 0:d92f936cf10d 111 pc.printf("%d, %d, %d\n\r", sum1, sum2, sum1+sum2);
MPPT51 0:d92f936cf10d 112 //温度を測定する処理
MPPT51 0:d92f936cf10d 113 temp1 = ((tempSens1*3.3)-0.600)*100.0; //conversion to degrees C - from sensor output voltage per LM61 data sheet
MPPT51 0:d92f936cf10d 114 temp2 = ((tempSens2*3.3)-0.600)*100.0; //conversion to degrees C - from sensor output voltage per LM61 data sheet
MPPT51 0:d92f936cf10d 115 temp3 = ((tempSens3*3.3)-0.600)*100.0; //conversion to degrees C - from sensor output voltage per LM61 data sheet
MPPT51 0:d92f936cf10d 116 temp4 = ((tempSens4*3.3)-0.600)*100.0; //conversion to degrees C - from sensor output voltage per LM61 data sheet
MPPT51 0:d92f936cf10d 117 temp5 = ((tempSens5*3.3)-0.600)*100.0; //conversion to degrees C - from sensor output voltage per LM61 data sheet
MPPT51 0:d92f936cf10d 118 pc.printf("temp:%4.1f,%4.1f,%4.1f,%4.1f,%4.1f\n\r",temp1,temp2,temp3,temp4,temp5); //print current temp
MPPT51 0:d92f936cf10d 119 //pc.printf("\n\r");
MPPT51 0:d92f936cf10d 120
MPPT51 0:d92f936cf10d 121 //バッテリ電流を測定する処理
MPPT51 0:d92f936cf10d 122 //VCmonitor.getVoltage(&V);
MPPT51 0:d92f936cf10d 123 //V = V * 14.825;
MPPT51 0:d92f936cf10d 124 VCmonitor.getCurrent(&C);
MPPT51 0:d92f936cf10d 125 pc.printf("%d,C,%f\n\r",count,C);
MPPT51 0:d92f936cf10d 126 pc.printf("\n\r");
MPPT51 0:d92f936cf10d 127
MPPT51 0:d92f936cf10d 128 CANbuf.data[0] = ((sum1+sum2)/100) / 100;
MPPT51 0:d92f936cf10d 129 CANbuf.data[1] = ((sum1+sum2)/100) % 100;
MPPT51 0:d92f936cf10d 130 CANbuf.data[2] = ((int)(C/10) / 100);
MPPT51 0:d92f936cf10d 131 CANbuf.data[3] = ((int)(C/10) % 100);
MPPT51 0:d92f936cf10d 132 CANbuf.data[4] = cellMin0 / 1000;
MPPT51 0:d92f936cf10d 133 CANbuf.data[5] = (cellMin0 % 1000) / 10;
MPPT51 0:d92f936cf10d 134 CANbuf.data[6] = cellMax0 / 1000;
MPPT51 0:d92f936cf10d 135 CANbuf.data[7] = (cellMax0 % 1000) / 10;
MPPT51 0:d92f936cf10d 136 if(can.write(CANbuf)){ //格納したデータを送信する
MPPT51 0:d92f936cf10d 137 led1 = !led1;
MPPT51 0:d92f936cf10d 138 }
MPPT51 0:d92f936cf10d 139 }
MPPT51 0:d92f936cf10d 140 }