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.
Diff: main.cpp
- Revision:
- 0:d92f936cf10d
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Sat Jul 31 09:12:21 2021 +0000 @@ -0,0 +1,140 @@ +#include "mbed.h" +#include "bq769x0.h" +#include "INA226.hpp" + +Timer timer1; + +Serial pc(USBTX,USBRX); +I2C i2c(p9, p10); // SDA SCL +bq769x0 bms( i2c, p26, 3, 0x18, false); +I2C i2c_ina226(p28,p27); +INA226 VCmonitor(i2c_ina226); +CAN can(p30,p29); +char counte=0; +CANMessage CANbuf; + +AnalogIn tempSens1(p16); // set p15 to analog input to read LM61 sensor's voltage output +AnalogIn tempSens2(p17); // set p15 to analog input to read LM61 sensor's voltage output +AnalogIn tempSens3(p18); // set p15 to analog input to read LM61 sensor's voltage output +AnalogIn tempSens4(p19); // set p15 to analog input to read LM61 sensor's voltage output +AnalogIn tempSens5(p20); // set p15 to analog input to read LM61 sensor's voltage output +DigitalOut led1(LED1); +DigitalOut led2(LED2); +DigitalOut led3(LED3); +DigitalOut led4(LED4); + +float temp1, temp2, temp3, temp4, temp5; +int cellVolt1[15]; //int cellVolt1[15]; /mv +int cellVolt2[15]; //int cellVolt1[15]; /mv +int cellMax1; +int cellMin1; +int cellAve1; +int cellMax2; +int cellMin2; +int cellAve2; +int cellMax0; +int cellMin0; +int cellAve0; + +int sum1 = 0; +int sum2 = 0; + +void readTemp(void); + +int main(){ + pc.printf("main program start\n\r"); + bms.init1(); + bms.init2(); + wait(1); + + CANbuf.id = 0x30; //CAN送信側(slave)のIDを決定 + + //INA226の処理 + unsigned short val=0; + double C; + int count = 1; + if(!VCmonitor.isExist()){ + pc.printf("VCmonitor NOT FOUND\n"); + while(1){;} + } + pc.printf("VCmonitor FOUND\n\r"); + if(VCmonitor.rawRead(0x00,&val) != 0){ //configResisterの値を読み取れるか確認(通信できてるか確認) + pc.printf("VCmonitor READ ERROR\n"); + } + VCmonitor.setConfigResister(); + wait(0.1); + pc.printf("VCmonitor Reg 0x00 : 0x%04x\n\r",val); //configResisterの値表示 + VCmonitor.setCurrentCalibration(); + + //無限ループ開始 + while(1){ + bms.update1(); //1-15セル電圧の測定 + //wait(0.5); + sum1 = 0; + for( int i=1; i<=15; i++ ){ //1-15セルの電圧を格納する処理 + cellVolt1[i-1] = bms.getCellVoltage(i); //cellVolt1配列に値を格納 + sum1 = sum1 + cellVolt1[i-1]; //合計を算出(バッテリ電圧・セル平均電圧の算出に使用) + } + cellMax1 = bms.getMaxCellVoltage(); //1-15セルの最大セル電圧を格納 + cellMin1 = bms.getMinCellVoltage(); //1-15セルの最小セル電圧を格納 + cellAve1 = sum1/15; //1-15セルの平均セル電圧を格納 + pc.printf("max1:%d, ave1:%d, min1:%d\n\r", cellMax1, cellAve1, cellMin1 ); + pc.printf("cell1:%d,%d,%d,%d,%d %d,%d,%d,%d,%d %d,%d,%d,%d,%d\n\r", + 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]); + //pc.printf("\n\r"); + bms.update2(); //16-27セル電圧の測定 + //wait(0.5); + sum2 = 0; + for( int i=1; i<=15; i++ ){ //16-27セルの電圧を格納する処理 + cellVolt2[i-1] = bms.getCellVoltage(i); // + sum2 = sum2 + cellVolt2[i-1]; + } + sum2 = sum2 -(cellVolt2[3]+cellVolt2[8]+cellVolt2[13]); //4セル,9セル,14セルは未接続のため値を引く + cellAve2 = sum2/12; //16-27セルの平均セル電圧を格納 + cellMax2 = bms.getMaxCellVoltage(); //16-27セルの最大セル電圧を格納 + cellMin2 = bms.getMinCellVoltage(); //16-27セルの最小セル電圧を格納 + pc.printf("max2:%d, ave2:%d, min2:%d\n\r", cellMax2, cellAve2, cellMin2 ); + pc.printf("cell2:%d,%d,%d,%d,%d %d,%d,%d,%d,%d %d,%d,%d,%d,%d\n\r", + 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]); + + if(cellMax1 >= cellMax2){ + cellMax0 = cellMax1; //27セル中の最大セル電圧を格納 + }else if(cellMax1 < cellMax2){ + cellMax0 = cellMax2; //27セル中の最大セル電圧を格納 + } + if(cellMin1 <= cellMin2){ + cellMin0 = cellMin1; //27セル中の最小セル電圧を格納 + }else if(cellMin1 > cellMin2){ + cellMin0 = cellMin2; //27セル中の最小セル電圧を格納 + } + cellAve0 = (sum1 + sum2) / 27; //27セルの平均セル電圧を格納 + pc.printf("%d, %d, %d\n\r", sum1, sum2, sum1+sum2); + //温度を測定する処理 + temp1 = ((tempSens1*3.3)-0.600)*100.0; //conversion to degrees C - from sensor output voltage per LM61 data sheet + temp2 = ((tempSens2*3.3)-0.600)*100.0; //conversion to degrees C - from sensor output voltage per LM61 data sheet + temp3 = ((tempSens3*3.3)-0.600)*100.0; //conversion to degrees C - from sensor output voltage per LM61 data sheet + temp4 = ((tempSens4*3.3)-0.600)*100.0; //conversion to degrees C - from sensor output voltage per LM61 data sheet + temp5 = ((tempSens5*3.3)-0.600)*100.0; //conversion to degrees C - from sensor output voltage per LM61 data sheet + pc.printf("temp:%4.1f,%4.1f,%4.1f,%4.1f,%4.1f\n\r",temp1,temp2,temp3,temp4,temp5); //print current temp + //pc.printf("\n\r"); + + //バッテリ電流を測定する処理 + //VCmonitor.getVoltage(&V); + //V = V * 14.825; + VCmonitor.getCurrent(&C); + pc.printf("%d,C,%f\n\r",count,C); + pc.printf("\n\r"); + + CANbuf.data[0] = ((sum1+sum2)/100) / 100; + CANbuf.data[1] = ((sum1+sum2)/100) % 100; + CANbuf.data[2] = ((int)(C/10) / 100); + CANbuf.data[3] = ((int)(C/10) % 100); + CANbuf.data[4] = cellMin0 / 1000; + CANbuf.data[5] = (cellMin0 % 1000) / 10; + CANbuf.data[6] = cellMax0 / 1000; + CANbuf.data[7] = (cellMax0 % 1000) / 10; + if(can.write(CANbuf)){ //格納したデータを送信する + led1 = !led1; + } + } +} \ No newline at end of file