hi

Dependencies:   CANMsg

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?

UserRevisionLine numberNew 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 }