hi
Dependencies: CANMsg
main.cpp@0:69bbc94cae9a, 2019-11-14 (annotated)
- Committer:
- davidyu
- Date:
- Thu Nov 14 03:20:27 2019 +0000
- Revision:
- 0:69bbc94cae9a
- Child:
- 1:983b2e230859
commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
davidyu | 0:69bbc94cae9a | 1 | #include "mbed.h" |
davidyu | 0:69bbc94cae9a | 2 | #include "canIds.h" |
davidyu | 0:69bbc94cae9a | 3 | #include <stdlib.h> |
davidyu | 0:69bbc94cae9a | 4 | #include <stdint.h> |
davidyu | 0:69bbc94cae9a | 5 | #include <stdio.h> |
davidyu | 0:69bbc94cae9a | 6 | |
davidyu | 0:69bbc94cae9a | 7 | // #define BOARD1 // Comment this for one board, BOARD1 sends |
davidyu | 0:69bbc94cae9a | 8 | |
davidyu | 0:69bbc94cae9a | 9 | #define CHAR16 3 |
davidyu | 0:69bbc94cae9a | 10 | #define CHAR32 5 |
davidyu | 0:69bbc94cae9a | 11 | #define NUM_VOLTAGE_READINGS 31 |
davidyu | 0:69bbc94cae9a | 12 | #define NUM_TEMP_READINGS 62 |
davidyu | 0:69bbc94cae9a | 13 | |
davidyu | 0:69bbc94cae9a | 14 | |
davidyu | 0:69bbc94cae9a | 15 | #define MPPT_BASE_R 0x710 // MPPT Base ID (Request) |
davidyu | 0:69bbc94cae9a | 16 | #define MPPT_BASE_A 0x770 // MPPT Base ID (Answer) |
davidyu | 0:69bbc94cae9a | 17 | #define MPPT_OFF 0xF //MPPT Offset ID (set by DIP switch on board) |
davidyu | 0:69bbc94cae9a | 18 | |
davidyu | 0:69bbc94cae9a | 19 | Serial pc(USBTX, USBRX); |
davidyu | 0:69bbc94cae9a | 20 | // CAN can(PA_11, PA_12); // L432KC |
davidyu | 0:69bbc94cae9a | 21 | CAN can(PD_0, PD_1); // 429ZI |
davidyu | 0:69bbc94cae9a | 22 | DigitalOut led(LED1); |
davidyu | 0:69bbc94cae9a | 23 | CANMessage msg; |
davidyu | 0:69bbc94cae9a | 24 | int counter = 0; |
davidyu | 0:69bbc94cae9a | 25 | #ifdef BOARD1 |
davidyu | 0:69bbc94cae9a | 26 | int CanID = 0x0000001; |
davidyu | 0:69bbc94cae9a | 27 | #else |
davidyu | 0:69bbc94cae9a | 28 | int CanID = 0x0000002; |
davidyu | 0:69bbc94cae9a | 29 | #endif |
davidyu | 0:69bbc94cae9a | 30 | |
davidyu | 0:69bbc94cae9a | 31 | // https://stackoverflow.com/questions/24420246/c-function-to-convert-float-to-byte-array |
davidyu | 0:69bbc94cae9a | 32 | void float2Bytes(float val,uint8_t* bytes_array){ |
davidyu | 0:69bbc94cae9a | 33 | uint8_t temp; |
davidyu | 0:69bbc94cae9a | 34 | // Create union of shared memory space |
davidyu | 0:69bbc94cae9a | 35 | union { |
davidyu | 0:69bbc94cae9a | 36 | float float_variable; |
davidyu | 0:69bbc94cae9a | 37 | uint8_t temp_array[4]; |
davidyu | 0:69bbc94cae9a | 38 | } u; |
davidyu | 0:69bbc94cae9a | 39 | // Overite bytes of union with float variable |
davidyu | 0:69bbc94cae9a | 40 | u.float_variable = val; |
davidyu | 0:69bbc94cae9a | 41 | // Assign bytes to input array |
davidyu | 0:69bbc94cae9a | 42 | memcpy(bytes_array, u.temp_array, 4); |
davidyu | 0:69bbc94cae9a | 43 | temp = bytes_array[3]; |
davidyu | 0:69bbc94cae9a | 44 | bytes_array[3] = bytes_array[0]; |
davidyu | 0:69bbc94cae9a | 45 | bytes_array[0] = temp; |
davidyu | 0:69bbc94cae9a | 46 | temp = bytes_array[2]; |
davidyu | 0:69bbc94cae9a | 47 | bytes_array[2] = bytes_array[1]; |
davidyu | 0:69bbc94cae9a | 48 | bytes_array[1] = temp; |
davidyu | 0:69bbc94cae9a | 49 | } |
davidyu | 0:69bbc94cae9a | 50 | |
davidyu | 0:69bbc94cae9a | 51 | float bytes2Float(uint8_t* bytes_array) { |
davidyu | 0:69bbc94cae9a | 52 | union { |
davidyu | 0:69bbc94cae9a | 53 | float f; |
davidyu | 0:69bbc94cae9a | 54 | uint8_t b[4]; |
davidyu | 0:69bbc94cae9a | 55 | } u; |
davidyu | 0:69bbc94cae9a | 56 | u.b[3] = bytes_array[0]; |
davidyu | 0:69bbc94cae9a | 57 | u.b[2] = bytes_array[1]; |
davidyu | 0:69bbc94cae9a | 58 | u.b[1] = bytes_array[2]; |
davidyu | 0:69bbc94cae9a | 59 | u.b[0] = bytes_array[3]; |
davidyu | 0:69bbc94cae9a | 60 | return u.f; |
davidyu | 0:69bbc94cae9a | 61 | } |
davidyu | 0:69bbc94cae9a | 62 | |
davidyu | 0:69bbc94cae9a | 63 | // TODO: use snprintf to convert int, uint16_t stuff into char array for can message |
davidyu | 0:69bbc94cae9a | 64 | // sprintf(&voltagesChar[6*i], "%d", voltages[i]); |
davidyu | 0:69bbc94cae9a | 65 | void generateValues() { |
davidyu | 0:69bbc94cae9a | 66 | // state of charge (SOC) |
davidyu | 0:69bbc94cae9a | 67 | //uint32_t socData = (rand() % (100 - 0 + 1)) + 0; |
davidyu | 0:69bbc94cae9a | 68 | float socData = (rand() % (100000 - 0 + 1)) + 0; |
davidyu | 0:69bbc94cae9a | 69 | socData = socData / 1000.0; |
davidyu | 0:69bbc94cae9a | 70 | uint8_t socDataBytes[4]; // TODO: make separate ones once we thread |
davidyu | 0:69bbc94cae9a | 71 | float2Bytes(socData, &socDataBytes[0]); |
davidyu | 0:69bbc94cae9a | 72 | if(can.write(CANMessage(SOC_DATA, (char*)(socDataBytes), 4))) { |
davidyu | 0:69bbc94cae9a | 73 | pc.printf("Sent SOC_DATA: %f\n", socData); |
davidyu | 0:69bbc94cae9a | 74 | } else { |
davidyu | 0:69bbc94cae9a | 75 | printf("Cannot write to CAN\n"); |
davidyu | 0:69bbc94cae9a | 76 | NVIC_SystemReset(); |
davidyu | 0:69bbc94cae9a | 77 | } |
davidyu | 0:69bbc94cae9a | 78 | |
davidyu | 0:69bbc94cae9a | 79 | // // current data, 50-60A (while moving) fixed point, 32 bits |
davidyu | 0:69bbc94cae9a | 80 | // // num = (rand() % (upper - lower + 1)) + lower |
davidyu | 0:69bbc94cae9a | 81 | float currentData = (rand() % (60000 - 50000 + 1)) + 50000; |
davidyu | 0:69bbc94cae9a | 82 | currentData = currentData / 1000.0; |
davidyu | 0:69bbc94cae9a | 83 | uint8_t bytes[4]; |
davidyu | 0:69bbc94cae9a | 84 | float2Bytes(currentData, &bytes[0]); |
davidyu | 0:69bbc94cae9a | 85 | |
davidyu | 0:69bbc94cae9a | 86 | if(can.write(CANMessage(CURRENT_DATA, (char*)(bytes), 4))) { |
davidyu | 0:69bbc94cae9a | 87 | pc.printf("Sent CURRENT_DATA: %f\n", currentData); |
davidyu | 0:69bbc94cae9a | 88 | } else { |
davidyu | 0:69bbc94cae9a | 89 | pc.printf("Cannot write to CAN\n"); |
davidyu | 0:69bbc94cae9a | 90 | NVIC_SystemReset(); |
davidyu | 0:69bbc94cae9a | 91 | } |
davidyu | 0:69bbc94cae9a | 92 | |
davidyu | 0:69bbc94cae9a | 93 | // voltage data, fixed point 2.7-4V |
davidyu | 0:69bbc94cae9a | 94 | // 16 bit |
davidyu | 0:69bbc94cae9a | 95 | float voltages[NUM_VOLTAGE_READINGS]; |
davidyu | 0:69bbc94cae9a | 96 | for (int i = 0; i < NUM_VOLTAGE_READINGS; i++) { |
davidyu | 0:69bbc94cae9a | 97 | float voltageData = (rand() % (40000 - 27000 + 1)) + 27000; |
davidyu | 0:69bbc94cae9a | 98 | voltageData = voltageData / 1000.0; |
davidyu | 0:69bbc94cae9a | 99 | //uint8_t bytes[4]; |
davidyu | 0:69bbc94cae9a | 100 | float2Bytes(voltageData, &bytes[0]); |
davidyu | 0:69bbc94cae9a | 101 | |
davidyu | 0:69bbc94cae9a | 102 | uint8_t data[5]; |
davidyu | 0:69bbc94cae9a | 103 | data[0] = i; |
davidyu | 0:69bbc94cae9a | 104 | data[1] = bytes[0]; |
davidyu | 0:69bbc94cae9a | 105 | data[2] = bytes[1]; |
davidyu | 0:69bbc94cae9a | 106 | data[3] = bytes[2]; |
davidyu | 0:69bbc94cae9a | 107 | data[4] = bytes[3]; |
davidyu | 0:69bbc94cae9a | 108 | if(can.write(CANMessage(VOLTAGE_DATA, (char*)(data), 5))) { |
davidyu | 0:69bbc94cae9a | 109 | pc.printf("Sent VOLTAGE_DATA: %f\n", voltageData); |
davidyu | 0:69bbc94cae9a | 110 | } else { |
davidyu | 0:69bbc94cae9a | 111 | printf("Cannot write to CAN\n"); |
davidyu | 0:69bbc94cae9a | 112 | NVIC_SystemReset(); |
davidyu | 0:69bbc94cae9a | 113 | } |
davidyu | 0:69bbc94cae9a | 114 | wait(0.1); |
davidyu | 0:69bbc94cae9a | 115 | } |
davidyu | 0:69bbc94cae9a | 116 | |
davidyu | 0:69bbc94cae9a | 117 | // temperature data, 0-100C fixed point res 0.01 |
davidyu | 0:69bbc94cae9a | 118 | // 16 bit |
davidyu | 0:69bbc94cae9a | 119 | float temperatures[NUM_TEMP_READINGS]; |
davidyu | 0:69bbc94cae9a | 120 | |
davidyu | 0:69bbc94cae9a | 121 | for (int i = 0; i < NUM_TEMP_READINGS; i++) { |
davidyu | 0:69bbc94cae9a | 122 | float tempData = (rand() % (73000 - 0 + 1)) + 0; |
davidyu | 0:69bbc94cae9a | 123 | tempData = tempData / 1000.0; |
davidyu | 0:69bbc94cae9a | 124 | float2Bytes(tempData, &bytes[0]); |
davidyu | 0:69bbc94cae9a | 125 | |
davidyu | 0:69bbc94cae9a | 126 | uint8_t data[5]; |
davidyu | 0:69bbc94cae9a | 127 | data[0] = i; |
davidyu | 0:69bbc94cae9a | 128 | data[1] = bytes[0]; |
davidyu | 0:69bbc94cae9a | 129 | data[2] = bytes[1]; |
davidyu | 0:69bbc94cae9a | 130 | data[3] = bytes[2]; |
davidyu | 0:69bbc94cae9a | 131 | data[4] = bytes[3]; |
davidyu | 0:69bbc94cae9a | 132 | |
davidyu | 0:69bbc94cae9a | 133 | if(can.write(CANMessage(TEMPERATURE_DATA, (char*)(data), 5))) { |
davidyu | 0:69bbc94cae9a | 134 | pc.printf("Sent TEMP_DATA: %f\n", tempData); |
davidyu | 0:69bbc94cae9a | 135 | } else { |
davidyu | 0:69bbc94cae9a | 136 | printf("Cannot write to CAN\n"); |
davidyu | 0:69bbc94cae9a | 137 | NVIC_SystemReset(); |
davidyu | 0:69bbc94cae9a | 138 | } |
davidyu | 0:69bbc94cae9a | 139 | wait(0.1); |
davidyu | 0:69bbc94cae9a | 140 | } |
davidyu | 0:69bbc94cae9a | 141 | |
davidyu | 0:69bbc94cae9a | 142 | // TODO: if these flags are not at the bottom of the function, it will skip values. figure this out. |
davidyu | 0:69bbc94cae9a | 143 | // bps trip always 0 |
davidyu | 0:69bbc94cae9a | 144 | uint8_t bpsTrip = 0; |
davidyu | 0:69bbc94cae9a | 145 | if(can.write(CANMessage(BPS_TRIP, (char*)&bpsTrip, 1))) { |
davidyu | 0:69bbc94cae9a | 146 | pc.printf("Sent BPS_TRIP: %d\n", bpsTrip); |
davidyu | 0:69bbc94cae9a | 147 | } else { |
davidyu | 0:69bbc94cae9a | 148 | printf("Cannot write to CAN\n"); |
davidyu | 0:69bbc94cae9a | 149 | NVIC_SystemReset(); |
davidyu | 0:69bbc94cae9a | 150 | } |
davidyu | 0:69bbc94cae9a | 151 | |
davidyu | 0:69bbc94cae9a | 152 | // bps all clear always 1 |
davidyu | 0:69bbc94cae9a | 153 | uint8_t bpsClear = 1; |
davidyu | 0:69bbc94cae9a | 154 | if(can.write(CANMessage(BPS_ALL_CLEAR, (char*)&bpsClear, 1))) { |
davidyu | 0:69bbc94cae9a | 155 | pc.printf("Sent BPS_CLEAR: %d\n", bpsClear); |
davidyu | 0:69bbc94cae9a | 156 | } else { |
davidyu | 0:69bbc94cae9a | 157 | printf("Cannot write to CAN\n"); |
davidyu | 0:69bbc94cae9a | 158 | NVIC_SystemReset(); |
davidyu | 0:69bbc94cae9a | 159 | } |
davidyu | 0:69bbc94cae9a | 160 | |
davidyu | 0:69bbc94cae9a | 161 | // bps off always 0 |
davidyu | 0:69bbc94cae9a | 162 | uint8_t bpsOff = 0; |
davidyu | 0:69bbc94cae9a | 163 | if(can.write(CANMessage(BPS_OFF, (char*)&bpsOff, 1))) { |
davidyu | 0:69bbc94cae9a | 164 | pc.printf("Sent BPS_OFF: %d\n", bpsOff); |
davidyu | 0:69bbc94cae9a | 165 | } else { |
davidyu | 0:69bbc94cae9a | 166 | printf("Cannot write to CAN\n"); |
davidyu | 0:69bbc94cae9a | 167 | NVIC_SystemReset(); |
davidyu | 0:69bbc94cae9a | 168 | } |
davidyu | 0:69bbc94cae9a | 169 | |
davidyu | 0:69bbc94cae9a | 170 | // watchdog triggered, 0 always |
davidyu | 0:69bbc94cae9a | 171 | uint8_t wdog = 0; |
davidyu | 0:69bbc94cae9a | 172 | if(can.write(CANMessage(WDOG_TRIGGERED, (char*)&wdog, 1))) { |
davidyu | 0:69bbc94cae9a | 173 | pc.printf("Sent WDOG_TRIGGERED: %d\n", wdog); |
davidyu | 0:69bbc94cae9a | 174 | } else { |
davidyu | 0:69bbc94cae9a | 175 | printf("Cannot write to CAN\n"); |
davidyu | 0:69bbc94cae9a | 176 | NVIC_SystemReset(); |
davidyu | 0:69bbc94cae9a | 177 | } |
davidyu | 0:69bbc94cae9a | 178 | |
davidyu | 0:69bbc94cae9a | 179 | // TODO: can error, bps command message? |
davidyu | 0:69bbc94cae9a | 180 | //wait(1.0); |
davidyu | 0:69bbc94cae9a | 181 | } |
davidyu | 0:69bbc94cae9a | 182 | |
davidyu | 0:69bbc94cae9a | 183 | float receiveCan(void) { |
davidyu | 0:69bbc94cae9a | 184 | uint32_t received; |
davidyu | 0:69bbc94cae9a | 185 | /* |
davidyu | 0:69bbc94cae9a | 186 | int cansuccess = 0; |
davidyu | 0:69bbc94cae9a | 187 | float data[2]; |
davidyu | 0:69bbc94cae9a | 188 | data[1] = 0.0; |
davidyu | 0:69bbc94cae9a | 189 | int id = MPPT_BASE_R + MPPT_OFF; |
davidyu | 0:69bbc94cae9a | 190 | |
davidyu | 0:69bbc94cae9a | 191 | if (!can.write(CANMessage(id, (char*)data, 8))) |
davidyu | 0:69bbc94cae9a | 192 | printf("Request to MPPT failed \n\r"); |
davidyu | 0:69bbc94cae9a | 193 | */ |
davidyu | 0:69bbc94cae9a | 194 | if (can.read(msg)) { |
davidyu | 0:69bbc94cae9a | 195 | received = *((uint32_t*) msg.data); |
davidyu | 0:69bbc94cae9a | 196 | } else { |
davidyu | 0:69bbc94cae9a | 197 | return -1; |
davidyu | 0:69bbc94cae9a | 198 | } |
davidyu | 0:69bbc94cae9a | 199 | pc.printf("-----------------------\r\n"); |
davidyu | 0:69bbc94cae9a | 200 | |
davidyu | 0:69bbc94cae9a | 201 | /* |
davidyu | 0:69bbc94cae9a | 202 | if(msg.id == (MPPT_BASE_A+MPPT_OFF) ) { |
davidyu | 0:69bbc94cae9a | 203 | |
davidyu | 0:69bbc94cae9a | 204 | AnalogIn Vtemp1(PA_3); // RTD temperature sensor (pin A2) |
davidyu | 0:69bbc94cae9a | 205 | AnalogIn Vtemp2(PA_4); // RTD temperature sensor (pin A3) |
davidyu | 0:69bbc94cae9a | 206 | |
davidyu | 0:69bbc94cae9a | 207 | double tempmeas1; |
davidyu | 0:69bbc94cae9a | 208 | double tempmeas2; |
davidyu | 0:69bbc94cae9a | 209 | double tempoff1 = -1.8; // Offset in deg C to calibrate RTD 1 |
davidyu | 0:69bbc94cae9a | 210 | double tempoff2 = -1.8; // Offset in deg C to calibrate RTD 2 |
davidyu | 0:69bbc94cae9a | 211 | double slope1 = 1.25; // Slope correction to RTD |
davidyu | 0:69bbc94cae9a | 212 | double slope2 = 1.25; // Slope correction to RTD |
davidyu | 0:69bbc94cae9a | 213 | double avgval; |
davidyu | 0:69bbc94cae9a | 214 | int n = 0; |
davidyu | 0:69bbc94cae9a | 215 | |
davidyu | 0:69bbc94cae9a | 216 | float vscale = 150.49; // Input voltage scale factor, mV/LSB (Drivetek datasheet) |
davidyu | 0:69bbc94cae9a | 217 | float vscaleout = 208.79; // Output voltage scale factor, mV/LSB (Drivetek datasheet) |
davidyu | 0:69bbc94cae9a | 218 | float iscale = 8.72; // Input current scale factor, mA/LSB (Drivetek datasheet) |
davidyu | 0:69bbc94cae9a | 219 | float mpptpwr; |
davidyu | 0:69bbc94cae9a | 220 | |
davidyu | 0:69bbc94cae9a | 221 | cansuccess = 1; |
davidyu | 0:69bbc94cae9a | 222 | int involtmsb = msg.data[0] & 0x3; // Bit 0 and Bit 1 of Byte 1 are MSB Uin |
davidyu | 0:69bbc94cae9a | 223 | int involtlsb = msg.data[1]; // Byte 2 is LSB of Uin |
davidyu | 0:69bbc94cae9a | 224 | int involt = (involtmsb<<8)|(involtlsb); |
davidyu | 0:69bbc94cae9a | 225 | int outvoltmsb = msg.data[4] & 0x3; // Bit 0 and Bit 1 of Byte 5 are MSB Uout |
davidyu | 0:69bbc94cae9a | 226 | int outvoltlsb = msg.data[5]; // Byte 6 is LSB of Uout |
davidyu | 0:69bbc94cae9a | 227 | int outvolt = (outvoltmsb<<8)|(outvoltlsb); |
davidyu | 0:69bbc94cae9a | 228 | int incurmsb = msg.data[2] & 0x3; // Bit 0 and Bit 1 of Byte 3 are MSB Uin |
davidyu | 0:69bbc94cae9a | 229 | int incurlsb = msg.data[3]; // Byte 4 is LSB of Iin |
davidyu | 0:69bbc94cae9a | 230 | int incur = (incurmsb<<8)|(incurlsb); |
davidyu | 0:69bbc94cae9a | 231 | mpptpwr = (involt*vscale/1000.0)*(incur*iscale/1000.0); |
davidyu | 0:69bbc94cae9a | 232 | |
davidyu | 0:69bbc94cae9a | 233 | avgval = 0.0; |
davidyu | 0:69bbc94cae9a | 234 | n=0; |
davidyu | 0:69bbc94cae9a | 235 | while(n<100){ |
davidyu | 0:69bbc94cae9a | 236 | tempmeas1 = Vtemp1.read()*3.3; |
davidyu | 0:69bbc94cae9a | 237 | avgval=avgval+tempmeas1; |
davidyu | 0:69bbc94cae9a | 238 | n++; |
davidyu | 0:69bbc94cae9a | 239 | } |
davidyu | 0:69bbc94cae9a | 240 | tempmeas1 = tempoff1 + slope1*(avgval/100.0)*150.0/2.92; |
davidyu | 0:69bbc94cae9a | 241 | avgval = 0.0; |
davidyu | 0:69bbc94cae9a | 242 | n=0; |
davidyu | 0:69bbc94cae9a | 243 | while(n<100){ |
davidyu | 0:69bbc94cae9a | 244 | tempmeas2 = Vtemp2.read()*3.3; |
davidyu | 0:69bbc94cae9a | 245 | avgval=avgval+tempmeas2; |
davidyu | 0:69bbc94cae9a | 246 | n++; |
davidyu | 0:69bbc94cae9a | 247 | } |
davidyu | 0:69bbc94cae9a | 248 | tempmeas2 = tempoff2 + slope2*(avgval/100.0)*150.0/2.92; |
davidyu | 0:69bbc94cae9a | 249 | printf("Array Temperature 1 = %.1f", tempmeas1); |
davidyu | 0:69bbc94cae9a | 250 | printf(" deg C "); |
davidyu | 0:69bbc94cae9a | 251 | printf("Array Temperature 2 = %.1f", tempmeas2); |
davidyu | 0:69bbc94cae9a | 252 | printf(" deg C \r\n"); |
davidyu | 0:69bbc94cae9a | 253 | printf("MPPT In Vol = %.1f", involt*vscale/1000.0); |
davidyu | 0:69bbc94cae9a | 254 | printf("V Out Vol = %.1f", outvolt*vscaleout/1000.0); |
davidyu | 0:69bbc94cae9a | 255 | printf("V Input Cur = %.1f", incur*iscale/1000.0); |
davidyu | 0:69bbc94cae9a | 256 | printf("A In Pwr = %.2f", mpptpwr); |
davidyu | 0:69bbc94cae9a | 257 | printf("W \r\n"); |
davidyu | 0:69bbc94cae9a | 258 | } |
davidyu | 0:69bbc94cae9a | 259 | */ |
davidyu | 0:69bbc94cae9a | 260 | if (msg.id == DC_BUS_CURRENT){ |
davidyu | 0:69bbc94cae9a | 261 | float DCbuscur = bytes2Float(msg.data); |
davidyu | 0:69bbc94cae9a | 262 | pc.printf("DC bus current is %f\n", DCbuscur); |
davidyu | 0:69bbc94cae9a | 263 | return DCbuscur; |
davidyu | 0:69bbc94cae9a | 264 | } else if (msg.id == DC_BUS_VOLTAGE){ |
davidyu | 0:69bbc94cae9a | 265 | float DCbusvolt = bytes2Float(msg.data); |
davidyu | 0:69bbc94cae9a | 266 | pc.printf("DC bus voltage is %f\n", DCbusvolt); |
davidyu | 0:69bbc94cae9a | 267 | return DCbusvolt; |
davidyu | 0:69bbc94cae9a | 268 | } else if (msg.id == PHASE_B_CURRENT){ |
davidyu | 0:69bbc94cae9a | 269 | float phaseBcurrent = bytes2Float(msg.data); |
davidyu | 0:69bbc94cae9a | 270 | pc.printf("Phase B current is %f\n", phaseBcurrent); |
davidyu | 0:69bbc94cae9a | 271 | return phaseBcurrent; |
davidyu | 0:69bbc94cae9a | 272 | } else if (msg.id == PHASE_C_CURRENT){ |
davidyu | 0:69bbc94cae9a | 273 | float phaseCcurrent = bytes2Float(msg.data); |
davidyu | 0:69bbc94cae9a | 274 | pc.printf("Phase C current is %f\n", phaseCcurrent); |
davidyu | 0:69bbc94cae9a | 275 | return phaseCcurrent; |
davidyu | 0:69bbc94cae9a | 276 | } else if (msg.id == VEHICLE_VELOCITY){ |
davidyu | 0:69bbc94cae9a | 277 | float vehicleVel = bytes2Float(msg.data); |
davidyu | 0:69bbc94cae9a | 278 | pc.printf("Vehicle velocity is %f\n", vehicleVel); |
davidyu | 0:69bbc94cae9a | 279 | return vehicleVel; |
davidyu | 0:69bbc94cae9a | 280 | } else if (msg.id == MOTOR_VELOCITY){ |
davidyu | 0:69bbc94cae9a | 281 | float motorVel = bytes2Float(msg.data); |
davidyu | 0:69bbc94cae9a | 282 | pc.printf("Motor velocity is %f\n", motorVel); |
davidyu | 0:69bbc94cae9a | 283 | return motorVel; |
davidyu | 0:69bbc94cae9a | 284 | } else if (msg.id == VD){ |
davidyu | 0:69bbc94cae9a | 285 | float vd = bytes2Float(msg.data); |
davidyu | 0:69bbc94cae9a | 286 | pc.printf("Velocity vector D is %f\n", vd); |
davidyu | 0:69bbc94cae9a | 287 | return vd; |
davidyu | 0:69bbc94cae9a | 288 | } else if (msg.id == VQ){ |
davidyu | 0:69bbc94cae9a | 289 | float vq = bytes2Float(msg.data); |
davidyu | 0:69bbc94cae9a | 290 | pc.printf("Velocity vector Q is %f\n", vq); |
davidyu | 0:69bbc94cae9a | 291 | return vq; |
davidyu | 0:69bbc94cae9a | 292 | } else if (msg.id == ID){ |
davidyu | 0:69bbc94cae9a | 293 | float Id = bytes2Float(msg.data); |
davidyu | 0:69bbc94cae9a | 294 | pc.printf("Current vector D is %f\n", Id); |
davidyu | 0:69bbc94cae9a | 295 | return Id; |
davidyu | 0:69bbc94cae9a | 296 | } else if (msg.id == IQ){ |
davidyu | 0:69bbc94cae9a | 297 | float Iq = bytes2Float(msg.data); |
davidyu | 0:69bbc94cae9a | 298 | pc.printf("Current vector Q is %f\n", Iq); |
davidyu | 0:69bbc94cae9a | 299 | return Iq; |
davidyu | 0:69bbc94cae9a | 300 | } else if (msg.id == BEMFD){ |
davidyu | 0:69bbc94cae9a | 301 | float BEMFd = bytes2Float(msg.data); |
davidyu | 0:69bbc94cae9a | 302 | pc.printf("BackEMF Measurement D is %f\n", BEMFd); |
davidyu | 0:69bbc94cae9a | 303 | return BEMFd; |
davidyu | 0:69bbc94cae9a | 304 | } else if (msg.id == BEMFQ){ |
davidyu | 0:69bbc94cae9a | 305 | float BEMFq = bytes2Float(msg.data); |
davidyu | 0:69bbc94cae9a | 306 | pc.printf("BackEMF Measurement Q is %f\n", BEMFq); |
davidyu | 0:69bbc94cae9a | 307 | return BEMFq; |
davidyu | 0:69bbc94cae9a | 308 | } else if (msg.id == HEAT_SINK_TEMPERATURE){ |
davidyu | 0:69bbc94cae9a | 309 | float heatSinkTemp = bytes2Float(msg.data); |
davidyu | 0:69bbc94cae9a | 310 | pc.printf("Heat sink temperature is %f\n", heatSinkTemp); |
davidyu | 0:69bbc94cae9a | 311 | return heatSinkTemp; |
davidyu | 0:69bbc94cae9a | 312 | } else if (msg.id == MOTOR_TEMPERATURE){ |
davidyu | 0:69bbc94cae9a | 313 | float motorTemp = bytes2Float(msg.data); |
davidyu | 0:69bbc94cae9a | 314 | pc.printf("Motor temperature is %f\n", motorTemp); |
davidyu | 0:69bbc94cae9a | 315 | return motorTemp; |
davidyu | 0:69bbc94cae9a | 316 | } else if (msg.id == DC_BUS_AMP_HOURS){ |
davidyu | 0:69bbc94cae9a | 317 | float DCBusAmpHours = bytes2Float(msg.data); |
davidyu | 0:69bbc94cae9a | 318 | pc.printf("DC Bus AmpHours is %f\n", DCBusAmpHours); |
davidyu | 0:69bbc94cae9a | 319 | return DCBusAmpHours; |
davidyu | 0:69bbc94cae9a | 320 | } else if (msg.id == ODOMETER){ |
davidyu | 0:69bbc94cae9a | 321 | float odometerValue = bytes2Float(msg.data); |
davidyu | 0:69bbc94cae9a | 322 | pc.printf("Odomoter value is %f\n", odometerValue); |
davidyu | 0:69bbc94cae9a | 323 | return odometerValue; |
davidyu | 0:69bbc94cae9a | 324 | } |
davidyu | 0:69bbc94cae9a | 325 | |
davidyu | 0:69bbc94cae9a | 326 | // BPS |
davidyu | 0:69bbc94cae9a | 327 | if (msg.id == BPS_TRIP) { |
davidyu | 0:69bbc94cae9a | 328 | received = msg.data[0]; |
davidyu | 0:69bbc94cae9a | 329 | pc.printf("BPS Trip is %d\n", received); |
davidyu | 0:69bbc94cae9a | 330 | } else if (msg.id == BPS_ALL_CLEAR) { |
davidyu | 0:69bbc94cae9a | 331 | received = msg.data[0]; |
davidyu | 0:69bbc94cae9a | 332 | pc.printf("BPS All Clear is %d\n", received); |
davidyu | 0:69bbc94cae9a | 333 | } else if (msg.id == BPS_OFF) { |
davidyu | 0:69bbc94cae9a | 334 | received = msg.data[0]; |
davidyu | 0:69bbc94cae9a | 335 | // sd card stuff |
davidyu | 0:69bbc94cae9a | 336 | pc.printf("BPS Off is %d\n", received); |
davidyu | 0:69bbc94cae9a | 337 | } else if (msg.id == WDOG_TRIGGERED) { |
davidyu | 0:69bbc94cae9a | 338 | received = msg.data[0]; |
davidyu | 0:69bbc94cae9a | 339 | pc.printf("WDOG Triggered is %d\n", received); |
davidyu | 0:69bbc94cae9a | 340 | } else if (msg.id == CAN_ERROR) { |
davidyu | 0:69bbc94cae9a | 341 | received = msg.data[0]; |
davidyu | 0:69bbc94cae9a | 342 | pc.printf("CAN Error is %d\n", received); |
davidyu | 0:69bbc94cae9a | 343 | } else if (msg.id == VOLTAGE_DATA) { |
davidyu | 0:69bbc94cae9a | 344 | // voltage |
davidyu | 0:69bbc94cae9a | 345 | float voltage = bytes2Float(&msg.data[1]); |
davidyu | 0:69bbc94cae9a | 346 | pc.printf("Voltage is %.3fV from array index %d\n", voltage, msg.data[0]); |
davidyu | 0:69bbc94cae9a | 347 | return voltage; |
davidyu | 0:69bbc94cae9a | 348 | } else if (msg.id == TEMPERATURE_DATA){ |
davidyu | 0:69bbc94cae9a | 349 | // temperature |
davidyu | 0:69bbc94cae9a | 350 | float temp = bytes2Float(&msg.data[1]); |
davidyu | 0:69bbc94cae9a | 351 | pc.printf("Temp is %.3f from array index %d\n", temp, msg.data[0]); |
davidyu | 0:69bbc94cae9a | 352 | return temp; |
davidyu | 0:69bbc94cae9a | 353 | } else if(msg.id == SOC_DATA){ |
davidyu | 0:69bbc94cae9a | 354 | // state of charge |
davidyu | 0:69bbc94cae9a | 355 | float soc = bytes2Float(msg.data); |
davidyu | 0:69bbc94cae9a | 356 | pc.printf("SoC is %.3f%%\n", soc); |
davidyu | 0:69bbc94cae9a | 357 | return received; |
davidyu | 0:69bbc94cae9a | 358 | } else if(msg.id == CURRENT_DATA){ |
davidyu | 0:69bbc94cae9a | 359 | // current |
davidyu | 0:69bbc94cae9a | 360 | float current = bytes2Float(msg.data); |
davidyu | 0:69bbc94cae9a | 361 | pc.printf("Current is %.3fA\n", current); |
davidyu | 0:69bbc94cae9a | 362 | return current; |
davidyu | 0:69bbc94cae9a | 363 | } |
davidyu | 0:69bbc94cae9a | 364 | |
davidyu | 0:69bbc94cae9a | 365 | // Motor controller |
davidyu | 0:69bbc94cae9a | 366 | /* |
davidyu | 0:69bbc94cae9a | 367 | else if (msg.id == DC_BUS_CURRENT){ |
davidyu | 0:69bbc94cae9a | 368 | float DCbuscur = bytes2Float(msg.data); |
davidyu | 0:69bbc94cae9a | 369 | pc.printf("DC bus current is %f\n", DCbuscur); |
davidyu | 0:69bbc94cae9a | 370 | return DCbuscur; |
davidyu | 0:69bbc94cae9a | 371 | } else if (msg.id == DC_BUS_VOLTAGE){ |
davidyu | 0:69bbc94cae9a | 372 | float DCbusvolt = bytes2Float(msg.data); |
davidyu | 0:69bbc94cae9a | 373 | pc.printf("DC bus voltage is %f\n", DCbusvolt); |
davidyu | 0:69bbc94cae9a | 374 | return DCbusvolt; |
davidyu | 0:69bbc94cae9a | 375 | } else if (msg.id == PHASE_B_CURRENT){ |
davidyu | 0:69bbc94cae9a | 376 | float phaseBcurrent = bytes2Float(msg.data); |
davidyu | 0:69bbc94cae9a | 377 | pc.printf("Phase B current is %f\n", phaseBcurrent); |
davidyu | 0:69bbc94cae9a | 378 | return phaseBcurrent; |
davidyu | 0:69bbc94cae9a | 379 | } else if (msg.id == PHASE_C_CURRENT){ |
davidyu | 0:69bbc94cae9a | 380 | float phaseCcurrent = bytes2Float(msg.data); |
davidyu | 0:69bbc94cae9a | 381 | pc.printf("Phase C current is %f\n", phaseCcurrent); |
davidyu | 0:69bbc94cae9a | 382 | return phaseCcurrent; |
davidyu | 0:69bbc94cae9a | 383 | } else if (msg.id == VEHICLE_VELOCITY){ |
davidyu | 0:69bbc94cae9a | 384 | float vehicleVel = bytes2Float(msg.data); |
davidyu | 0:69bbc94cae9a | 385 | pc.printf("Vehicle velocity is %f\n", vehicleVel); |
davidyu | 0:69bbc94cae9a | 386 | return vehicleVel; |
davidyu | 0:69bbc94cae9a | 387 | } else if (msg.id == MOTOR_VELOCITY){ |
davidyu | 0:69bbc94cae9a | 388 | float motorVel = bytes2Float(msg.data); |
davidyu | 0:69bbc94cae9a | 389 | pc.printf("Motor velocity is %f\n", motorVel); |
davidyu | 0:69bbc94cae9a | 390 | return motorVel; |
davidyu | 0:69bbc94cae9a | 391 | } else if (msg.id == VD){ |
davidyu | 0:69bbc94cae9a | 392 | float vd = bytes2Float(msg.data); |
davidyu | 0:69bbc94cae9a | 393 | pc.printf("Velocity vector D is %f\n", vd); |
davidyu | 0:69bbc94cae9a | 394 | return vd; |
davidyu | 0:69bbc94cae9a | 395 | } else if (msg.id == VQ){ |
davidyu | 0:69bbc94cae9a | 396 | float vq = bytes2Float(msg.data); |
davidyu | 0:69bbc94cae9a | 397 | pc.printf("Velocity vector Q is %f\n", vq); |
davidyu | 0:69bbc94cae9a | 398 | return vq; |
davidyu | 0:69bbc94cae9a | 399 | } else if (msg.id == ID){ |
davidyu | 0:69bbc94cae9a | 400 | float Id = bytes2Float(msg.data); |
davidyu | 0:69bbc94cae9a | 401 | pc.printf("Current vector D is %f\n", Id); |
davidyu | 0:69bbc94cae9a | 402 | return Id; |
davidyu | 0:69bbc94cae9a | 403 | } else if (msg.id == IQ){ |
davidyu | 0:69bbc94cae9a | 404 | float Iq = bytes2Float(msg.data); |
davidyu | 0:69bbc94cae9a | 405 | pc.printf("Current vector Q is %f\n", Iq); |
davidyu | 0:69bbc94cae9a | 406 | return Iq; |
davidyu | 0:69bbc94cae9a | 407 | } else if (msg.id == BEMFD){ |
davidyu | 0:69bbc94cae9a | 408 | float BEMFd = bytes2Float(msg.data); |
davidyu | 0:69bbc94cae9a | 409 | pc.printf("BackEMF Measurement D is %f\n", BEMFd); |
davidyu | 0:69bbc94cae9a | 410 | return BEMFd; |
davidyu | 0:69bbc94cae9a | 411 | } else if (msg.id == BEMFQ){ |
davidyu | 0:69bbc94cae9a | 412 | float BEMFq = bytes2Float(msg.data); |
davidyu | 0:69bbc94cae9a | 413 | pc.printf("BackEMF Measurement Q is %f\n", BEMFq); |
davidyu | 0:69bbc94cae9a | 414 | return BEMFq; |
davidyu | 0:69bbc94cae9a | 415 | } else if (msg.id == HEAT_SINK_TEMPERATURE){ |
davidyu | 0:69bbc94cae9a | 416 | float heatSinkTemp = bytes2Float(msg.data); |
davidyu | 0:69bbc94cae9a | 417 | pc.printf("Heat sink temperature is %f\n", heatSinkTemp); |
davidyu | 0:69bbc94cae9a | 418 | return heatSinkTemp; |
davidyu | 0:69bbc94cae9a | 419 | } else if (msg.id == MOTOR_TEMPERATURE){ |
davidyu | 0:69bbc94cae9a | 420 | float motorTemp = bytes2Float(msg.data); |
davidyu | 0:69bbc94cae9a | 421 | pc.printf("Motor temperature is %f\n", motorTemp); |
davidyu | 0:69bbc94cae9a | 422 | return motorTemp; |
davidyu | 0:69bbc94cae9a | 423 | } else if (msg.id == DC_BUS_AMP_HOURS){ |
davidyu | 0:69bbc94cae9a | 424 | float DCBusAmpHours = bytes2Float(msg.data); |
davidyu | 0:69bbc94cae9a | 425 | pc.printf("DC Bus AmpHours is %f\n", DCBusAmpHours); |
davidyu | 0:69bbc94cae9a | 426 | return DCBusAmpHours; |
davidyu | 0:69bbc94cae9a | 427 | } else if (msg.id == ODOMETER){ |
davidyu | 0:69bbc94cae9a | 428 | float odometerValue = bytes2Float(msg.data); |
davidyu | 0:69bbc94cae9a | 429 | pc.printf("Odomoter value is %f\n", odometerValue); |
davidyu | 0:69bbc94cae9a | 430 | return odometerValue; |
davidyu | 0:69bbc94cae9a | 431 | } |
davidyu | 0:69bbc94cae9a | 432 | */ |
davidyu | 0:69bbc94cae9a | 433 | |
davidyu | 0:69bbc94cae9a | 434 | |
davidyu | 0:69bbc94cae9a | 435 | pc.printf("-----------------------\r\n"); |
davidyu | 0:69bbc94cae9a | 436 | //wait(0.5); |
davidyu | 0:69bbc94cae9a | 437 | return -1; |
davidyu | 0:69bbc94cae9a | 438 | } |
davidyu | 0:69bbc94cae9a | 439 | |
davidyu | 0:69bbc94cae9a | 440 | int main() { |
davidyu | 0:69bbc94cae9a | 441 | pc.baud(9600); // set serial speed |
davidyu | 0:69bbc94cae9a | 442 | can.frequency(125000); // max 1Mbps, usually 150000 |
davidyu | 0:69bbc94cae9a | 443 | pc.printf("-----------------\r\n"); |
davidyu | 0:69bbc94cae9a | 444 | pc.printf(" main loop \r\n"); |
davidyu | 0:69bbc94cae9a | 445 | pc.printf("this is board %d \r\n", CanID); |
davidyu | 0:69bbc94cae9a | 446 | pc.printf("-----------------\r\n"); |
davidyu | 0:69bbc94cae9a | 447 | CANMessage msg; |
davidyu | 0:69bbc94cae9a | 448 | led = 0; |
davidyu | 0:69bbc94cae9a | 449 | |
davidyu | 0:69bbc94cae9a | 450 | while(1) { |
davidyu | 0:69bbc94cae9a | 451 | // Write CAN, comment for one board |
davidyu | 0:69bbc94cae9a | 452 | #ifdef BOARD1 |
davidyu | 0:69bbc94cae9a | 453 | generateValues(); |
davidyu | 0:69bbc94cae9a | 454 | #else |
davidyu | 0:69bbc94cae9a | 455 | // Read CAN, comment for the other |
davidyu | 0:69bbc94cae9a | 456 | receiveCan(); |
davidyu | 0:69bbc94cae9a | 457 | #endif |
davidyu | 0:69bbc94cae9a | 458 | |
davidyu | 0:69bbc94cae9a | 459 | // comment for push |
davidyu | 0:69bbc94cae9a | 460 | // wait(1.0); |
davidyu | 0:69bbc94cae9a | 461 | |
davidyu | 0:69bbc94cae9a | 462 | } |
davidyu | 0:69bbc94cae9a | 463 | } |