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.
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{