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:
- 2:f6f76dde7e1d
- Parent:
- 0:f06ed53310a3
- Child:
- 3:a1368cd4b0a9
diff -r 4dd3e328a30b -r f6f76dde7e1d main.cpp
--- a/main.cpp Fri Feb 09 04:43:04 2018 +0000
+++ b/main.cpp Sat Oct 26 05:24:17 2019 +0000
@@ -12,12 +12,16 @@
#define DATALOG_ENABLED 1
#define DATALOG_DISABLED 0
+
+Ticker ticker;
DigitalOut led1(LED1);
Serial pc(USBTX, USBRX);
+CAN BMS_CAN(p9,p10);
+
void run_command(uint32_t cmd);
void measurement_loop(uint8_t datalog_en);
-void print_menu();
+//void print_menu();
void print_cells(uint8_t datalog_en);
void print_open();
void print_aux(uint8_t datalog_en);
@@ -27,6 +31,10 @@
void print_pec(void);
void serial_print_hex(uint8_t data);
void check_error(int error);
+void wakeup();
+void cell_read();
+void spi_error();
+
//char get_char();
//void read_config_data(uint8_t cfg_data[][6], uint8_t nIC);
@@ -51,8 +59,8 @@
const uint16_t MEASUREMENT_LOOP_TIME = 500;//milliseconds(mS)
//Under Voltage and Over Voltage Thresholds
-const uint16_t OV_THRESHOLD = 41000; // Over voltage threshold ADC Code. LSB = 0.0001
-const uint16_t UV_THRESHOLD = 30000; // Under voltage threshold ADC Code. LSB = 0.0001
+const uint16_t OV_THRESHOLD = 41000; //
+const uint16_t UV_THRESHOLD = 30000; //
//Loop Measurement Setup These Variables are ENABLED or DISABLED Remember ALL CAPS
const uint8_t WRITE_CONFIG = DISABLED; // This is ENABLED or DISABLED
@@ -77,7 +85,7 @@
// 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.
char *read_string();
@@ -109,21 +117,73 @@
LTC681x_init_cfg(TOTAL_IC, bms_ic);
LTC6811_reset_crc_count(TOTAL_IC,bms_ic);
LTC6811_init_reg_limits(TOTAL_IC,bms_ic);
- print_menu();
+ 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(); // Read the user commandi
- pc.printf("command -> %d \n", user_command);
+ 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);
+
+ wakeup_sleep(TOTAL_IC);
+ error = LTC6811_rdcfg(TOTAL_IC,bms_ic);
+ check_error(error);
+ print_rxconfig();
+ wait(0.05);
+
+ 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");
+
+
+ }
+
+
+void spi_error(){
+
+ int8_t error = 0;
+ int countup;
+
+ if(error = -1 ){
+ for(countup = 0; countup <= 100; countup++){
+ wakeup();
+ if(error = 1){
+ break;
+ }
+ }
+ }
+ if(error = 1){
+ cell_read();
+ }
+
+ }
+
/*!*****************************************
\brief executes the user command
*******************************************/
@@ -135,38 +195,14 @@
// uint32_t user_command;
int8_t readIC=0;
char input = 0;
+
+ cell_read();
+
+
switch (cmd) {
- case 1: // Write Configuration Register
- wakeup_sleep(TOTAL_IC);
- LTC6811_wrcfg(TOTAL_IC,bms_ic);
- print_config();
- break;
- case 2: // Read Configuration Register
- wakeup_sleep(TOTAL_IC);
- error = LTC6811_rdcfg(TOTAL_IC,bms_ic);
- check_error(error);
- print_rxconfig();
- break;
-
- case 3: // Start Cell ADC Measurement
- 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");
- break;
-
- case 4: // Read Cell Voltage Registers
- 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);
- break;
-
- case 5: // Start GPIO ADC Measurement
+ case 3: // Start GPIO ADC Measurement
wakeup_sleep(TOTAL_IC);
LTC6811_adax(ADC_CONVERSION_MODE , AUX_CH_TO_CONVERT);
LTC6811_pollAdc();
@@ -174,14 +210,14 @@
pc.printf("\n");
break;
- case 6: // Read AUX Voltage Registers
+ 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 7: // Start Status ADC Measurement
+ case 5: // Start Status ADC Measurement
wakeup_sleep(TOTAL_IC);
LTC6811_adstat(ADC_CONVERSION_MODE, STAT_CH_TO_CONVERT);
LTC6811_pollAdc();
@@ -189,14 +225,14 @@
pc.printf("\n");
break;
- case 8: // Read Status registers
+ case 6: // Read Status registers
wakeup_sleep(TOTAL_IC);
error = LTC6811_rdstat(0,TOTAL_IC,bms_ic); // Set to read back all aux registers
check_error(error);
print_stat();
break;
- case 9: // Loop Measurements
+ case 7: // Loop Measurements
pc.printf("transmit 'm' to quit\n");
wakeup_sleep(TOTAL_IC);
LTC6811_wrcfg(TOTAL_IC,bms_ic);
@@ -212,16 +248,16 @@
//print_menu();
break;
- case 10: // Run open wire self test
+ case 8: // Run open wire self test
print_pec();
break;
- case 11: // Read in raw configuration data
+ case 9: // Read in raw configuration data
LTC6811_reset_crc_count(TOTAL_IC,bms_ic);
break;
- case 12: // Run the ADC/Memory Self Test
+ 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);
@@ -236,10 +272,10 @@
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();
+ //print_menu();
break;
- case 13: // Enable a discharge transistor
+ 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);
@@ -248,14 +284,14 @@
print_config();
break;
- case 14: // Clear all discharge transistors
+ 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 15: // Clear all ADC measurement registers
+ case 13: // Clear all ADC measurement registers
wakeup_sleep(TOTAL_IC);
LTC6811_clrcell();
LTC6811_clraux();
@@ -263,7 +299,7 @@
pc.printf("All Registers Cleared\n");
break;
- case 16: // Run the Mux Decoder Self Test
+ case 14: // Run the Mux Decoder Self Test
wakeup_sleep(TOTAL_IC);
LTC6811_diagn();
wait_ms(5);
@@ -280,14 +316,14 @@
break;
- case 17: // Run ADC Overlap self test
+ 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 18: // Run ADC Redundancy self test
+ 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);
@@ -299,12 +335,12 @@
pc.printf(" : errors detected in STAT Measurement\n");
break;
- case 19:
+ case 17:
LTC6811_run_openwire(TOTAL_IC, bms_ic);
print_open();
break;
- case 20: //Datalog print option Loop Measurements
+ case 18: //Datalog print option Loop Measurements
pc.printf("transmit 'm' to quit\n");
wakeup_sleep(TOTAL_IC);
LTC6811_wrcfg(TOTAL_IC,bms_ic);
@@ -317,18 +353,31 @@
wait_ms(MEASUREMENT_LOOP_TIME);
}
- print_menu();
+ //print_menu();
break;
case 'm': //prints menu
- print_menu();
+ //print_menu();
break;
default:
pc.printf("Incorrect Option\n");
break;
+ }
}
-}
+void cell_read(){
+
+ 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);
+
+ }
+
void measurement_loop(uint8_t datalog_en)
{
@@ -387,6 +436,7 @@
/*!*********************************
\brief Prints the main menu
***********************************/
+/*
void print_menu()
{
pc.printf("Please enter LTC6811 Command\n");
@@ -404,7 +454,7 @@
pc.printf("Please enter command:\n");
pc.printf("\n");
}
-
+*/
/*!************************************************************
\brief Prints cell voltage codes to the serial port
*************************************************************/
@@ -595,11 +645,11 @@
'\0','\0','\0'
};
-// Read data from the serial interface into the ui_buffer
+// シリアル インターフェイスから ui_バッファへのデータの読み取り
uint8_t read_data()
{
- uint8_t index = 0; //index to hold current location in ui_buffer
- int c; // single character used to store incoming keystrokes
+ uint8_t index = 0; // 内の現在の場所を保持するインデックス
+ int c; // 着信キーストロークの格納に使用される単一の文字
//pc.printf("check 1\n");
while (index < UI_BUFFER_SIZE-1) {
//pc.printf("check 2\n");
@@ -607,7 +657,7 @@
//return c;
//pc.printf("check 3\n");
- if (((char) c == '\r') || ((char) c == '\n')) break; // if carriage return or linefeed, stop and return data
+ if (((char) c == '\r') || ((char) c == '\n')) break; // キャリッジ リターンまたはラインフィードの場合は、データを停止して返します。
if ( ((char) c == '\x7F') || ((char) c == '\x08') ) { // remove previous character (decrement index) if Backspace/Delete key pressed index--;
if (index > 0) index--;
} else if (c >= 0) {