Just a regular publish

Dependencies:   mbed imu_driver

Committer:
open4416
Date:
Tue Nov 12 14:12:58 2019 +0000
Revision:
4:f05bef255292
Parent:
2:c7a3a8c1aeed
Child:
5:8116016abee0
Initial release, change from 2018 CAN_Bridge

Who changed what in which revision?

UserRevisionLine numberNew contents of line
open4416 0:c4747ebbe0b4 1 #include "mbed.h"
open4416 2:c7a3a8c1aeed 2 #define dt 0.01f
open4416 2:c7a3a8c1aeed 3 #define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt)))
open4416 2:c7a3a8c1aeed 4
open4416 2:c7a3a8c1aeed 5 DigitalOut Cool(PA_15,0);
open4416 2:c7a3a8c1aeed 6 DigitalOut LED(D13, 0); //Internal LED output, general purpose
open4416 4:f05bef255292 7 CAN can1(PA_11, PA_12, 1000000); //1Mbps, contain critical torque command message
open4416 2:c7a3a8c1aeed 8 Serial pc(USBTX, USBRX, 115200);
open4416 2:c7a3a8c1aeed 9 Ticker ticker1; //General
open4416 2:c7a3a8c1aeed 10
open4416 2:c7a3a8c1aeed 11 Ticker ticker2; //Logger
open4416 0:c4747ebbe0b4 12
open4416 2:c7a3a8c1aeed 13 CANMessage can_msg_1;
open4416 2:c7a3a8c1aeed 14 CANMessage can_msg_2;
open4416 2:c7a3a8c1aeed 15 CANMessage can_msg_send;
open4416 2:c7a3a8c1aeed 16 char data_msg[8] = {0,0,0,0,0,0,0,0};
open4416 0:c4747ebbe0b4 17
open4416 2:c7a3a8c1aeed 18 int16_t IGBT_Temp_A = 0; // *0.1 to get float value
open4416 2:c7a3a8c1aeed 19 int16_t IGBT_Temp_B = 0; // *0.1 to get float value
open4416 2:c7a3a8c1aeed 20 int16_t IGBT_Temp_C = 0; // *0.1 to get float value
open4416 2:c7a3a8c1aeed 21 int16_t IGBT_Temp = 0; // *0.1 to get float value
open4416 2:c7a3a8c1aeed 22 int16_t Motor_Temp = 0; // *0.1 to get float value
open4416 2:c7a3a8c1aeed 23 int16_t DC_Current = 0; // *0.1 to get float value
open4416 2:c7a3a8c1aeed 24 int16_t DC_Voltage = 0; // *0.1 to get float value
open4416 2:c7a3a8c1aeed 25 int16_t Motor_Speed = 0;
open4416 2:c7a3a8c1aeed 26
open4416 0:c4747ebbe0b4 27
open4416 0:c4747ebbe0b4 28 uint8_t CAN_flag_1 = 0;
open4416 0:c4747ebbe0b4 29 uint8_t CAN_flag_2 = 0;
open4416 2:c7a3a8c1aeed 30 uint8_t timer_flag = 0;
open4416 2:c7a3a8c1aeed 31 uint8_t RTD_State = 0; //use as bool
open4416 2:c7a3a8c1aeed 32 uint8_t SD_OK = 0; //SD OK flag
open4416 2:c7a3a8c1aeed 33 uint8_t Logging = 0; //Logging flag
open4416 2:c7a3a8c1aeed 34
open4416 2:c7a3a8c1aeed 35 int16_t Max_temp_within_BMS1 = 0; //*0.01 to degC
open4416 2:c7a3a8c1aeed 36 int16_t Max_temp_within_BMS2 = 0; //*0.01 to degC
open4416 2:c7a3a8c1aeed 37 int16_t Max_temp = 0; //*0.01 to degC
open4416 0:c4747ebbe0b4 38
open4416 2:c7a3a8c1aeed 39 uint16_t Module_Total_BMS1 = 0; //*0.01 to Voltage ~ 120 V
open4416 2:c7a3a8c1aeed 40 uint16_t Module_Total_BMS2 = 0; //*0.01 to Voltage ~ 120 V
open4416 2:c7a3a8c1aeed 41 uint16_t Module_Total = 0; //*0.01 to Voltage ~ 240 V
open4416 2:c7a3a8c1aeed 42
open4416 2:c7a3a8c1aeed 43 uint16_t Module_Min_BMS1 = 0; //*0.0001 to Voltage ~ 3.0 V
open4416 2:c7a3a8c1aeed 44 uint16_t Module_Min_BMS2 = 0; //*0.0001 to Voltage ~ 3.0 V
open4416 2:c7a3a8c1aeed 45 uint16_t Module_Min = 0; //*0.0001 to Voltage ~ 3.0 V
open4416 2:c7a3a8c1aeed 46
open4416 2:c7a3a8c1aeed 47 uint16_t Module_Max_BMS1 = 0; //*0.0001 to Voltage ~ 3.0 V
open4416 2:c7a3a8c1aeed 48 uint16_t Module_Max_BMS2 = 0; //*0.0001 to Voltage ~ 3.0 V
open4416 2:c7a3a8c1aeed 49 uint16_t Module_Max = 0; //*0.0001 to Voltage ~ 3.0 V
open4416 2:c7a3a8c1aeed 50
open4416 2:c7a3a8c1aeed 51 void send(char ID);
open4416 1:8a9ac822aab7 52 void CAN_RX1(void);
open4416 1:8a9ac822aab7 53 void CAN_RX2(void);
open4416 2:c7a3a8c1aeed 54 void Send2CAN1(void);
open4416 2:c7a3a8c1aeed 55
open4416 2:c7a3a8c1aeed 56 void start_log(void);
open4416 2:c7a3a8c1aeed 57 void stop_log(void);
open4416 2:c7a3a8c1aeed 58 void autoname(void);
open4416 2:c7a3a8c1aeed 59 int16_t max_val(int16_t i1, int16_t i2, int16_t i3);
open4416 2:c7a3a8c1aeed 60
open4416 2:c7a3a8c1aeed 61 void timer1_interrupt(void)
open4416 2:c7a3a8c1aeed 62 {
open4416 2:c7a3a8c1aeed 63 timer_flag = 1;
open4416 2:c7a3a8c1aeed 64 }
open4416 2:c7a3a8c1aeed 65 void timer2_interrupt(void);
open4416 0:c4747ebbe0b4 66
open4416 0:c4747ebbe0b4 67 int main()
open4416 0:c4747ebbe0b4 68 {
open4416 0:c4747ebbe0b4 69 CAN_flag_1 = 0;
open4416 0:c4747ebbe0b4 70 CAN_flag_2 = 0;
open4416 1:8a9ac822aab7 71
open4416 1:8a9ac822aab7 72 can1.attach(&CAN_RX1, CAN::RxIrq); //CAN1 Recieve Irq
open4416 2:c7a3a8c1aeed 73 ticker1.attach(&timer1_interrupt, 1); //1sec
open4416 0:c4747ebbe0b4 74
open4416 2:c7a3a8c1aeed 75 //General task
open4416 0:c4747ebbe0b4 76 while(1) {
open4416 2:c7a3a8c1aeed 77 if(timer_flag == 1) {
open4416 2:c7a3a8c1aeed 78
open4416 2:c7a3a8c1aeed 79 if(CAN_flag_1) {
open4416 2:c7a3a8c1aeed 80 if(RTD_State) {
open4416 2:c7a3a8c1aeed 81 Cool = 1;
open4416 2:c7a3a8c1aeed 82 if(!Logging) {
open4416 2:c7a3a8c1aeed 83 autoname(); //GENERATE NEW FILE EACH call fp ready or stuck
open4416 2:c7a3a8c1aeed 84 if(SD_OK) {
open4416 2:c7a3a8c1aeed 85 Logging = 1;
open4416 2:c7a3a8c1aeed 86 start_log();
open4416 2:c7a3a8c1aeed 87 }
open4416 2:c7a3a8c1aeed 88 }
open4416 2:c7a3a8c1aeed 89 } else {
open4416 2:c7a3a8c1aeed 90 Cool = 0;
open4416 2:c7a3a8c1aeed 91 if(Logging) {
open4416 2:c7a3a8c1aeed 92 Logging = 0;
open4416 2:c7a3a8c1aeed 93 stop_log();
open4416 2:c7a3a8c1aeed 94 }
open4416 2:c7a3a8c1aeed 95 }
open4416 2:c7a3a8c1aeed 96 CAN_flag_1 = 0;
open4416 2:c7a3a8c1aeed 97 }
open4416 2:c7a3a8c1aeed 98
open4416 2:c7a3a8c1aeed 99 if(CAN_flag_2) {
open4416 2:c7a3a8c1aeed 100 //Total
open4416 2:c7a3a8c1aeed 101 Module_Total = Module_Total_BMS1 + Module_Total_BMS2;
open4416 2:c7a3a8c1aeed 102
open4416 2:c7a3a8c1aeed 103 //Min
open4416 2:c7a3a8c1aeed 104 if(Module_Min_BMS1 < Module_Min_BMS2) {
open4416 2:c7a3a8c1aeed 105 Module_Min = Module_Min_BMS1;
open4416 2:c7a3a8c1aeed 106 } else {
open4416 2:c7a3a8c1aeed 107 Module_Min = Module_Min_BMS2;
open4416 2:c7a3a8c1aeed 108 }
open4416 2:c7a3a8c1aeed 109
open4416 2:c7a3a8c1aeed 110 //Max
open4416 2:c7a3a8c1aeed 111 if(Module_Max_BMS1 < Module_Max_BMS2) {
open4416 2:c7a3a8c1aeed 112 Module_Max = Module_Max_BMS2;
open4416 2:c7a3a8c1aeed 113 } else {
open4416 2:c7a3a8c1aeed 114 Module_Max = Module_Max_BMS1;
open4416 2:c7a3a8c1aeed 115 }
open4416 2:c7a3a8c1aeed 116
open4416 2:c7a3a8c1aeed 117 //Temp
open4416 2:c7a3a8c1aeed 118 if(Max_temp_within_BMS1 < Max_temp_within_BMS2) {
open4416 2:c7a3a8c1aeed 119 Max_temp = Max_temp_within_BMS2;
open4416 2:c7a3a8c1aeed 120 } else {
open4416 2:c7a3a8c1aeed 121 Max_temp = Max_temp_within_BMS1;
open4416 2:c7a3a8c1aeed 122 }
open4416 2:c7a3a8c1aeed 123
open4416 2:c7a3a8c1aeed 124 CAN_flag_2 = 0;
open4416 2:c7a3a8c1aeed 125 Send2CAN1();
open4416 2:c7a3a8c1aeed 126 }
open4416 2:c7a3a8c1aeed 127
open4416 2:c7a3a8c1aeed 128 // pc.printf("SOC: %.2f\n", Module_Total*0.01f);
open4416 2:c7a3a8c1aeed 129 // pc.printf("Min: %.3f\n", Module_Min*0.0001f);
open4416 2:c7a3a8c1aeed 130 // pc.printf("Max: %.3f\n", Module_Max*0.0001f);
open4416 2:c7a3a8c1aeed 131 // pc.printf("Max1: %.3f\n", Module_Max_BMS1*0.0001f);
open4416 2:c7a3a8c1aeed 132 // pc.printf("Max2: %.3f\n", Module_Max_BMS2*0.0001f);
open4416 2:c7a3a8c1aeed 133 // pc.printf("Temp: %.1f\n", Max_temp*0.01f);
open4416 2:c7a3a8c1aeed 134 timer_flag = 0;
open4416 0:c4747ebbe0b4 135 }
open4416 0:c4747ebbe0b4 136 }
open4416 0:c4747ebbe0b4 137 }
open4416 0:c4747ebbe0b4 138
open4416 2:c7a3a8c1aeed 139 void timer2_interrupt(void)
open4416 2:c7a3a8c1aeed 140 {
open4416 2:c7a3a8c1aeed 141 }
open4416 2:c7a3a8c1aeed 142
open4416 2:c7a3a8c1aeed 143 void start_log(void)
open4416 2:c7a3a8c1aeed 144 {
open4416 4:f05bef255292 145
open4416 2:c7a3a8c1aeed 146 }
open4416 2:c7a3a8c1aeed 147
open4416 2:c7a3a8c1aeed 148 void stop_log(void)
open4416 2:c7a3a8c1aeed 149 {
open4416 4:f05bef255292 150
open4416 2:c7a3a8c1aeed 151 }
open4416 2:c7a3a8c1aeed 152
open4416 2:c7a3a8c1aeed 153 void autoname(void)
open4416 2:c7a3a8c1aeed 154 {
open4416 2:c7a3a8c1aeed 155
open4416 2:c7a3a8c1aeed 156 }
open4416 2:c7a3a8c1aeed 157
open4416 1:8a9ac822aab7 158 void CAN_RX1(void)
open4416 0:c4747ebbe0b4 159 {
open4416 0:c4747ebbe0b4 160 if(can1.read(can_msg_1)) {
open4416 1:8a9ac822aab7 161 switch(can_msg_1.id) { //Filtered the input message and do corresponding action
open4416 2:c7a3a8c1aeed 162 case 0xF0:
open4416 1:8a9ac822aab7 163 //Internal state address
open4416 2:c7a3a8c1aeed 164 RTD_State = can_msg_1.data[7] & 0x01; //get bit "0", result ( 1 = RTD, 0 = OFF )
open4416 2:c7a3a8c1aeed 165 CAN_flag_1 = 1;
open4416 2:c7a3a8c1aeed 166 break;
open4416 2:c7a3a8c1aeed 167
open4416 2:c7a3a8c1aeed 168 case 0xA0 :
open4416 2:c7a3a8c1aeed 169 //Temperature infrom address 1
open4416 2:c7a3a8c1aeed 170 IGBT_Temp_A = can_msg_1.data[1] << 8 | can_msg_1.data[0];
open4416 2:c7a3a8c1aeed 171 IGBT_Temp_B = can_msg_1.data[3] << 8 | can_msg_1.data[2];
open4416 2:c7a3a8c1aeed 172 IGBT_Temp_C = can_msg_1.data[5] << 8 | can_msg_1.data[4];
open4416 2:c7a3a8c1aeed 173 IGBT_Temp = max_val(IGBT_Temp_A,IGBT_Temp_B,IGBT_Temp_C);
open4416 2:c7a3a8c1aeed 174 CAN_flag_1 = 1;
open4416 2:c7a3a8c1aeed 175 break;
open4416 2:c7a3a8c1aeed 176
open4416 2:c7a3a8c1aeed 177 case 0xA2 :
open4416 2:c7a3a8c1aeed 178 //Temperature infrom address 3
open4416 2:c7a3a8c1aeed 179 Motor_Temp = can_msg_1.data[5] << 8 | can_msg_1.data[4];
open4416 2:c7a3a8c1aeed 180 CAN_flag_1 = 1;
open4416 2:c7a3a8c1aeed 181 break;
open4416 2:c7a3a8c1aeed 182
open4416 2:c7a3a8c1aeed 183 case 0xA5:
open4416 2:c7a3a8c1aeed 184 Motor_Speed = can_msg_1.data[3] << 8 | can_msg_1.data[2];
open4416 2:c7a3a8c1aeed 185 break;
open4416 2:c7a3a8c1aeed 186
open4416 2:c7a3a8c1aeed 187 case 0xA6 :
open4416 2:c7a3a8c1aeed 188 //Current infrom address
open4416 2:c7a3a8c1aeed 189 DC_Current = can_msg_1.data[7] << 8 | can_msg_1.data[6];
open4416 2:c7a3a8c1aeed 190 CAN_flag_1 = 1;
open4416 2:c7a3a8c1aeed 191 break;
open4416 2:c7a3a8c1aeed 192
open4416 2:c7a3a8c1aeed 193 case 0xA7 :
open4416 2:c7a3a8c1aeed 194 //Voltage infrom address
open4416 2:c7a3a8c1aeed 195 DC_Voltage = can_msg_1.data[1] << 8 | can_msg_1.data[0];
open4416 1:8a9ac822aab7 196 CAN_flag_1 = 1;
open4416 1:8a9ac822aab7 197 break;
open4416 1:8a9ac822aab7 198 }
open4416 0:c4747ebbe0b4 199 }
open4416 0:c4747ebbe0b4 200 }
open4416 1:8a9ac822aab7 201
open4416 4:f05bef255292 202 //void CAN_RX2(void)
open4416 4:f05bef255292 203 //{
open4416 4:f05bef255292 204 // if(can2.read(can_msg_2)) {
open4416 4:f05bef255292 205 // switch(can_msg_2.id) {
open4416 4:f05bef255292 206 //// case 0xD1:
open4416 4:f05bef255292 207 //// //BMS1 soc
open4416 4:f05bef255292 208 //// Module_Total_BMS1 = can_msg_2.data[1] << 8 | can_msg_2.data[0];
open4416 4:f05bef255292 209 //// Module_Total_BMS1 += can_msg_2.data[3] << 8 | can_msg_2.data[2];
open4416 4:f05bef255292 210 //// Module_Total_BMS1 += can_msg_2.data[5] << 8 | can_msg_2.data[4];
open4416 4:f05bef255292 211 //// CAN_flag_2 = 1;
open4416 4:f05bef255292 212 //// break;
open4416 4:f05bef255292 213 //// case 0xD2:
open4416 4:f05bef255292 214 //// //BMS1 min Volt
open4416 4:f05bef255292 215 //// Module_Min_BMS1 = can_msg_2.data[7] << 8 | can_msg_2.data[6];
open4416 4:f05bef255292 216 //// CAN_flag_2 = 1;
open4416 4:f05bef255292 217 //// break;
open4416 4:f05bef255292 218 //// case 0xD3:
open4416 4:f05bef255292 219 //// //BMS1 max Volt
open4416 4:f05bef255292 220 //// Module_Max_BMS1 = can_msg_2.data[7] << 8 | can_msg_2.data[6];
open4416 4:f05bef255292 221 //// CAN_flag_2 = 1;
open4416 4:f05bef255292 222 //// break;
open4416 4:f05bef255292 223 // case 0xD4:
open4416 4:f05bef255292 224 // //BMS1 max temperature
open4416 4:f05bef255292 225 // Max_temp_within_BMS1 = can_msg_2.data[7] << 8 | can_msg_2.data[6];
open4416 4:f05bef255292 226 // CAN_flag_2 = 1;
open4416 4:f05bef255292 227 // break;
open4416 4:f05bef255292 228 //
open4416 4:f05bef255292 229 //// case 0xE1:
open4416 4:f05bef255292 230 //// //BMS2 soc
open4416 4:f05bef255292 231 //// Module_Total_BMS2 = can_msg_2.data[1] << 8 | can_msg_2.data[0];
open4416 4:f05bef255292 232 //// Module_Total_BMS2 += can_msg_2.data[3] << 8 | can_msg_2.data[2];
open4416 4:f05bef255292 233 //// Module_Total_BMS2 += can_msg_2.data[5] << 8 | can_msg_2.data[4];
open4416 4:f05bef255292 234 //// CAN_flag_2 = 1;
open4416 4:f05bef255292 235 //// break;
open4416 4:f05bef255292 236 //// case 0xE2:
open4416 4:f05bef255292 237 //// //BMS2 min Volt
open4416 4:f05bef255292 238 //// Module_Min_BMS2 = can_msg_2.data[7] << 8 | can_msg_2.data[6];
open4416 4:f05bef255292 239 //// CAN_flag_2 = 1;
open4416 4:f05bef255292 240 //// break;
open4416 4:f05bef255292 241 //// case 0xE3:
open4416 4:f05bef255292 242 //// //BMS2 max Volt
open4416 4:f05bef255292 243 //// Module_Max_BMS2 = can_msg_2.data[7] << 8 | can_msg_2.data[6];
open4416 4:f05bef255292 244 //// CAN_flag_2 = 1;
open4416 4:f05bef255292 245 //// break;
open4416 4:f05bef255292 246 // case 0xE4:
open4416 4:f05bef255292 247 // //BMS2 max temperature
open4416 4:f05bef255292 248 // Max_temp_within_BMS2 = can_msg_2.data[7] << 8 | can_msg_2.data[6];
open4416 4:f05bef255292 249 // CAN_flag_2 = 1;
open4416 4:f05bef255292 250 // break;
open4416 4:f05bef255292 251 // }
open4416 4:f05bef255292 252 // }
open4416 4:f05bef255292 253 //}
open4416 2:c7a3a8c1aeed 254
open4416 2:c7a3a8c1aeed 255 void Send2CAN1(void)
open4416 2:c7a3a8c1aeed 256 {
open4416 2:c7a3a8c1aeed 257 data_msg[0] = Module_Total;
open4416 2:c7a3a8c1aeed 258 data_msg[1] = Module_Total >> 8;
open4416 2:c7a3a8c1aeed 259 data_msg[2] = Module_Min;
open4416 2:c7a3a8c1aeed 260 data_msg[3] = Module_Min >> 8;
open4416 2:c7a3a8c1aeed 261 data_msg[4] = Module_Max;
open4416 2:c7a3a8c1aeed 262 data_msg[5] = Module_Max >> 8;
open4416 2:c7a3a8c1aeed 263 data_msg[6] = Max_temp;
open4416 2:c7a3a8c1aeed 264 data_msg[7] = Max_temp >> 8;
open4416 2:c7a3a8c1aeed 265 send(0xF1);
open4416 2:c7a3a8c1aeed 266 }
open4416 2:c7a3a8c1aeed 267
open4416 2:c7a3a8c1aeed 268 void send(char ID)
open4416 2:c7a3a8c1aeed 269 {
open4416 2:c7a3a8c1aeed 270 can_msg_send = CANMessage(ID,data_msg,8,CANData,CANStandard);
open4416 2:c7a3a8c1aeed 271 can1.write(can_msg_send);
open4416 2:c7a3a8c1aeed 272 }
open4416 2:c7a3a8c1aeed 273
open4416 2:c7a3a8c1aeed 274 int16_t max_val(int16_t i1, int16_t i2, int16_t i3)
open4416 2:c7a3a8c1aeed 275 {
open4416 2:c7a3a8c1aeed 276 int16_t max = i1;
open4416 2:c7a3a8c1aeed 277 if(i2 > max) max = i2;
open4416 2:c7a3a8c1aeed 278 if(i3 > max) max = i3;
open4416 2:c7a3a8c1aeed 279 return max;
open4416 0:c4747ebbe0b4 280 }