1

Dependencies:   mbed-dev-f303 FastPWM3

Revision:
55:d614e29c60c5
Parent:
54:4c9415402628
--- a/main.cpp	Thu Sep 17 07:49:27 2020 +0000
+++ b/main.cpp	Wed Apr 14 11:46:16 2021 +0000
@@ -60,6 +60,7 @@
 volatile int count = 0;
 volatile int state = REST_MODE;
 volatile int state_change;
+volatile int brake_count=0;
 volatile float Joint_init =0; //Joint intial angle
 volatile int J_M_flag = 0;     // Joint motor angle combine
 
@@ -119,6 +120,8 @@
     printf(" esc - Exit to Menu\n\r");
     wait_us(10);
     state_change = 0;
+    gpio.brake->write(0); //shut up electrical brake ---set up electrical brake 0% duty cycle, relative to period
+    brake_count=0;
     gpio.enable->write(0);
     gpio.led->write(0);
     }
@@ -144,6 +147,8 @@
     }
     
 void enter_torque_mode(void){
+   // gpio.brake->write(0.8);
+   gpio.brake->write(1);
     controller.ovp_flag = 0;
     gpio.enable->write(1);                                                      // Enable gate drive
     reset_foc(&controller);                                                     // Tesets integrators, and other control loop parameters
@@ -156,6 +161,7 @@
     }
     
 void calibrate(void){
+    gpio.brake->write(0.8);
     gpio.enable->write(1);                                                      // Enable gate drive
     gpio.led->write(1);                                                    // Turn on status LED
     order_phases(&spi, &gpio, &controller, &prefs);                             // Check phase ordering
@@ -287,7 +293,7 @@
         //////shaorui add for obtaining joint real position
         controller.theta_elec1 = ma700.GetElecPosition();
         controller.theta_mech1 = (1.0f/GR)*ma700.GetMechPosition();
-        controller.dtheta_mech1 =(1.0f/GR)*ma700.GetMechVelocity();  
+        controller.dtheta_mech1 =-(ma700.GetMechVelocity()+spi.GetMechVelocity());  
         controller.dtheta_elec1 = ma700.GetElecVelocity();
         
         ///hjb add joint angle
@@ -329,10 +335,12 @@
                 }
               }
             controller.theta_mech = controller.theta_joint_raw;
+            
            }
         else if(J_M_flag == 1)
         {
             controller.theta_mech = Joint_init + (1.0f/GR)*spi.GetMechPosition(); 
+         
             
             }
         
@@ -361,6 +369,7 @@
             case CALIBRATION_MODE:                                              // Run encoder calibration procedure
                 if(state_change){
                     calibrate();
+                    gpio.brake->write(0); //shut up electrical brake ---set up electrical brake 0% duty cycle, relative to period
                     }
                 break;
              
@@ -374,7 +383,7 @@
              case TEST_TRAJECTORY_MODE:                                            // Run encoder calibration procedure
                 if(state_change){
                      test_jointround_flag=1;
-                     J_M_flag = 0;
+                     //J_M_flag = 0;
                      stop_sign=0;
                      jointcalibrate();
                     
@@ -397,9 +406,14 @@
                     printf("OVP Triggered!\n\r");
                     }
                     */  
-
+                 brake_count++;
+                if(brake_count>=3*40000)
+                    {
+                    //gpio.brake->write(0.125); //set up electrical brake 12.5% duty cycle, relative to period 
+                    gpio.brake->write(0.3);
+                     }
                 torque_control(&controller); 
-                /*   
+                  
                 if((controller.timeout > CAN_TIMEOUT) && (CAN_TIMEOUT > 0)){
                     controller.i_d_ref = 0;
                     controller.i_q_ref = 0;
@@ -407,7 +421,7 @@
                     controller.kd = 0;
                     controller.t_ff = 0;
                     } 
-                    */
+                    
                 commutate(&controller, &observer, &gpio, controller.theta_elec);           // Run current loop
                 controller.timeout += 1;
                 
@@ -574,7 +588,7 @@
     controller.mode = 0;
     controller.sidebct1=0;
     Init_All_HW(&gpio);                                                         // Setup PWM, ADC, GPIO
-
+    gpio.brake->period_ms(25); //set up electrical brake 250 ms period
     wait(.1);
     gpio.enable->write(1);
     TIM1->CCR3 = PWM_ARR*(1.0f);                        // Write duty cycles
