Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
main.cpp@0:d92f936cf10d, 2021-07-31 (annotated)
- Committer:
- MPPT51
- Date:
- Sat Jul 31 09:12:21 2021 +0000
- Revision:
- 0:d92f936cf10d
commit_bms
Who changed what in which revision?
User | Revision | Line number | New 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 | } |