Modified Motor Driver Firmware to include Flash + Thermal
Dependencies: FastPWM3 mbed-dev-STM-lean
Revision 24:58c2d7571207, committed 2017-04-07
- Comitter:
- benkatz
- Date:
- Fri Apr 07 16:23:39 2017 +0000
- Parent:
- 23:2adf23ee0305
- Child:
- 25:f5741040c4bb
- Commit message:
- Can flush preferences multiple times now
Changed in this revision
--- a/Calibration/calibration.cpp Wed Apr 05 20:54:16 2017 +0000 +++ b/Calibration/calibration.cpp Fri Apr 07 16:23:39 2017 +0000 @@ -62,7 +62,6 @@ printf("Direction: %d\n\r", direction); if(direction){printf("Phasing correct\n\r");} else if(!direction){printf("Phasing incorrect. Swapping phases V and W\n\r");} - gpio->phasing = direction; PHASE_ORDER = direction; } @@ -92,7 +91,7 @@ svm(1.0, v_u, v_v, v_w, &dtc_u, &dtc_v, &dtc_w); // space vector modulation for(int i = 0; i<40000; i++){ TIM1->CCR3 = 0x708*(1.0f-dtc_u); // Set duty cycles - if(gpio->phasing){ + if(PHASE_ORDER){ TIM1->CCR2 = 0x708*(1.0f-dtc_v); TIM1->CCR1 = 0x708*(1.0f-dtc_w); } @@ -114,7 +113,7 @@ abc(theta_ref, v_d, v_q, &v_u, &v_v, &v_w); // inverse dq0 transform on voltages svm(1.0, v_u, v_v, v_w, &dtc_u, &dtc_v, &dtc_w); // space vector modulation TIM1->CCR3 = 0x708*(1.0f-dtc_u); - if(gpio->phasing){ + if(PHASE_ORDER){ TIM1->CCR2 = 0x708*(1.0f-dtc_v); TIM1->CCR1 = 0x708*(1.0f-dtc_w); } @@ -139,7 +138,7 @@ abc(theta_ref, v_d, v_q, &v_u, &v_v, &v_w); // inverse dq0 transform on voltages svm(1.0, v_u, v_v, v_w, &dtc_u, &dtc_v, &dtc_w); // space vector modulation TIM1->CCR3 = 0x708*(1.0f-dtc_u); - if(gpio->phasing){ + if(PHASE_ORDER){ TIM1->CCR2 = 0x708*(1.0f-dtc_v); TIM1->CCR1 = 0x708*(1.0f-dtc_w); }
--- a/Config/user_config.h Wed Apr 05 20:54:16 2017 +0000 +++ b/Config/user_config.h Fri Apr 07 16:23:39 2017 +0000 @@ -7,7 +7,7 @@ #define E_OFFSET __float_reg[0] #define M_OFFSET __float_reg[1] #define I_BW __float_reg[2] -#define I_LIMIT __float_reg[3] +#define TORQUE_LIMIT __float_reg[3] #define PHASE_ORDER __int_reg[0] #define CAN_ID __int_reg[1]
--- a/FOC/foc.cpp Wed Apr 05 20:54:16 2017 +0000 +++ b/FOC/foc.cpp Fri Apr 07 16:23:39 2017 +0000 @@ -1,4 +1,4 @@ - +#include "user_config.h" #include "foc.h" //#include "FastMath.h" @@ -55,7 +55,7 @@ void commutate(ControllerStruct *controller, GPIOStruct *gpio, float theta){ controller->loop_count ++; - if(gpio->phasing){ + if(PHASE_ORDER){ controller->i_b = I_SCALE*(float)(controller->adc2_raw - controller->adc2_offset); //Calculate phase currents from ADC readings controller->i_c = I_SCALE*(float)(controller->adc1_raw - controller->adc1_offset); } @@ -103,7 +103,7 @@ //gpio->pwm_v->write(1.0f-controller->dtc_v); //gpio->pwm_w->write(1.0f-controller->dtc_w); - if(gpio->phasing){ + if(PHASE_ORDER){ TIM1->CCR3 = 0x708*(1.0f-controller->dtc_u); TIM1->CCR2 = 0x708*(1.0f-controller->dtc_v); TIM1->CCR1 = 0x708*(1.0f-controller->dtc_w);
--- a/PreferenceWriter/PrefrenceWriter.cpp Wed Apr 05 20:54:16 2017 +0000 +++ b/PreferenceWriter/PrefrenceWriter.cpp Fri Apr 07 16:23:39 2017 +0000 @@ -34,6 +34,7 @@ for (; offs < 320; offs++) { writer->write(offs, __float_reg[offs - 256]); } + __ready = false; } void PreferenceWriter::load() { @@ -47,5 +48,6 @@ } void PreferenceWriter::close() { + __ready = false; writer->close(); } \ No newline at end of file
--- a/StateMachine/state_machine.cpp Wed Apr 05 20:54:16 2017 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,20 +0,0 @@ -#include "state_machine.h" - -/* -void menu_state(void){ - printf("\n\r\n\r\n\r"); - printf(" Comands:\n\r"); - printf(" t - Torque Mode\n\r"); - printf(" p - PD Mode\n\r"); - printf(" c - Calibrate Encoder\n\r"); - printf(" s - Setup\n\r"); - - } - - -void calibration_state(void){ - printf("Beginning Calibration\n\r"); - - } - - */ \ No newline at end of file
--- a/StateMachine/state_machine.h Wed Apr 05 20:54:16 2017 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,11 +0,0 @@ -#ifndef STATE_MACHINE_H -#define STATE_MACHINE_H - -#include "structs.h" -#include "mbed.h" -/* -void menu_state(void); -void calibration_state(void); -*/ - -#endif
--- a/hw_setup.cpp Wed Apr 05 20:54:16 2017 +0000 +++ b/hw_setup.cpp Fri Apr 07 16:23:39 2017 +0000 @@ -17,7 +17,6 @@ gpio->pwm_v = new FastPWM(PIN_V); gpio->pwm_w = new FastPWM(PIN_W); - gpio->phasing = 1; //ISR Setup
--- a/loops.cpp Wed Apr 05 20:54:16 2017 +0000 +++ b/loops.cpp Fri Apr 07 16:23:39 2017 +0000 @@ -1,2 +1,10 @@ #include "loops.h" -#include "foc.h" \ No newline at end of file +#include "foc.h" + +void pd1(float p_des, float v_des, float kp, float kd){ + + } +void pd2(float p_des, float kp, float kd); + +void torque(float t){ + } \ No newline at end of file
--- a/loops.h Wed Apr 05 20:54:16 2017 +0000 +++ b/loops.h Fri Apr 07 16:23:39 2017 +0000 @@ -5,6 +5,8 @@ #include "PositionSensor.h" -void pd(float p_des, float v_des, float kp, float kd); +void pd1(float p_des, float v_des, float kp, float kd); +void pd2(float p_des, float kp, float kd); +void torque(float t); #endif
--- a/main.cpp Wed Apr 05 20:54:16 2017 +0000 +++ b/main.cpp Fri Apr 07 16:23:39 2017 +0000 @@ -35,9 +35,6 @@ #include "FlashWriter.h" #include "user_config.h" #include "PreferenceWriter.h" -//#include "state_machine.h" - - PreferenceWriter prefs(6); @@ -47,7 +44,6 @@ VelocityEstimatorStruct velocity; - CANnucleo::CAN can(PB_8, PB_9); // CAN Rx pin name, CAN Tx pin name CANnucleo::CANMessage rxMsg; CANnucleo::CANMessage txMsg; @@ -118,9 +114,18 @@ printf(" esc - Exit to Menu\n\r"); state_change = 0; } + +void enter_setup_state(void){ + printf("\n\r\n\r Configuration Options \n\r\n\n"); + printf(" %-7s %-25s %-5s %-5s %-5s\n\r\n\r", "prefix", "parameter", "min", "max", "current value"); + printf(" %-7s %-25s %-5s %-5s %.1f\n\r", "b", "Current Bandwidth (Hz)", "100", "2000", I_BW); + printf(" %-7s %-25s %-5s %-5s %-5i\n\r", "i", "CAN ID", "0", "127", CAN_ID); + printf(" %-7s %-25s %-5s %-5s %.1f\n\r", "l", "Torque Limit (N-m)", "0.0", "18.0", TORQUE_LIMIT); + printf("\n\r To change a value, type 'prefix''value''ENTER'\n\r i.e. 'b1000''ENTER'\n\r\n\r"); + state_change = 0; + } void enter_torque_mode(void){ - controller.mode = 2; controller.i_d_ref = 0; controller.i_q_ref = 0; reset_foc(&controller); //resets integrators, and other control loop parameters @@ -194,8 +199,7 @@ break; case SETUP_MODE: if(state_change){ - printf("\n\r Configuration Menu \n\r\n\n"); - state_change = 0; + enter_setup_state(); } break; case ENCODER_MODE: @@ -210,15 +214,19 @@ } /// Manage state machine with commands from serial terminal or configurator gui /// +char cmd_val[8] = {0}; +char cmd_id = 0; + +char char_count = 0; void serial_interrupt(void){ while(pc.readable()){ char c = pc.getc(); - if(c == 27){ - state = REST_MODE; - state_change = 1; - } - else if(state == REST_MODE){ + if(state == REST_MODE){ switch (c){ + case 27: + state = REST_MODE; + state_change = 1; + break; case 'c': state = CALIBRATION_MODE; state_change = 1; @@ -235,10 +243,61 @@ state = SETUP_MODE; state_change = 1; break; - + } + } + else if(state == SETUP_MODE){ + if(c == 27){ + state = REST_MODE; + state_change = 1; + char_count = 0; + cmd_id = 0; + for(int i = 0; i<8; i++){cmd_val[i] = 0;} + } + else if(c == 13){ + switch (cmd_id){ + case 'b': + I_BW = fmaxf(fminf(atof(cmd_val), 2000.0f), 100.0f); + break; + case 'i': + CAN_ID = atoi(cmd_val); + break; + case 'l': + TORQUE_LIMIT = fmaxf(fminf(atof(cmd_val), 18.0f), 0.0f); + break; + default: + printf("\n\r '%c' Not a valid command prefix\n\r\n\r", cmd_id); + break; + } + + if (!prefs.ready()) prefs.open(); + prefs.flush(); // Write new prefs to flash + prefs.close(); + prefs.load(); + state_change = 1; + char_count = 0; + cmd_id = 0; + for(int i = 0; i<8; i++){cmd_val[i] = 0;} + } + else{ + if(char_count == 0){cmd_id = c;} + else{ + cmd_val[char_count-1] = c; + + } + pc.putc(c); + char_count++; } } - } + else if (state == ENCODER_MODE){ + switch (c){ + case 27: + state = REST_MODE; + state_change = 1; + break; + } + } + + } } int main() { @@ -283,7 +342,7 @@ printf("\n\r Debug Info:\n\r"); printf(" ADC1 Offset: %d ADC2 Offset: %d\n\r", controller.adc1_offset, controller.adc2_offset); printf(" Position Sensor Electrical Offset: %.4f\n\r", E_OFFSET); - printf(" CAN ID: %d\n\r", BOARDNUM); + printf(" CAN ID: %d\n\r", CAN_ID); pc.attach(&serial_interrupt); // attach serial interrupt
--- a/structs.h Wed Apr 05 20:54:16 2017 +0000 +++ b/structs.h Fri Apr 07 16:23:39 2017 +0000 @@ -9,7 +9,6 @@ typedef struct{ DigitalOut *enable; FastPWM *pwm_u, *pwm_v, *pwm_w; - int phasing; } GPIOStruct; typedef struct{