BMS

Dependencies:   bms_master mbed

Committer:
open4416
Date:
Mon Jan 22 03:43:00 2018 +0000
Revision:
8:404c4d795fde
Parent:
7:5f7232441106
V1.00

Who changed what in which revision?

UserRevisionLine numberNew contents of line
roger5641 2:e0ec3ed506ea 1 /*
open4416 8:404c4d795fde 2 LTC6811-1: Battery stack monitor
open4416 8:404c4d795fde 3 */
roger5641 0:3547f7580dbd 4 #include "mbed.h"
open4416 8:404c4d795fde 5 #include "stdint.h"
open4416 8:404c4d795fde 6 #include "Linduino.h"
open4416 8:404c4d795fde 7 #include "LT_SPI.h"
open4416 8:404c4d795fde 8 #include "UserInterface.h"
open4416 8:404c4d795fde 9 #include "LTC681x.h"
open4416 8:404c4d795fde 10 #include "LTC6811.h"
open4416 8:404c4d795fde 11 SPI spi(A6,A5,A4);
open4416 8:404c4d795fde 12 DigitalOut spi_CS(A3, 1);
roger5641 0:3547f7580dbd 13
roger5641 0:3547f7580dbd 14 #define ENABLED 1
roger5641 0:3547f7580dbd 15 #define DISABLED 0
roger5641 0:3547f7580dbd 16
roger5641 0:3547f7580dbd 17 #define DATALOG_ENABLED 1
roger5641 0:3547f7580dbd 18 #define DATALOG_DISABLED 0
roger5641 0:3547f7580dbd 19
open4416 8:404c4d795fde 20 void run_command(uint32_t cmd);
open4416 8:404c4d795fde 21 void measurement_loop(uint8_t datalog_en);
roger5641 0:3547f7580dbd 22 void print_menu();
roger5641 0:3547f7580dbd 23 void print_cells(uint8_t datalog_en);
roger5641 0:3547f7580dbd 24 void print_open();
open4416 8:404c4d795fde 25 void print_aux(uint8_t datalog_en);
open4416 8:404c4d795fde 26 void print_stat();
roger5641 0:3547f7580dbd 27 void print_config();
roger5641 0:3547f7580dbd 28 void print_rxconfig();
open4416 8:404c4d795fde 29 void print_pec(void);
open4416 8:404c4d795fde 30 void serial_print_hex(uint8_t data);
roger5641 0:3547f7580dbd 31 void check_error(int error);
open4416 8:404c4d795fde 32 //char get_char();
open4416 8:404c4d795fde 33 //void read_config_data(uint8_t cfg_data[][6], uint8_t nIC);
open4416 8:404c4d795fde 34
roger5641 0:3547f7580dbd 35 /**********************************************************
roger5641 0:3547f7580dbd 36 Setup Variables
roger5641 0:3547f7580dbd 37 The following variables can be modified to
roger5641 0:3547f7580dbd 38 configure the software.
roger5641 0:3547f7580dbd 39
roger5641 0:3547f7580dbd 40 ***********************************************************/
open4416 8:404c4d795fde 41 const uint8_t TOTAL_IC = 1;//!<number of ICs in the daisy chain
roger5641 0:3547f7580dbd 42
roger5641 0:3547f7580dbd 43 //ADC Command Configurations
roger5641 0:3547f7580dbd 44 const uint8_t ADC_OPT = ADC_OPT_DISABLED; // See LTC6811_daisy.h for Options
roger5641 0:3547f7580dbd 45 const uint8_t ADC_CONVERSION_MODE = MD_7KHZ_3KHZ;//MD_7KHZ_3KHZ; //MD_26HZ_2KHZ;//MD_7KHZ_3KHZ; // See LTC6811_daisy.h for Options
roger5641 0:3547f7580dbd 46 const uint8_t ADC_DCP = DCP_DISABLED; // See LTC6811_daisy.h for Options
roger5641 0:3547f7580dbd 47 const uint8_t CELL_CH_TO_CONVERT = CELL_CH_ALL; // See LTC6811_daisy.h for Options
roger5641 0:3547f7580dbd 48 const uint8_t AUX_CH_TO_CONVERT = AUX_CH_ALL; // See LTC6811_daisy.h for Options
roger5641 0:3547f7580dbd 49 const uint8_t STAT_CH_TO_CONVERT = STAT_CH_ALL; // See LTC6811_daisy.h for Options
roger5641 0:3547f7580dbd 50
roger5641 0:3547f7580dbd 51 const uint16_t MEASUREMENT_LOOP_TIME = 500;//milliseconds(mS)
roger5641 0:3547f7580dbd 52
roger5641 0:3547f7580dbd 53 //Under Voltage and Over Voltage Thresholds
roger5641 0:3547f7580dbd 54 const uint16_t OV_THRESHOLD = 41000; // Over voltage threshold ADC Code. LSB = 0.0001
roger5641 0:3547f7580dbd 55 const uint16_t UV_THRESHOLD = 30000; // Under voltage threshold ADC Code. LSB = 0.0001
roger5641 0:3547f7580dbd 56
roger5641 0:3547f7580dbd 57 //Loop Measurement Setup These Variables are ENABLED or DISABLED Remember ALL CAPS
roger5641 0:3547f7580dbd 58 const uint8_t WRITE_CONFIG = DISABLED; // This is ENABLED or DISABLED
roger5641 0:3547f7580dbd 59 const uint8_t READ_CONFIG = DISABLED; // This is ENABLED or DISABLED
roger5641 0:3547f7580dbd 60 const uint8_t MEASURE_CELL = ENABLED; // This is ENABLED or DISABLED
roger5641 0:3547f7580dbd 61 const uint8_t MEASURE_AUX = DISABLED; // This is ENABLED or DISABLED
roger5641 0:3547f7580dbd 62 const uint8_t MEASURE_STAT = DISABLED; //This is ENABLED or DISABLED
roger5641 0:3547f7580dbd 63 const uint8_t PRINT_PEC = DISABLED; //This is ENABLED or DISABLED
roger5641 0:3547f7580dbd 64 /************************************
roger5641 0:3547f7580dbd 65 END SETUP
roger5641 0:3547f7580dbd 66 *************************************/
roger5641 0:3547f7580dbd 67
roger5641 0:3547f7580dbd 68 /******************************************************
roger5641 0:3547f7580dbd 69 *** Global Battery Variables received from 681x commands
roger5641 0:3547f7580dbd 70 These variables store the results from the LTC6811
roger5641 0:3547f7580dbd 71 register reads and the array lengths must be based
roger5641 0:3547f7580dbd 72 on the number of ICs on the stack
roger5641 0:3547f7580dbd 73 ******************************************************/
roger5641 0:3547f7580dbd 74
roger5641 0:3547f7580dbd 75 cell_asic bms_ic[TOTAL_IC];
roger5641 0:3547f7580dbd 76
roger5641 0:3547f7580dbd 77 /*!*********************************************************************
roger5641 0:3547f7580dbd 78 \brief main loop
roger5641 0:3547f7580dbd 79 ***********************************************************************/
roger5641 0:3547f7580dbd 80 int main(void)
roger5641 0:3547f7580dbd 81 {
roger5641 2:e0ec3ed506ea 82 pc.baud(115200);
open4416 8:404c4d795fde 83 spi_enable();
roger5641 2:e0ec3ed506ea 84 LTC681x_init_cfg(TOTAL_IC, bms_ic);
open4416 8:404c4d795fde 85 LTC6811_reset_crc_count(TOTAL_IC,bms_ic);
roger5641 2:e0ec3ed506ea 86 LTC6811_init_reg_limits(TOTAL_IC,bms_ic);
roger5641 2:e0ec3ed506ea 87 print_menu();
open4416 8:404c4d795fde 88
open4416 8:404c4d795fde 89 while(1) {
open4416 8:404c4d795fde 90 if (pc.readable()) { // Check for user input
roger5641 2:e0ec3ed506ea 91 uint32_t user_command;
roger5641 2:e0ec3ed506ea 92 user_command = read_int(); // Read the user command
roger5641 4:47d6a0b63e38 93 pc.printf("%d\n",user_command);
roger5641 2:e0ec3ed506ea 94 run_command(user_command);
roger5641 2:e0ec3ed506ea 95 }
roger5641 2:e0ec3ed506ea 96 }
roger5641 0:3547f7580dbd 97 }
roger5641 0:3547f7580dbd 98
roger5641 0:3547f7580dbd 99 /*!*****************************************
roger5641 0:3547f7580dbd 100 \brief executes the user command
roger5641 0:3547f7580dbd 101 *******************************************/
roger5641 0:3547f7580dbd 102
roger5641 0:3547f7580dbd 103 void run_command(uint32_t cmd)
roger5641 0:3547f7580dbd 104 {
open4416 8:404c4d795fde 105 int8_t error = 0;
open4416 8:404c4d795fde 106 uint32_t conv_time = 0;
open4416 8:404c4d795fde 107 // uint32_t user_command;
open4416 8:404c4d795fde 108 int8_t readIC=0;
open4416 8:404c4d795fde 109 char input = 0;
open4416 8:404c4d795fde 110 switch (cmd) {
roger5641 0:3547f7580dbd 111
open4416 8:404c4d795fde 112 case 1: // Write Configuration Register
open4416 8:404c4d795fde 113 wakeup_sleep(TOTAL_IC);
open4416 8:404c4d795fde 114 LTC6811_wrcfg(TOTAL_IC,bms_ic);
open4416 8:404c4d795fde 115 print_config();
open4416 8:404c4d795fde 116 break;
roger5641 0:3547f7580dbd 117
open4416 8:404c4d795fde 118 case 2: // Read Configuration Register
open4416 8:404c4d795fde 119 wakeup_sleep(TOTAL_IC);
open4416 8:404c4d795fde 120 error = LTC6811_rdcfg(TOTAL_IC,bms_ic);
open4416 8:404c4d795fde 121 check_error(error);
open4416 8:404c4d795fde 122 print_rxconfig();
open4416 8:404c4d795fde 123 break;
roger5641 0:3547f7580dbd 124
open4416 8:404c4d795fde 125 case 3: // Start Cell ADC Measurement
open4416 8:404c4d795fde 126 wakeup_sleep(TOTAL_IC);
open4416 8:404c4d795fde 127 LTC6811_adcv(ADC_CONVERSION_MODE,ADC_DCP,CELL_CH_TO_CONVERT);
open4416 8:404c4d795fde 128 conv_time = LTC6811_pollAdc();
open4416 8:404c4d795fde 129 pc.printf("cell conversion completed in:");
open4416 8:404c4d795fde 130 pc.printf("%.1f",((float)conv_time/1000));
open4416 8:404c4d795fde 131 pc.printf("mS\n");
open4416 8:404c4d795fde 132 break;
roger5641 0:3547f7580dbd 133
open4416 8:404c4d795fde 134 case 4: // Read Cell Voltage Registers
open4416 8:404c4d795fde 135 wakeup_sleep(TOTAL_IC);
open4416 8:404c4d795fde 136 error = LTC6811_rdcv(0, TOTAL_IC,bms_ic); // Set to read back all cell voltage registers
open4416 8:404c4d795fde 137 check_error(error);
open4416 8:404c4d795fde 138 print_cells(DATALOG_DISABLED);
open4416 8:404c4d795fde 139 break;
roger5641 0:3547f7580dbd 140
open4416 8:404c4d795fde 141 case 5: // Start GPIO ADC Measurement
open4416 8:404c4d795fde 142 wakeup_sleep(TOTAL_IC);
open4416 8:404c4d795fde 143 LTC6811_adax(ADC_CONVERSION_MODE , AUX_CH_TO_CONVERT);
open4416 8:404c4d795fde 144 LTC6811_pollAdc();
open4416 8:404c4d795fde 145 pc.printf("aux conversion completed\n");
open4416 8:404c4d795fde 146 pc.printf("\n");
open4416 8:404c4d795fde 147 break;
roger5641 0:3547f7580dbd 148
open4416 8:404c4d795fde 149 case 6: // Read AUX Voltage Registers
open4416 8:404c4d795fde 150 wakeup_sleep(TOTAL_IC);
open4416 8:404c4d795fde 151 error = LTC6811_rdaux(0,TOTAL_IC,bms_ic); // Set to read back all aux registers
open4416 8:404c4d795fde 152 check_error(error);
open4416 8:404c4d795fde 153 print_aux(DATALOG_DISABLED);
open4416 8:404c4d795fde 154 break;
roger5641 0:3547f7580dbd 155
open4416 8:404c4d795fde 156 case 7: // Start Status ADC Measurement
open4416 8:404c4d795fde 157 wakeup_sleep(TOTAL_IC);
open4416 8:404c4d795fde 158 LTC6811_adstat(ADC_CONVERSION_MODE, STAT_CH_TO_CONVERT);
open4416 8:404c4d795fde 159 LTC6811_pollAdc();
open4416 8:404c4d795fde 160 pc.printf("stat conversion completed\n");
open4416 8:404c4d795fde 161 pc.printf("\n");
open4416 8:404c4d795fde 162 break;
roger5641 0:3547f7580dbd 163
open4416 8:404c4d795fde 164 case 8: // Read Status registers
open4416 8:404c4d795fde 165 wakeup_sleep(TOTAL_IC);
open4416 8:404c4d795fde 166 error = LTC6811_rdstat(0,TOTAL_IC,bms_ic); // Set to read back all aux registers
open4416 8:404c4d795fde 167 check_error(error);
open4416 8:404c4d795fde 168 print_stat();
open4416 8:404c4d795fde 169 break;
roger5641 0:3547f7580dbd 170
open4416 8:404c4d795fde 171 case 9: // Loop Measurements
open4416 8:404c4d795fde 172 pc.printf("transmit 'm' to quit\n");
open4416 8:404c4d795fde 173 wakeup_sleep(TOTAL_IC);
open4416 8:404c4d795fde 174 LTC6811_wrcfg(TOTAL_IC,bms_ic);
open4416 8:404c4d795fde 175 while (input != 'm') {
open4416 8:404c4d795fde 176 if (pc.readable()) {
open4416 8:404c4d795fde 177 input = read_char();
open4416 8:404c4d795fde 178 }
roger5641 0:3547f7580dbd 179
open4416 8:404c4d795fde 180 measurement_loop(DATALOG_DISABLED);
roger5641 0:3547f7580dbd 181
open4416 8:404c4d795fde 182 wait_ms(MEASUREMENT_LOOP_TIME);
open4416 8:404c4d795fde 183 }
open4416 8:404c4d795fde 184 //print_menu();
open4416 8:404c4d795fde 185 break;
roger5641 0:3547f7580dbd 186
open4416 8:404c4d795fde 187 case 10: // Run open wire self test
open4416 8:404c4d795fde 188 print_pec();
roger5641 0:3547f7580dbd 189
open4416 8:404c4d795fde 190 break;
roger5641 0:3547f7580dbd 191
open4416 8:404c4d795fde 192 case 11: // Read in raw configuration data
open4416 8:404c4d795fde 193 LTC6811_reset_crc_count(TOTAL_IC,bms_ic);
open4416 8:404c4d795fde 194 break;
roger5641 0:3547f7580dbd 195
open4416 8:404c4d795fde 196 case 12: // Run the ADC/Memory Self Test
open4416 8:404c4d795fde 197 wakeup_sleep(TOTAL_IC);
open4416 8:404c4d795fde 198 error = LTC6811_run_cell_adc_st(CELL,ADC_CONVERSION_MODE,bms_ic);
open4416 8:404c4d795fde 199 pc.printf("%d", error);
open4416 8:404c4d795fde 200 pc.printf(" : errors detected in Digital Filter and CELL Memory\n");
roger5641 0:3547f7580dbd 201
open4416 8:404c4d795fde 202 wakeup_sleep(TOTAL_IC);
open4416 8:404c4d795fde 203 error = LTC6811_run_cell_adc_st(AUX,ADC_CONVERSION_MODE, bms_ic);
open4416 8:404c4d795fde 204 pc.printf("%d",error);
open4416 8:404c4d795fde 205 pc.printf(" : errors detected in Digital Filter and AUX Memory\n");
roger5641 0:3547f7580dbd 206
open4416 8:404c4d795fde 207 wakeup_sleep(TOTAL_IC);
open4416 8:404c4d795fde 208 error = LTC6811_run_cell_adc_st(STAT,ADC_CONVERSION_MODE, bms_ic);
open4416 8:404c4d795fde 209 pc.printf("%d",error);
open4416 8:404c4d795fde 210 pc.printf(" : errors detected in Digital Filter and STAT Memory\n");
open4416 8:404c4d795fde 211 print_menu();
open4416 8:404c4d795fde 212 break;
roger5641 0:3547f7580dbd 213
open4416 8:404c4d795fde 214 case 13: // Enable a discharge transistor
open4416 8:404c4d795fde 215 pc.printf("Please enter the Spin number\n");
open4416 8:404c4d795fde 216 readIC = (int8_t)read_int();
open4416 8:404c4d795fde 217 LTC6811_set_discharge(readIC,TOTAL_IC,bms_ic);
open4416 8:404c4d795fde 218 wakeup_sleep(TOTAL_IC);
open4416 8:404c4d795fde 219 LTC6811_wrcfg(TOTAL_IC,bms_ic);
open4416 8:404c4d795fde 220 print_config();
open4416 8:404c4d795fde 221 break;
roger5641 0:3547f7580dbd 222
open4416 8:404c4d795fde 223 case 14: // Clear all discharge transistors
open4416 8:404c4d795fde 224 clear_discharge(TOTAL_IC,bms_ic);
open4416 8:404c4d795fde 225 wakeup_sleep(TOTAL_IC);
open4416 8:404c4d795fde 226 LTC6811_wrcfg(TOTAL_IC,bms_ic);
open4416 8:404c4d795fde 227 print_config();
open4416 8:404c4d795fde 228 break;
open4416 8:404c4d795fde 229
open4416 8:404c4d795fde 230 case 15: // Clear all ADC measurement registers
open4416 8:404c4d795fde 231 wakeup_sleep(TOTAL_IC);
open4416 8:404c4d795fde 232 LTC6811_clrcell();
open4416 8:404c4d795fde 233 LTC6811_clraux();
open4416 8:404c4d795fde 234 LTC6811_clrstat();
open4416 8:404c4d795fde 235 pc.printf("All Registers Cleared\n");
open4416 8:404c4d795fde 236 break;
roger5641 0:3547f7580dbd 237
open4416 8:404c4d795fde 238 case 16: // Run the Mux Decoder Self Test
open4416 8:404c4d795fde 239 wakeup_sleep(TOTAL_IC);
open4416 8:404c4d795fde 240 LTC6811_diagn();
open4416 8:404c4d795fde 241 wait_ms(5);
open4416 8:404c4d795fde 242 error = LTC6811_rdstat(0,TOTAL_IC,bms_ic); // Set to read back all aux registers
open4416 8:404c4d795fde 243 check_error(error);
open4416 8:404c4d795fde 244 error = 0;
open4416 8:404c4d795fde 245 for (int ic = 0;
open4416 8:404c4d795fde 246 ic<TOTAL_IC;
open4416 8:404c4d795fde 247 ic++) {
open4416 8:404c4d795fde 248 if (bms_ic[ic].stat.mux_fail[0] != 0) error++;
open4416 8:404c4d795fde 249 }
open4416 8:404c4d795fde 250 if (error==0) pc.printf("Mux Test: PASS\n");
open4416 8:404c4d795fde 251 else pc.printf("Mux Test: FAIL\n");
roger5641 0:3547f7580dbd 252
open4416 8:404c4d795fde 253 break;
roger5641 0:3547f7580dbd 254
open4416 8:404c4d795fde 255 case 17: // Run ADC Overlap self test
open4416 8:404c4d795fde 256 wakeup_sleep(TOTAL_IC);
open4416 8:404c4d795fde 257 error = (int8_t)LTC6811_run_adc_overlap(TOTAL_IC,bms_ic);
open4416 8:404c4d795fde 258 if (error==0) pc.printf("Overlap Test: PASS\n");
open4416 8:404c4d795fde 259 else pc.printf("Overlap Test: FAIL\n");
open4416 8:404c4d795fde 260 break;
roger5641 0:3547f7580dbd 261
open4416 8:404c4d795fde 262 case 18: // Run ADC Redundancy self test
open4416 8:404c4d795fde 263 wakeup_sleep(TOTAL_IC);
open4416 8:404c4d795fde 264 error = LTC6811_run_adc_redundancy_st(ADC_CONVERSION_MODE,AUX,TOTAL_IC, bms_ic);
open4416 8:404c4d795fde 265 pc.printf("%d",error);
open4416 8:404c4d795fde 266 pc.printf(" : errors detected in AUX Measurement\n");
roger5641 0:3547f7580dbd 267
open4416 8:404c4d795fde 268 wakeup_sleep(TOTAL_IC);
open4416 8:404c4d795fde 269 error = LTC6811_run_adc_redundancy_st(ADC_CONVERSION_MODE,STAT,TOTAL_IC, bms_ic);
open4416 8:404c4d795fde 270 pc.printf("%d",error);
open4416 8:404c4d795fde 271 pc.printf(" : errors detected in STAT Measurement\n");
open4416 8:404c4d795fde 272 break;
roger5641 0:3547f7580dbd 273
open4416 8:404c4d795fde 274 case 19:
open4416 8:404c4d795fde 275 LTC6811_run_openwire(TOTAL_IC, bms_ic);
open4416 8:404c4d795fde 276 print_open();
open4416 8:404c4d795fde 277 break;
roger5641 0:3547f7580dbd 278
open4416 8:404c4d795fde 279 case 20: //Datalog print option Loop Measurements
open4416 8:404c4d795fde 280 pc.printf("transmit 'm' to quit\n");
open4416 8:404c4d795fde 281 wakeup_sleep(TOTAL_IC);
open4416 8:404c4d795fde 282 LTC6811_wrcfg(TOTAL_IC,bms_ic);
open4416 8:404c4d795fde 283 while (input != 'm') {
open4416 8:404c4d795fde 284 if (pc.readable()) {
open4416 8:404c4d795fde 285 input = read_char();
open4416 8:404c4d795fde 286 }
roger5641 0:3547f7580dbd 287
open4416 8:404c4d795fde 288 measurement_loop(DATALOG_ENABLED);
open4416 8:404c4d795fde 289
open4416 8:404c4d795fde 290 wait_ms(MEASUREMENT_LOOP_TIME);
open4416 8:404c4d795fde 291 }
open4416 8:404c4d795fde 292 print_menu();
open4416 8:404c4d795fde 293 break;
roger5641 0:3547f7580dbd 294
open4416 8:404c4d795fde 295 case 'm': //prints menu
open4416 8:404c4d795fde 296 print_menu();
open4416 8:404c4d795fde 297 break;
roger5641 0:3547f7580dbd 298
open4416 8:404c4d795fde 299 default:
open4416 8:404c4d795fde 300 pc.printf("Incorrect Option\n");
open4416 8:404c4d795fde 301 break;
open4416 8:404c4d795fde 302 }
roger5641 0:3547f7580dbd 303 }
roger5641 0:3547f7580dbd 304
roger5641 0:3547f7580dbd 305 void measurement_loop(uint8_t datalog_en)
roger5641 0:3547f7580dbd 306 {
open4416 8:404c4d795fde 307 int8_t error = 0;
open4416 8:404c4d795fde 308 if (WRITE_CONFIG == ENABLED) {
open4416 8:404c4d795fde 309 wakeup_sleep(TOTAL_IC);
open4416 8:404c4d795fde 310 LTC6811_wrcfg(TOTAL_IC,bms_ic);
open4416 8:404c4d795fde 311 print_config();
open4416 8:404c4d795fde 312 }
roger5641 0:3547f7580dbd 313
open4416 8:404c4d795fde 314 if (READ_CONFIG == ENABLED) {
open4416 8:404c4d795fde 315 wakeup_sleep(TOTAL_IC);
open4416 8:404c4d795fde 316 error = LTC6811_rdcfg(TOTAL_IC,bms_ic);
open4416 8:404c4d795fde 317 check_error(error);
open4416 8:404c4d795fde 318 print_rxconfig();
open4416 8:404c4d795fde 319 }
roger5641 0:3547f7580dbd 320
open4416 8:404c4d795fde 321 if (MEASURE_CELL == ENABLED) {
open4416 8:404c4d795fde 322 wakeup_idle(TOTAL_IC);
open4416 8:404c4d795fde 323 LTC6811_adcv(ADC_CONVERSION_MODE,ADC_DCP,CELL_CH_TO_CONVERT);
open4416 8:404c4d795fde 324 LTC6811_pollAdc();
open4416 8:404c4d795fde 325 wakeup_idle(TOTAL_IC);
open4416 8:404c4d795fde 326 error = LTC6811_rdcv(0, TOTAL_IC,bms_ic);
open4416 8:404c4d795fde 327 check_error(error);
open4416 8:404c4d795fde 328 print_cells(datalog_en);
roger5641 0:3547f7580dbd 329
open4416 8:404c4d795fde 330 }
roger5641 0:3547f7580dbd 331
open4416 8:404c4d795fde 332 if (MEASURE_AUX == ENABLED) {
open4416 8:404c4d795fde 333 wakeup_idle(TOTAL_IC);
open4416 8:404c4d795fde 334 LTC6811_adax(ADC_CONVERSION_MODE , AUX_CH_ALL);
open4416 8:404c4d795fde 335 LTC6811_pollAdc();
open4416 8:404c4d795fde 336 wakeup_idle(TOTAL_IC);
open4416 8:404c4d795fde 337 error = LTC6811_rdaux(0,TOTAL_IC,bms_ic); // Set to read back all aux registers
open4416 8:404c4d795fde 338 check_error(error);
open4416 8:404c4d795fde 339 print_aux(datalog_en);
open4416 8:404c4d795fde 340 }
roger5641 0:3547f7580dbd 341
open4416 8:404c4d795fde 342 if (MEASURE_STAT == ENABLED) {
open4416 8:404c4d795fde 343 wakeup_idle(TOTAL_IC);
open4416 8:404c4d795fde 344 LTC6811_adstat(ADC_CONVERSION_MODE, STAT_CH_ALL);
open4416 8:404c4d795fde 345 LTC6811_pollAdc();
open4416 8:404c4d795fde 346 wakeup_idle(TOTAL_IC);
open4416 8:404c4d795fde 347 error = LTC6811_rdstat(0,TOTAL_IC,bms_ic); // Set to read back all aux registers
open4416 8:404c4d795fde 348 check_error(error);
open4416 8:404c4d795fde 349 print_stat();
open4416 8:404c4d795fde 350 }
roger5641 0:3547f7580dbd 351
open4416 8:404c4d795fde 352 if (PRINT_PEC == ENABLED) {
open4416 8:404c4d795fde 353 print_pec();
open4416 8:404c4d795fde 354 }
roger5641 0:3547f7580dbd 355
roger5641 0:3547f7580dbd 356 }
roger5641 0:3547f7580dbd 357
roger5641 0:3547f7580dbd 358
roger5641 0:3547f7580dbd 359 /*!*********************************
roger5641 0:3547f7580dbd 360 \brief Prints the main menu
roger5641 0:3547f7580dbd 361 ***********************************/
roger5641 0:3547f7580dbd 362 void print_menu()
roger5641 0:3547f7580dbd 363 {
open4416 8:404c4d795fde 364 pc.printf("Please enter LTC6811 Command\n");
open4416 8:404c4d795fde 365 pc.printf("Write Configuration: 1 | Reset PEC Counter: 11\n");
open4416 8:404c4d795fde 366 pc.printf("Read Configuration: 2 | Run ADC Self Test: 12\n");
open4416 8:404c4d795fde 367 pc.printf("Start Cell Voltage Conversion: 3 | Set Discharge: 13\n");
open4416 8:404c4d795fde 368 pc.printf("Read Cell Voltages: 4 | Clear Discharge: 14\n");
open4416 8:404c4d795fde 369 pc.printf("Start Aux Voltage Conversion: 5 | Clear Registers: 15\n");
open4416 8:404c4d795fde 370 pc.printf("Read Aux Voltages: 6 | Run Mux Self Test: 16\n");
open4416 8:404c4d795fde 371 pc.printf("Start Stat Voltage Conversion: 7 | Run ADC overlap Test: 17\n");
open4416 8:404c4d795fde 372 pc.printf("Read Stat Voltages: 8 | Run Digital Redundancy Test: 18\n");
open4416 8:404c4d795fde 373 pc.printf("loop Measurements: 9 | Run Open Wire Test: 19\n");
open4416 8:404c4d795fde 374 pc.printf("Read PEC Errors: 10 | Loop measurements with datalog output: 20\n");
open4416 8:404c4d795fde 375 pc.printf("\n");
open4416 8:404c4d795fde 376 pc.printf("Please enter command:\n");
open4416 8:404c4d795fde 377 pc.printf("\n");
roger5641 0:3547f7580dbd 378 }
roger5641 0:3547f7580dbd 379
roger5641 0:3547f7580dbd 380 /*!************************************************************
open4416 8:404c4d795fde 381 \brief Prints cell voltage codes to the serial port
roger5641 0:3547f7580dbd 382 *************************************************************/
roger5641 0:3547f7580dbd 383 void print_cells(uint8_t datalog_en)
roger5641 0:3547f7580dbd 384 {
open4416 8:404c4d795fde 385 for (int current_ic = 0 ; current_ic < TOTAL_IC; current_ic++) {
roger5641 0:3547f7580dbd 386
open4416 8:404c4d795fde 387 if (datalog_en == 0) {
open4416 8:404c4d795fde 388 pc.printf("IC%d, ", current_ic+1);
open4416 8:404c4d795fde 389 for (int i=0; i<bms_ic[0].ic_reg.cell_channels; i++) {
open4416 8:404c4d795fde 390 pc.printf("C%d:", i+1);
open4416 8:404c4d795fde 391 pc.printf("%.4f, ", bms_ic[current_ic].cells.c_codes[i]*0.0001);
open4416 8:404c4d795fde 392 }
open4416 8:404c4d795fde 393 pc.printf("\n");
open4416 8:404c4d795fde 394 } else {
open4416 8:404c4d795fde 395 pc.printf("Cells, ");
open4416 8:404c4d795fde 396 for (int i=0; i<bms_ic[0].ic_reg.cell_channels; i++) {
open4416 8:404c4d795fde 397 pc.printf("%.4f, ",bms_ic[current_ic].cells.c_codes[i]*0.0001);
open4416 8:404c4d795fde 398 }
open4416 8:404c4d795fde 399 }
roger5641 0:3547f7580dbd 400
roger5641 0:3547f7580dbd 401 }
open4416 8:404c4d795fde 402 pc.printf("\n");
roger5641 0:3547f7580dbd 403 }
roger5641 0:3547f7580dbd 404
roger5641 0:3547f7580dbd 405 /*!****************************************************************************
open4416 8:404c4d795fde 406 \brief Prints Open wire test results to the serial port
roger5641 0:3547f7580dbd 407 *****************************************************************************/
roger5641 0:3547f7580dbd 408 void print_open()
roger5641 0:3547f7580dbd 409 {
open4416 8:404c4d795fde 410 for (int current_ic =0 ; current_ic < TOTAL_IC; current_ic++) {
open4416 8:404c4d795fde 411 if (bms_ic[current_ic].system_open_wire == 0) {
open4416 8:404c4d795fde 412 pc.printf("No Opens Detected on IC%d\n", current_ic+1);
open4416 8:404c4d795fde 413 } else {
open4416 8:404c4d795fde 414 for (int cell=0; cell<bms_ic[0].ic_reg.cell_channels+1; cell++) {
open4416 8:404c4d795fde 415 if ((bms_ic[current_ic].system_open_wire &(1<<cell))>0) {
open4416 8:404c4d795fde 416 pc.printf("There is an open wire on IC%d Channel: %d\n", current_ic + 1, cell);
open4416 8:404c4d795fde 417 }
open4416 8:404c4d795fde 418 }
open4416 8:404c4d795fde 419 }
roger5641 0:3547f7580dbd 420 }
roger5641 0:3547f7580dbd 421 }
roger5641 0:3547f7580dbd 422
roger5641 0:3547f7580dbd 423 /*!****************************************************************************
open4416 8:404c4d795fde 424 \brief Prints GPIO voltage codes and Vref2 voltage code onto the serial port
roger5641 0:3547f7580dbd 425 *****************************************************************************/
roger5641 0:3547f7580dbd 426 void print_aux(uint8_t datalog_en)
roger5641 0:3547f7580dbd 427 {
open4416 8:404c4d795fde 428
open4416 8:404c4d795fde 429 for (int current_ic =0 ; current_ic < TOTAL_IC; current_ic++) {
open4416 8:404c4d795fde 430 if (datalog_en == 0) {
open4416 8:404c4d795fde 431 pc.printf(" IC%d", current_ic+1);
open4416 8:404c4d795fde 432 for (int i=0; i < 5; i++) {
open4416 8:404c4d795fde 433 pc.printf(" GPIO-%d:%.4f,", i+1, bms_ic[current_ic].aux.a_codes[i]*0.0001);
open4416 8:404c4d795fde 434 }
open4416 8:404c4d795fde 435 pc.printf("Vref2:%.4f\n", bms_ic[current_ic].aux.a_codes[5]*0.0001);
open4416 8:404c4d795fde 436 } else {
open4416 8:404c4d795fde 437 pc.printf("AUX, ");
open4416 8:404c4d795fde 438 for (int i=0; i < 6; i++) {
open4416 8:404c4d795fde 439 pc.printf("%.4f,", bms_ic[current_ic].aux.a_codes[i]*0.0001);
open4416 8:404c4d795fde 440 }
open4416 8:404c4d795fde 441 }
roger5641 0:3547f7580dbd 442 }
open4416 8:404c4d795fde 443 pc.printf("\n");
roger5641 0:3547f7580dbd 444 }
roger5641 0:3547f7580dbd 445
roger5641 0:3547f7580dbd 446 /*!****************************************************************************
open4416 8:404c4d795fde 447 \brief Prints Status voltage codes and Vref2 voltage code onto the serial port
roger5641 0:3547f7580dbd 448 *****************************************************************************/
roger5641 0:3547f7580dbd 449 void print_stat()
roger5641 0:3547f7580dbd 450 {
open4416 8:404c4d795fde 451
open4416 8:404c4d795fde 452 for (int current_ic =0 ; current_ic < TOTAL_IC; current_ic++) {
open4416 8:404c4d795fde 453 pc.printf("IC%d", current_ic+1);
open4416 8:404c4d795fde 454 pc.printf(" SOC:%.4f,", bms_ic[current_ic].stat.stat_codes[0]*0.0001*20);
open4416 8:404c4d795fde 455 pc.printf(" Itemp:%.4f,", bms_ic[current_ic].stat.stat_codes[1]*0.0001);
open4416 8:404c4d795fde 456 pc.printf(" VregA:%.4f,", bms_ic[current_ic].stat.stat_codes[2]*0.0001);
open4416 8:404c4d795fde 457 pc.printf(" VregD:%.4f\n", bms_ic[current_ic].stat.stat_codes[3]*0.0001);
open4416 8:404c4d795fde 458 }
open4416 8:404c4d795fde 459
open4416 8:404c4d795fde 460 pc.printf("\n");
roger5641 0:3547f7580dbd 461 }
roger5641 0:3547f7580dbd 462
roger5641 0:3547f7580dbd 463 /*!******************************************************************************
roger5641 0:3547f7580dbd 464 \brief Prints the configuration data that is going to be written to the LTC6811
open4416 8:404c4d795fde 465 to the serial port.
roger5641 0:3547f7580dbd 466 ********************************************************************************/
roger5641 0:3547f7580dbd 467 void print_config()
roger5641 0:3547f7580dbd 468 {
open4416 8:404c4d795fde 469 int cfg_pec;
roger5641 0:3547f7580dbd 470
open4416 8:404c4d795fde 471 pc.printf("Written Configuration: \n");
open4416 8:404c4d795fde 472 for (int current_ic = 0; current_ic<TOTAL_IC; current_ic++) {
open4416 8:404c4d795fde 473 pc.printf(" IC ");
open4416 8:404c4d795fde 474 pc.printf("%d", current_ic+1);
open4416 8:404c4d795fde 475 pc.printf(": ");
open4416 8:404c4d795fde 476 pc.printf("0x");
open4416 8:404c4d795fde 477 serial_print_hex(bms_ic[current_ic].config.tx_data[0]);
open4416 8:404c4d795fde 478 pc.printf(", 0x");
open4416 8:404c4d795fde 479 serial_print_hex(bms_ic[current_ic].config.tx_data[1]);
open4416 8:404c4d795fde 480 pc.printf(", 0x");
open4416 8:404c4d795fde 481 serial_print_hex(bms_ic[current_ic].config.tx_data[2]);
open4416 8:404c4d795fde 482 pc.printf(", 0x");
open4416 8:404c4d795fde 483 serial_print_hex(bms_ic[current_ic].config.tx_data[3]);
open4416 8:404c4d795fde 484 pc.printf(", 0x");
open4416 8:404c4d795fde 485 serial_print_hex(bms_ic[current_ic].config.tx_data[4]);
open4416 8:404c4d795fde 486 pc.printf(", 0x");
open4416 8:404c4d795fde 487 serial_print_hex(bms_ic[current_ic].config.tx_data[5]);
open4416 8:404c4d795fde 488 pc.printf(", Calculated PEC: 0x");
open4416 8:404c4d795fde 489 cfg_pec = pec15_calc(6,&bms_ic[current_ic].config.tx_data[0]);
open4416 8:404c4d795fde 490 serial_print_hex((uint8_t)(cfg_pec>>8));
open4416 8:404c4d795fde 491 pc.printf(", 0x");
open4416 8:404c4d795fde 492 serial_print_hex((uint8_t)(cfg_pec));
open4416 8:404c4d795fde 493 pc.printf("\n");
open4416 8:404c4d795fde 494 }
open4416 8:404c4d795fde 495 pc.printf("\n");
roger5641 0:3547f7580dbd 496 }
roger5641 0:3547f7580dbd 497
roger5641 0:3547f7580dbd 498 /*!*****************************************************************
roger5641 0:3547f7580dbd 499 \brief Prints the configuration data that was read back from the
open4416 8:404c4d795fde 500 LTC6811 to the serial port.
roger5641 0:3547f7580dbd 501 *******************************************************************/
roger5641 0:3547f7580dbd 502 void print_rxconfig()
roger5641 0:3547f7580dbd 503 {
roger5641 4:47d6a0b63e38 504 pc.printf("Received Configuration ");
open4416 8:404c4d795fde 505 for (int current_ic=0; current_ic<TOTAL_IC; current_ic++) {
roger5641 4:47d6a0b63e38 506 pc.printf(" IC ");
open4416 8:404c4d795fde 507 pc.printf("%d", current_ic+1);
roger5641 4:47d6a0b63e38 508 pc.printf(": 0x");
roger5641 4:47d6a0b63e38 509 serial_print_hex(bms_ic[current_ic].config.rx_data[0]);
roger5641 4:47d6a0b63e38 510 pc.printf(", 0x");
roger5641 4:47d6a0b63e38 511 serial_print_hex(bms_ic[current_ic].config.rx_data[1]);
roger5641 4:47d6a0b63e38 512 pc.printf(", 0x");
roger5641 4:47d6a0b63e38 513 serial_print_hex(bms_ic[current_ic].config.rx_data[2]);
roger5641 4:47d6a0b63e38 514 pc.printf(", 0x");
roger5641 4:47d6a0b63e38 515 serial_print_hex(bms_ic[current_ic].config.rx_data[3]);
roger5641 4:47d6a0b63e38 516 pc.printf(", 0x");
roger5641 4:47d6a0b63e38 517 serial_print_hex(bms_ic[current_ic].config.rx_data[4]);
roger5641 4:47d6a0b63e38 518 pc.printf(", 0x");
roger5641 4:47d6a0b63e38 519 serial_print_hex(bms_ic[current_ic].config.rx_data[5]);
roger5641 4:47d6a0b63e38 520 pc.printf(", Received PEC: 0x");
roger5641 4:47d6a0b63e38 521 serial_print_hex(bms_ic[current_ic].config.rx_data[6]);
roger5641 4:47d6a0b63e38 522 pc.printf(", 0x");
roger5641 4:47d6a0b63e38 523 serial_print_hex(bms_ic[current_ic].config.rx_data[7]);
open4416 8:404c4d795fde 524 pc.printf("\n");
roger5641 4:47d6a0b63e38 525 }
open4416 8:404c4d795fde 526 pc.printf("\n");
roger5641 0:3547f7580dbd 527 }
roger5641 0:3547f7580dbd 528
roger5641 0:3547f7580dbd 529 void print_pec()
roger5641 0:3547f7580dbd 530 {
open4416 8:404c4d795fde 531 for (int current_ic=0; current_ic<TOTAL_IC; current_ic++) {
open4416 8:404c4d795fde 532 pc.printf("\n%d", bms_ic[current_ic].crc_count.pec_count);
open4416 8:404c4d795fde 533 pc.printf(" : PEC Errors Detected on IC");
open4416 8:404c4d795fde 534 pc.printf("%d\n", current_ic+1);
open4416 8:404c4d795fde 535 }
roger5641 0:3547f7580dbd 536 }
roger5641 0:3547f7580dbd 537
roger5641 0:3547f7580dbd 538
roger5641 0:3547f7580dbd 539 void serial_print_hex(uint8_t data)
roger5641 0:3547f7580dbd 540 {
open4416 8:404c4d795fde 541 if (data < 16) {
open4416 8:404c4d795fde 542 pc.printf("0x0%X", data);
open4416 8:404c4d795fde 543 } else
open4416 8:404c4d795fde 544 pc.printf("0x%X", data);
roger5641 0:3547f7580dbd 545 }
roger5641 0:3547f7580dbd 546
roger5641 0:3547f7580dbd 547 //Function to check error flag and print PEC error message
roger5641 0:3547f7580dbd 548 void check_error(int error)
roger5641 0:3547f7580dbd 549 {
open4416 8:404c4d795fde 550 if (error == -1) {
open4416 8:404c4d795fde 551 pc.printf("A PEC error was detected in the received data");
open4416 8:404c4d795fde 552 }
roger5641 0:3547f7580dbd 553 }
open4416 8:404c4d795fde 554
open4416 8:404c4d795fde 555
open4416 8:404c4d795fde 556 // hex conversion constants
open4416 8:404c4d795fde 557 char hex_digits[16]= {
open4416 8:404c4d795fde 558 '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'
open4416 8:404c4d795fde 559 };
open4416 8:404c4d795fde 560
open4416 8:404c4d795fde 561 // global variables
open4416 8:404c4d795fde 562
open4416 8:404c4d795fde 563 char hex_to_byte_buffer[5]= {
open4416 8:404c4d795fde 564 '0', 'x', '0', '0', '\0'
open4416 8:404c4d795fde 565 }; // buffer for ASCII hex to byte conversion
open4416 8:404c4d795fde 566 char byte_to_hex_buffer[3]= {
open4416 8:404c4d795fde 567 '\0','\0','\0'
open4416 8:404c4d795fde 568 };
open4416 8:404c4d795fde 569
open4416 8:404c4d795fde 570 //char read_hex()
open4416 8:404c4d795fde 571 //// read 2 hex characters from the serial buffer and convert
open4416 8:404c4d795fde 572 //// them to a byte
open4416 8:404c4d795fde 573 //{
open4416 8:404c4d795fde 574 // byte data;
open4416 8:404c4d795fde 575 // hex_to_byte_buffer[2]=get_char();
open4416 8:404c4d795fde 576 // hex_to_byte_buffer[3]=get_char();
open4416 8:404c4d795fde 577 // get_char();
open4416 8:404c4d795fde 578 // get_char();
open4416 8:404c4d795fde 579 // data = strtol(hex_to_byte_buffer, NULL, 0);
open4416 8:404c4d795fde 580 // return(data);
open4416 8:404c4d795fde 581 //}
open4416 8:404c4d795fde 582 //
open4416 8:404c4d795fde 583 //char get_char()
open4416 8:404c4d795fde 584 //{
open4416 8:404c4d795fde 585 // // read a command from the serial port
open4416 8:404c4d795fde 586 // while (pc.readable() == 0);
open4416 8:404c4d795fde 587 // return(Serial.read());
open4416 8:404c4d795fde 588 //}
open4416 8:404c4d795fde 589
open4416 8:404c4d795fde 590