Just a regular publish

Dependencies:   mbed imu_driver

Revision:
5:8116016abee0
Parent:
4:f05bef255292
Child:
6:fbe401163489
--- a/main.cpp	Tue Nov 12 14:12:58 2019 +0000
+++ b/main.cpp	Wed Nov 13 13:56:55 2019 +0000
@@ -1,130 +1,136 @@
 #include "mbed.h"
 #define dt  0.01f
 #define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt)))
+#define FL_HSB_ID 0xA0      // Rx, 100Hz
+#define FR_HSB_ID 0xA1      // Rx
+#define RL_HSB_ID 0xA2      // Rx
+#define RR_HSB_ID 0xA3      // Rx
+#define FL_LSB_ID 0xB0      // Rx, 10Hz
+#define FR_LSB_ID 0xB1      // Rx
+#define RL_LSB_ID 0xB2      // Rx
+#define RR_LSB_ID 0xB3      // Rx
+#define PSU_cmd_ID 0xC4     // Rx, 100Hz
 
-DigitalOut  Cool(PA_15,0);
+#define FL_CMD_ID 0xC0      // Tx, 100Hz
+#define FR_CMD_ID 0xC1      // Tx
+#define RL_CMD_ID 0xC2      // Tx
+#define RR_CMD_ID 0xC3      // Tx
+#define AUX_sense_ID 0xE0   // Tx, 10Hz
+#define Qdrv_stat_ID 0xE1   // Tx
+#define IMU_sense_ID 0xE2   // Tx
+
+DigitalOut  Aux_Rly(PC_10,0);                       //Control aux relay, 1 active
+DigitalOut  Fault_Ind(PC_10,0);                     //Indicate fault bt flashing, 1 active
 DigitalOut  LED(D13, 0);                            //Internal LED output, general purpose
-CAN     can1(PA_11, PA_12, 1000000);                //1Mbps, contain critical torque command message
+CAN     can1(PB_8, PB_9, 1000000);                  //1Mbps, contain critical torque command message
 Serial  pc(USBTX, USBRX, 115200);
-Ticker  ticker1;                                    //General
+Ticker  ticker1;                                    //100Hz task
+
+CANMessage  can_msg_Rx;
+CANMessage  can_msg_Tx;
 
-Ticker  ticker2;                                    //Logger
+//Recive bank for HSB & LFB
+char    temp_msg[8] = {0,0,0,0,0,0,0,0};
+char    FL_HFB[8];                                  //data space to speed up can_Rx speed
+char    FR_HFB[8];
+char    RL_HFB[8];
+char    RR_HFB[8];
+char    FL_LFB[8];
+char    FR_LFB[8];
+char    RL_LFB[8];
+char    RR_LFB[8];
 
-CANMessage  can_msg_1;
-CANMessage  can_msg_2;
-CANMessage  can_msg_send;
-char    data_msg[8] = {0,0,0,0,0,0,0,0};
+//CAN to motor drive module, 100Hz
+//msg ID: 0xC0~0xC3
+float FL_Tcmd = 0;                  // *100 before sent in int16_t
+float FR_Tcmd = 0;
+float RL_Tcmd = 0;
+float RR_Tcmd = 0;
+uint8_t RTD_cmd = 0;                // start inverter switching cmd
+uint8_t RST_cmd = 0;                // send out once to reset module fault
+
+//Module online flag
+uint8_t FL_online = 0;              // 0 indicate detection timeout
+uint8_t FR_online = 0;              // reset value is 10 to hold for 0.1sec
+uint8_t RL_online = 0;              // -1 per 100Hz task
+uint8_t RR_online = 0;
 
-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;
+//Decoded out data storage
+float FL_Temp_mtr = 0;              // motor temperature degC, 10Hz refresh
+float FR_Temp_mtr = 0;
+float RL_Temp_mtr = 0;
+float RR_Temp_mtr = 0;
+float FL_Temp_ivt = 0;              // inverter temperature degC, 10Hz refresh
+float FR_Temp_ivt = 0;
+float RL_Temp_ivt = 0;
+float RR_Temp_ivt = 0;
+uint16_t FL_FLT_Run = 0;            // RUN fault code, 10Hz refresh
+uint16_t FR_FLT_Run = 0;
+uint16_t RL_FLT_Run = 0;
+uint16_t RR_FLT_Run = 0;
+uint16_t FL_FLT_Post = 0;           // POST fault code, 10Hz refresh
+uint16_t FR_FLT_Post = 0;
+uint16_t RL_FLT_Post = 0;
+uint16_t RR_FLT_Post = 0;
+float FL_Trq_fil3 = 0;              // Internal Tcmd, 100Hz refresh
+float FR_Trq_fil3 = 0;
+float RL_Trq_fil3 = 0;
+float RR_Trq_fil3 = 0;
+float FL_Trq_est = 0;               // Estimated Torque, 100Hz refresh
+float FR_Trq_est = 0;
+float RL_Trq_est = 0;
+float RR_Trq_est = 0;
+float FL_W_ele = 0;                 // Estimated W_ele, 100Hz refresh
+float FR_W_ele = 0;
+float RL_W_ele = 0;
+float RR_W_ele = 0;
+uint8_t FL_DSM = 0;                 // DSM state, 100Hz refresh
+uint8_t FR_DSM = 0;
+uint8_t RL_DSM = 0;
+uint8_t RR_DSM = 0;
+CAN_HandleTypeDef hcan1;
 
+//From Pedal Box msg
+uint8_t RTD_HMI = 0;                //1 = requesting
+uint8_t AWD_HMI = 0;                //1 = requesting
 
