SHENG-HEN HSIEH / Mbed 2 deprecated VDU_2021

Dependencies:   mbed imu_driver

Files at this revision

API Documentation at this revision

Comitter:
open4416
Date:
Sat Jul 14 20:02:18 2018 +0000
Parent:
1:8a9ac822aab7
Child:
3:44f82e3fc33f
Commit message:
Add SD data logging

Changed in this revision

SDFileSystem.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SDFileSystem.lib	Sat Jul 14 20:02:18 2018 +0000
@@ -0,0 +1,1 @@
+http://os.mbed.com/users/mbed_official/code/SDFileSystem/#213197704a9b
--- a/main.cpp	Mon Jun 18 06:50:24 2018 +0000
+++ b/main.cpp	Sat Jul 14 20:02:18 2018 +0000
@@ -1,20 +1,73 @@
 #include "mbed.h"
+#include "SDFileSystem.h"
+#define dt  0.01f
+#define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt)))
+
+DigitalOut  Cool(PA_15,0);
+DigitalOut  LED(D13, 0);                            //Internal LED output, general purpose
+CAN     can1(PA_11, PA_12, 1000000);                //(Inverter, PadalBox, DashBoard) 1Mbps, contain critical torque command message
+CAN     can2(PB_5, PB_13, 500000);                  //(BMS1, BMS2) 500kbps, contain battery status
+Serial  pc(USBTX, USBRX, 115200);
+Ticker  ticker1;                                    //General
+
+Ticker  ticker2;                                    //Logger
+SDFileSystem    sd(PC_12, PC_11, PC_10, PD_2, "sd");           // mosi, miso, sck, cs
 
-DigitalOut Cool(PA_15,0);
-//DigitalOut Led(D13,0);
-CAN can1(PA_11, PA_12, 1000000);                    //(Inverter, PadalBox, DashBoard) 1Mbps, contain critical torque command message
-CAN can2(PB_5, PB_13, 500000);                      //(BMS1, BMS2) 500kbps, contain battery status
-Serial pc(USBTX, USBRX, 115200);
+CANMessage  can_msg_1;
+CANMessage  can_msg_2;
+CANMessage  can_msg_send;
+char    data_msg[8] = {0,0,0,0,0,0,0,0};
 
-CANMessage can_msg_1;
-CANMessage can_msg_2;
+int16_t IGBT_Temp_A = 0;                            // *0.1 to get float value
+int16_t IGBT_Temp_B = 0;                            // *0.1 to get float value
+int16_t IGBT_Temp_C = 0;                            // *0.1 to get float value
+int16_t IGBT_Temp = 0;                              // *0.1 to get float value
+int16_t Motor_Temp = 0;                             // *0.1 to get float value
+int16_t DC_Current = 0;                             // *0.1 to get float value
+int16_t DC_Voltage = 0;                             // *0.1 to get float value
+int16_t Motor_Speed = 0;
+
 
 uint8_t CAN_flag_1 = 0;
 uint8_t CAN_flag_2 = 0;
-uint8_t RTD_State = 0;                              // use as bool
+uint8_t timer_flag = 0;
+uint8_t RTD_State = 0;                              //use as bool
+uint8_t SD_OK = 0;                                  //SD OK flag
+uint8_t Logging = 0;                                //Logging flag
+
+int16_t     Max_temp_within_BMS1 = 0;               //*0.01 to degC
+int16_t     Max_temp_within_BMS2 = 0;               //*0.01 to degC
+int16_t     Max_temp = 0;                           //*0.01 to degC
 
+uint16_t    Module_Total_BMS1 = 0;                  //*0.01 to Voltage ~ 120 V
+uint16_t    Module_Total_BMS2 = 0;                  //*0.01 to Voltage ~ 120 V
+uint16_t    Module_Total = 0;                       //*0.01 to Voltage ~ 240 V
+
+uint16_t    Module_Min_BMS1 = 0;                    //*0.0001 to Voltage ~ 3.0 V
+uint16_t    Module_Min_BMS2 = 0;                    //*0.0001 to Voltage ~ 3.0 V
+uint16_t    Module_Min = 0;                         //*0.0001 to Voltage ~ 3.0 V
+
+uint16_t    Module_Max_BMS1 = 0;                    //*0.0001 to Voltage ~ 3.0 V
+uint16_t    Module_Max_BMS2 = 0;                    //*0.0001 to Voltage ~ 3.0 V
+uint16_t    Module_Max = 0;                         //*0.0001 to Voltage ~ 3.0 V
+
+void send(char ID);
 void CAN_RX1(void);
 void CAN_RX2(void);
