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