-uint8_t CAN_flag_1 = 0;
-uint8_t CAN_flag_2 = 0;
+//100Hz tasking
 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 Rx_CAN1(void);
+void Rx_Decode(void);
+void Tx_Tcmd_CAN1(void);
+void Tx_Qdrv_CAN1(void);
+void Error_CAN1(void);
 
-void send(char ID);
-void CAN_RX1(void);
-void CAN_RX2(void);
-void Send2CAN1(void);
-
-void start_log(void);
-void stop_log(void);
-void autoname(void);
 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()
 {
-    CAN_flag_1 = 0;
-    CAN_flag_2 = 0;
+    SET_BIT(CAN1->MCR, CAN_MCR_ABOM);               // Enable auto reboot after bus off
+    can1.filter(FL_HSB_ID,0xFFFF,CANStandard,0);    // ID filter listing mode
+    can1.filter(FR_HSB_ID,0xFFFF,CANStandard,1);
+    can1.filter(RL_HSB_ID,0xFFFF,CANStandard,2);
+    can1.filter(RR_HSB_ID,0xFFFF,CANStandard,3);
+    can1.filter(FL_LSB_ID,0xFFFF,CANStandard,4);
+    can1.filter(FR_LSB_ID,0xFFFF,CANStandard,5);
+    can1.filter(RL_LSB_ID,0xFFFF,CANStandard,6);
+    can1.filter(RR_LSB_ID,0xFFFF,CANStandard,7);
+    can1.filter(PSU_cmd_ID,0xFFFF,CANStandard,8);
 
-    can1.attach(&CAN_RX1, CAN::RxIrq);              //CAN1 Recieve Irq
-    ticker1.attach(&timer1_interrupt, 1);           //1sec
+//    can1.mode(CAN::GlobalTest);                   // Add only for testing 2019/11/13
+    can1.attach(&Rx_CAN1, CAN::RxIrq);                  //CAN1 Recieve Irq
 
-    //General task
+    //House keeping task
+    ticker1.attach_us(&timer1_interrupt, 10000);        //10 ms
     while(1) {
         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();
-            }
-
+            Tx_Qdrv_CAN1();
 //            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);
@@ -136,141 +142,99 @@
     }
 }
 
-void timer2_interrupt(void)
+void Rx_CAN1(void)
+{
+    LED = 1;
+    if(can1.read(can_msg_Rx)) {
+//        switch(can_msg_Rx.id) {                                                  //Filtered the input message and do corresponding action
+//            case 0xF0:
+//                //Internal state address
+//                RTD_State = can_msg_Rx.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_Rx.data[1] << 8 | can_msg_Rx.data[0];
+//                IGBT_Temp_B = can_msg_Rx.data[3] << 8 | can_msg_Rx.data[2];
+//                IGBT_Temp_C = can_msg_Rx.data[5] << 8 | can_msg_Rx.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_Rx.data[5] << 8 | can_msg_Rx.data[4];
+//                CAN_flag_1 = 1;
+//                break;
+//
+//            case 0xA5:
+//                Motor_Speed = can_msg_Rx.data[3] << 8 | can_msg_Rx.data[2];
+//                break;
+//
+//            case 0xA6 :
+//                //Current infrom address
+//                DC_Current = can_msg_Rx.data[7] << 8 | can_msg_Rx.data[6];
+//                CAN_flag_1 = 1;
+//                break;
+//
+//            case 0xA7 :
+//                //Voltage infrom address
+//                DC_Voltage = can_msg_Rx.data[1] << 8 | can_msg_Rx.data[0];
+//                CAN_flag_1 = 1;
+//                break;
+//        }
+    }
+    LED = 0;
+}
+
+void Rx_Decode(void)
 {
 }
 
-void start_log(void)
-{
-
-}
-
-void stop_log(void)
+void Tx_Tcmd_CAN1(void)
 {
-
-}
-
-void autoname(void)
-{
-
 }
 
-void CAN_RX1(void)
+void Tx_Qdrv_CAN1(void)
 {
-    if(can1.read(can_msg_1)) {
-        switch(can_msg_1.id) {                                                  //Filtered the input message and do corresponding action
-            case 0xF0:
-                //Internal state address
-                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;
+    uint32_t ID = FL_HSB_ID;
+    temp_msg[0] = 1;
+    temp_msg[1] = 2;
+    temp_msg[2] = 3;
+    temp_msg[3] = 4;
+    temp_msg[4] = 5;
+    temp_msg[5] = 6;
+    temp_msg[6] = 7;
+    temp_msg[7] = 8;
+    can_msg_Tx = CANMessage(ID,temp_msg,8,CANData,CANStandard);
+    if(!can1.write(can_msg_Tx)) {
+        //Report fault
+    }
 
-            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;
-        }
+    ID = RR_HSB_ID;
+    can_msg_Tx = CANMessage(ID,temp_msg,8,CANData,CANStandard);
+    if(!can1.write(can_msg_Tx)) {
+        //Report fault
     }
 }
 
-//void CAN_RX2(void)
+//void Send2CAN1(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;
-//        }
-//    }
+//    uint32_t ID = 0xF1;
+//    temp_msg[0] = Module_Total;
+//    temp_msg[1] = Module_Total >> 8;
+//    temp_msg[2] = Module_Min;
+//    temp_msg[3] = Module_Min >> 8;
+//    temp_msg[4] = Module_Max;
+//    temp_msg[5] = Module_Max >> 8;
+//    temp_msg[6] = Max_temp;
+//    temp_msg[7] = Max_temp >> 8;
+//    send_CAN1();
+//    can_msg_Tx = CANMessage(ID,temp_msg,8,CANData,CANStandard);
+//    can1.write(can_msg_Tx);
 //}
 
-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;