University of Texas Solar Vehicles Team / Mbed 2 deprecated motor-control

Dependencies:   mbed

Committer:
armin1376
Date:
Wed Nov 13 23:34:18 2019 +0000
Revision:
6:e7c29e46ad6c
Parent:
5:f55622eacb87
Child:
7:3352a96997b3
New Code

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jjohnle 3:f282664610ba 1 // Motor Control Board Program
jjohnle 3:f282664610ba 2 // This program operates the Tritium controller and also sends data
jjohnle 3:f282664610ba 3 // over the separate car CAN.
jjohnle 4:7d027ceba0a0 4
jjohnle 2:2a4822c7c91a 5 #include "mbed.h"
jjohnle 4:7d027ceba0a0 6
jjohnle 3:f282664610ba 7 // CAN base address and offsets (Tritium)
jjohnle 0:c61d18b01f8c 8 #define DC_BASE 0x220 // Driver controls base address
jjohnle 0:c61d18b01f8c 9 #define DC_DRIVE 0x01 // Offset for motor drive command
jjohnle 0:c61d18b01f8c 10 #define DC_POWER 0x02 // Offset for motor power command
jjohnle 0:c61d18b01f8c 11 #define DC_RESET 0x03 // Offset for reset command
jjohnle 0:c61d18b01f8c 12 #define DC_SWITCH 0x04 // Offset for phase current measurement
jjohnle 4:7d027ceba0a0 13
jjohnle 3:f282664610ba 14 #define MC_BASE 0x240 // Motor controls base address
jjohnle 3:f282664610ba 15 #define MC_BUS 0x02 // Bus measurement offset
jjohnle 3:f282664610ba 16 #define MC_VEL 0x03 // Velocity measurement offset
jjohnle 3:f282664610ba 17 #define MC_PHCUR 0x04 // Phase Current offset
jjohnle 3:f282664610ba 18 #define MC_VOVEC 0x05 // Voltage Vector offset
jjohnle 3:f282664610ba 19 #define MC_CUVEC 0x06 // current vector offset
jjohnle 3:f282664610ba 20 #define MC_BEMF 0x07 // back emf offset
jjohnle 3:f282664610ba 21 #define MC_TEMP 0x0B // heat sink and motor temp offset
jjohnle 3:f282664610ba 22 #define MC_AMPH 0x0E // odometer and bus amp ohours measuremeant
jjohnle 0:c61d18b01f8c 23 #define MAX_VELOCITY 100 // motor velocity in m/s
jjohnle 0:c61d18b01f8c 24 #define MAX_CURRENT 1.0 // desired motor current as percentage of max current
jjohnle 4:7d027ceba0a0 25
jjohnle 3:f282664610ba 26 #define DC_BUS_CURRENT 0x900
jjohnle 3:f282664610ba 27 #define DC_BUS_VOLTAGE 0x901
jjohnle 3:f282664610ba 28 #define PHASE_B_CURRENT 0x902
jjohnle 3:f282664610ba 29 #define PHASE_C_CURRENT 0x903
jjohnle 3:f282664610ba 30 #define VEHICLE_VELOCITY 0x904
jjohnle 3:f282664610ba 31 #define MOTOR_VELOCITY 0x905
jjohnle 3:f282664610ba 32 #define VD 0x906
jjohnle 3:f282664610ba 33 #define VQ 0x907
jjohnle 3:f282664610ba 34 #define ID 0x908
jjohnle 3:f282664610ba 35 #define IQ 0x909
jjohnle 3:f282664610ba 36 #define BEMFD 0x90A
jjohnle 3:f282664610ba 37 #define BEMFQ 0x90B
jjohnle 3:f282664610ba 38 #define HEAT_SINK_TEMPERATURE 0x90C
jjohnle 3:f282664610ba 39 #define MOTOR_TEMPERATURE 0x90D
jjohnle 3:f282664610ba 40 #define DC_BUS_AMP_HOURS 0x90E
jjohnle 3:f282664610ba 41 #define ODOMETER 0x90F
armin1376 5:f55622eacb87 42
armin1376 5:f55622eacb87 43 #define DASH_Forward 0x580 // DASH Forward Motor ID
armin1376 5:f55622eacb87 44 #define DASH_Cruise_Set 0x581 // DASH Brake ID
armin1376 5:f55622eacb87 45 #define DASH_Cruise 0x582 // DASH Brake ID
armin1376 5:f55622eacb87 46 #define DASH_Regen 0x583 // DASH Regen ID
jjohnle 4:7d027ceba0a0 47
jjohnle 3:f282664610ba 48 CAN can1(PD_0,PD_1,125000); // can1 is car CAN (Rx, Tx, speed)
armin1376 5:f55622eacb87 49 CAN can2(PB_5,PB_6, 100000); // can2 is motor controller CAN (Rx, Tx, speed)
jjohnle 0:c61d18b01f8c 50 Serial pc(USBTX, USBRX);
jjohnle 4:7d027ceba0a0 51
jjohnle 3:f282664610ba 52 AnalogIn ain(PB_0);
jjohnle 4:7d027ceba0a0 53
jjohnle 3:f282664610ba 54 DigitalOut LED8(PF_2);
jjohnle 3:f282664610ba 55 DigitalOut LED7(PA_7);
jjohnle 3:f282664610ba 56 DigitalOut LED6(PF_10);
jjohnle 3:f282664610ba 57 DigitalOut LED5(PF_5);
jjohnle 3:f282664610ba 58 DigitalOut LED4a(PF_3);
jjohnle 3:f282664610ba 59 DigitalOut LED3a(PC_3);
jjohnle 3:f282664610ba 60 DigitalOut LED2a(PC_0);
jjohnle 3:f282664610ba 61 DigitalOut LED1a(PA_3);
armin1376 6:e7c29e46ad6c 62
armin1376 6:e7c29e46ad6c 63
armin1376 6:e7c29e46ad6c 64 CANMessage msg;
armin1376 6:e7c29e46ad6c 65
armin1376 6:e7c29e46ad6c 66 union {
armin1376 6:e7c29e46ad6c 67 char rcvdata[4];
armin1376 6:e7c29e46ad6c 68 float rxdata;
armin1376 6:e7c29e46ad6c 69 } urxdata;
armin1376 6:e7c29e46ad6c 70
armin1376 6:e7c29e46ad6c 71 char rdata2[8];
armin1376 6:e7c29e46ad6c 72 float vehicleVel;
armin1376 6:e7c29e46ad6c 73 float motorVel;
jjohnle 4:7d027ceba0a0 74
jjohnle 3:f282664610ba 75 #define MAX_VELOCITY 100 // motor velocity in m/s
jjohnle 3:f282664610ba 76 #define MAX_CURRENT 1.0 // desired motor current as percentage of max current
armin1376 6:e7c29e46ad6c 77 void speeed(){
armin1376 6:e7c29e46ad6c 78
armin1376 6:e7c29e46ad6c 79
armin1376 5:f55622eacb87 80 while(1){
armin1376 6:e7c29e46ad6c 81 if(can2.read(msg) && msg.id == (MC_BASE+MC_VEL)) {
armin1376 6:e7c29e46ad6c 82 for (int i = 0; i < msg.len; i++) {
armin1376 6:e7c29e46ad6c 83 rdata2[i] = msg.data[i];
armin1376 6:e7c29e46ad6c 84 }
armin1376 6:e7c29e46ad6c 85 }
armin1376 6:e7c29e46ad6c 86
armin1376 6:e7c29e46ad6c 87 if(msg.id == (MC_BASE+MC_VEL)) {
armin1376 6:e7c29e46ad6c 88 for (int i = 0; i < msg.len; i++) {
armin1376 6:e7c29e46ad6c 89 rdata2[i] = msg.data[i];
armin1376 6:e7c29e46ad6c 90 }
armin1376 6:e7c29e46ad6c 91 // sending value to CAR can
armin1376 6:e7c29e46ad6c 92 if (!can1.write(CANMessage(0x243, (char*) rdata2, 8))) {
armin1376 6:e7c29e46ad6c 93 pc.printf("Cannot write to CAN\n");
armin1376 6:e7c29e46ad6c 94 }
armin1376 6:e7c29e46ad6c 95 wait(0.001);
armin1376 6:e7c29e46ad6c 96
armin1376 6:e7c29e46ad6c 97 urxdata.rcvdata[3] = rdata2[7];
armin1376 6:e7c29e46ad6c 98 urxdata.rcvdata[2] = rdata2[6];
armin1376 6:e7c29e46ad6c 99 urxdata.rcvdata[1] = rdata2[5];
armin1376 6:e7c29e46ad6c 100 urxdata.rcvdata[0] = rdata2[4];
armin1376 6:e7c29e46ad6c 101 vehicleVel = urxdata.rxdata;
armin1376 6:e7c29e46ad6c 102 urxdata.rcvdata[3] = rdata2[3];
armin1376 6:e7c29e46ad6c 103 urxdata.rcvdata[2] = rdata2[2];
armin1376 6:e7c29e46ad6c 104 urxdata.rcvdata[1] = rdata2[1];
armin1376 6:e7c29e46ad6c 105 urxdata.rcvdata[0] = rdata2[0];
armin1376 6:e7c29e46ad6c 106 motorVel = urxdata.rxdata;
armin1376 6:e7c29e46ad6c 107 }
armin1376 5:f55622eacb87 108 }
armin1376 5:f55622eacb87 109
armin1376 5:f55622eacb87 110 }
armin1376 5:f55622eacb87 111
armin1376 6:e7c29e46ad6c 112
armin1376 6:e7c29e46ad6c 113
armin1376 5:f55622eacb87 114 int main() {
armin1376 6:e7c29e46ad6c 115
armin1376 6:e7c29e46ad6c 116 can1.frequency(125000);
armin1376 6:e7c29e46ad6c 117 Thread V1(speeed);
armin1376 5:f55622eacb87 118
jjohnle 3:f282664610ba 119 float current = MAX_CURRENT;
jjohnle 3:f282664610ba 120 float velocity = MAX_VELOCITY;
jjohnle 3:f282664610ba 121 float bus_current = MAX_CURRENT;
jjohnle 3:f282664610ba 122 float DCbuscur;
jjohnle 3:f282664610ba 123 float DCbusvolt;
jjohnle 3:f282664610ba 124 double pedal_position;
jjohnle 3:f282664610ba 125 float data[2];
jjohnle 3:f282664610ba 126 float data2[2];
jjohnle 3:f282664610ba 127 float meas;
jjohnle 3:f282664610ba 128 double avgval;
jjohnle 3:f282664610ba 129 int n;
jjohnle 3:f282664610ba 130 int dummy;
jjohnle 3:f282664610ba 131 int alive;
jjohnle 4:7d027ceba0a0 132
jjohnle 3:f282664610ba 133 // other ids we need to read
jjohnle 3:f282664610ba 134 float phaseBcurrent;
jjohnle 3:f282664610ba 135 float phaseCcurrent;
armin1376 6:e7c29e46ad6c 136
armin1376 6:e7c29e46ad6c 137
jjohnle 3:f282664610ba 138 float vd;
jjohnle 3:f282664610ba 139 float vq;
jjohnle 3:f282664610ba 140 float Id;
jjohnle 3:f282664610ba 141 float Iq;
jjohnle 3:f282664610ba 142 float BEMFd;
jjohnle 3:f282664610ba 143 float BEMFq;
jjohnle 3:f282664610ba 144 float heatSinkTemp;
jjohnle 3:f282664610ba 145 float motorTemp;
jjohnle 3:f282664610ba 146 float DCBusAmpHours;
jjohnle 3:f282664610ba 147 float odometerValue;
armin1376 5:f55622eacb87 148 int forward;
armin1376 5:f55622eacb87 149 int cruiseSet;
armin1376 5:f55622eacb87 150 int cruise;
armin1376 5:f55622eacb87 151 float regen;
jjohnle 4:7d027ceba0a0 152
jjohnle 3:f282664610ba 153 //char const * serial = "0002173";
jjohnle 3:f282664610ba 154 // can1.frequency(500000);
jjohnle 3:f282664610ba 155 int id;
jjohnle 3:f282664610ba 156 int id2;
jjohnle 3:f282664610ba 157 int id3;
jjohnle 3:f282664610ba 158 char rdata[8];
armin1376 6:e7c29e46ad6c 159
jjohnle 3:f282664610ba 160 char rdata3[8];
jjohnle 3:f282664610ba 161 char rdata4[8];
jjohnle 3:f282664610ba 162 char rdata5[8];
jjohnle 3:f282664610ba 163 char rdata6[8];
jjohnle 3:f282664610ba 164 char rdata7[8];
jjohnle 3:f282664610ba 165 char rdata8[8];
jjohnle 3:f282664610ba 166 char rdata9[8];
armin1376 5:f55622eacb87 167
armin1376 5:f55622eacb87 168 char ddata[8];
armin1376 5:f55622eacb87 169 char ddata1[8];
armin1376 5:f55622eacb87 170 char ddata2[8];
armin1376 5:f55622eacb87 171 char ddata3[8];
armin1376 5:f55622eacb87 172
armin1376 5:f55622eacb87 173 float zero = 0;
jjohnle 4:7d027ceba0a0 174
jjohnle 3:f282664610ba 175 CANMessage msg;
armin1376 5:f55622eacb87 176 CANMessage msg2;
armin1376 5:f55622eacb87 177
jjohnle 3:f282664610ba 178 dummy = 0;
jjohnle 3:f282664610ba 179 alive = 0;
jjohnle 4:7d027ceba0a0 180
armin1376 6:e7c29e46ad6c 181
jjohnle 4:7d027ceba0a0 182
jjohnle 3:f282664610ba 183 id = DC_BASE + DC_DRIVE;
jjohnle 3:f282664610ba 184 id2 = DC_BASE + DC_POWER;
jjohnle 3:f282664610ba 185 id3 = MC_BASE + DC_POWER;
jjohnle 4:7d027ceba0a0 186
jjohnle 3:f282664610ba 187 while (1) {
jjohnle 3:f282664610ba 188 n = 0;
jjohnle 3:f282664610ba 189 avgval = 0.0;
jjohnle 3:f282664610ba 190 while(n < 100) {
jjohnle 3:f282664610ba 191 meas = ain.read();
jjohnle 3:f282664610ba 192 avgval = avgval + meas;
jjohnle 3:f282664610ba 193 n++ ;
jjohnle 2:2a4822c7c91a 194 }
jjohnle 3:f282664610ba 195 pedal_position = avgval/100.0;
jjohnle 4:7d027ceba0a0 196
jjohnle 3:f282664610ba 197 if(pedal_position > 0.005)
jjohnle 3:f282664610ba 198 LED1a = 1;
jjohnle 3:f282664610ba 199 else
jjohnle 3:f282664610ba 200 LED1a = 0;
jjohnle 3:f282664610ba 201 if(pedal_position > 0.01)
jjohnle 3:f282664610ba 202 LED2a = 1;
jjohnle 3:f282664610ba 203 else
jjohnle 3:f282664610ba 204 LED2a = 0;
jjohnle 3:f282664610ba 205 if(pedal_position > 0.015)
jjohnle 3:f282664610ba 206 LED3a = 1;
jjohnle 3:f282664610ba 207 else
jjohnle 3:f282664610ba 208 LED3a = 0;
jjohnle 3:f282664610ba 209 if(pedal_position > 0.02)
jjohnle 3:f282664610ba 210 LED4a = 1;
jjohnle 3:f282664610ba 211 else
jjohnle 3:f282664610ba 212 LED4a = 0;
jjohnle 3:f282664610ba 213 if(pedal_position > 0.025)
jjohnle 3:f282664610ba 214 LED5 = 1;
jjohnle 3:f282664610ba 215 else
jjohnle 3:f282664610ba 216 LED5 = 0;
jjohnle 3:f282664610ba 217 if(pedal_position > 0.03)
jjohnle 3:f282664610ba 218 LED6 = 1;
jjohnle 3:f282664610ba 219 else
jjohnle 3:f282664610ba 220 LED6 = 0;
jjohnle 3:f282664610ba 221 if(pedal_position > 0.035)
jjohnle 3:f282664610ba 222 LED7 = 1;
jjohnle 3:f282664610ba 223 else
jjohnle 3:f282664610ba 224 LED7 = 0;
jjohnle 4:7d027ceba0a0 225
jjohnle 3:f282664610ba 226 current = MAX_CURRENT * pedal_position;
jjohnle 3:f282664610ba 227 velocity = 9.0;
jjohnle 4:7d027ceba0a0 228
jjohnle 3:f282664610ba 229 data[1] = current; // Flipped because of endianness
jjohnle 3:f282664610ba 230 data[0] = velocity;
jjohnle 4:7d027ceba0a0 231
jjohnle 3:f282664610ba 232 if (!can2.write(CANMessage(id, (char*)data, 8))) // send current and velocity to Tritum
jjohnle 3:f282664610ba 233 printf("Drive failed \n\r");
jjohnle 4:7d027ceba0a0 234
jjohnle 3:f282664610ba 235 data2[1] = bus_current;
jjohnle 3:f282664610ba 236 data2[0] = 0.0;
jjohnle 3:f282664610ba 237 if (!can2.write(CANMessage(id2, (char*)data2, 8)))
jjohnle 3:f282664610ba 238 dummy = 0;
jjohnle 4:7d027ceba0a0 239
jjohnle 3:f282664610ba 240 wait_ms(10); // Need message every 250ms to maintain operation
jjohnle 4:7d027ceba0a0 241
jjohnle 3:f282664610ba 242 // WE ARE READING STUFFF HERE //
jjohnle 4:7d027ceba0a0 243 // if(can2.read(msg) && msg.id == (MC_BASE+MC_VEL)) {
jjohnle 4:7d027ceba0a0 244 // for (int i = 0; i < msg.len; i++) {
jjohnle 4:7d027ceba0a0 245 // rdata2[i] = msg.data[i];
jjohnle 4:7d027ceba0a0 246 // }
jjohnle 4:7d027ceba0a0 247 //
armin1376 6:e7c29e46ad6c 248 // sending value to CAR can
armin1376 6:e7c29e46ad6c 249
jjohnle 4:7d027ceba0a0 250 //
jjohnle 4:7d027ceba0a0 251 // }
armin1376 5:f55622eacb87 252
armin1376 5:f55622eacb87 253 if(can1.read(msg2)) {
armin1376 5:f55622eacb87 254 if(msg2.id == DASH_Forward) {
armin1376 5:f55622eacb87 255 for(int i = 0; i < msg2.len; i++) {
armin1376 5:f55622eacb87 256 ddata[i] = msg2.data[i];
armin1376 5:f55622eacb87 257 }
armin1376 5:f55622eacb87 258
armin1376 5:f55622eacb87 259 float ddatafloat = *((float*) &ddata);
armin1376 5:f55622eacb87 260 int ddatabit = ceil(ddatafloat);
armin1376 5:f55622eacb87 261
armin1376 5:f55622eacb87 262
armin1376 5:f55622eacb87 263 if(ddatabit == 2147483647) {
armin1376 5:f55622eacb87 264 forward = 1;
armin1376 5:f55622eacb87 265 } else forward = 0;
armin1376 5:f55622eacb87 266
armin1376 5:f55622eacb87 267 pc.printf("ddatabit: %d", ddatabit);
armin1376 5:f55622eacb87 268 pc.printf("forward: %d \n", forward);
armin1376 5:f55622eacb87 269
armin1376 5:f55622eacb87 270
armin1376 5:f55622eacb87 271 }
armin1376 5:f55622eacb87 272
armin1376 5:f55622eacb87 273 else if(msg2.id == DASH_Cruise_Set) {
armin1376 5:f55622eacb87 274 for(int i = 0; i < msg2.len; i++) {
armin1376 5:f55622eacb87 275 ddata1[i] = msg2.data[i];
armin1376 5:f55622eacb87 276 }
armin1376 5:f55622eacb87 277
armin1376 5:f55622eacb87 278 float ddatafloat1 = *((float*) &ddata1);
armin1376 5:f55622eacb87 279 int ddatabit1 = ceil(ddatafloat1);
armin1376 5:f55622eacb87 280
armin1376 5:f55622eacb87 281 if(ddatabit1 == 2147483647) {
armin1376 5:f55622eacb87 282 cruiseSet = 1;
armin1376 5:f55622eacb87 283 } else cruiseSet = 0;
armin1376 5:f55622eacb87 284
armin1376 5:f55622eacb87 285 pc.printf("ddatabit1: %d", ddatabit1);
armin1376 5:f55622eacb87 286 pc.printf("cruise set: %d \n", cruiseSet);
armin1376 5:f55622eacb87 287
armin1376 5:f55622eacb87 288
armin1376 5:f55622eacb87 289 }
armin1376 5:f55622eacb87 290
armin1376 5:f55622eacb87 291 else if(msg2.id == DASH_Cruise) {
armin1376 5:f55622eacb87 292 for(int i = 0; i < msg2.len; i++) {
armin1376 5:f55622eacb87 293 ddata2[i] = msg2.data[i];
armin1376 5:f55622eacb87 294 }
armin1376 5:f55622eacb87 295
armin1376 5:f55622eacb87 296 float ddatafloat2 = *((float*) &ddata2);
armin1376 5:f55622eacb87 297 int ddatabit2 = ceil(ddatafloat2);
armin1376 5:f55622eacb87 298
armin1376 5:f55622eacb87 299 if(ddatabit2 == 2147483647) {
armin1376 5:f55622eacb87 300 cruise = 1;
armin1376 5:f55622eacb87 301 } else cruise = 0;
armin1376 5:f55622eacb87 302
armin1376 5:f55622eacb87 303 pc.printf("ddatabit2: %d", ddatabit2);
armin1376 5:f55622eacb87 304 pc.printf("cruise: %d \n", cruise);
armin1376 5:f55622eacb87 305
armin1376 5:f55622eacb87 306 }
armin1376 5:f55622eacb87 307
armin1376 5:f55622eacb87 308 else if(msg2.id == DASH_Regen) {
armin1376 5:f55622eacb87 309 for(int i = 0; i < msg2.len; i++) {
armin1376 5:f55622eacb87 310 ddata3[i] = msg2.data[i];
armin1376 5:f55622eacb87 311 }
armin1376 5:f55622eacb87 312 pc.printf("regen ddata: %f", ddata3);
armin1376 5:f55622eacb87 313
armin1376 5:f55622eacb87 314 urxdata.rcvdata[3] = ddata3[3];
armin1376 5:f55622eacb87 315 urxdata.rcvdata[2] = ddata3[2];
armin1376 5:f55622eacb87 316 urxdata.rcvdata[1] = ddata3[1];
armin1376 5:f55622eacb87 317 urxdata.rcvdata[0] = ddata3[0];
armin1376 5:f55622eacb87 318 regen = urxdata.rxdata;
armin1376 5:f55622eacb87 319
armin1376 5:f55622eacb87 320 pc.printf("here in regen \n");
armin1376 5:f55622eacb87 321 pc.printf("%f", regen);
armin1376 5:f55622eacb87 322
armin1376 5:f55622eacb87 323 }
armin1376 5:f55622eacb87 324 }
armin1376 5:f55622eacb87 325
jjohnle 4:7d027ceba0a0 326 if(can2.read(msg)){
jjohnle 4:7d027ceba0a0 327 if(msg.id == id3 ) { // Tritium Bus
jjohnle 3:f282664610ba 328 for(int i = 0; i < msg.len; i++) {
jjohnle 3:f282664610ba 329 rdata[i] = msg.data[i];
jjohnle 0:c61d18b01f8c 330 }
jjohnle 4:7d027ceba0a0 331
jjohnle 3:f282664610ba 332 // sending value to CAR can
jjohnle 3:f282664610ba 333 if (!can1.write(CANMessage(0x242, (char*) rdata, 8))) {
jjohnle 3:f282664610ba 334 pc.printf("Cannot write to CAN\n");
jjohnle 3:f282664610ba 335 }
armin1376 5:f55622eacb87 336 // wait(0.001);
jjohnle 4:7d027ceba0a0 337
jjohnle 3:f282664610ba 338 urxdata.rcvdata[3] = rdata[7];
jjohnle 3:f282664610ba 339 urxdata.rcvdata[2] = rdata[6];
jjohnle 3:f282664610ba 340 urxdata.rcvdata[1] = rdata[5];
jjohnle 3:f282664610ba 341 urxdata.rcvdata[0] = rdata[4];
jjohnle 3:f282664610ba 342 DCbuscur = urxdata.rxdata;
jjohnle 3:f282664610ba 343 urxdata.rcvdata[3] = rdata[3];
jjohnle 3:f282664610ba 344 urxdata.rcvdata[2] = rdata[2];
jjohnle 3:f282664610ba 345 urxdata.rcvdata[1] = rdata[1];
jjohnle 3:f282664610ba 346 urxdata.rcvdata[0] = rdata[0];
jjohnle 3:f282664610ba 347 DCbusvolt = urxdata.rxdata;
jjohnle 3:f282664610ba 348 }
jjohnle 4:7d027ceba0a0 349
jjohnle 4:7d027ceba0a0 350
jjohnle 3:f282664610ba 351 // reading vehicle and motor velocity
armin1376 6:e7c29e46ad6c 352
jjohnle 4:7d027ceba0a0 353
armin1376 5:f55622eacb87 354 // // reading phase currents
armin1376 5:f55622eacb87 355 // else if(msg.id == (MC_BASE+MC_PHCUR)) {
armin1376 5:f55622eacb87 356 // for (int i = 0; i < msg.len; i++) {
armin1376 5:f55622eacb87 357 // rdata3[i] = msg.data[i];
armin1376 5:f55622eacb87 358 // }
armin1376 5:f55622eacb87 359 //
armin1376 5:f55622eacb87 360 // // sending value to CAR can
armin1376 5:f55622eacb87 361 // if (!can1.write(CANMessage(0x244, (char*) rdata3, 8))) {
armin1376 5:f55622eacb87 362 // pc.printf("Cannot write to CAN\n");
armin1376 5:f55622eacb87 363 // }
armin1376 5:f55622eacb87 364 //// wait(0.001);
armin1376 5:f55622eacb87 365 //
armin1376 5:f55622eacb87 366 // urxdata.rcvdata[3] = rdata3[7];
armin1376 5:f55622eacb87 367 // urxdata.rcvdata[2] = rdata3[6];
armin1376 5:f55622eacb87 368 // urxdata.rcvdata[1] = rdata3[5];
armin1376 5:f55622eacb87 369 // urxdata.rcvdata[0] = rdata3[4];
armin1376 5:f55622eacb87 370 // phaseCcurrent = urxdata.rxdata;
armin1376 5:f55622eacb87 371 // urxdata.rcvdata[3] = rdata3[3];
armin1376 5:f55622eacb87 372 // urxdata.rcvdata[2] = rdata3[2];
armin1376 5:f55622eacb87 373 // urxdata.rcvdata[1] = rdata3[1];
armin1376 5:f55622eacb87 374 // urxdata.rcvdata[0] = rdata3[0];
armin1376 5:f55622eacb87 375 // phaseBcurrent = urxdata.rxdata;
armin1376 5:f55622eacb87 376 // }
jjohnle 4:7d027ceba0a0 377
armin1376 5:f55622eacb87 378 // // reading motor voltage vector
armin1376 5:f55622eacb87 379 // else if(msg.id == (MC_BASE+MC_VOVEC)) {
armin1376 5:f55622eacb87 380 // for (int i = 0; i < msg.len; i++) {
armin1376 5:f55622eacb87 381 // rdata4[i] = msg.data[i];
armin1376 5:f55622eacb87 382 // }
armin1376 5:f55622eacb87 383 //
armin1376 5:f55622eacb87 384 // // sending value to CAR can
armin1376 5:f55622eacb87 385 // if (!can1.write(CANMessage(0x245, (char*) rdata4, 8))) {
armin1376 5:f55622eacb87 386 // pc.printf("Cannot write to CAN\n");
armin1376 5:f55622eacb87 387 // }
armin1376 5:f55622eacb87 388 //// wait(0.001);
armin1376 5:f55622eacb87 389 //
armin1376 5:f55622eacb87 390 // urxdata.rcvdata[3] = rdata4[7];
armin1376 5:f55622eacb87 391 // urxdata.rcvdata[2] = rdata4[6];
armin1376 5:f55622eacb87 392 // urxdata.rcvdata[1] = rdata4[5];
armin1376 5:f55622eacb87 393 // urxdata.rcvdata[0] = rdata4[4];
armin1376 5:f55622eacb87 394 // vd = urxdata.rxdata;
armin1376 5:f55622eacb87 395 // urxdata.rcvdata[3] = rdata4[3];
armin1376 5:f55622eacb87 396 // urxdata.rcvdata[2] = rdata4[2];
armin1376 5:f55622eacb87 397 // urxdata.rcvdata[1] = rdata4[1];
armin1376 5:f55622eacb87 398 // urxdata.rcvdata[0] = rdata4[0];
armin1376 5:f55622eacb87 399 // vq = urxdata.rxdata;
armin1376 5:f55622eacb87 400 // }
armin1376 5:f55622eacb87 401 //
armin1376 5:f55622eacb87 402 // // reading current vector
armin1376 5:f55622eacb87 403 // else if(msg.id == (MC_BASE+MC_CUVEC)) {
armin1376 5:f55622eacb87 404 // for (int i = 0; i < msg.len; i++) {
armin1376 5:f55622eacb87 405 // rdata5[i] = msg.data[i];
armin1376 5:f55622eacb87 406 // }
armin1376 5:f55622eacb87 407 //
armin1376 5:f55622eacb87 408 // // sending value to CAR can
armin1376 5:f55622eacb87 409 // if (!can1.write(CANMessage(0x246, (char*) rdata5, 8))) {
armin1376 5:f55622eacb87 410 // pc.printf("Cannot write to CAN\n");
armin1376 5:f55622eacb87 411 // }
armin1376 5:f55622eacb87 412 //// wait(0.001);
armin1376 5:f55622eacb87 413 //
armin1376 5:f55622eacb87 414 // urxdata.rcvdata[3] = rdata5[7];
armin1376 5:f55622eacb87 415 // urxdata.rcvdata[2] = rdata5[6];
armin1376 5:f55622eacb87 416 // urxdata.rcvdata[1] = rdata5[5];
armin1376 5:f55622eacb87 417 // urxdata.rcvdata[0] = rdata5[4];
armin1376 5:f55622eacb87 418 // Id = urxdata.rxdata;
armin1376 5:f55622eacb87 419 // urxdata.rcvdata[3] = rdata5[3];
armin1376 5:f55622eacb87 420 // urxdata.rcvdata[2] = rdata5[2];
armin1376 5:f55622eacb87 421 // urxdata.rcvdata[1] = rdata5[1];
armin1376 5:f55622eacb87 422 // urxdata.rcvdata[0] = rdata5[0];
armin1376 5:f55622eacb87 423 // Iq = urxdata.rxdata;
armin1376 5:f55622eacb87 424 // }
armin1376 5:f55622eacb87 425 //
armin1376 5:f55622eacb87 426 // // reading back emf
armin1376 5:f55622eacb87 427 // else if(msg.id == (MC_BASE+MC_BEMF)) {
armin1376 5:f55622eacb87 428 // for (int i = 0; i < msg.len; i++) {
armin1376 5:f55622eacb87 429 // rdata6[i] = msg.data[i];
armin1376 5:f55622eacb87 430 // }
armin1376 5:f55622eacb87 431 //
armin1376 5:f55622eacb87 432 // // sending value to CAR can
armin1376 5:f55622eacb87 433 // if (!can1.write(CANMessage(0x247, (char*) rdata6, 8))) {
armin1376 5:f55622eacb87 434 // pc.printf("Cannot write to CAN\n");
armin1376 5:f55622eacb87 435 // }
armin1376 5:f55622eacb87 436 //// wait(0.001);
armin1376 5:f55622eacb87 437 //
armin1376 5:f55622eacb87 438 // urxdata.rcvdata[3] = rdata6[7];
armin1376 5:f55622eacb87 439 // urxdata.rcvdata[2] = rdata6[6];
armin1376 5:f55622eacb87 440 // urxdata.rcvdata[1] = rdata6[5];
armin1376 5:f55622eacb87 441 // urxdata.rcvdata[0] = rdata6[4];
armin1376 5:f55622eacb87 442 // BEMFd = urxdata.rxdata;
armin1376 5:f55622eacb87 443 // urxdata.rcvdata[3] = rdata6[3];
armin1376 5:f55622eacb87 444 // urxdata.rcvdata[2] = rdata6[2];
armin1376 5:f55622eacb87 445 // urxdata.rcvdata[1] = rdata6[1];
armin1376 5:f55622eacb87 446 // urxdata.rcvdata[0] = rdata6[0];
armin1376 5:f55622eacb87 447 // BEMFq = urxdata.rxdata;
armin1376 5:f55622eacb87 448 // }
jjohnle 4:7d027ceba0a0 449
jjohnle 3:f282664610ba 450 // reading heatsink and motor temp
jjohnle 4:7d027ceba0a0 451 else if(msg.id == (MC_BASE+MC_TEMP)) {
jjohnle 3:f282664610ba 452 for (int i = 0; i < msg.len; i++) {
jjohnle 3:f282664610ba 453 rdata7[i] = msg.data[i];
jjohnle 2:2a4822c7c91a 454 }
jjohnle 4:7d027ceba0a0 455
jjohnle 3:f282664610ba 456 // sending value to CAR can
jjohnle 3:f282664610ba 457 if (!can1.write(CANMessage(0x24B, (char*) rdata7, 8))) {
jjohnle 3:f282664610ba 458 pc.printf("Cannot write to CAN\n");
jjohnle 2:2a4822c7c91a 459 }
armin1376 5:f55622eacb87 460 // wait(0.001);
jjohnle 4:7d027ceba0a0 461
jjohnle 3:f282664610ba 462 urxdata.rcvdata[3] = rdata7[7];
jjohnle 3:f282664610ba 463 urxdata.rcvdata[2] = rdata7[6];
jjohnle 3:f282664610ba 464 urxdata.rcvdata[1] = rdata7[5];
jjohnle 3:f282664610ba 465 urxdata.rcvdata[0] = rdata7[4];
jjohnle 3:f282664610ba 466 heatSinkTemp = urxdata.rxdata;
jjohnle 3:f282664610ba 467 urxdata.rcvdata[3] = rdata7[3];
jjohnle 3:f282664610ba 468 urxdata.rcvdata[2] = rdata7[2];
jjohnle 3:f282664610ba 469 urxdata.rcvdata[1] = rdata7[1];
jjohnle 3:f282664610ba 470 urxdata.rcvdata[0] = rdata7[0];
jjohnle 3:f282664610ba 471 motorTemp = urxdata.rxdata;
jjohnle 3:f282664610ba 472 }
jjohnle 4:7d027ceba0a0 473
armin1376 5:f55622eacb87 474 // // reading odometer and bus amp ohours measuremeant
armin1376 5:f55622eacb87 475 // else if(msg.id == (MC_BASE+MC_AMPH)) {
armin1376 5:f55622eacb87 476 // for (int i = 0; i < msg.len; i++) {
armin1376 5:f55622eacb87 477 // rdata8[i] = msg.data[i];
armin1376 5:f55622eacb87 478 // }
armin1376 5:f55622eacb87 479 //
armin1376 5:f55622eacb87 480 // // sending value to CAR can
armin1376 5:f55622eacb87 481 // if (!can1.write(CANMessage(0x24E, (char*) rdata8, 8))) {
armin1376 5:f55622eacb87 482 // pc.printf("Cannot write to CAN\n");
armin1376 5:f55622eacb87 483 // }
armin1376 5:f55622eacb87 484 //// wait(0.001);
armin1376 5:f55622eacb87 485 //
armin1376 5:f55622eacb87 486 // urxdata.rcvdata[3] = rdata8[7];
armin1376 5:f55622eacb87 487 // urxdata.rcvdata[2] = rdata8[6];
armin1376 5:f55622eacb87 488 // urxdata.rcvdata[1] = rdata8[5];
armin1376 5:f55622eacb87 489 // urxdata.rcvdata[0] = rdata8[4];
armin1376 5:f55622eacb87 490 // DCBusAmpHours = urxdata.rxdata;
armin1376 5:f55622eacb87 491 // urxdata.rcvdata[3] = rdata8[3];
armin1376 5:f55622eacb87 492 // urxdata.rcvdata[2] = rdata8[2];
armin1376 5:f55622eacb87 493 // urxdata.rcvdata[1] = rdata8[1];
armin1376 5:f55622eacb87 494 // urxdata.rcvdata[0] = rdata8[0];
armin1376 5:f55622eacb87 495 // odometerValue = urxdata.rxdata;
armin1376 5:f55622eacb87 496 // }
jjohnle 4:7d027ceba0a0 497 }
jjohnle 4:7d027ceba0a0 498
jjohnle 3:f282664610ba 499 if(alive % 100 == 0){
jjohnle 3:f282664610ba 500 printf("Motor board is running \n\r");
jjohnle 3:f282664610ba 501 printf(" Requested Motor Current: %f\n\r", current);
jjohnle 3:f282664610ba 502 printf(" Requested Motor Velocity: %f\n\r", velocity);
jjohnle 3:f282664610ba 503 printf(" DC Bus Current (A) = %f",DCbuscur);
jjohnle 3:f282664610ba 504 printf("\r\n");
jjohnle 3:f282664610ba 505 printf(" DC Bus Voltage (V) = %f",DCbusvolt);
jjohnle 3:f282664610ba 506 printf("\r\n");
jjohnle 4:7d027ceba0a0 507
jjohnle 3:f282664610ba 508 // Printing other values
jjohnle 3:f282664610ba 509 printf(" Vehicle Velocity (RPM) = %f",vehicleVel);
jjohnle 3:f282664610ba 510 printf("\r\n");
jjohnle 3:f282664610ba 511 printf(" Motor Velocity (V) = %f",motorVel);
jjohnle 3:f282664610ba 512 printf("\r\n");
armin1376 5:f55622eacb87 513 // printf(" Phase B Current (A-rms) = %f",phaseBcurrent);
armin1376 5:f55622eacb87 514 // printf("\r\n");
armin1376 5:f55622eacb87 515 // printf(" Phase C Current (A-rms) = %f",phaseCcurrent);
armin1376 5:f55622eacb87 516 // printf("\r\n");
armin1376 5:f55622eacb87 517 // printf(" Vd (V) = %f",vd);
armin1376 5:f55622eacb87 518 // printf("\r\n");
armin1376 5:f55622eacb87 519 // printf(" Vq (V) = %f",vq);
armin1376 5:f55622eacb87 520 // printf("\r\n");
armin1376 5:f55622eacb87 521 //
armin1376 5:f55622eacb87 522 // printf(" Id (A) = %f",Id);
armin1376 5:f55622eacb87 523 // printf("\r\n");
armin1376 5:f55622eacb87 524 // printf(" Iq (A) = %f",Iq);
armin1376 5:f55622eacb87 525 // printf("\r\n");
armin1376 5:f55622eacb87 526 // printf(" BEMFd (V) = %f",BEMFd);
armin1376 5:f55622eacb87 527 // printf("\r\n");
armin1376 5:f55622eacb87 528 // printf(" BEMFq (V) = %f",BEMFq);
armin1376 5:f55622eacb87 529 // printf("\r\n");
jjohnle 3:f282664610ba 530 printf(" Heat Sink Temperature (Celsius) = %f",heatSinkTemp);
jjohnle 3:f282664610ba 531 printf("\r\n");
jjohnle 3:f282664610ba 532 printf(" Motor Temperature (Celsius) = %f",motorTemp);
jjohnle 3:f282664610ba 533 printf("\r\n");
armin1376 5:f55622eacb87 534 // printf(" DC Bus (Ah) = %f",DCBusAmpHours);
armin1376 5:f55622eacb87 535 // printf("\r\n");
armin1376 5:f55622eacb87 536 // printf(" Odometer (Distance) (m) = %f",odometerValue);
armin1376 5:f55622eacb87 537 // printf("\r\n");
armin1376 5:f55622eacb87 538 //
jjohnle 4:7d027ceba0a0 539
jjohnle 3:f282664610ba 540 // blinking LED
jjohnle 3:f282664610ba 541 LED8 = !LED8;
jjohnle 3:f282664610ba 542 if (!can1.write(CANMessage(id, (char*)data, 8))) //send current and velocity over car CAN
jjohnle 3:f282664610ba 543 printf("Car CAN failed \n\r");
jjohnle 3:f282664610ba 544 }
jjohnle 3:f282664610ba 545 alive++;
jjohnle 3:f282664610ba 546 }
jjohnle 3:f282664610ba 547 }