@@ -660,80 +674,46 @@
              // wait(.1); 
               if(state == MOTOR_MODE)
              {
-              if(test_jointround_flag==1)
-              {
+              
+              
+              
                if(controller.theta_joint_raw*57.2957795<=1)
                { 
-               //if(stop_sign==0)
-               //{
+               
                 controller.v_des = 0;
                 wait(1);
                 controller.p_des=0;
-                controller.v_des = 1.0f;
+                controller.v_des = 1.5f;
                 controller.kp = 0;
-                controller.kd = 2.0f;
+                controller.kd = 5.0f;
                 controller.t_ff = 0;
                 wait(.5); 
-               // }
-               /*
-                else 
-                {
-                   test_jointround_flag=0; 
-                   controller.v_des =0;
-                   
-                } 
-                */
                 }
+               
               else if(controller.theta_joint_raw*57.2957795>=(359))
                { 
                //stop_sign=1;
                 controller.v_des = 0;
                 wait(1);
                 controller.p_des=0;
-                controller.v_des = -1.0f;
+                controller.v_des = -1.5f;
                 controller.kp = 0;
-                controller.kd = 2.0f;
+                controller.kd = 5.0f;
                 controller.t_ff = 0;
                 wait(.5);
                 printf("test position:%.3f\n\r",(1.0f/GR)* spi.GetMechPosition());
                 
-               }  
-             }
-           //wait(.1);
-            // printf("%.3f\n\r",(1.0f/GR)* spi.GetMechPosition());
-            // printf("%.3d,  %.3d\n\r",test_jointround_flag, stop_sign);
+               } 
+               
            
-            //printf("BCT: %.3x   zzz: %.3x   etxy: %.3x \n\r",ma700.Gettest(),ma700.Gettest1(),ma700.Gettest2());
-           // float joint_mech_position=-(controller.theta_mech*360/(2.0f*PI)*GR+controller.theta_mech1*360/(2.0f*PI));
-           // wucha1=(controller.theta_mech-controller.theta_mech1)*360/(2.0f*PI); 
-            //wucha1=controller.theta_mech*360/(2.0f*PI)-joint_mech_position;
-            //wucha+=abs(wucha1); 
-            //printf("M: %.3f J: %.3f E: %.3f  EA: %.3f  \n\r",controller.theta_mech*360/(2.0f*PI),controller.theta_mech1*360/(2.0f*PI),wucha1,float(wucha/i)) ; 
-            // printf("M: %.3f J: %.3f E: %.3f  EA: %.3f  \n\r",controller.theta_mech*360/(2.0f*PI),joint_mech_position,wucha1,float(wucha/i)) ; 
-            //printf("m_position: %.3f\n\r",controller.theta_mech*360/(2.0f*PI)*GR);
-            //printf("j_position: %.3f\n\r",controller.theta_mech1*360/(2.0f*PI));
-          //  float m_position=controller.theta_mech*57.2957795;
-           // float j_position=-controller.theta_mech1*360/(2.0f*PI)-controller.theta_mech*360/(2.0f*PI)*GR;
-          // float j_position=-(controller.theta_mech1+controller.theta_mech)*2807.49319614;
-          // float j_position=-controller.theta_mech1*57.2957795;
-            //printf("m:%.3f\n\r,j:%.3f\n\r",m_position,j_position);
-           if(count >= 4000){
-//            printf("J: %.3f  Mec: %.3f   Jerr: %.3f   JVerr: %.3f   Kp: %.3f   Kd: %.3f  \n\r",controller.theta_joint*57.2957795, controller.theta_mech*57.2957795, (controller.p_des - controller.theta_mech)*57.2957795,(controller.v_des - controller.dtheta_mech)*57.2957795, controller.kp,controller.kd);
-              //printf("Jraw:%.3f   J: %.3f  Mec: %.3f   N: %.3d   Nmod: %.3f   Mmod: %.3f \n\r",controller.theta_joint_raw*57.2957795,controller.theta_joint*57.2957795, controller.theta_mech*57.2957795, controller.Ncycle,controller.Ncycle_mod*57.2957795,controller.Mech_mod*57.2957795);
-
-              printf("vd:%.3f   vq: %.3f   iq: %.3f  Velc:%.3f\n\r",controller.v_d,controller.v_q,controller.i_q_ref,controller.dtheta_elec);
-
-              printf("Pdes: %.3f  Vdes: %.3f   Kp: %.3f   Kd: %.3f   Tff: %.3f\n\r",controller.p_des*57.2957795, controller.v_des*57.2957795, controller.kp,controller.kd,controller.t_ff);
-              printf("Prel: %.3f  Vrel: %.3f   T: %.3f \n\r",controller.theta_mech*57.2957795, controller.dtheta_mech*57.2957795, controller.i_q_filt*KT_OUT);
+           if(count >= 40000){        
+            printf("J_init: %.3f Pref: %.3f  preal: %.3f   JM: %.3d one: %.3f  two: %.3f\n\r",Joint_init*57.2957795,(1.0f/GR)*spi.GetMechPosition()*57.2957795,controller.theta_mech*57.2957795,J_M_flag ,controller.Ncycle_mod*57.2957795-controller.Mech_mod*57.2957795/GR,(controller.theta_joint- controller.theta_joint_raw)*57.2957795);
+           // printf("Pref: %.3f  qian: %.3f  hou: %.3f  M: %.3d \n\r", (1.0f/GR)*spi.GetMechPosition()*57.2957795,controller.theta_joint_raw*57.2957795,controller.theta_mech*57.2957795,J_M_flag);
+            // printf("v: %.3f  v1: %.3f   \n\r",controller.dtheta_mech*57.2957795,controller.dtheta_mech1*57.2957795);
               count = 0;
               }
-                  
-            
+              
              i++;
-            //wait(.5);
-            
         }
-        
-                
-    }
+ }       
 }