1

Dependencies:   mbed-dev-f303 FastPWM3

Revision:
52:d4d5e3414865
Parent:
51:29e1686e8b3e
Child:
53:32218a36df05
--- a/main.cpp	Thu Aug 06 07:25:51 2020 +0000
+++ b/main.cpp	Sat Aug 08 13:43:20 2020 +0000
@@ -251,9 +251,9 @@
 
     
 void print_encoder(void){
-    printf(" AS5147Mechanical Angle:  %f    Electrical Angle:  %f    Raw:  %d\n\r", spi.GetMechPosition(), spi.GetElecPosition(), spi.GetRawPosition());
-    printf(" MA700:Mechanical Angle:  %f    Electrical Angle:  %f    Raw:  %d\n\r", ma700.GetMechPosition(), ma700.GetElecPosition(), ma700.GetRawPosition());
-    printf(" Joint Angle:  %f               Mech1: %f                Mech: %f\n\r", controller.theta_joint_raw*57.2957795, -controller.theta_mech1*57.2957795*GR, controller.theta_mech*57.2957795*GR);
+    printf(" AS5147Mechanical Angle:  %f    Electrical Angle:  %f    Raw:  %d\n\r", spi.GetMechPosition()*57.2957795, spi.GetElecPosition()*57.2957795, spi.GetRawPosition());
+    printf(" MA700:Mechanical Angle:  %f    Electrical Angle:  %f    Raw:  %d\n\r", ma700.GetMechPosition()*57.2957795, ma700.GetElecPosition()*57.2957795, ma700.GetRawPosition());
+    printf(" Joint raw:  %f                 Joint: %f                Mech: %f\n\r", controller.theta_joint_raw*57.2957795, controller.theta_joint*57.2957795, controller.theta_mech*57.2957795);
 
     // 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;
@@ -270,11 +270,13 @@
         ADC1->CR2  |= 0x40000000;                                               // Begin sample and conversion
         //volatile int delay;   
         //for (delay = 0; delay < 55; delay++);
+        spi.Sample(DT);
+        ma700.Sample(DT); 
+        
         controller.adc2_raw = ADC2->DR;                                         // Read ADC Data Registers
         controller.adc1_raw = ADC1->DR;
         controller.adc3_raw = ADC3->DR;
-        spi.Sample(DT);
-        ma700.Sample(DT);                                                               // sample position sensor
+                                                                      // sample position sensor
         controller.theta_elec = spi.GetElecPosition();
        // controller.theta_mech = (1.0f/GR)*spi.GetMechPosition();
         controller.dtheta_mech = (1.0f/GR)*spi.GetMechVelocity();  
@@ -293,7 +295,10 @@
         //if(controller.dtheta_mech>0) {controller.theta_joint_raw += PI/180.0f;}  //compensate
        // else if(controller.dtheta_mech<0) {controller.theta_joint_raw -= PI/180.0f;}
         if(controller.theta_joint_raw<0){controller.theta_joint_raw += 2.0f*PI;}
-        if(controller.theta_joint_raw>=360){controller.theta_joint_raw -= 2.0f*PI;}
+        else if(controller.theta_joint_raw>=2.0f*PI){controller.theta_joint_raw -= 2.0f*PI;}
+        
+        if(controller.theta_joint_raw<0){controller.theta_joint_raw += 2.0f*PI;}   //may be still below 0
+        else if(controller.theta_joint_raw>=2.0f*PI){controller.theta_joint_raw -= 2.0f*PI;}
 
         controller.theta_joint_raw_fil =0.99f*controller.theta_joint_raw_pre + 0.01f*controller.theta_joint_raw ;//filter
         controller.theta_joint_raw_pre =controller.theta_joint_raw_fil;
@@ -305,21 +310,13 @@
         controller.Ncycle = controller.theta_joint_raw/(2.0f*PI/GR);
         controller.Ncycle_mod = fmod(controller.theta_joint_raw,2.0f*PI/GR);
         controller.Mech_mod = fmod(spi.GetMechPosition(),2.0f*PI);
-      /*
-        if(abs(controller.Ncycle_mod*57.2957795-controller.Mech_mod*57.2957795/GR)>4)  //not in the error range
-        {
-            if (controller.Mech_mod>PI)   //
-           {
-            controller.Ncycle -= 1;
-            } 
-           else if(controller.Mech_mod<PI) //
-           {
-            controller.Ncycle += 1;
-           } 
-            
-        }
-        */
+        
+        if(controller.Mech_mod<0){controller.Mech_mod += 2.0f*PI;}
+        else if(controller.Mech_mod>=2.0f*PI){controller.Mech_mod -= 2.0f*PI;}
+
         controller.theta_joint= controller.Ncycle*(2.0f*PI/GR)+controller.Mech_mod/GR;  //In the real use, should turn to the theta_mech
+        if(controller.theta_joint<0){controller.theta_joint += 2.0f*PI;}
+        else if(controller.theta_joint>=2.0f*PI){controller.theta_joint -= 2.0f*PI;}
         if(J_M_flag == 0)
           {
             if(0<abs(controller.Ncycle_mod*57.2957795-controller.Mech_mod*57.2957795/GR)<2)
@@ -589,36 +586,60 @@
     NVIC_SetPriority(TIM1_UP_TIM10_IRQn, 0);                                             // commutation > communication
     
     NVIC_SetPriority(CAN1_RX0_IRQn, 3);
-    can.filter(CAN_ID<<21, 0xFFE00004, CANStandard, 0);
-                                                                    
+        // If preferences haven't been user configured yet, set defaults 
+    prefs.load();                                                               // Read flash
+    can.filter(CAN_ID , 0xFFF, CANStandard, 0);                                                         
     txMsg.id = CAN_MASTER;
     txMsg.len = 6;
     rxMsg.len = 8;
-    can.attach(&onMsgReceived);                                     // attach 'CAN receive-complete' interrupt handler    
-    prefs.load();                                                               // Read flash
+    can.attach(&onMsgReceived);  
+    
     if(isnan(E_OFFSET)){E_OFFSET = 0.0f;}
     if(isnan(M_OFFSET)){M_OFFSET = 0.0f;}
     spi.SetElecOffset(E_OFFSET);                                                // Set position sensor offset
     spi.SetMechOffset(M_OFFSET);
+    
+    pc.baud(460800);//pc.baud(921600); 
+    //=====benk 2020 last version===//
+    
+    spi.Sample(1.0f);
+     printf("MP: %.3f\n\r",spi.GetMechPosition());
+    if(spi.GetMechPosition() > 2.0f*PI){spi.SetMechOffset(M_OFFSET+2.0f*PI);}        // now zeroes to +- 30 degrees about nominal, independent of rollover point
+    else if (spi.GetMechPosition() < 0){spi.SetMechOffset(M_OFFSET-2.0f*PI);}
+    //=====benk 2020 last version===//
+    
     if(isnan(JOINT_E_OFFSET)){JOINT_E_OFFSET = 0.0f;}
     if(isnan(JOINT_M_OFFSET)){JOINT_M_OFFSET = 0.0f;}
     ma700.SetElecOffset(JOINT_E_OFFSET);                                                // Set position sensor offset
     ma700.SetMechOffset(JOINT_M_OFFSET);
+    //=====benk 2020 last version===//
+    ma700.Sample(1.0f);
+    printf("JP: %.3f\n\r",ma700.GetMechPosition());
+    if(ma700.GetMechPosition() > 2.0f*PI){ma700.SetMechOffset(JOINT_M_OFFSET+2.0f*PI);}        // now zeroes to +- 30 degrees about nominal, independent of rollover point
+    else if (ma700.GetMechPosition() < 0){ma700.SetMechOffset(JOINT_M_OFFSET-2.0f*PI);}
+    
+    spi.Sample(1.0f);
+    ma700.Sample(1.0f);
+    printf("MP: %.3f   JP: %.3f\n\r",spi.GetMechPosition(),ma700.GetMechPosition());
+
+    //=====benk 2020 last version===//
     int lut[128] = {0};
     int joint[128]={0};                                                         //shaorui
     memcpy(&lut, &ENCODER_LUT, sizeof(lut));
     spi.WriteLUT(lut);  
     memcpy(&joint, &ENCODER_JOINT , sizeof(joint));
     spi.WriteLUT(joint);                             
-    pc.baud(460800);//pc.baud(921600);                                                            // set serial baud rate
+                                                               // set serial baud rate
     wait(.01);
+        printf("MP: %.3f   JP: %.3f\n\r",spi.GetMechPosition(),ma700.GetMechPosition());
+
     pc.printf("\n\r\n\r QXSLAB Joint\n\r\n\r");
     wait(.01);
     printf("\n\r Debug Info:\n\r");
     printf(" Firmware Version: %s\n\r", VERSION_NUM);
     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(" Output Zero Position:  %.4f\n\r", M_OFFSET);
+    printf(" Position Sensor Electrical Offset:   %.4f\n\r", E_OFFSET*57.2957795);
+    printf(" Output Zero Position:  %.4f\n\r", M_OFFSET*57.2957795);
     printf(" CAN ID:  %d\n\r", CAN_ID);
     
     controller.theta_joint_raw_pre=-(ma700.GetMechPosition()+spi.GetMechPosition());    //hjb added, for joint encoder filter    
@@ -689,7 +710,9 @@
           // 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("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("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);
               count = 0;