+void Send2CAN1(void);
+
+FILE *fp;                                           //General file pointer
+void start_log(void);
+void stop_log(void);
+void autoname(void);
+char fileName[] = "/sd/NTHU_RACING/00.CSV";
+int16_t max_val(int16_t i1, int16_t i2, int16_t i3);
+
+void timer1_interrupt(void)
+{
+    timer_flag = 1;
+}
+void timer2_interrupt(void);
 
 int main()
 {
@@ -23,24 +76,165 @@
 
     can1.attach(&CAN_RX1, CAN::RxIrq);              //CAN1 Recieve Irq
     can2.attach(&CAN_RX2, CAN::RxIrq);              //CAN2 Recieve Irq
+    ticker1.attach(&timer1_interrupt, 1);           //1sec
 
+    //Logger header
+    mkdir("/sd/NTHU_RACING", 0777);
+
+    //General task
     while(1) {
-        if(CAN_flag_1) {
-//            Led = RTD_State;
-            Cool = RTD_State;
-            pc.printf("%d\r", RTD_State);
-            CAN_flag_1 = 0;
+        if(timer_flag == 1) {
+
+            if(CAN_flag_1) {
+                if(RTD_State) {
+                    Cool = 1;
+                    if(!Logging) {
+                        autoname();                                     //GENERATE NEW FILE EACH call fp ready or stuck
+                        if(SD_OK) {
+                            Logging = 1;
+                            start_log();
+                        }
+                    }
+                } else {
+                    Cool = 0;
+                    if(Logging) {
+                        Logging = 0;
+                        stop_log();
+                    }
+                }
+                CAN_flag_1 = 0;
+            }
+
+            if(CAN_flag_2) {
+                //Total
+                Module_Total = Module_Total_BMS1 + Module_Total_BMS2;
+
+                //Min
+                if(Module_Min_BMS1 < Module_Min_BMS2) {
+                    Module_Min = Module_Min_BMS1;
+                } else {
+                    Module_Min = Module_Min_BMS2;
+                }
+
+                //Max
+                if(Module_Max_BMS1 < Module_Max_BMS2) {
+                    Module_Max = Module_Max_BMS2;
+                } else {
+                    Module_Max = Module_Max_BMS1;
+                }
+
+                //Temp
+                if(Max_temp_within_BMS1 < Max_temp_within_BMS2) {
+                    Max_temp = Max_temp_within_BMS2;
+                } else {
+                    Max_temp = Max_temp_within_BMS1;
+                }
+
+                CAN_flag_2 = 0;
+                Send2CAN1();
+            }
+
+//            pc.printf("SOC: %.2f\n", Module_Total*0.01f);
+//            pc.printf("Min: %.3f\n", Module_Min*0.0001f);
+//            pc.printf("Max: %.3f\n", Module_Max*0.0001f);
+//            pc.printf("Max1: %.3f\n", Module_Max_BMS1*0.0001f);
+//            pc.printf("Max2: %.3f\n", Module_Max_BMS2*0.0001f);
+//            pc.printf("Temp: %.1f\n", Max_temp*0.01f);
+            timer_flag = 0;
         }
     }
 }
 
+void timer2_interrupt(void)
+{
+    fprintf(fp, "%.0f,%.0f,%d\n", DC_Voltage*0.1f, DC_Current*0.1f, Motor_Speed);
+}
+
+void start_log(void)
+{
+    fprintf(fp, "NTHU_RACING DataLogger_V1.00\n");
+    fprintf(fp, "Sample period: %.3f\n", dt);
+    fprintf(fp, "POOPOOphysic\n\n");
+    fprintf(fp, "Volt,Amp,RPM\n");
+    ticker2.attach(&timer2_interrupt, dt);
+}
+
+void stop_log(void)
+{
+    ticker2.detach();
+    fprintf(fp, "End of logging\n");
+    fclose(fp);
+}
+
+void autoname(void)
+{
+    for(uint8_t i=0; i<100; i++) {
+        fileName[16] = i/10 + '0';
+        fileName[17] = i%10 + '0';
+
+        pc.printf("Openning: ");
+        pc.printf(fileName);
+        pc.printf("\n");
+
+        fp = fopen(fileName, "r" );
+
+        if(fp == NULL) {
+            fp = fopen(fileName, "w" );
+            if(fp != NULL) {                                                    //indicates a valid file
+                printf("File opened: %s\n", fileName);
+                SD_OK = 1;
+                break;                                                          //out of for loop
+
+            } else {
+                printf("Failed to open %s for read or write access. Check card is inserted.\n", fileName);
+                SD_OK = 0;
+            }
+        } else {
+            fclose(fp);
+            SD_OK = 0;
+        }
+    }
+
+}
+
 void CAN_RX1(void)
 {
     if(can1.read(can_msg_1)) {
         switch(can_msg_1.id) {                                                  //Filtered the input message and do corresponding action
-            case 0xAA:
+            case 0xF0:
                 //Internal state address
-                RTD_State = can_msg_1.data[6] & 0x01;                           //get bit "0", result ( 1 = RTD, 0 = OFF )
+                RTD_State = can_msg_1.data[7] & 0x01;                           //get bit "0", result ( 1 = RTD, 0 = OFF )
+                CAN_flag_1 = 1;
+                break;
+
+            case 0xA0 :
+                //Temperature infrom address 1
+                IGBT_Temp_A = can_msg_1.data[1] << 8 | can_msg_1.data[0];
+                IGBT_Temp_B = can_msg_1.data[3] << 8 | can_msg_1.data[2];
+                IGBT_Temp_C = can_msg_1.data[5] << 8 | can_msg_1.data[4];
+                IGBT_Temp = max_val(IGBT_Temp_A,IGBT_Temp_B,IGBT_Temp_C);
+                CAN_flag_1 = 1;
+                break;
+
+            case 0xA2 :
+                //Temperature infrom address 3
+                Motor_Temp = can_msg_1.data[5] << 8 | can_msg_1.data[4];
+                CAN_flag_1 = 1;
+                break;
+
+            case 0xA5:
+                Motor_Speed = can_msg_1.data[3] << 8 | can_msg_1.data[2];
+                break;
+
+            case 0xA6 :
+                //Current infrom address
+                DC_Current = can_msg_1.data[7] << 8 | can_msg_1.data[6];
+                CAN_flag_1 = 1;
+                break;
+
+            case 0xA7 :
+                //Voltage infrom address
+                DC_Voltage = can_msg_1.data[1] << 8 | can_msg_1.data[0];
                 CAN_flag_1 = 1;
                 break;
         }
@@ -50,5 +244,79 @@
 void CAN_RX2(void)
 {
     if(can2.read(can_msg_2)) {
+        switch(can_msg_2.id) {
+            case 0xD1:
+                //BMS1 soc
+                Module_Total_BMS1 = can_msg_2.data[1] << 8 | can_msg_2.data[0];
+                Module_Total_BMS1 += can_msg_2.data[3] << 8 | can_msg_2.data[2];
+                Module_Total_BMS1 += can_msg_2.data[5] << 8 | can_msg_2.data[4];
+                CAN_flag_2 = 1;
+                break;
+            case 0xD2:
+                //BMS1 min Volt
+                Module_Min_BMS1 = can_msg_2.data[7] << 8 | can_msg_2.data[6];
+                CAN_flag_2 = 1;
+                break;
+            case 0xD3:
+                //BMS1 max Volt
+                Module_Max_BMS1 = can_msg_2.data[7] << 8 | can_msg_2.data[6];
+                CAN_flag_2 = 1;
+                break;
+            case 0xD4:
+                //BMS1 max temperature
+                Max_temp_within_BMS1 = can_msg_2.data[7] << 8 | can_msg_2.data[6];
+                CAN_flag_2 = 1;
+                break;
+
+            case 0xE1:
+                //BMS2 soc
+                Module_Total_BMS2 = can_msg_2.data[1] << 8 | can_msg_2.data[0];
+                Module_Total_BMS2 += can_msg_2.data[3] << 8 | can_msg_2.data[2];
+                Module_Total_BMS2 += can_msg_2.data[5] << 8 | can_msg_2.data[4];
+                CAN_flag_2 = 1;
+                break;
+            case 0xE2:
+                //BMS2 min Volt
+                Module_Min_BMS2 = can_msg_2.data[7] << 8 | can_msg_2.data[6];
+                CAN_flag_2 = 1;
+                break;
+            case 0xE3:
+                //BMS2 max Volt
+                Module_Max_BMS2 = can_msg_2.data[7] << 8 | can_msg_2.data[6];
+                CAN_flag_2 = 1;
+                break;
+            case 0xE4:
+                //BMS2 max temperature
+                Max_temp_within_BMS2 = can_msg_2.data[7] << 8 | can_msg_2.data[6];
+                CAN_flag_2 = 1;
+                break;
+        }
     }
+}
+
+void Send2CAN1(void)
+{
+    data_msg[0] = Module_Total;
+    data_msg[1] = Module_Total >> 8;
+    data_msg[2] = Module_Min;
+    data_msg[3] = Module_Min >> 8;
+    data_msg[4] = Module_Max;
+    data_msg[5] = Module_Max >> 8;
+    data_msg[6] = Max_temp;
+    data_msg[7] = Max_temp >> 8;
+    send(0xF1);
+}
+
+void send(char ID)
+{
+    can_msg_send = CANMessage(ID,data_msg,8,CANData,CANStandard);
+    can1.write(can_msg_send);
+}
+
+int16_t max_val(int16_t i1, int16_t i2, int16_t i3)
+{
+    int16_t max = i1;
+    if(i2 > max) max = i2;
+    if(i3 > max) max = i3;
+    return max;
 }
\ No newline at end of file
--- a/mbed.bld	Mon Jun 18 06:50:24 2018 +0000
+++ b/mbed.bld	Sat Jul 14 20:02:18 2018 +0000
@@ -1,1 +1,1 @@
-https://os.mbed.com/users/mbed_official/code/mbed/builds/5aab5a7997ee
\ No newline at end of file
+http://mbed.org/users/mbed_official/code/mbed/builds/a7c7b631e539
\ No newline at end of file