KIT Solar Car Project / Mbed 2 deprecated BMS_6804_pb

Dependencies:   mbed INA226

Committer:
takuma1
Date:
Thu Apr 08 10:04:55 2021 +0000
Revision:
5:f07de56debf3
Parent:
4:e57b023e41f3
210408_BMS_v1;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
APS_Lab 0:f06ed53310a3 1
APS_Lab 0:f06ed53310a3 2 #include "mbed.h"
APS_Lab 0:f06ed53310a3 3 #include "bms.h"
APS_Lab 0:f06ed53310a3 4 #include "LTC681x.h"
APS_Lab 0:f06ed53310a3 5 #include "LTC6811.h"
takuma1 4:e57b023e41f3 6 #include "INA226.hpp"
takuma1 5:f07de56debf3 7
takuma1 5:f07de56debf3 8
APS_Lab 0:f06ed53310a3 9
APS_Lab 0:f06ed53310a3 10 #define UI_BUFFER_SIZE 64
APS_Lab 0:f06ed53310a3 11 #define SERIAL_TERMINATOR '\n'
APS_Lab 0:f06ed53310a3 12
APS_Lab 0:f06ed53310a3 13 #define ENABLED 1
APS_Lab 0:f06ed53310a3 14 #define DISABLED 0
APS_Lab 0:f06ed53310a3 15
APS_Lab 0:f06ed53310a3 16 #define DATALOG_ENABLED 1
APS_Lab 0:f06ed53310a3 17 #define DATALOG_DISABLED 0
takuma1 2:f6f76dde7e1d 18
takuma1 4:e57b023e41f3 19
takuma1 4:e57b023e41f3 20
APS_Lab 0:f06ed53310a3 21 DigitalOut led1(LED1);
APS_Lab 0:f06ed53310a3 22 Serial pc(USBTX, USBRX);
takuma1 4:e57b023e41f3 23 CAN canSlave(p30,p29);
takuma1 4:e57b023e41f3 24 I2C i2c(p28,p27);
takuma1 4:e57b023e41f3 25 DigitalOut led2(LED2);
takuma1 4:e57b023e41f3 26 DigitalOut BAT_MIN_safty(p21);
takuma1 4:e57b023e41f3 27 DigitalOut BAT_MAX_safty(p22);
takuma1 4:e57b023e41f3 28 //Timer timer; //書き込み時間を計測するタイマ
APS_Lab 0:f06ed53310a3 29
takuma1 4:e57b023e41f3 30 // CAN関係
takuma1 4:e57b023e41f3 31 short int forSend = 0; //データ送信時に一時的に使用する変数
takuma1 4:e57b023e41f3 32 bool CANsendOK = 0; //CAN送信完了時,セットする(mainでのprintfのため)
takuma1 4:e57b023e41f3 33 CANMessage msgSlave1; //CAN送信用
takuma1 4:e57b023e41f3 34 short int canSlaveID = 0x20; //canSlaveのIDをに設定
takuma1 4:e57b023e41f3 35 void Handler_canSend();
takuma1 4:e57b023e41f3 36 bool flag_can = 1;
takuma1 4:e57b023e41f3 37
takuma1 4:e57b023e41f3 38 //測定関係の関数(変更の際触る必要がない)
takuma1 4:e57b023e41f3 39 void run_command(uint32_t cmd); //測定コマンド送信関数
APS_Lab 0:f06ed53310a3 40 void measurement_loop(uint8_t datalog_en);
takuma1 4:e57b023e41f3 41 void print_cells(uint8_t datalog_en); //セル電圧の測定表示関数
APS_Lab 0:f06ed53310a3 42 void print_open();
APS_Lab 0:f06ed53310a3 43 void print_aux(uint8_t datalog_en);
APS_Lab 0:f06ed53310a3 44 void print_stat();
APS_Lab 0:f06ed53310a3 45 void print_config();
APS_Lab 0:f06ed53310a3 46 void print_rxconfig();
APS_Lab 0:f06ed53310a3 47 void print_pec(void);
APS_Lab 0:f06ed53310a3 48 void serial_print_hex(uint8_t data);
APS_Lab 0:f06ed53310a3 49 void check_error(int error);
takuma1 2:f6f76dde7e1d 50
takuma1 4:e57b023e41f3 51 //測定関係関数(使ってる)
takuma1 4:e57b023e41f3 52 void wakeup();//ICの起動関数、消費電力削減関数
takuma1 4:e57b023e41f3 53 void cell_read();//セルの電圧の読み込みコマンド
takuma1 4:e57b023e41f3 54 void spi_error();//SPIエラー処理関数
takuma1 4:e57b023e41f3 55 void ic_check();//ICが測定可能状態か診断して次のコマンドに持ち込むための関数
takuma1 4:e57b023e41f3 56 void spi_check();//SPIエラーの確認関数
takuma1 4:e57b023e41f3 57 void print_CAN(uint8_t datalog_en);//セルの電圧の表示コマンドと過充電過放電検出
takuma1 4:e57b023e41f3 58 void BAT_safty();
takuma1 4:e57b023e41f3 59 void print_math();
takuma1 4:e57b023e41f3 60 void can_sent1();
takuma1 4:e57b023e41f3 61 void can_sent2();
takuma1 4:e57b023e41f3 62 void can_sent3();
takuma1 4:e57b023e41f3 63 void can_sent4();
takuma1 4:e57b023e41f3 64 //void can_set();
takuma1 4:e57b023e41f3 65 void can_wait();
takuma1 4:e57b023e41f3 66 void ic_set();
APS_Lab 0:f06ed53310a3 67
takuma1 4:e57b023e41f3 68
APS_Lab 0:f06ed53310a3 69
takuma1 4:e57b023e41f3 70
takuma1 4:e57b023e41f3 71 const uint8_t TOTAL_IC = 3; //IC数
APS_Lab 0:f06ed53310a3 72 char ui_buffer[UI_BUFFER_SIZE];
APS_Lab 0:f06ed53310a3 73
APS_Lab 0:f06ed53310a3 74
APS_Lab 0:f06ed53310a3 75
takuma1 4:e57b023e41f3 76 const uint8_t ADC_CONVERSION_MODE = MD_7KHZ_3KHZ;
takuma1 4:e57b023e41f3 77 const uint8_t ADC_DCP = DCP_DISABLED;
takuma1 4:e57b023e41f3 78 const uint8_t CELL_CH_TO_CONVERT = CELL_CH_ALL;
takuma1 4:e57b023e41f3 79 const uint8_t AUX_CH_TO_CONVERT = AUX_CH_ALL;
takuma1 4:e57b023e41f3 80 const uint8_t STAT_CH_TO_CONVERT = STAT_CH_ALL;
APS_Lab 0:f06ed53310a3 81
takuma1 4:e57b023e41f3 82 const uint16_t MEASUREMENT_LOOP_TIME = 10;//milliseconds(mS)
takuma1 2:f6f76dde7e1d 83 const uint16_t OV_THRESHOLD = 41000; //
takuma1 2:f6f76dde7e1d 84 const uint16_t UV_THRESHOLD = 30000; //
APS_Lab 0:f06ed53310a3 85
takuma1 4:e57b023e41f3 86
takuma1 4:e57b023e41f3 87 const uint8_t WRITE_CONFIG = DISABLED;
takuma1 4:e57b023e41f3 88 const uint8_t READ_CONFIG = DISABLED;
takuma1 4:e57b023e41f3 89 const uint8_t MEASURE_CELL = ENABLED;
takuma1 4:e57b023e41f3 90 const uint8_t MEASURE_AUX = DISABLED;
takuma1 4:e57b023e41f3 91 const uint8_t MEASURE_STAT = DISABLED;
takuma1 4:e57b023e41f3 92 const uint8_t PRINT_PEC = DISABLED;
takuma1 3:a1368cd4b0a9 93 short n =0;
APS_Lab 0:f06ed53310a3 94
APS_Lab 0:f06ed53310a3 95 uint8_t read_data();
APS_Lab 0:f06ed53310a3 96
APS_Lab 0:f06ed53310a3 97 float read_float();
takuma1 4:e57b023e41f3 98 INA226 VCmonitor(i2c); // INA226
APS_Lab 0:f06ed53310a3 99
APS_Lab 0:f06ed53310a3 100 int32_t read_int();
takuma1 4:e57b023e41f3 101 float BAT_MIN ;
takuma1 4:e57b023e41f3 102 float BAT_MAX ;
takuma1 4:e57b023e41f3 103 float BAT_AVG ;
takuma1 4:e57b023e41f3 104 double BAT_C;
takuma1 4:e57b023e41f3 105 float BAT_SUM;
takuma1 3:a1368cd4b0a9 106 unsigned short BAT_CELL[23];
takuma1 3:a1368cd4b0a9 107
APS_Lab 0:f06ed53310a3 108 char *read_string();
takuma1 4:e57b023e41f3 109 /*
takuma1 4:e57b023e41f3 110 int Replace1;
takuma1 4:e57b023e41f3 111 int Replace2;
takuma1 4:e57b023e41f3 112 int Replace3;
takuma1 4:e57b023e41f3 113 int Replace4;
takuma1 4:e57b023e41f3 114 */
takuma1 3:a1368cd4b0a9 115
APS_Lab 0:f06ed53310a3 116 int8_t read_char();
APS_Lab 0:f06ed53310a3 117
APS_Lab 0:f06ed53310a3 118 cell_asic bms_ic[TOTAL_IC];
APS_Lab 0:f06ed53310a3 119
takuma1 4:e57b023e41f3 120
takuma1 4:e57b023e41f3 121 void Handler_canSend() {
takuma1 4:e57b023e41f3 122
takuma1 4:e57b023e41f3 123 int Replace1 = 0;
takuma1 4:e57b023e41f3 124 int Replace2 = 0;
takuma1 4:e57b023e41f3 125 int Replace3 = 0;
takuma1 4:e57b023e41f3 126 short int Replace4 = 0;
takuma1 4:e57b023e41f3 127
takuma1 4:e57b023e41f3 128 short n =0;
takuma1 4:e57b023e41f3 129 int BAT_SUM = 0; // 0にする
takuma1 4:e57b023e41f3 130 int BAT_MIN = 55876;
takuma1 4:e57b023e41f3 131 double C;
takuma1 4:e57b023e41f3 132 //unsigned short BTA_MAX = 0;
takuma1 4:e57b023e41f3 133
takuma1 4:e57b023e41f3 134 for (int current_ic = 0 ; current_ic < TOTAL_IC; current_ic++) {
takuma1 4:e57b023e41f3 135 for (int i=0; i < bms_ic[0].ic_reg.cell_channels; i++) {
takuma1 4:e57b023e41f3 136
takuma1 4:e57b023e41f3 137 //pc.printf("C%d:", i+1);
takuma1 5:f07de56debf3 138 printf("%.4f, ",bms_ic[current_ic].cells.c_codes[i]*0.0001);
takuma1 4:e57b023e41f3 139 BAT_SUM = bms_ic[current_ic].cells.c_codes[i] + BAT_SUM;
takuma1 4:e57b023e41f3 140
takuma1 4:e57b023e41f3 141 if(bms_ic[current_ic].cells.c_codes[i] > 10000){
takuma1 4:e57b023e41f3 142 if(bms_ic[current_ic].cells.c_codes[i] < BAT_MIN){
takuma1 4:e57b023e41f3 143 BAT_MIN = bms_ic[current_ic].cells.c_codes[i];
takuma1 4:e57b023e41f3 144 }
takuma1 4:e57b023e41f3 145 }
takuma1 4:e57b023e41f3 146
takuma1 4:e57b023e41f3 147 if( bms_ic[current_ic].cells.c_codes[i] > BAT_MAX){
takuma1 4:e57b023e41f3 148 BAT_MAX = bms_ic[current_ic].cells.c_codes[i];
takuma1 4:e57b023e41f3 149 }
takuma1 4:e57b023e41f3 150 }
takuma1 4:e57b023e41f3 151
takuma1 4:e57b023e41f3 152 if(VCmonitor.getCurrent(&C) == 0){ // INA226
takuma1 4:e57b023e41f3 153 BAT_C = C;
takuma1 4:e57b023e41f3 154 printf("C,%f\n",C);
takuma1 4:e57b023e41f3 155 }
takuma1 4:e57b023e41f3 156
takuma1 4:e57b023e41f3 157 }
takuma1 4:e57b023e41f3 158 // BMA_SUM
takuma1 4:e57b023e41f3 159 Replace1 = (int)(BAT_SUM / 100);
takuma1 4:e57b023e41f3 160 msgSlave1.data[0] = Replace1 / 100;
takuma1 4:e57b023e41f3 161 msgSlave1.data[1] = Replace1 % 100;
takuma1 4:e57b023e41f3 162 //BAT_MIN
takuma1 4:e57b023e41f3 163 Replace2 = (int)(BAT_MIN / 10);
takuma1 4:e57b023e41f3 164 msgSlave1.data[2] = Replace2 / 100;
takuma1 4:e57b023e41f3 165 msgSlave1.data[3] = Replace2 % 100;
takuma1 4:e57b023e41f3 166 //BAT_MAX
takuma1 4:e57b023e41f3 167 Replace3 = (int)(BAT_MAX /10);
takuma1 4:e57b023e41f3 168 msgSlave1.data[4] = Replace3 / 100;
takuma1 4:e57b023e41f3 169 msgSlave1.data[5] = Replace3 % 100;
takuma1 4:e57b023e41f3 170 //BAT_C
takuma1 4:e57b023e41f3 171
takuma1 4:e57b023e41f3 172 //short BAT_C = -233;
takuma1 4:e57b023e41f3 173 if(BAT_C < 1000){
takuma1 4:e57b023e41f3 174 BAT_C = BAT_C + 9002;
takuma1 4:e57b023e41f3 175 }
takuma1 4:e57b023e41f3 176
takuma1 4:e57b023e41f3 177 if(BAT_C < 0){ //正電流か負電流を判定する
takuma1 4:e57b023e41f3 178 BAT_C = BAT_C + 9001; //負だと正の電流に変更する。さらにモニタ側でマイナスに戻すための定数を9001とする
takuma1 4:e57b023e41f3 179 //最大放電電流は50000mA 充電電流は-40000mAであるため9001とした。
takuma1 4:e57b023e41f3 180 }
takuma1 4:e57b023e41f3 181
takuma1 4:e57b023e41f3 182 Replace4 = (short int)(BAT_C / 1);
takuma1 4:e57b023e41f3 183 msgSlave1.data[6] = Replace4 / 100;
takuma1 4:e57b023e41f3 184 msgSlave1.data[7] = Replace4 % 100;
takuma1 4:e57b023e41f3 185 pc.printf("BAT_C %d\n",Replace4 );
takuma1 4:e57b023e41f3 186 printf("Data in msgSlave1.data[6] : %d\n\r", msgSlave1.data[6]);
takuma1 4:e57b023e41f3 187
takuma1 4:e57b023e41f3 188
takuma1 4:e57b023e41f3 189 if(canSlave.write(msgSlave1)){ //格納したデータを送信する
takuma1 4:e57b023e41f3 190 led1 = !led1;
takuma1 4:e57b023e41f3 191 CANsendOK = 1;
takuma1 4:e57b023e41f3 192 }
takuma1 4:e57b023e41f3 193 ic_check();
takuma1 4:e57b023e41f3 194 }
takuma1 4:e57b023e41f3 195
takuma1 4:e57b023e41f3 196 void Handler_canRecieve(){ //canMasterから送信要求が来たとき,データ送信するための関数
takuma1 4:e57b023e41f3 197 if( flag_can ){
takuma1 4:e57b023e41f3 198 if( canSlave.read( msgSlave1 ) ){ //msgに送られたデータが入る
takuma1 4:e57b023e41f3 199 led2 = !led2;
takuma1 4:e57b023e41f3 200 if( msgSlave1.id == canSlaveID ){ //IDがcanSlaveIDであれば処理する
takuma1 4:e57b023e41f3 201 Handler_canSend();
takuma1 4:e57b023e41f3 202 }
takuma1 4:e57b023e41f3 203 }
takuma1 4:e57b023e41f3 204 }
takuma1 4:e57b023e41f3 205 }
takuma1 5:f07de56debf3 206
APS_Lab 0:f06ed53310a3 207 int main(void)
APS_Lab 0:f06ed53310a3 208 {
APS_Lab 0:f06ed53310a3 209 uint32_t user_command;
takuma1 4:e57b023e41f3 210 //short int BAT_C = 2322;
APS_Lab 0:f06ed53310a3 211 pc.baud(115200);
takuma1 3:a1368cd4b0a9 212
takuma1 5:f07de56debf3 213 //printf("main()\n\r");
takuma1 4:e57b023e41f3 214 canSlave.attach(&Handler_canRecieve, CAN::RxIrq); //CAN受信割り込みの設定
takuma1 4:e57b023e41f3 215 msgSlave1.id = canSlaveID; //CAN送信側(slave)のIDを決定
takuma1 4:e57b023e41f3 216 msgSlave1.len = 8; //CAN送信側で送るデータのバイト数
takuma1 3:a1368cd4b0a9 217
takuma1 4:e57b023e41f3 218 while(1) {
takuma1 4:e57b023e41f3 219 BAT_MIN = 0;
takuma1 4:e57b023e41f3 220 BAT_MAX = 0; // 0にする
takuma1 4:e57b023e41f3 221 /*
takuma1 4:e57b023e41f3 222 if ( fp == NULL )
takuma1 4:e57b023e41f3 223 {
takuma1 4:e57b023e41f3 224 pc.printf("USB fileopen!\r\n");
takuma1 4:e57b023e41f3 225 exit(1);
takuma1 4:e57b023e41f3 226 }
takuma1 4:e57b023e41f3 227 FILE *fp = fopen( "/usb/test.csv", "w"); //ファイルを開く "W"は新規作成して書き込みっていう命令?
takuma1 4:e57b023e41f3 228 */
takuma1 4:e57b023e41f3 229 ic_check();
takuma1 4:e57b023e41f3 230 //timer.start(); //書き込み時間測定開始
takuma1 4:e57b023e41f3 231 //timer.stop(); //書き込み時間測定終了
takuma1 4:e57b023e41f3 232 //fclose(fp); //ファイルを閉じる
takuma1 4:e57b023e41f3 233 if( CANsendOK ) {
takuma1 4:e57b023e41f3 234 CANsendOK = 0;
takuma1 4:e57b023e41f3 235 printf("Data in msgSlave1.data[0] : %d\n\r", msgSlave1.data[0]); //CANで送信したデータをそのまま表示
takuma1 4:e57b023e41f3 236 printf("Data in msgSlave1.data[1] : %d\n\r", msgSlave1.data[1]); //上に同じ
takuma1 4:e57b023e41f3 237 printf("Data in msgSlave1.data[2] : %d\n\r", msgSlave1.data[2]); //上に同じ
takuma1 4:e57b023e41f3 238 printf("Data in msgSlave1.data[3] : %d\n\r", msgSlave1.data[3]);
takuma1 4:e57b023e41f3 239 printf("Data in msgSlave1.data[4] : %d\n\r", msgSlave1.data[4]);
takuma1 4:e57b023e41f3 240 printf("Data in msgSlave1.data[5] : %d\n\r", msgSlave1.data[5]);
takuma1 4:e57b023e41f3 241 printf("Data in msgSlave1.data[6] : %d\n\r", msgSlave1.data[6]);
takuma1 4:e57b023e41f3 242 printf("Data in msgSlave1.data[7] : %d\n\r", msgSlave1.data[7]); //上に同じ
takuma1 4:e57b023e41f3 243 printf("\n\r");
takuma1 4:e57b023e41f3 244 }
takuma1 4:e57b023e41f3 245 BAT_safty();
takuma1 3:a1368cd4b0a9 246 }
takuma1 3:a1368cd4b0a9 247 }
takuma1 4:e57b023e41f3 248
takuma1 4:e57b023e41f3 249 /*
takuma1 4:e57b023e41f3 250 void ic_set(){
takuma1 4:e57b023e41f3 251
takuma1 4:e57b023e41f3 252 // __disable_irq();
takuma1 4:e57b023e41f3 253 // flag_can = 0;
takuma1 4:e57b023e41f3 254 ic_check();
takuma1 4:e57b023e41f3 255 spi_check();
takuma1 4:e57b023e41f3 256 spi_error();
takuma1 4:e57b023e41f3 257 wakeup();
takuma1 4:e57b023e41f3 258 cell_read();
takuma1 4:e57b023e41f3 259 }
takuma1 4:e57b023e41f3 260 */
takuma1 3:a1368cd4b0a9 261 void ic_check(){ //1
takuma1 3:a1368cd4b0a9 262
takuma1 4:e57b023e41f3 263 //__disable_irq();
takuma1 4:e57b023e41f3 264
APS_Lab 0:f06ed53310a3 265 spi_enable();
APS_Lab 0:f06ed53310a3 266 LTC681x_init_cfg(TOTAL_IC, bms_ic);
APS_Lab 0:f06ed53310a3 267 LTC6811_reset_crc_count(TOTAL_IC,bms_ic);
APS_Lab 0:f06ed53310a3 268 LTC6811_init_reg_limits(TOTAL_IC,bms_ic);
takuma1 2:f6f76dde7e1d 269 wakeup_sleep(TOTAL_IC);
takuma1 2:f6f76dde7e1d 270 LTC6811_wrcfg(TOTAL_IC,bms_ic);
takuma1 2:f6f76dde7e1d 271 print_config();
takuma1 4:e57b023e41f3 272 spi_check();
takuma1 4:e57b023e41f3 273 }
takuma1 4:e57b023e41f3 274
takuma1 3:a1368cd4b0a9 275
takuma1 3:a1368cd4b0a9 276 void spi_check(){ //2
takuma1 4:e57b023e41f3 277
takuma1 4:e57b023e41f3 278 //__disable_irq();
takuma1 3:a1368cd4b0a9 279 int countup;
takuma1 3:a1368cd4b0a9 280 int8_t error = 0;
takuma1 3:a1368cd4b0a9 281
takuma1 2:f6f76dde7e1d 282 wakeup_sleep(TOTAL_IC);
takuma1 2:f6f76dde7e1d 283 error = LTC6811_rdcfg(TOTAL_IC,bms_ic);
takuma1 2:f6f76dde7e1d 284 check_error(error);
takuma1 4:e57b023e41f3 285 print_rxconfig();
takuma1 3:a1368cd4b0a9 286 spi_error();
takuma1 3:a1368cd4b0a9 287 }
takuma1 3:a1368cd4b0a9 288
takuma1 4:e57b023e41f3 289 void wakeup(){ //3
takuma1 3:a1368cd4b0a9 290
takuma1 4:e57b023e41f3 291 //__disable_irq();
takuma1 3:a1368cd4b0a9 292 int countup;
takuma1 3:a1368cd4b0a9 293 int8_t error = 0;
takuma1 3:a1368cd4b0a9 294 uint32_t conv_time = 0;
takuma1 2:f6f76dde7e1d 295
takuma1 3:a1368cd4b0a9 296
takuma1 3:a1368cd4b0a9 297 wakeup_sleep(TOTAL_IC);
takuma1 2:f6f76dde7e1d 298 LTC6811_adcv(ADC_CONVERSION_MODE,ADC_DCP,CELL_CH_TO_CONVERT);
takuma1 2:f6f76dde7e1d 299 conv_time = LTC6811_pollAdc();
takuma1 3:a1368cd4b0a9 300 cell_read();
takuma1 4:e57b023e41f3 301 }
takuma1 2:f6f76dde7e1d 302
takuma1 2:f6f76dde7e1d 303
takuma1 2:f6f76dde7e1d 304 void spi_error(){
takuma1 4:e57b023e41f3 305
takuma1 4:e57b023e41f3 306 // __disable_irq();
takuma1 2:f6f76dde7e1d 307
takuma1 2:f6f76dde7e1d 308 int8_t error = 0;
takuma1 2:f6f76dde7e1d 309 int countup;
takuma1 3:a1368cd4b0a9 310 /*
takuma1 2:f6f76dde7e1d 311 if(error = -1 ){
takuma1 3:a1368cd4b0a9 312 for(countup = 0; countup <= 2; countup++){
takuma1 3:a1368cd4b0a9 313 spi_check();
takuma1 3:a1368cd4b0a9 314 if(error =1){
takuma1 2:f6f76dde7e1d 315 break;
takuma1 3:a1368cd4b0a9 316 }
takuma1 3:a1368cd4b0a9 317 }
takuma1 2:f6f76dde7e1d 318 }
takuma1 3:a1368cd4b0a9 319 if(error = 1){
takuma1 3:a1368cd4b0a9 320 wakeup();
takuma1 2:f6f76dde7e1d 321 }
takuma1 3:a1368cd4b0a9 322 */
takuma1 3:a1368cd4b0a9 323 wakeup();
takuma1 2:f6f76dde7e1d 324 }
takuma1 3:a1368cd4b0a9 325
takuma1 3:a1368cd4b0a9 326 void cell_read(){ //4 電圧読み取り
APS_Lab 0:f06ed53310a3 327
takuma1 4:e57b023e41f3 328 //__disable_irq();
APS_Lab 0:f06ed53310a3 329 int8_t error = 0;
APS_Lab 0:f06ed53310a3 330 uint32_t conv_time = 0;
APS_Lab 0:f06ed53310a3 331 int8_t readIC=0;
takuma1 2:f6f76dde7e1d 332
takuma1 3:a1368cd4b0a9 333 wakeup_sleep(TOTAL_IC);
takuma1 3:a1368cd4b0a9 334 error = LTC6811_rdcv(0, TOTAL_IC,bms_ic);
APS_Lab 0:f06ed53310a3 335 check_error(error);
takuma1 3:a1368cd4b0a9 336 //print_cells(DATALOG_DISABLED);
takuma1 4:e57b023e41f3 337 print_CAN(DATALOG_DISABLED);
takuma1 3:a1368cd4b0a9 338 }
APS_Lab 0:f06ed53310a3 339
takuma1 3:a1368cd4b0a9 340 void print_CAN(uint8_t datalog_en){
takuma1 4:e57b023e41f3 341 /*
takuma1 4:e57b023e41f3 342 __disable_irq();
takuma1 3:a1368cd4b0a9 343 short n =0;
takuma1 4:e57b023e41f3 344 int BAT_SUM = 0; // 0にする
takuma1 4:e57b023e41f3 345 int BAT_MIN = 55876;
takuma1 4:e57b023e41f3 346 double C;
takuma1 3:a1368cd4b0a9 347 //unsigned short BTA_MAX = 0;
takuma1 4:e57b023e41f3 348
takuma1 4:e57b023e41f3 349 for (int current_ic = 0 ; current_ic < TOTAL_IC; current_ic++) {
takuma1 4:e57b023e41f3 350 for (int i=0; i < bms_ic[0].ic_reg.cell_channels; i++) {
takuma1 4:e57b023e41f3 351
takuma1 4:e57b023e41f3 352 //pc.printf("C%d:", i+1);
takuma1 4:e57b023e41f3 353 //pc.printf("%.4f, ",bms_ic[current_ic].cells.c_codes[i]*0.0001);
takuma1 4:e57b023e41f3 354 BAT_SUM = bms_ic[current_ic].cells.c_codes[i] + BAT_SUM;
takuma1 4:e57b023e41f3 355 if(bms_ic[current_ic].cells.c_codes[i] > 10000){
takuma1 4:e57b023e41f3 356 if(bms_ic[current_ic].cells.c_codes[i] < BAT_MIN){
takuma1 4:e57b023e41f3 357 BAT_MIN = bms_ic[current_ic].cells.c_codes[i];
takuma1 4:e57b023e41f3 358 }
takuma1 4:e57b023e41f3 359 }
takuma1 4:e57b023e41f3 360
takuma1 4:e57b023e41f3 361 if( bms_ic[current_ic].cells.c_codes[i] > BAT_MAX){
takuma1 4:e57b023e41f3 362 BAT_MAX = bms_ic[current_ic].cells.c_codes[i];
takuma1 4:e57b023e41f3 363 }
takuma1 4:e57b023e41f3 364
takuma1 4:e57b023e41f3 365 if(VCmonitor.getCurrent(&C) == 0){ // INA226
takuma1 4:e57b023e41f3 366 BAT_C = C;
takuma1 4:e57b023e41f3 367 //printf("C,%f\n",C);
takuma1 4:e57b023e41f3 368 }
takuma1 4:e57b023e41f3 369 }
takuma1 4:e57b023e41f3 370 }
takuma1 4:e57b023e41f3 371 /*
takuma1 3:a1368cd4b0a9 372 for (int current_ic = 0 ; current_ic < TOTAL_IC; current_ic++) {
takuma1 3:a1368cd4b0a9 373
takuma1 3:a1368cd4b0a9 374 //if (datalog_en == 0) {
takuma1 4:e57b023e41f3 375 //pc.printf("IC%d, ", current_ic+1);
takuma1 3:a1368cd4b0a9 376 //for(n = 0; n <= 12; n++){
takuma1 3:a1368cd4b0a9 377 for (int i=0; i < bms_ic[0].ic_reg.cell_channels; i++) {
takuma1 3:a1368cd4b0a9 378
takuma1 4:e57b023e41f3 379 //BAT_CELL= bms_ic[current_ic].cells.c_codes[i];
takuma1 4:e57b023e41f3 380
takuma1 4:e57b023e41f3 381 //fprintf(fp,"C%d:", i+1);
takuma1 4:e57b023e41f3 382 //fprintf(fp,"%.4f, ",bms_ic[current_ic].cells.c_codes[i]*0.0001);
takuma1 3:a1368cd4b0a9 383 BAT_SUM = bms_ic[current_ic].cells.c_codes[i] + BAT_SUM;
takuma1 3:a1368cd4b0a9 384
takuma1 3:a1368cd4b0a9 385 if(bms_ic[current_ic].cells.c_codes[i] > 10000){
takuma1 3:a1368cd4b0a9 386 if(bms_ic[current_ic].cells.c_codes[i] < BAT_MIN){
takuma1 3:a1368cd4b0a9 387 BAT_MIN = bms_ic[current_ic].cells.c_codes[i];
takuma1 3:a1368cd4b0a9 388 }
takuma1 3:a1368cd4b0a9 389 }
takuma1 3:a1368cd4b0a9 390 //unsigned short BTA_MAX = 0;
takuma1 3:a1368cd4b0a9 391 if( bms_ic[current_ic].cells.c_codes[i] > BAT_MAX){
takuma1 3:a1368cd4b0a9 392 BAT_MAX = bms_ic[current_ic].cells.c_codes[i];
takuma1 4:e57b023e41f3 393 }
takuma1 4:e57b023e41f3 394 if(VCmonitor.getCurrent(&C) == 0){ // INA226
takuma1 4:e57b023e41f3 395 BAT_C = C;
takuma1 4:e57b023e41f3 396 }
takuma1 4:e57b023e41f3 397
takuma1 4:e57b023e41f3 398 }
takuma1 4:e57b023e41f3 399 }
takuma1 4:e57b023e41f3 400
takuma1 4:e57b023e41f3 401 fprintf(fp,"SUM");
takuma1 4:e57b023e41f3 402 fprintf(fp,"%0.4f, ",BAT_SUM*0.0001);
takuma1 4:e57b023e41f3 403 BAT_AVG = BAT_SUM / 20;
takuma1 4:e57b023e41f3 404 fprintf(fp,"AVG");
takuma1 4:e57b023e41f3 405 fprintf(fp,"%.4f, ",BAT_AVG*0.0001);
takuma1 4:e57b023e41f3 406 fprintf(fp,"MIN");
takuma1 4:e57b023e41f3 407 fprintf(fp,"%.4f, ",BAT_MIN*0.0001);
takuma1 4:e57b023e41f3 408 fprintf(fp,"MAX");
takuma1 4:e57b023e41f3 409 fprintf(fp,"%.4f, ",BAT_MAX*0.0001);
takuma1 4:e57b023e41f3 410 fprintf(fp,"BAT_Current,%f\n",BAT_Current);
takuma1 4:e57b023e41f3 411 */
APS_Lab 0:f06ed53310a3 412 }
takuma1 4:e57b023e41f3 413
takuma1 4:e57b023e41f3 414 void BAT_safty(){
takuma1 4:e57b023e41f3 415 if( BAT_MIN < 25000 ){
takuma1 4:e57b023e41f3 416 BAT_MIN_safty = 1 ;
takuma1 4:e57b023e41f3 417 wait(1);
takuma1 4:e57b023e41f3 418 BAT_MIN_safty = 0 ;
takuma1 4:e57b023e41f3 419 }
takuma1 4:e57b023e41f3 420 if( BAT_MAX > 42000){
takuma1 4:e57b023e41f3 421 BAT_MAX_safty = 1;
takuma1 4:e57b023e41f3 422 wait(1);
takuma1 4:e57b023e41f3 423 BAT_MAX_safty = 0;
takuma1 4:e57b023e41f3 424 }
takuma1 4:e57b023e41f3 425 if(BAT_C > 60000){
takuma1 4:e57b023e41f3 426 BAT_MIN_safty = 1 ;
takuma1 4:e57b023e41f3 427 wait(1);
takuma1 4:e57b023e41f3 428 BAT_MIN_safty = 0 ;
takuma1 4:e57b023e41f3 429 }
takuma1 4:e57b023e41f3 430 }
takuma1 3:a1368cd4b0a9 431
takuma1 4:e57b023e41f3 432
APS_Lab 0:f06ed53310a3 433 void measurement_loop(uint8_t datalog_en)
APS_Lab 0:f06ed53310a3 434 {
APS_Lab 0:f06ed53310a3 435 int8_t error = 0;
APS_Lab 0:f06ed53310a3 436 if (WRITE_CONFIG == ENABLED) {
APS_Lab 0:f06ed53310a3 437 wakeup_sleep(TOTAL_IC);
APS_Lab 0:f06ed53310a3 438 LTC6811_wrcfg(TOTAL_IC,bms_ic);
APS_Lab 0:f06ed53310a3 439 print_config();
APS_Lab 0:f06ed53310a3 440 }
APS_Lab 0:f06ed53310a3 441
APS_Lab 0:f06ed53310a3 442 if (READ_CONFIG == ENABLED) {
APS_Lab 0:f06ed53310a3 443 wakeup_sleep(TOTAL_IC);
APS_Lab 0:f06ed53310a3 444 error = LTC6811_rdcfg(TOTAL_IC,bms_ic);
APS_Lab 0:f06ed53310a3 445 check_error(error);
APS_Lab 0:f06ed53310a3 446 print_rxconfig();
APS_Lab 0:f06ed53310a3 447 }
APS_Lab 0:f06ed53310a3 448
APS_Lab 0:f06ed53310a3 449 if (MEASURE_CELL == ENABLED) {
APS_Lab 0:f06ed53310a3 450 wakeup_idle(TOTAL_IC);
APS_Lab 0:f06ed53310a3 451 LTC6811_adcv(ADC_CONVERSION_MODE,ADC_DCP,CELL_CH_TO_CONVERT);
APS_Lab 0:f06ed53310a3 452 LTC6811_pollAdc();
APS_Lab 0:f06ed53310a3 453 wakeup_idle(TOTAL_IC);
APS_Lab 0:f06ed53310a3 454 error = LTC6811_rdcv(0, TOTAL_IC,bms_ic);
APS_Lab 0:f06ed53310a3 455 check_error(error);
APS_Lab 0:f06ed53310a3 456 print_cells(datalog_en);
APS_Lab 0:f06ed53310a3 457
APS_Lab 0:f06ed53310a3 458 }
APS_Lab 0:f06ed53310a3 459
APS_Lab 0:f06ed53310a3 460 if (MEASURE_AUX == ENABLED) {
APS_Lab 0:f06ed53310a3 461 wakeup_idle(TOTAL_IC);
APS_Lab 0:f06ed53310a3 462 LTC6811_adax(ADC_CONVERSION_MODE , AUX_CH_ALL);
APS_Lab 0:f06ed53310a3 463 LTC6811_pollAdc();
APS_Lab 0:f06ed53310a3 464 wakeup_idle(TOTAL_IC);
APS_Lab 0:f06ed53310a3 465 error = LTC6811_rdaux(0,TOTAL_IC,bms_ic); // Set to read back all aux registers
APS_Lab 0:f06ed53310a3 466 check_error(error);
APS_Lab 0:f06ed53310a3 467 print_aux(datalog_en);
APS_Lab 0:f06ed53310a3 468 }
APS_Lab 0:f06ed53310a3 469
APS_Lab 0:f06ed53310a3 470 if (MEASURE_STAT == ENABLED) {
APS_Lab 0:f06ed53310a3 471 wakeup_idle(TOTAL_IC);
APS_Lab 0:f06ed53310a3 472 LTC6811_adstat(ADC_CONVERSION_MODE, STAT_CH_ALL);
APS_Lab 0:f06ed53310a3 473 LTC6811_pollAdc();
APS_Lab 0:f06ed53310a3 474 wakeup_idle(TOTAL_IC);
APS_Lab 0:f06ed53310a3 475 error = LTC6811_rdstat(0,TOTAL_IC,bms_ic); // Set to read back all aux registers
APS_Lab 0:f06ed53310a3 476 check_error(error);
APS_Lab 0:f06ed53310a3 477 print_stat();
APS_Lab 0:f06ed53310a3 478 }
APS_Lab 0:f06ed53310a3 479
APS_Lab 0:f06ed53310a3 480 if (PRINT_PEC == ENABLED) {
APS_Lab 0:f06ed53310a3 481 print_pec();
APS_Lab 0:f06ed53310a3 482 }
APS_Lab 0:f06ed53310a3 483
APS_Lab 0:f06ed53310a3 484 }
APS_Lab 0:f06ed53310a3 485
takuma1 4:e57b023e41f3 486
takuma1 3:a1368cd4b0a9 487
APS_Lab 0:f06ed53310a3 488 void print_cells(uint8_t datalog_en)
APS_Lab 0:f06ed53310a3 489 {
APS_Lab 0:f06ed53310a3 490 for (int current_ic = 0 ; current_ic < TOTAL_IC; current_ic++) {
APS_Lab 0:f06ed53310a3 491
APS_Lab 0:f06ed53310a3 492 if (datalog_en == 0) {
APS_Lab 0:f06ed53310a3 493 pc.printf("IC%d, ", current_ic+1);
takuma1 3:a1368cd4b0a9 494 for (int i=0; i < bms_ic[0].ic_reg.cell_channels; i++) {
APS_Lab 0:f06ed53310a3 495 pc.printf("C%d:", i+1);
APS_Lab 0:f06ed53310a3 496 pc.printf("%.4f, ", bms_ic[current_ic].cells.c_codes[i]*0.0001);
takuma1 3:a1368cd4b0a9 497 }
takuma1 3:a1368cd4b0a9 498
APS_Lab 0:f06ed53310a3 499 pc.printf("\n");
takuma1 3:a1368cd4b0a9 500 }
takuma1 3:a1368cd4b0a9 501
takuma1 3:a1368cd4b0a9 502 else {
APS_Lab 0:f06ed53310a3 503 pc.printf("Cells, ");
APS_Lab 0:f06ed53310a3 504 for (int i=0; i<bms_ic[0].ic_reg.cell_channels; i++) {
takuma1 3:a1368cd4b0a9 505 pc.printf("%.4f, ",bms_ic[current_ic].cells.c_codes[i]*0.0001);
takuma1 3:a1368cd4b0a9 506
APS_Lab 0:f06ed53310a3 507 }
APS_Lab 0:f06ed53310a3 508 }
takuma1 3:a1368cd4b0a9 509
APS_Lab 0:f06ed53310a3 510 }
APS_Lab 0:f06ed53310a3 511 pc.printf("\n");
APS_Lab 0:f06ed53310a3 512 }
APS_Lab 0:f06ed53310a3 513
APS_Lab 0:f06ed53310a3 514 void print_open()
APS_Lab 0:f06ed53310a3 515 {
APS_Lab 0:f06ed53310a3 516 for (int current_ic =0 ; current_ic < TOTAL_IC; current_ic++) {
APS_Lab 0:f06ed53310a3 517 if (bms_ic[current_ic].system_open_wire == 0) {
APS_Lab 0:f06ed53310a3 518 pc.printf("No Opens Detected on IC%d\n", current_ic+1);
APS_Lab 0:f06ed53310a3 519 } else {
APS_Lab 0:f06ed53310a3 520 for (int cell=0; cell<bms_ic[0].ic_reg.cell_channels+1; cell++) {
APS_Lab 0:f06ed53310a3 521 if ((bms_ic[current_ic].system_open_wire &(1<<cell))>0) {
APS_Lab 0:f06ed53310a3 522 pc.printf("There is an open wire on IC%d Channel: %d\n", current_ic + 1, cell);
APS_Lab 0:f06ed53310a3 523 }
APS_Lab 0:f06ed53310a3 524 }
APS_Lab 0:f06ed53310a3 525 }
APS_Lab 0:f06ed53310a3 526 }
APS_Lab 0:f06ed53310a3 527 }
APS_Lab 0:f06ed53310a3 528
takuma1 4:e57b023e41f3 529
APS_Lab 0:f06ed53310a3 530 void print_aux(uint8_t datalog_en)
APS_Lab 0:f06ed53310a3 531 {
APS_Lab 0:f06ed53310a3 532
APS_Lab 0:f06ed53310a3 533 for (int current_ic =0 ; current_ic < TOTAL_IC; current_ic++) {
APS_Lab 0:f06ed53310a3 534 if (datalog_en == 0) {
APS_Lab 0:f06ed53310a3 535 pc.printf(" IC%d", current_ic+1);
APS_Lab 0:f06ed53310a3 536 for (int i=0; i < 5; i++) {
APS_Lab 0:f06ed53310a3 537 pc.printf(" GPIO-%d:%.4f,", i+1, bms_ic[current_ic].aux.a_codes[i]*0.0001);
APS_Lab 0:f06ed53310a3 538 }
APS_Lab 0:f06ed53310a3 539 pc.printf("Vref2:%.4f\n", bms_ic[current_ic].aux.a_codes[5]*0.0001);
APS_Lab 0:f06ed53310a3 540 } else {
APS_Lab 0:f06ed53310a3 541 pc.printf("AUX, ");
APS_Lab 0:f06ed53310a3 542 for (int i=0; i < 6; i++) {
APS_Lab 0:f06ed53310a3 543 pc.printf("%.4f,", bms_ic[current_ic].aux.a_codes[i]*0.0001);
APS_Lab 0:f06ed53310a3 544 }
APS_Lab 0:f06ed53310a3 545 }
APS_Lab 0:f06ed53310a3 546 }
APS_Lab 0:f06ed53310a3 547 pc.printf("\n");
APS_Lab 0:f06ed53310a3 548 }
APS_Lab 0:f06ed53310a3 549
takuma1 4:e57b023e41f3 550
APS_Lab 0:f06ed53310a3 551 void print_stat()
APS_Lab 0:f06ed53310a3 552 {
APS_Lab 0:f06ed53310a3 553
APS_Lab 0:f06ed53310a3 554 for (int current_ic =0 ; current_ic < TOTAL_IC; current_ic++) {
APS_Lab 0:f06ed53310a3 555 pc.printf("IC%d", current_ic+1);
APS_Lab 0:f06ed53310a3 556 pc.printf(" SOC:%.4f,", bms_ic[current_ic].stat.stat_codes[0]*0.0001*20);
APS_Lab 0:f06ed53310a3 557 pc.printf(" Itemp:%.4f,", bms_ic[current_ic].stat.stat_codes[1]*0.0001);
APS_Lab 0:f06ed53310a3 558 pc.printf(" VregA:%.4f,", bms_ic[current_ic].stat.stat_codes[2]*0.0001);
APS_Lab 0:f06ed53310a3 559 pc.printf(" VregD:%.4f\n", bms_ic[current_ic].stat.stat_codes[3]*0.0001);
APS_Lab 0:f06ed53310a3 560 }
APS_Lab 0:f06ed53310a3 561
APS_Lab 0:f06ed53310a3 562 pc.printf("\n");
APS_Lab 0:f06ed53310a3 563 }
APS_Lab 0:f06ed53310a3 564
takuma1 4:e57b023e41f3 565
APS_Lab 0:f06ed53310a3 566 void print_config()
APS_Lab 0:f06ed53310a3 567 {
APS_Lab 0:f06ed53310a3 568 int cfg_pec;
APS_Lab 0:f06ed53310a3 569
takuma1 3:a1368cd4b0a9 570 //pc.printf("Written Configuration: \n");
APS_Lab 0:f06ed53310a3 571 for (int current_ic = 0; current_ic<TOTAL_IC; current_ic++) {
takuma1 3:a1368cd4b0a9 572 //pc.printf(" IC ");
takuma1 3:a1368cd4b0a9 573 //pc.printf("%d", current_ic+1);
takuma1 3:a1368cd4b0a9 574 // pc.printf(": ");
takuma1 3:a1368cd4b0a9 575 //pc.printf("0x");
APS_Lab 0:f06ed53310a3 576 serial_print_hex(bms_ic[current_ic].config.tx_data[0]);
takuma1 3:a1368cd4b0a9 577 // pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 578 serial_print_hex(bms_ic[current_ic].config.tx_data[1]);
takuma1 3:a1368cd4b0a9 579 //pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 580 serial_print_hex(bms_ic[current_ic].config.tx_data[2]);
takuma1 3:a1368cd4b0a9 581 //pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 582 serial_print_hex(bms_ic[current_ic].config.tx_data[3]);
takuma1 3:a1368cd4b0a9 583 // pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 584 serial_print_hex(bms_ic[current_ic].config.tx_data[4]);
takuma1 3:a1368cd4b0a9 585 // pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 586 serial_print_hex(bms_ic[current_ic].config.tx_data[5]);
takuma1 3:a1368cd4b0a9 587 //pc.printf(", Calculated PEC: 0x");
APS_Lab 0:f06ed53310a3 588 cfg_pec = pec15_calc(6,&bms_ic[current_ic].config.tx_data[0]);
APS_Lab 0:f06ed53310a3 589 serial_print_hex((uint8_t)(cfg_pec>>8));
takuma1 3:a1368cd4b0a9 590 //pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 591 serial_print_hex((uint8_t)(cfg_pec));
takuma1 3:a1368cd4b0a9 592 // pc.printf("\n");
APS_Lab 0:f06ed53310a3 593 }
takuma1 3:a1368cd4b0a9 594 // pc.printf("\n");
APS_Lab 0:f06ed53310a3 595 }
APS_Lab 0:f06ed53310a3 596
takuma1 4:e57b023e41f3 597
APS_Lab 0:f06ed53310a3 598 void print_rxconfig()
APS_Lab 0:f06ed53310a3 599 {
takuma1 3:a1368cd4b0a9 600 //pc.printf("Received Configuration ");
APS_Lab 0:f06ed53310a3 601 for (int current_ic=0; current_ic<TOTAL_IC; current_ic++) {
takuma1 3:a1368cd4b0a9 602 // pc.printf(" IC ");
takuma1 3:a1368cd4b0a9 603 // pc.printf("%d", current_ic+1);
takuma1 3:a1368cd4b0a9 604 //pc.printf(": 0x");
APS_Lab 0:f06ed53310a3 605 serial_print_hex(bms_ic[current_ic].config.rx_data[0]);
takuma1 3:a1368cd4b0a9 606 //pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 607 serial_print_hex(bms_ic[current_ic].config.rx_data[1]);
takuma1 3:a1368cd4b0a9 608 //pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 609 serial_print_hex(bms_ic[current_ic].config.rx_data[2]);
takuma1 3:a1368cd4b0a9 610 //pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 611 serial_print_hex(bms_ic[current_ic].config.rx_data[3]);
takuma1 3:a1368cd4b0a9 612 //pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 613 serial_print_hex(bms_ic[current_ic].config.rx_data[4]);
takuma1 3:a1368cd4b0a9 614 // pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 615 serial_print_hex(bms_ic[current_ic].config.rx_data[5]);
takuma1 3:a1368cd4b0a9 616 //pc.printf(", Received PEC: 0x");
APS_Lab 0:f06ed53310a3 617 serial_print_hex(bms_ic[current_ic].config.rx_data[6]);
takuma1 3:a1368cd4b0a9 618 //pc.printf(", 0x");
APS_Lab 0:f06ed53310a3 619 serial_print_hex(bms_ic[current_ic].config.rx_data[7]);
takuma1 3:a1368cd4b0a9 620 // pc.printf("\n");
APS_Lab 0:f06ed53310a3 621 }
APS_Lab 0:f06ed53310a3 622 pc.printf("\n");
APS_Lab 0:f06ed53310a3 623 }
APS_Lab 0:f06ed53310a3 624
APS_Lab 0:f06ed53310a3 625 void print_pec()
APS_Lab 0:f06ed53310a3 626 {
APS_Lab 0:f06ed53310a3 627 for (int current_ic=0; current_ic<TOTAL_IC; current_ic++) {
APS_Lab 0:f06ed53310a3 628 pc.printf("\n%d", bms_ic[current_ic].crc_count.pec_count);
APS_Lab 0:f06ed53310a3 629 pc.printf(" : PEC Errors Detected on IC");
APS_Lab 0:f06ed53310a3 630 pc.printf("%d\n", current_ic+1);
APS_Lab 0:f06ed53310a3 631 }
APS_Lab 0:f06ed53310a3 632 }
APS_Lab 0:f06ed53310a3 633
APS_Lab 0:f06ed53310a3 634
APS_Lab 0:f06ed53310a3 635 void serial_print_hex(uint8_t data)
APS_Lab 0:f06ed53310a3 636 {
takuma1 3:a1368cd4b0a9 637 /*
APS_Lab 0:f06ed53310a3 638 if (data < 16) {
takuma1 3:a1368cd4b0a9 639 //pc.printf("0x0%X", data);
APS_Lab 0:f06ed53310a3 640 } else
takuma1 3:a1368cd4b0a9 641 pc.printf("0x%X", data);
takuma1 3:a1368cd4b0a9 642 */
APS_Lab 0:f06ed53310a3 643 }
APS_Lab 0:f06ed53310a3 644
APS_Lab 0:f06ed53310a3 645 //Function to check error flag and print PEC error message
APS_Lab 0:f06ed53310a3 646 void check_error(int error)
APS_Lab 0:f06ed53310a3 647 {
APS_Lab 0:f06ed53310a3 648 if (error == -1) {
APS_Lab 0:f06ed53310a3 649 pc.printf("A PEC error was detected in the received data");
APS_Lab 0:f06ed53310a3 650 }
APS_Lab 0:f06ed53310a3 651 }
APS_Lab 0:f06ed53310a3 652
APS_Lab 0:f06ed53310a3 653
takuma1 4:e57b023e41f3 654
APS_Lab 0:f06ed53310a3 655 char hex_digits[16]= {
APS_Lab 0:f06ed53310a3 656 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
APS_Lab 0:f06ed53310a3 657 };
APS_Lab 0:f06ed53310a3 658
takuma1 4:e57b023e41f3 659
APS_Lab 0:f06ed53310a3 660
APS_Lab 0:f06ed53310a3 661 char hex_to_byte_buffer[5]= {
APS_Lab 0:f06ed53310a3 662 '0', 'x', '0', '0', '\0'
APS_Lab 0:f06ed53310a3 663 }; // buffer for ASCII hex to byte conversion
APS_Lab 0:f06ed53310a3 664 char byte_to_hex_buffer[3]= {
APS_Lab 0:f06ed53310a3 665 '\0','\0','\0'
APS_Lab 0:f06ed53310a3 666 };
APS_Lab 0:f06ed53310a3 667
takuma1 2:f6f76dde7e1d 668 // シリアル インターフェイスから ui_バッファへのデータの読み取り
APS_Lab 0:f06ed53310a3 669 uint8_t read_data()
APS_Lab 0:f06ed53310a3 670 {
takuma1 2:f6f76dde7e1d 671 uint8_t index = 0; // 内の現在の場所を保持するインデックス
takuma1 2:f6f76dde7e1d 672 int c; // 着信キーストロークの格納に使用される単一の文字
APS_Lab 0:f06ed53310a3 673 //pc.printf("check 1\n");
APS_Lab 0:f06ed53310a3 674 while (index < UI_BUFFER_SIZE-1) {
APS_Lab 0:f06ed53310a3 675 //pc.printf("check 2\n");
takuma1 4:e57b023e41f3 676 c = pc.getc();
APS_Lab 0:f06ed53310a3 677 //return c;
APS_Lab 0:f06ed53310a3 678 //pc.printf("check 3\n");
APS_Lab 0:f06ed53310a3 679
takuma1 4:e57b023e41f3 680 if (((char) c == '\r') || ((char) c == '\n')) break;
takuma1 4:e57b023e41f3 681 if ( ((char) c == '\x7F') || ((char) c == '\x08') ) {
APS_Lab 0:f06ed53310a3 682 if (index > 0) index--;
APS_Lab 0:f06ed53310a3 683 } else if (c >= 0) {
takuma1 4:e57b023e41f3 684 ui_buffer[index++]=(char) c;
APS_Lab 0:f06ed53310a3 685 }
APS_Lab 0:f06ed53310a3 686 //pc.printf("check 4\n");
APS_Lab 0:f06ed53310a3 687
APS_Lab 0:f06ed53310a3 688 }
takuma1 4:e57b023e41f3 689 ui_buffer[index]='\0';
APS_Lab 0:f06ed53310a3 690
takuma1 4:e57b023e41f3 691 if ((char) c == '\r') {
APS_Lab 0:f06ed53310a3 692 wait_ms(1);
APS_Lab 0:f06ed53310a3 693 //pc.printf("check 5\n");
APS_Lab 0:f06ed53310a3 694
APS_Lab 0:f06ed53310a3 695 if (pc.readable()==1) {
APS_Lab 0:f06ed53310a3 696 //pc.printf("check 6\n");
takuma1 4:e57b023e41f3 697 pc.getc();
APS_Lab 0:f06ed53310a3 698 }
takuma1 4:e57b023e41f3 699
APS_Lab 0:f06ed53310a3 700
APS_Lab 0:f06ed53310a3 701 }
takuma1 4:e57b023e41f3 702
APS_Lab 0:f06ed53310a3 703
takuma1 4:e57b023e41f3 704 return index;
APS_Lab 0:f06ed53310a3 705 }
APS_Lab 0:f06ed53310a3 706
takuma1 4:e57b023e41f3 707
APS_Lab 0:f06ed53310a3 708 float read_float()
APS_Lab 0:f06ed53310a3 709 {
APS_Lab 0:f06ed53310a3 710 float data;
APS_Lab 0:f06ed53310a3 711 read_data();
APS_Lab 0:f06ed53310a3 712 data = atof(ui_buffer);
APS_Lab 0:f06ed53310a3 713 return(data);
APS_Lab 0:f06ed53310a3 714 }
APS_Lab 0:f06ed53310a3 715
takuma1 4:e57b023e41f3 716
APS_Lab 0:f06ed53310a3 717 int32_t read_int()
APS_Lab 0:f06ed53310a3 718 {
APS_Lab 0:f06ed53310a3 719 int32_t data;
APS_Lab 0:f06ed53310a3 720 read_data();
APS_Lab 0:f06ed53310a3 721 if (ui_buffer[0] == 'm')
APS_Lab 0:f06ed53310a3 722 return('m');
APS_Lab 0:f06ed53310a3 723 if ((ui_buffer[0] == 'B') || (ui_buffer[0] == 'b')) {
APS_Lab 0:f06ed53310a3 724 data = strtol(ui_buffer+1, NULL, 2);
APS_Lab 0:f06ed53310a3 725 } else
APS_Lab 0:f06ed53310a3 726 data = strtol(ui_buffer, NULL, 0);
APS_Lab 0:f06ed53310a3 727 return(data);
APS_Lab 0:f06ed53310a3 728 }
APS_Lab 0:f06ed53310a3 729
APS_Lab 0:f06ed53310a3 730 char *read_string()
APS_Lab 0:f06ed53310a3 731 {
APS_Lab 0:f06ed53310a3 732 read_data();
APS_Lab 0:f06ed53310a3 733 return(ui_buffer);
APS_Lab 0:f06ed53310a3 734 }
APS_Lab 0:f06ed53310a3 735
takuma1 4:e57b023e41f3 736
APS_Lab 0:f06ed53310a3 737 int8_t read_char()
APS_Lab 0:f06ed53310a3 738 {
APS_Lab 0:f06ed53310a3 739 read_data();
APS_Lab 0:f06ed53310a3 740 return(ui_buffer[0]);
APS_Lab 0:f06ed53310a3 741 }