KIT Solar Car Project / Mbed 2 deprecated BMS_6804_pb

Dependencies:   mbed INA226

Revision:
3:a1368cd4b0a9
Parent:
2:f6f76dde7e1d
Child:
4:e57b023e41f3
--- a/main.cpp	Sat Oct 26 05:24:17 2019 +0000
+++ b/main.cpp	Sat Nov 30 07:24:22 2019 +0000
@@ -34,6 +34,10 @@
 void wakeup();
 void cell_read();
 void spi_error();
+void ic_check();
+void spi_check();
+void print_CAN(uint8_t datalog_en);
+void print_math();
 
 //char get_char();
 //void read_config_data(uint8_t cfg_data[][6], uint8_t nIC);
@@ -44,7 +48,7 @@
   configure the software.
 
 ***********************************************************/
-const uint8_t TOTAL_IC = 1;//!<number of ICs in the daisy chain
+const uint8_t TOTAL_IC = 2;//!<number of ICs in the daisy chain
 char ui_buffer[UI_BUFFER_SIZE];
 
 
@@ -69,7 +73,7 @@
 const uint8_t MEASURE_AUX = DISABLED; // This is ENABLED or DISABLED
 const uint8_t MEASURE_STAT = DISABLED; //This is ENABLED or DISABLED
 const uint8_t PRINT_PEC = DISABLED; //This is ENABLED or DISABLED
-
+short n =0;
 
 // Read data from the serial interface into the ui_buffer buffer
 uint8_t read_data();
@@ -77,19 +81,15 @@
 // Read a float value from the serial interface
 float read_float();
 
-// Read an integer from the serial interface.
-// The routine can recognize Hex, Decimal, Octal, or Binary
-// Example:
-// Hex:     0x11 (0x prefix)
-// Decimal: 17
-// Octal:   O21 (leading letter O prefix)
-// Binary:  B10001 (leading letter B prefix)
 int32_t read_int();
 int kaisuu;
-// Read a string from the serial interface.  Returns a pointer to the ui_buffer.
+unsigned short BAT_MIN, BAT_MAX, BAT_AVG;
+unsigned long BAT_SUM;
+unsigned short BAT_CELL[23];
+
 char *read_string();
 
-// Read a character from the serial interface
+
 int8_t read_char();
 
 /************************************
@@ -105,63 +105,80 @@
 
 cell_asic bms_ic[TOTAL_IC];
 
-/*!*********************************************************************
-  \brief main loop
-***********************************************************************/
 int main(void)
 {
     uint32_t user_command;
     
     pc.baud(115200);
+    //spi_enable();
+    //LTC681x_init_cfg(TOTAL_IC, bms_ic);
+    //LTC6811_reset_crc_count(TOTAL_IC,bms_ic);
+    //LTC6811_init_reg_limits(TOTAL_IC,bms_ic);
+    //ic_check();
+    //wakeup();
+    
+    
+    //print_menu();
+   
+
+    while(1) {
+       
+       
+      unsigned short BAT_MIN = 0;
+      unsigned short BAT_MAX = 0;
+        //spi_error();
+        //pc.printf("check 00\n");
+        //while(!pc.readable()) {
+        //wait(0.3);
+        //    pc.printf("check 001\n");
+        //}         // Check for user input
+        //pc.printf("check 01\n");
+        //user_command = read_int();     
+        //run_command(user_command);
+
+        ic_check();
+    }
+}
+void ic_check(){  //1
+
+    pc.baud(115200);
     spi_enable();
     LTC681x_init_cfg(TOTAL_IC, bms_ic);
     LTC6811_reset_crc_count(TOTAL_IC,bms_ic);
     LTC6811_init_reg_limits(TOTAL_IC,bms_ic);
-    wakeup();
-    //print_menu();
-   
-
-    while(1) {
-      
-        spi_error();
-        //pc.printf("check 00\n");
-        //while(!pc.readable()) {
-        wait(0.3);
-        //    pc.printf("check 001\n");
-        //}         // Check for user input
-        //pc.printf("check 01\n");
-        user_command = read_int();     
-        run_command(user_command);
-        
-    }
-}
-
-void wakeup(){
-    int countup;
-    int8_t error = 0;
-    uint32_t conv_time = 0;
-    
-    
     wakeup_sleep(TOTAL_IC);
             LTC6811_wrcfg(TOTAL_IC,bms_ic);
             print_config();
-                 
-                 wait(0.05);
-                 
+            spi_check();
+            
+    }
+    
+void spi_check(){  //2
+     int countup;
+    int8_t error = 0;
+    
      wakeup_sleep(TOTAL_IC);
             error = LTC6811_rdcfg(TOTAL_IC,bms_ic);
             check_error(error);
             print_rxconfig(); 
-                 wait(0.05);
+            spi_error();    
+            
+               }
+
+
+void wakeup(){  //3
+    int countup;
+    int8_t error = 0;
+    uint32_t conv_time = 0;
                  
-     wakeup_sleep(TOTAL_IC);
+                 
+            wakeup_sleep(TOTAL_IC);
             LTC6811_adcv(ADC_CONVERSION_MODE,ADC_DCP,CELL_CH_TO_CONVERT);
             conv_time = LTC6811_pollAdc();
-            pc.printf("cell conversion completed in:");
-            pc.printf("%.1f",((float)conv_time/1000));
-            pc.printf("mS\n"); 
-            
-            
+           // pc.printf("cell conversion completed in:");
+            //pc.printf("%.1f",((float)conv_time/1000));
+            //pc.printf("mS\n"); 
+            cell_read();
     }
     
     
