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

Dependencies:   mbed

Committer:
armin1376
Date:
Mon Nov 11 19:37:48 2019 +0000
Revision:
5:f55622eacb87
Parent:
4:7d027ceba0a0
Child:
6:e7c29e46ad6c
Motor with OS2

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