Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
main.cpp@5:f55622eacb87, 2019-11-11 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |