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