test
Dependencies: SDFileSystem mbed
main.cpp
- Committer:
- ediukill
- Date:
- 2017-02-28
- Revision:
- 1:ae56cde0a4d4
- Parent:
- 0:bc9f2c007928
File content as of revision 1:ae56cde0a4d4:
#include "mbed.h" #include "SDFileSystem.h" //Create an SDFileSystem object SDFileSystem sd(PE_6, PE_5, PE_2, PE_4, "sd"); void pm100dx_init(); void pm100dx_can_tx(uint32_t id, char data[]); void pm100dx_can_read(uint32_t id, char data[]); float pm100dx_getMaxControllerT(); void pm100dx_set_torque(float torque, int dir, int enable, int discharge); uint8_t pm100dx_set_voltage_limits(float dc_overvoltage, float dc_undervoltage); uint8_t pm100dx_set_temperature_limits(float inverter_over_temp, float motor_over_temp); uint8_t pm100dx_set_current_limits(float iq_limit, float id_limit); uint8_t pm100dx_set_torque_config(float motor_limit, float regen_limit, float brake_limit, float zero_torque_temp, float full_torque_temp); uint8_t pm100dx_set_torque_pid(float kp_torque, float ki_torque, float kd_torque, float kip_torque, float torque_rate_limit); void pm100dx_command(int address, int p_data[], int rw); void pm100dx_clear_fault(); float pm100dx_read_temperature(char data[]); float pm100dx_read_LV(char data[]); float pm100dx_read_Torque(char data[]); float pm100dx_read_HV(char data[]); float pm100dx_read_Current(char data[]); float pm100dx_read_AngVel(char data[]); float pm100dx_read_Power(char data[]); #include "stdint.h" Ticker ticker; DigitalOut led1(LED1); DigitalOut led2(LED2); CAN can1(PD_0 , PD_1 ); volatile float pm100dx_temp_modA; volatile float pm100dx_temp_modB; volatile float pm100dx_temp_modC; volatile float pm100dx_temp_gate; volatile float pm100dx_temp_motor; volatile float pm100dx_mot_speed; volatile float pm100dx_current_phaseA; volatile float pm100dx_current_phaseB; volatile float pm100dx_current_phaseC; volatile float pm100dx_current_phaseDC; volatile float pm100dx_voltage_DCbus; volatile float pm100dx_voltage_Output; volatile float pm100dx_voltage_phaseAB; volatile float pm100dx_voltage_phaseBC; volatile float pm100dx_voltage_1_5V; volatile float pm100dx_voltage_2_5V; volatile float pm100dx_voltage_5V; volatile float pm100dx_voltage_12V; volatile int pm100dx_inv_state; volatile int pm100dx_inv_run_state = 0; volatile int pm100dx_inv_command_mode = 0; volatile int pm100dx_inv_enable_state = 0; volatile int pm100dx_inv_enable_lockout = 0; volatile int pm100dx_inv_dir_command = 0; volatile uint32_t pm100dx_fault[2] = { 0, 0 }; volatile float pm100dx_commanded_torque; volatile float pm100dx_feedback_torque; volatile int pm100dx_date; //stored as ddmmyyyy ( first bit is day, second is month, third and fourth is year) #define BMS_ID 0x99 #define PM100DX_CAN_BASE_ID 0x100 char counter = 0; void com_loop_vc(); void bmsRead(uint32_t id, char data[]); void pm100dx_can_read(uint32_t id, char data[]); void com_loop_pwtr(uint32_t id, char data[]); void send() { if(can1.write(CANMessage(1337, &counter, 1))) { printf("Message sent: %d\n", counter); counter++; } led1 = !led1; } int main() { ticker.attach(&send, 1); CANMessage msg; while(1) { if(can1.read(msg)) { char data[8]; for (int i=0;i<8;i++) data[i]=msg.data[i]; com_loop_pwtr(msg.id,data); printf("Message received: %d\n\n", msg.data[0]); led2 = !led2; } pm100dx_set_torque(10, 1, 1, 0); wait(0.2); } } void com_loop_pwtr(uint32_t id, char data[]) { switch (id) { case BMS_ID ... BMS_ID + 0x1F: bmsRead(id, data); break; case PM100DX_CAN_BASE_ID ... PM100DX_CAN_BASE_ID + 22: pm100dx_can_read(id, data); break; } } void bmsRead(uint32_t id, char data[]){ } void pm100dx_can_read(uint32_t id, char data[]){ int temp = (int) (id - PM100DX_CAN_BASE_ID); int year; int month; switch (temp) { //see page 13 case 0: //Temp 1, 10hz pm100dx_temp_modA = pm100dx_read_temperature(&data[0]); //Module A temp pm100dx_temp_modB = pm100dx_read_temperature(&data[2]); //Module B temp pm100dx_temp_modC = pm100dx_read_temperature(&data[4]); //Module C temp pm100dx_temp_gate = pm100dx_read_temperature(&data[6]); //Gate Driver Temp break; case 1: // temp 2, 10hz ,disabled break; case 2: //temp 3, 10hz pm100dx_temp_motor = pm100dx_read_temperature(&data[4]); //Motor Temp break; case 3: //Analog Input Voltage, 100hz, disabled break; case 4: //digital input status ,100hz, disabled break; case 5: //motor position info, 100hz pm100dx_mot_speed = pm100dx_read_AngVel(&data[2]); break; case 6: //current info, 100hz pm100dx_current_phaseA = pm100dx_read_Current(&data[0]); //PHASE A pm100dx_current_phaseB = pm100dx_read_Current(&data[2]); pm100dx_current_phaseC = pm100dx_read_Current(&data[4]); pm100dx_current_phaseDC = pm100dx_read_Current(&data[6]); break; case 7: //voltage info, 100hz pm100dx_voltage_DCbus = pm100dx_read_HV(&data[0]); pm100dx_voltage_Output = pm100dx_read_HV(&data[2]); pm100dx_voltage_phaseAB = pm100dx_read_HV(&data[4]); pm100dx_voltage_phaseBC = pm100dx_read_HV(&data[6]); break; case 8: //flux info, 100hz , disabled break; case 9: // internal voltage, 10hz pm100dx_voltage_1_5V = pm100dx_read_LV(&data[0]); pm100dx_voltage_2_5V = pm100dx_read_LV(&data[2]); pm100dx_voltage_5V = pm100dx_read_LV(&data[4]); pm100dx_voltage_12V = pm100dx_read_LV(&data[6]); break; case 10: //internal states, 10 hz pm100dx_inv_state = (int) data[2]; //Inverter state pm100dx_inv_run_state = (int) data[4] & (1 << 0); //Inverter Run Mode pm100dx_inv_command_mode = data[5]; //Inverter Command Mode pm100dx_inv_enable_state = data[6] & (1 << 0); //Inverter Enabled pm100dx_inv_enable_lockout = (int) ((data[6] & (1 << 7)) >> 7); //Inverter Enable Lockout pm100dx_inv_dir_command = data[7]; //Direction Command break; case 11: //fault codes, 10 hz pm100dx_fault[0] = (uint32_t) data[0] | (uint32_t) (data[1] << 8) | (uint32_t) (data[2] << 16) | (uint32_t) (data[3] << 24); pm100dx_fault[1] = (uint32_t) (data[4]) | (uint32_t) (data[5] << 8) | (uint32_t) (data[6] << 16) | (uint32_t) (data[7] << 24); break; case 12: // torque & timer info, 100hz pm100dx_commanded_torque = pm100dx_read_Torque(&data[0]); // commanded torque pm100dx_feedback_torque = pm100dx_read_Torque(&data[2]); // torque feedback break; case 13: //modulation index, 100hz , not used break; case 14: // firmware info, 10hz month = (int) data[4] | (int) (data[5] << 8); year = ((int) (data[6]) | (int) (data[7] << 8)); pm100dx_date = month + year; break; case 15: // diagnostic data, 100hz , not used break; case 22: //parameter answer break; } } //return V in degC float pm100dx_read_temperature(char data[]) { return (float) ((int16_t) ((uint16_t) data[0] | (uint16_t) data[1] << 8)) / 10.0f; } //return V in volts float pm100dx_read_LV(char data[]) { return (float) ((int16_t) ((uint16_t) data[0] | (uint16_t) data[1] << 8)) / 100.0f; } //return torque in Nm float pm100dx_read_Torque(char data[]) { return (float) ((int16_t) ((uint16_t) data[0] | (uint16_t) data[1] << 8)) / 10.0f; } //return V in volts float pm100dx_read_HV(char data[]) { return (float) ((int16_t) ((uint16_t) data[0] | (uint16_t) data[1] << 8)) / 10.0f; } //in A float pm100dx_read_Current(char data[]) { return (float) ((int16_t) ((uint16_t) data[0] | (uint16_t) data[1] << 8)) / 10.0f; } //in RPM float pm100dx_read_AngVel(char data[]) { return (float) ((int16_t) ((uint16_t) data[0] | (uint16_t) data[1] << 8)); } //in kW float pm100dx_read_Power(char data[]) { return (float) ((int16_t) ((uint16_t) data[0] | (uint16_t) data[1] << 8)) / 10.0f; } void pm100dx_init() { int data[2]; //first disable some broadcast message we wont use //disable temp2 , analog input, digital input, flux data[0] = 0b11100101; data[1] = 0b11111110; pm100dx_command(148, data, 1); } float pm100dx_getMaxControllerT() { float temp = 0; if (pm100dx_temp_modA > temp) temp = pm100dx_temp_modA; if (pm100dx_temp_modB > temp) temp = pm100dx_temp_modB; if (pm100dx_temp_modC > temp) temp = pm100dx_temp_modC; if (pm100dx_temp_gate > temp) temp = pm100dx_temp_gate; return temp; } void pm100dx_command(int address, int p_data[], int rw) { char data[8]; data[0] = (char) address; //paramater address data[1] = (char) address >> 8; //paramater address data[2] = (char) rw; //read or write data[3] = 0; //reserved data[4] = (char) p_data[0]; //data data[5] = (char) p_data[1]; //data data[6] = 0; //reserved data[7] = 0; //reserved pm100dx_can_tx(0X0C1 - 0x0A0 + PM100DX_CAN_BASE_ID, data); } void pm100dx_can_tx(uint32_t id, char data[]) { can1.write(CANMessage(PM100DX_CAN_BASE_ID, data, 8)); } void pm100dx_clear_fault() { int data[2]; data[0] = 0; data[1] = 0; pm100dx_command(20, data, 1); } void pm100dx_set_torque(float torque, int dir, int enable, int discharge) { char data[8]; int16_t itorque = (int16_t) (torque * 10.0f); data[0] = (char) itorque; data[1] = (char) (itorque >> 8); data[2] = 0; data[3] = 0; data[4] = (char) dir; data[5] = (char) (enable | (discharge << 1)); data[6] = 0; data[7] = 0; pm100dx_can_tx(0X0C0 - 0x0A0 + PM100DX_CAN_BASE_ID, data); }