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-dev-f303 FastPWM3
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{