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:
Thu Apr 04 13:50:02 2019 +0000
Parent:
48:74a40481740c
Child:
50:ba72df25d10f
Commit message:
testing_commit;

Changed in this revision

Config/current_controller_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
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/Config/current_controller_config.h	Sun Mar 03 02:51:51 2019 +0000
+++ b/Config/current_controller_config.h	Thu Apr 04 13:50:02 2019 +0000
@@ -14,7 +14,7 @@
 #define Q_INT_LIM V_BUS/(K_Q*KI_Q)  // Amps*samples
 
 #define I_MAX 40.0f                 // Max Current
-#define I_MAX_FW 0.0f               // Max field weakening current
+#define I_MAX_FW 10.0f               // Max field weakening current
 #define I_MAX_CONT 15.0f            // Max continuous current, for thermal limiting
 
 //Observer//
--- a/FOC/foc.cpp	Sun Mar 03 02:51:51 2019 +0000
+++ b/FOC/foc.cpp	Thu Apr 04 13:50:02 2019 +0000
@@ -122,12 +122,12 @@
         // Resistance observer //
         // Temperature Observer //
         float t_rise = (float)observer->temperature - 25.0f;
-        float q_th_in = (1.0f + .00393f*t_rise)*(controller->i_d*controller->i_d*R_PHASE*1.5f + controller->i_q*controller->i_q*R_PHASE*1.5f);
+        float q_th_in = (1.0f + .00393f*t_rise)*(controller->i_d*controller->i_d*R_PHASE*SQRT3 + controller->i_q*controller->i_q*R_PHASE*SQRT3);
         float q_th_out = t_rise*R_TH;
         observer->temperature += INV_M_TH*DT*(q_th_in-q_th_out);
         
-        //observer->resistance = (controller->v_q - 2.0f*controller->dtheta_elec*(WB + L_D*controller->i_d))/controller->i_q;
-        observer->resistance = controller->v_q/controller->i_q;
+        observer->resistance = (controller->v_q - SQRT3*controller->dtheta_elec*(WB))/controller->i_q;
+        //observer->resistance = controller->v_q/controller->i_q;
         if(isnan(observer->resistance)){observer->resistance = R_PHASE;}
         observer->temperature2 = (double)(25.0f + ((observer->resistance*6.0606f)-1.0f)*275.5f);
         double e = observer->temperature - observer->temperature2;
@@ -157,7 +157,7 @@
         controller->i_d_filt = 0.95f*controller->i_d_filt + 0.05f*controller->i_d;
         
         
-        // Filter the current references to the desired closed-loopbandwidth
+        // Filter the current references to the desired closed-loop bandwidth
         controller->i_d_ref_filt = (1.0f-controller->alpha)*controller->i_d_ref_filt + controller->alpha*controller->i_d_ref;
         controller->i_q_ref_filt = (1.0f-controller->alpha)*controller->i_q_ref_filt + controller->alpha*controller->i_q_ref;
 
--- a/main.cpp	Sun Mar 03 02:51:51 2019 +0000
+++ b/main.cpp	Thu Apr 04 13:50:02 2019 +0000
@@ -134,7 +134,7 @@
     reset_foc(&controller);                                                     // Tesets integrators, and other control loop parameters
     wait(.001);
     controller.i_d_ref = 0;
-    controller.i_q_ref = 0;                                                     // Current Setpoints
+    controller.i_q_ref = 40;                                                     // Current Setpoints
     gpio.led->write(1);                                                     // Turn on status LED
     state_change = 0;
     printf("\n\r Entering Motor Mode \n\r");
@@ -220,62 +220,19 @@
                     controller.kd = 0;
                     controller.t_ff = 0;
                     } 
