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
- Committer:
- armin1376
- Date:
- 2019-11-13
- Revision:
- 6:e7c29e46ad6c
- Parent:
- 5:f55622eacb87
- Child:
- 7:3352a96997b3
File content as of revision 6:e7c29e46ad6c:
// Motor Control Board Program
// This program operates the Tritium controller and also sends data
// over the separate car CAN.
#include "mbed.h"
// CAN base address and offsets (Tritium)
#define DC_BASE 0x220 // Driver controls base address
#define DC_DRIVE 0x01 // Offset for motor drive command
#define DC_POWER 0x02 // Offset for motor power command
#define DC_RESET 0x03 // Offset for reset command
#define DC_SWITCH 0x04 // Offset for phase current measurement
#define MC_BASE 0x240 // Motor controls base address
#define MC_BUS 0x02 // Bus measurement offset
#define MC_VEL 0x03 // Velocity measurement offset
#define MC_PHCUR 0x04 // Phase Current offset
#define MC_VOVEC 0x05 // Voltage Vector offset
#define MC_CUVEC 0x06 // current vector offset
#define MC_BEMF 0x07 // back emf offset
#define MC_TEMP 0x0B // heat sink and motor temp offset
#define MC_AMPH 0x0E // odometer and bus amp ohours measuremeant
#define MAX_VELOCITY 100 // motor velocity in m/s
#define MAX_CURRENT 1.0 // desired motor current as percentage of max current
#define DC_BUS_CURRENT 0x900
#define DC_BUS_VOLTAGE 0x901
#define PHASE_B_CURRENT 0x902
#define PHASE_C_CURRENT 0x903
#define VEHICLE_VELOCITY 0x904
#define MOTOR_VELOCITY 0x905
#define VD 0x906
#define VQ 0x907
#define ID 0x908
#define IQ 0x909
#define BEMFD 0x90A
#define BEMFQ 0x90B
#define HEAT_SINK_TEMPERATURE 0x90C
#define MOTOR_TEMPERATURE 0x90D
#define DC_BUS_AMP_HOURS 0x90E
#define ODOMETER 0x90F
#define DASH_Forward 0x580 // DASH Forward Motor ID
#define DASH_Cruise_Set 0x581 // DASH Brake ID
#define DASH_Cruise 0x582 // DASH Brake ID
#define DASH_Regen 0x583 // DASH Regen ID
CAN can1(PD_0,PD_1,125000); // can1 is car CAN (Rx, Tx, speed)
CAN can2(PB_5,PB_6, 100000); // can2 is motor controller CAN (Rx, Tx, speed)
Serial pc(USBTX, USBRX);
AnalogIn ain(PB_0);
DigitalOut LED8(PF_2);
DigitalOut LED7(PA_7);
DigitalOut LED6(PF_10);
DigitalOut LED5(PF_5);
DigitalOut LED4a(PF_3);
DigitalOut LED3a(PC_3);
DigitalOut LED2a(PC_0);
DigitalOut LED1a(PA_3);
CANMessage msg;
union {
char rcvdata[4];
float rxdata;
} urxdata;
char rdata2[8];
float vehicleVel;
float motorVel;
#define MAX_VELOCITY 100 // motor velocity in m/s
#define MAX_CURRENT 1.0 // desired motor current as percentage of max current
void speeed(){
while(1){
if(can2.read(msg) && msg.id == (MC_BASE+MC_VEL)) {
for (int i = 0; i < msg.len; i++) {
rdata2[i] = msg.data[i];
}
}
if(msg.id == (MC_BASE+MC_VEL)) {
for (int i = 0; i < msg.len; i++) {
rdata2[i] = msg.data[i];
}
// sending value to CAR can
if (!can1.write(CANMessage(0x243, (char*) rdata2, 8))) {
pc.printf("Cannot write to CAN\n");
}
wait(0.001);
urxdata.rcvdata[3] = rdata2[7];
urxdata.rcvdata[2] = rdata2[6];
urxdata.rcvdata[1] = rdata2[5];
urxdata.rcvdata[0] = rdata2[4];
vehicleVel = urxdata.rxdata;
urxdata.rcvdata[3] = rdata2[3];
urxdata.rcvdata[2] = rdata2[2];
urxdata.rcvdata[1] = rdata2[1];
urxdata.rcvdata[0] = rdata2[0];
motorVel = urxdata.rxdata;
}
}
}
int main() {
can1.frequency(125000);
Thread V1(speeed);
float current = MAX_CURRENT;
float velocity = MAX_VELOCITY;
float bus_current = MAX_CURRENT;
float DCbuscur;
float DCbusvolt;
double pedal_position;
float data[2];
float data2[2];
float meas;
double avgval;
int n;
int dummy;
int alive;
// other ids we need to read
float phaseBcurrent;
float phaseCcurrent;
float vd;
float vq;
float Id;
float Iq;
float BEMFd;
float BEMFq;
float heatSinkTemp;
float motorTemp;
float DCBusAmpHours;
float odometerValue;
int forward;
int cruiseSet;
int cruise;
float regen;
//char const * serial = "0002173";
// can1.frequency(500000);
int id;
int id2;
int id3;
char rdata[8];
char rdata3[8];
char rdata4[8];
char rdata5[8];
char rdata6[8];
char rdata7[8];
char rdata8[8];
char rdata9[8];
char ddata[8];
char ddata1[8];
char ddata2[8];
char ddata3[8];
float zero = 0;
CANMessage msg;
CANMessage msg2;
dummy = 0;
alive = 0;
id = DC_BASE + DC_DRIVE;
id2 = DC_BASE + DC_POWER;
id3 = MC_BASE + DC_POWER;
while (1) {
n = 0;
avgval = 0.0;
while(n < 100) {
meas = ain.read();
avgval = avgval + meas;
n++ ;
}
pedal_position = avgval/100.0;
if(pedal_position > 0.005)
LED1a = 1;
else
LED1a = 0;
if(pedal_position > 0.01)
LED2a = 1;
else
LED2a = 0;
if(pedal_position > 0.015)
LED3a = 1;
else
LED3a = 0;
if(pedal_position > 0.02)
LED4a = 1;
else
LED4a = 0;
if(pedal_position > 0.025)
LED5 = 1;
else
LED5 = 0;
if(pedal_position > 0.03)
LED6 = 1;
else
LED6 = 0;
if(pedal_position > 0.035)
LED7 = 1;
else
LED7 = 0;
current = MAX_CURRENT * pedal_position;
velocity = 9.0;
data[1] = current; // Flipped because of endianness
data[0] = velocity;
if (!can2.write(CANMessage(id, (char*)data, 8))) // send current and velocity to Tritum
printf("Drive failed \n\r");
data2[1] = bus_current;
data2[0] = 0.0;
if (!can2.write(CANMessage(id2, (char*)data2, 8)))
dummy = 0;
wait_ms(10); // Need message every 250ms to maintain operation
// WE ARE READING STUFFF HERE //
// if(can2.read(msg) && msg.id == (MC_BASE+MC_VEL)) {
// for (int i = 0; i < msg.len; i++) {
// rdata2[i] = msg.data[i];
// }
//
// sending value to CAR can
//
// }
if(can1.read(msg2)) {
if(msg2.id == DASH_Forward) {
for(int i = 0; i < msg2.len; i++) {
ddata[i] = msg2.data[i];
}
float ddatafloat = *((float*) &ddata);
int ddatabit = ceil(ddatafloat);
if(ddatabit == 2147483647) {
forward = 1;
} else forward = 0;
pc.printf("ddatabit: %d", ddatabit);
pc.printf("forward: %d \n", forward);
}
else if(msg2.id == DASH_Cruise_Set) {
for(int i = 0; i < msg2.len; i++) {
ddata1[i] = msg2.data[i];
}
float ddatafloat1 = *((float*) &ddata1);
int ddatabit1 = ceil(ddatafloat1);
if(ddatabit1 == 2147483647) {
cruiseSet = 1;
} else cruiseSet = 0;
pc.printf("ddatabit1: %d", ddatabit1);
pc.printf("cruise set: %d \n", cruiseSet);
}
else if(msg2.id == DASH_Cruise) {
for(int i = 0; i < msg2.len; i++) {
ddata2[i] = msg2.data[i];
}
float ddatafloat2 = *((float*) &ddata2);
int ddatabit2 = ceil(ddatafloat2);
if(ddatabit2 == 2147483647) {
cruise = 1;
} else cruise = 0;
pc.printf("ddatabit2: %d", ddatabit2);
pc.printf("cruise: %d \n", cruise);
}
else if(msg2.id == DASH_Regen) {
for(int i = 0; i < msg2.len; i++) {
ddata3[i] = msg2.data[i];
}
pc.printf("regen ddata: %f", ddata3);
urxdata.rcvdata[3] = ddata3[3];
urxdata.rcvdata[2] = ddata3[2];
urxdata.rcvdata[1] = ddata3[1];
urxdata.rcvdata[0] = ddata3[0];
regen = urxdata.rxdata;
pc.printf("here in regen \n");
pc.printf("%f", regen);
}
}
if(can2.read(msg)){
if(msg.id == id3 ) { // Tritium Bus
for(int i = 0; i < msg.len; i++) {
rdata[i] = msg.data[i];
}
// sending value to CAR can
if (!can1.write(CANMessage(0x242, (char*) rdata, 8))) {
pc.printf("Cannot write to CAN\n");
}
// wait(0.001);
urxdata.rcvdata[3] = rdata[7];
urxdata.rcvdata[2] = rdata[6];
urxdata.rcvdata[1] = rdata[5];
urxdata.rcvdata[0] = rdata[4];
DCbuscur = urxdata.rxdata;
urxdata.rcvdata[3] = rdata[3];
urxdata.rcvdata[2] = rdata[2];
urxdata.rcvdata[1] = rdata[1];
urxdata.rcvdata[0] = rdata[0];
DCbusvolt = urxdata.rxdata;
}
// reading vehicle and motor velocity
// // reading phase currents
// else if(msg.id == (MC_BASE+MC_PHCUR)) {
// for (int i = 0; i < msg.len; i++) {
// rdata3[i] = msg.data[i];
// }
//
// // sending value to CAR can
// if (!can1.write(CANMessage(0x244, (char*) rdata3, 8))) {
// pc.printf("Cannot write to CAN\n");
// }
//// wait(0.001);
//
// urxdata.rcvdata[3] = rdata3[7];
// urxdata.rcvdata[2] = rdata3[6];
// urxdata.rcvdata[1] = rdata3[5];
// urxdata.rcvdata[0] = rdata3[4];
// phaseCcurrent = urxdata.rxdata;
// urxdata.rcvdata[3] = rdata3[3];
// urxdata.rcvdata[2] = rdata3[2];
// urxdata.rcvdata[1] = rdata3[1];
// urxdata.rcvdata[0] = rdata3[0];
// phaseBcurrent = urxdata.rxdata;
// }
// // reading motor voltage vector
// else if(msg.id == (MC_BASE+MC_VOVEC)) {
// for (int i = 0; i < msg.len; i++) {
// rdata4[i] = msg.data[i];
// }
//
// // sending value to CAR can
// if (!can1.write(CANMessage(0x245, (char*) rdata4, 8))) {
// pc.printf("Cannot write to CAN\n");
// }
//// wait(0.001);
//
// urxdata.rcvdata[3] = rdata4[7];
// urxdata.rcvdata[2] = rdata4[6];
// urxdata.rcvdata[1] = rdata4[5];
// urxdata.rcvdata[0] = rdata4[4];
// vd = urxdata.rxdata;
// urxdata.rcvdata[3] = rdata4[3];
// urxdata.rcvdata[2] = rdata4[2];
// urxdata.rcvdata[1] = rdata4[1];
// urxdata.rcvdata[0] = rdata4[0];
// vq = urxdata.rxdata;
// }
//
// // reading current vector
// else if(msg.id == (MC_BASE+MC_CUVEC)) {
// for (int i = 0; i < msg.len; i++) {
// rdata5[i] = msg.data[i];
// }
//
// // sending value to CAR can
// if (!can1.write(CANMessage(0x246, (char*) rdata5, 8))) {
// pc.printf("Cannot write to CAN\n");
// }
//// wait(0.001);
//
// urxdata.rcvdata[3] = rdata5[7];
// urxdata.rcvdata[2] = rdata5[6];
// urxdata.rcvdata[1] = rdata5[5];
// urxdata.rcvdata[0] = rdata5[4];
// Id = urxdata.rxdata;
// urxdata.rcvdata[3] = rdata5[3];
// urxdata.rcvdata[2] = rdata5[2];
// urxdata.rcvdata[1] = rdata5[1];
// urxdata.rcvdata[0] = rdata5[0];
// Iq = urxdata.rxdata;
// }
//
// // reading back emf
// else if(msg.id == (MC_BASE+MC_BEMF)) {
// for (int i = 0; i < msg.len; i++) {
// rdata6[i] = msg.data[i];
// }
//
// // sending value to CAR can
// if (!can1.write(CANMessage(0x247, (char*) rdata6, 8))) {
// pc.printf("Cannot write to CAN\n");
// }
//// wait(0.001);
//
// urxdata.rcvdata[3] = rdata6[7];
// urxdata.rcvdata[2] = rdata6[6];
// urxdata.rcvdata[1] = rdata6[5];
// urxdata.rcvdata[0] = rdata6[4];
// BEMFd = urxdata.rxdata;
// urxdata.rcvdata[3] = rdata6[3];
// urxdata.rcvdata[2] = rdata6[2];
// urxdata.rcvdata[1] = rdata6[1];
// urxdata.rcvdata[0] = rdata6[0];
// BEMFq = urxdata.rxdata;
// }
// reading heatsink and motor temp
else if(msg.id == (MC_BASE+MC_TEMP)) {
for (int i = 0; i < msg.len; i++) {
rdata7[i] = msg.data[i];
}
// sending value to CAR can
if (!can1.write(CANMessage(0x24B, (char*) rdata7, 8))) {
pc.printf("Cannot write to CAN\n");
}
// wait(0.001);
urxdata.rcvdata[3] = rdata7[7];
urxdata.rcvdata[2] = rdata7[6];
urxdata.rcvdata[1] = rdata7[5];
urxdata.rcvdata[0] = rdata7[4];
heatSinkTemp = urxdata.rxdata;
urxdata.rcvdata[3] = rdata7[3];
urxdata.rcvdata[2] = rdata7[2];
urxdata.rcvdata[1] = rdata7[1];
urxdata.rcvdata[0] = rdata7[0];
motorTemp = urxdata.rxdata;
}
// // reading odometer and bus amp ohours measuremeant
// else if(msg.id == (MC_BASE+MC_AMPH)) {
// for (int i = 0; i < msg.len; i++) {
// rdata8[i] = msg.data[i];
// }
//
// // sending value to CAR can
// if (!can1.write(CANMessage(0x24E, (char*) rdata8, 8))) {
// pc.printf("Cannot write to CAN\n");
// }
//// wait(0.001);
//
// urxdata.rcvdata[3] = rdata8[7];
// urxdata.rcvdata[2] = rdata8[6];
// urxdata.rcvdata[1] = rdata8[5];
// urxdata.rcvdata[0] = rdata8[4];
// DCBusAmpHours = urxdata.rxdata;
// urxdata.rcvdata[3] = rdata8[3];
// urxdata.rcvdata[2] = rdata8[2];
// urxdata.rcvdata[1] = rdata8[1];
// urxdata.rcvdata[0] = rdata8[0];
// odometerValue = urxdata.rxdata;
// }
}
if(alive % 100 == 0){
printf("Motor board is running \n\r");
printf(" Requested Motor Current: %f\n\r", current);
printf(" Requested Motor Velocity: %f\n\r", velocity);
printf(" DC Bus Current (A) = %f",DCbuscur);
printf("\r\n");
printf(" DC Bus Voltage (V) = %f",DCbusvolt);
printf("\r\n");
// Printing other values
printf(" Vehicle Velocity (RPM) = %f",vehicleVel);
printf("\r\n");
printf(" Motor Velocity (V) = %f",motorVel);
printf("\r\n");
// printf(" Phase B Current (A-rms) = %f",phaseBcurrent);
// printf("\r\n");
// printf(" Phase C Current (A-rms) = %f",phaseCcurrent);
// printf("\r\n");
// printf(" Vd (V) = %f",vd);
// printf("\r\n");
// printf(" Vq (V) = %f",vq);
// printf("\r\n");
//
// printf(" Id (A) = %f",Id);
// printf("\r\n");
// printf(" Iq (A) = %f",Iq);
// printf("\r\n");
// printf(" BEMFd (V) = %f",BEMFd);
// printf("\r\n");
// printf(" BEMFq (V) = %f",BEMFq);
// printf("\r\n");
printf(" Heat Sink Temperature (Celsius) = %f",heatSinkTemp);
printf("\r\n");
printf(" Motor Temperature (Celsius) = %f",motorTemp);
printf("\r\n");
// printf(" DC Bus (Ah) = %f",DCBusAmpHours);
// printf("\r\n");
// printf(" Odometer (Distance) (m) = %f",odometerValue);
// printf("\r\n");
//
// blinking LED
LED8 = !LED8;
if (!can1.write(CANMessage(id, (char*)data, 8))) //send current and velocity over car CAN
printf("Car CAN failed \n\r");
}
alive++;
}
}