@@ -169,214 +186,120 @@
             
             int8_t error = 0;
             int countup;
-            
+            /*
             if(error = -1 ){
-            for(countup = 0; countup <= 100; countup++){
-             wakeup();
-             if(error = 1){
+            for(countup = 0; countup <= 2; countup++){
+             spi_check();
+            if(error =1){             
                  break;
+                        }
+                                                        }                                       
                            }
-                                                        }                                       
+             if(error = 1){
+                   wakeup();
                           }
-             if(error = 1){
-             cell_read();
-                          }
+                          */
+                          
+             wakeup();
+                          
              
                  }
-    
-/*!*****************************************
-  \brief executes the user command
-*******************************************/
+                 
+void cell_read(){  //4  電圧読み取り
 
-void run_command(uint32_t cmd)
-{
     int8_t error = 0;
     uint32_t conv_time = 0;
-//    uint32_t user_command;
     int8_t readIC=0;
-    char input = 0;
-    
-    cell_read();
-   
     
-    switch (cmd) {
-
-
-        case 3: // Start GPIO ADC Measurement
-            wakeup_sleep(TOTAL_IC);
-            LTC6811_adax(ADC_CONVERSION_MODE , AUX_CH_TO_CONVERT);
-            LTC6811_pollAdc();
-            pc.printf("aux conversion completed\n");
-            pc.printf("\n");
-            break;
-
-        case 4: // Read AUX Voltage Registers
-            wakeup_sleep(TOTAL_IC);
-            error = LTC6811_rdaux(0,TOTAL_IC,bms_ic); // Set to read back all aux registers
-            check_error(error);
-            print_aux(DATALOG_DISABLED);
-            break;
-
-        case 5: // Start Status ADC Measurement
-            wakeup_sleep(TOTAL_IC);
-            LTC6811_adstat(ADC_CONVERSION_MODE, STAT_CH_TO_CONVERT);
-            LTC6811_pollAdc();
-            pc.printf("stat conversion completed\n");
-            pc.printf("\n");
-            break;
-
-        case 6: // Read Status registers
-            wakeup_sleep(TOTAL_IC);
-            error = LTC6811_rdstat(0,TOTAL_IC,bms_ic); // Set to read back all aux registers
+         wakeup_sleep(TOTAL_IC);
+            error = LTC6811_rdcv(0, TOTAL_IC,bms_ic); 
             check_error(error);
-            print_stat();
-            break;
-
-        case 7: // Loop Measurements
-            pc.printf("transmit 'm' to quit\n");
-            wakeup_sleep(TOTAL_IC);
-            LTC6811_wrcfg(TOTAL_IC,bms_ic);
-            while (input != 'm') {
-                //if (pc.readable()) {
-                    input = read_char();
-                //}
-
-                measurement_loop(DATALOG_DISABLED);
-
-                wait_ms(MEASUREMENT_LOOP_TIME);
-            }
-            //print_menu();
-            break;
-
-        case 8: // Run open wire self test
-            print_pec();
-
-            break;
-
-        case 9: // Read in raw configuration data
-            LTC6811_reset_crc_count(TOTAL_IC,bms_ic);
-            break;
-
-        case 10:  // Run the ADC/Memory Self Test
-            wakeup_sleep(TOTAL_IC);
-            error = LTC6811_run_cell_adc_st(CELL,ADC_CONVERSION_MODE,bms_ic);
-            pc.printf("%d", error);
-            pc.printf(" : errors detected in Digital Filter and CELL Memory\n");
-
-            wakeup_sleep(TOTAL_IC);
-            error = LTC6811_run_cell_adc_st(AUX,ADC_CONVERSION_MODE, bms_ic);
-            pc.printf("%d",error);
-            pc.printf(" : errors detected in Digital Filter and AUX Memory\n");
-
-            wakeup_sleep(TOTAL_IC);
-            error = LTC6811_run_cell_adc_st(STAT,ADC_CONVERSION_MODE, bms_ic);
-            pc.printf("%d",error);
-            pc.printf(" : errors detected in Digital Filter and STAT Memory\n");
-            //print_menu();
-            break;
-
-        case 11: // Enable a discharge transistor
-            pc.printf("Please enter the Spin number\n");
-            readIC = (int8_t)read_int();
-            LTC6811_set_discharge(readIC,TOTAL_IC,bms_ic);
-            wakeup_sleep(TOTAL_IC);
-            LTC6811_wrcfg(TOTAL_IC,bms_ic);
-            print_config();
-            break;
+            //print_cells(DATALOG_DISABLED);
+            print_CAN(DATALOG_DISABLED);
+            
+            ic_check();
+                }           
+            
+    
 
-        case 12: // Clear all discharge transistors
-            clear_discharge(TOTAL_IC,bms_ic);
-            wakeup_sleep(TOTAL_IC);
-            LTC6811_wrcfg(TOTAL_IC,bms_ic);
-            print_config();
-            break;
-
-        case 13: // Clear all ADC measurement registers
-            wakeup_sleep(TOTAL_IC);
-            LTC6811_clrcell();
-            LTC6811_clraux();
-            LTC6811_clrstat();
-            pc.printf("All Registers Cleared\n");
-            break;
-
-        case 14: // Run the Mux Decoder Self Test
-            wakeup_sleep(TOTAL_IC);
-            LTC6811_diagn();
-            wait_ms(5);
-            error = LTC6811_rdstat(0,TOTAL_IC,bms_ic); // Set to read back all aux registers
-            check_error(error);
-            error = 0;
-            for (int ic = 0;
-                    ic<TOTAL_IC;
-                    ic++) {
-                if (bms_ic[ic].stat.mux_fail[0] != 0) error++;
-            }
-            if (error==0) pc.printf("Mux Test: PASS\n");
-            else pc.printf("Mux Test: FAIL\n");
-
-            break;
-
-        case 15: // Run ADC Overlap self test
-            wakeup_sleep(TOTAL_IC);
-            error = (int8_t)LTC6811_run_adc_overlap(TOTAL_IC,bms_ic);
-            if (error==0) pc.printf("Overlap Test: PASS\n");
-            else pc.printf("Overlap Test: FAIL\n");
-            break;
-
-        case 16: // Run ADC Redundancy self test
-            wakeup_sleep(TOTAL_IC);
-            error = LTC6811_run_adc_redundancy_st(ADC_CONVERSION_MODE,AUX,TOTAL_IC, bms_ic);
-            pc.printf("%d",error);
-            pc.printf(" : errors detected in AUX Measurement\n");
-
-            wakeup_sleep(TOTAL_IC);
-            error = LTC6811_run_adc_redundancy_st(ADC_CONVERSION_MODE,STAT,TOTAL_IC, bms_ic);
-            pc.printf("%d",error);
-            pc.printf(" : errors detected in STAT Measurement\n");
-            break;
-
-        case 17:
-            LTC6811_run_openwire(TOTAL_IC, bms_ic);
-            print_open();
-            break;
-
-        case 18: //Datalog print option Loop Measurements
-            pc.printf("transmit 'm' to quit\n");
-            wakeup_sleep(TOTAL_IC);
-            LTC6811_wrcfg(TOTAL_IC,bms_ic);
-            while (input != 'm') {
-                //if (pc.readable()) {
-                    input = read_char();
-                //}
-
-                measurement_loop(DATALOG_ENABLED);
-
-                wait_ms(MEASUREMENT_LOOP_TIME);
-            }
-            //print_menu();
-            break;
-
-        case 'm': //prints menu
-            //print_menu();
-            break;
-
-        default:
-            pc.printf("Incorrect Option\n");
-            break;
-            }
+    
+void print_CAN(uint8_t datalog_en){
+    
+    short n =0;
+    long BAT_SUM = 0;
+    unsigned short BAT_MIN = 55000;
+    //unsigned short BTA_MAX = 0;
+    
+    for (int current_ic = 0 ; current_ic < TOTAL_IC; current_ic++) {
+        
+        //if (datalog_en == 0) {
+            pc.printf("IC%d, ", current_ic+1);
+            //for(n = 0; n <= 12; n++){
+        for (int i=0; i < bms_ic[0].ic_reg.cell_channels; i++) {
+                    
+                    BAT_CELL[n] = bms_ic[current_ic].cells.c_codes[i];
+                    
+                                                                      
+                     pc.printf("C%d:", i+1);
+                     pc.printf("%.4f, ",bms_ic[current_ic].cells.c_codes[i]*0.0001);
+                     BAT_SUM = bms_ic[current_ic].cells.c_codes[i] +  BAT_SUM;
+                     
+                     if(bms_ic[current_ic].cells.c_codes[i] > 10000){
+                     if(bms_ic[current_ic].cells.c_codes[i] < BAT_MIN){
+                           BAT_MIN = bms_ic[current_ic].cells.c_codes[i];
+                                                                      }
+                                                                      }
+                    //unsigned short BTA_MAX = 0;                                                 
+                     if( bms_ic[current_ic].cells.c_codes[i] > BAT_MAX){
+                           BAT_MAX = bms_ic[current_ic].cells.c_codes[i];
+                                                                       }
+                                              
+                                                                    
+                     
+                     
+                     
+                    // BAT_SUM = BAT_CELL[n] +  BAT_SUM;
+              // if(bms_ic[current_ic].cells.c_codes[i] < BAT_MIN){
+                //    BAT_MIN = BAT_CELL[n];
+      //  }
     }
-void cell_read(){
+    
+    
+                    
+                    
+                    
+               //BAT_CELL[n] = bms_ic[current_ic].cells.c_codes[i]*0.0001;
+              // BAT_CELL[n] = BAT_CELL[n]*0.0001;
+               // pc.printf("C%d:", i+1);
+               // pc.printf("%.4f, ",bms_ic[current_ic].cells.c_codes[i]); 
+               // pc.printf("%d, ",BAT_CELL[n]);
+                          //}     
+           // }      
     
-    int8_t error = 0;
-    uint32_t conv_time = 0;
-
-    int8_t readIC=0;
-         wakeup_sleep(TOTAL_IC);
-            error = LTC6811_rdcv(0, TOTAL_IC,bms_ic); // Set to read back all cell voltage registers
-            check_error(error);
-            print_cells(DATALOG_DISABLED);
-        
+       // else {
+           // pc.printf("Cells, ");
+           // for (int i=0; i<bms_ic[0].ic_reg.cell_channels; i++) {
+             //   pc.printf("%.4f, ",bms_ic[current_ic].cells.c_codes[i]*0.0001);  
+                
+            //}
+       // }
         }
+                                                                    
+    //print_math();
+                    pc.printf("\n");
+                    pc.printf("SUM");
+                    pc.printf("%f, ",BAT_SUM*0.0001);
+                    BAT_AVG = BAT_SUM / 20;
+                    pc.printf("AVG");
+                    pc.printf("%.4f, ",BAT_AVG*0.0001);
+                    pc.printf("MIN");
+                    pc.printf("%.4f, ",BAT_MIN*0.0001);
+                    pc.printf("MAX");
+                    pc.printf("%.4f, ",BAT_MAX*0.0001);
+                   pc.printf("\n");
+    pc.printf("\n");
+    
+    }
 
 
 void measurement_loop(uint8_t datalog_en)
@@ -432,10 +355,6 @@
 
 }
 
-
-/*!*********************************
-  \brief Prints the main menu
-***********************************/
 /*
 void print_menu()
 {
@@ -455,27 +374,29 @@
     pc.printf("\n");
 }
 */
-/*!************************************************************
-  \brief Prints cell voltage codes to the serial port
- *************************************************************/
+
 void print_cells(uint8_t datalog_en)
 {
     for (int current_ic = 0 ; current_ic < TOTAL_IC; current_ic++) {
 
         if (datalog_en == 0) {
             pc.printf("IC%d, ", current_ic+1);
-            for (int i=0; i<bms_ic[0].ic_reg.cell_channels; i++) {
+            for (int i=0; i < bms_ic[0].ic_reg.cell_channels; i++) {
                 pc.printf("C%d:", i+1);
                 pc.printf("%.4f, ", bms_ic[current_ic].cells.c_codes[i]*0.0001);
-            }
+                } 
+                   
             pc.printf("\n");
-        } else {
+            }
+            
+        else {
             pc.printf("Cells, ");
             for (int i=0; i<bms_ic[0].ic_reg.cell_channels; i++) {
-                pc.printf("%.4f, ",bms_ic[current_ic].cells.c_codes[i]*0.0001);
+                pc.printf("%.4f, ",bms_ic[current_ic].cells.c_codes[i]*0.0001);  
+                
             }
         }
-
+        
     }
     pc.printf("\n");
 }
@@ -546,31 +467,31 @@
 {
     int cfg_pec;
 
-    pc.printf("Written Configuration: \n");
+    //pc.printf("Written Configuration: \n");
     for (int current_ic = 0; current_ic<TOTAL_IC; current_ic++) {
-        pc.printf(" IC ");
-        pc.printf("%d", current_ic+1);
-        pc.printf(": ");
-        pc.printf("0x");
+        //pc.printf(" IC ");
+        //pc.printf("%d", current_ic+1);
+       // pc.printf(": ");
+        //pc.printf("0x");
         serial_print_hex(bms_ic[current_ic].config.tx_data[0]);
-        pc.printf(", 0x");
+       // pc.printf(", 0x");
         serial_print_hex(bms_ic[current_ic].config.tx_data[1]);
-        pc.printf(", 0x");
+        //pc.printf(", 0x");
         serial_print_hex(bms_ic[current_ic].config.tx_data[2]);
-        pc.printf(", 0x");
+        //pc.printf(", 0x");
         serial_print_hex(bms_ic[current_ic].config.tx_data[3]);
-        pc.printf(", 0x");
+       // pc.printf(", 0x");
         serial_print_hex(bms_ic[current_ic].config.tx_data[4]);
-        pc.printf(", 0x");
+       // pc.printf(", 0x");
         serial_print_hex(bms_ic[current_ic].config.tx_data[5]);
-        pc.printf(", Calculated PEC: 0x");
+        //pc.printf(", Calculated PEC: 0x");
         cfg_pec = pec15_calc(6,&bms_ic[current_ic].config.tx_data[0]);
         serial_print_hex((uint8_t)(cfg_pec>>8));
-        pc.printf(", 0x");
+        //pc.printf(", 0x");
         serial_print_hex((uint8_t)(cfg_pec));
-        pc.printf("\n");
+       // pc.printf("\n");
     }
-    pc.printf("\n");
+   // pc.printf("\n");
 }
 
 /*!*****************************************************************
@@ -579,27 +500,27 @@
  *******************************************************************/
 void print_rxconfig()
 {
-    pc.printf("Received Configuration ");
+    //pc.printf("Received Configuration ");
     for (int current_ic=0; current_ic<TOTAL_IC; current_ic++) {
-        pc.printf(" IC ");
-        pc.printf("%d", current_ic+1);
-        pc.printf(": 0x");
+       // pc.printf(" IC ");
+      //  pc.printf("%d", current_ic+1);
+        //pc.printf(": 0x");
         serial_print_hex(bms_ic[current_ic].config.rx_data[0]);
-        pc.printf(", 0x");
+        //pc.printf(", 0x");
         serial_print_hex(bms_ic[current_ic].config.rx_data[1]);
-        pc.printf(", 0x");
+        //pc.printf(", 0x");
         serial_print_hex(bms_ic[current_ic].config.rx_data[2]);
-        pc.printf(", 0x");
+        //pc.printf(", 0x");
         serial_print_hex(bms_ic[current_ic].config.rx_data[3]);
-        pc.printf(", 0x");
+        //pc.printf(", 0x");
         serial_print_hex(bms_ic[current_ic].config.rx_data[4]);
-        pc.printf(", 0x");
+       // pc.printf(", 0x");
         serial_print_hex(bms_ic[current_ic].config.rx_data[5]);
-        pc.printf(", Received PEC: 0x");
+        //pc.printf(", Received PEC: 0x");
         serial_print_hex(bms_ic[current_ic].config.rx_data[6]);
-        pc.printf(", 0x");
+        //pc.printf(", 0x");
         serial_print_hex(bms_ic[current_ic].config.rx_data[7]);
-        pc.printf("\n");
+       // pc.printf("\n");
     }
     pc.printf("\n");
 }
@@ -616,10 +537,12 @@
 
 void serial_print_hex(uint8_t data)
 {
+    /*
     if (data < 16) {
-        pc.printf("0x0%X", data);
+        //pc.printf("0x0%X", data);
     } else
-        pc.printf("0x%X", data);
+       pc.printf("0x%X", data);
+       */
 }
 
 //Function to check error flag and print PEC error message