Modified Motor Driver Firmware to include Flash + Thermal

Dependencies:   FastPWM3 mbed-dev-STM-lean

Files at this revision

API Documentation at this revision

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

Calibration/calibration.cpp Show annotated file Show diff for this revision Revisions of this file
Config/user_config.h Show annotated file Show diff for this revision Revisions of this file
FOC/foc.cpp Show annotated file Show diff for this revision Revisions of this file
PreferenceWriter/PrefrenceWriter.cpp Show annotated file Show diff for this revision Revisions of this file
StateMachine/state_machine.cpp Show diff for this revision Revisions of this file
StateMachine/state_machine.h Show diff for this revision Revisions of this file
hw_setup.cpp Show annotated file Show diff for this revision Revisions of this file
loops.cpp Show annotated file Show diff for this revision Revisions of this file
loops.h Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
structs.h Show annotated file Show diff for this revision Revisions of this file
--- 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{