-                //controller.i_q_ref = 0.0f;
-                //controller.i_d_ref = 0.0f;
-                
-                //controller.i_q_ref = 2.0f;
-                //controller.i_d_ref = -30.0f;
-                //controller.kp = 1;
-                //controller.kd = .1f;
-                //controller.v_des = 25;
-                //torque_control(&controller);
-                controller.i_q_ref = 40.0f;
-                //
-                //controller.i_q_ref += .00025f;
-                //if(count>80000)
-                //{
-                //    controller.i_q_ref = 0.0f;
-                //    count = 0;
-                //    }    
-                //controller.i_d_ref = -10.0f;
-                commutate(&controller, &observer, &gpio, controller.theta_elec);           // Run current loop
-                //TIM1->CCR3 = (PWM_ARR)*(0.5f);                        // Write duty cycles
-                //TIM1->CCR2 = (PWM_ARR)*(0.5f);
-                //TIM1->CCR1 = (PWM_ARR)*(0.5f);
-                controller.timeout++;
 
-                //pc.putc(iq);
-                //pc.putc(id);
-                //pc.putc(ang);
-                //pc.printf("\n\r");
-                
-                
-                count++;
-                
-                /*
-                if(count == 10000){
-                     //printf("%d  %d  %.4f  %.4f  %.4f\n\r", controller.adc1_raw, controller.adc2_raw, controller.i_a, controller.i_b, controller.i_c);
-                     //printf("%.2f\n\r", 1000.0f*controller.h1_iq_afc_int1);
-                     //pc.putc(id);
-                     //pc.putc(iq);
-                     //pc.putc(ang);
-                     //pc.putc('\n');
-                     //pc.putc('\r');
-                     //printf("%.1f\n", controller.k_q*controller.ki_q*controller.q_int);
-                     if(controller.i_d_ref< 10.0f)
-                     {
-                        controller.i_d_ref += .05f;
-                    }
-                    else{controller.i_d_ref = 0;}
-                    
-                     count = 0;
-                     }
-                     */
-                     
-                    
-                     
-                   
-                     
+                //torque_control(&controller);
+                //controller.i_q_ref = 20.0f;
+                if(count > 40000)
+                {
+                    count = 0;
+                    controller.i_q_ref = -controller.i_q_ref;
+                }
+
+                commutate(&controller, &observer, &gpio, controller.theta_elec);           // Run current loop
+
+                controller.timeout++;
+                count++; 
             
                 }     
                 break;
@@ -394,6 +351,13 @@
                     break;
                     }
             }
+        else if (state == MOTOR_MODE){
+            switch (c){
+                case 'd':
+                    controller.i_q_ref = 0;
+                    controller.i_d_ref = 0;
+                }
+            }
             
         }
     }
@@ -412,7 +376,7 @@
     wait_us(100);
     drv.write_CSACR(0x0, 0x1, 0x0, CSA_GAIN_40, 0x0, 0x0, 0x0, 0x0, SEN_LVL_1_0);
     wait_us(100);
-    drv.write_OCPCR(TRETRY_4MS, DEADTIME_200NS, OCP_RETRY, OCP_DEG_4US, VDS_LVL_1_5);
+    drv.write_OCPCR(TRETRY_4MS, DEADTIME_200NS, OCP_RETRY, OCP_DEG_8US, VDS_LVL_1_88);
     
     //drv.enable_gd();
     zero_current(&controller.adc1_offset, &controller.adc2_offset);             // Measure current sensor zero-offset
@@ -503,9 +467,9 @@
         if(state == MOTOR_MODE)
         {
             //printf("%.3f  %.3f  %.3f\n\r", (float)observer.temperature, (float)observer.temperature2, observer.resistance);
-            //printf("%.3f  %.3f  %.3f\n\r", controller.v_q/controller.v_bus, controller.i_q, observer.resistance);
-            printf("%.3f\n\r", controller.dtheta_mech);
-            wait(.001);
+            //printf("%.3f  %.3f  %.3f %.3f %.3f\n\r", controller.v_d, controller.v_q, controller.i_d_filt, controller.i_q_filt, controller.dtheta_elec);
+            //printf("%.3f\n\r", controller.dtheta_mech);
+            wait(.002);
         }
 
     }