Luca Antolini / Mbed 2 deprecated AAA_Stabilus322699_LA0030

Dependencies:   mbed QEI PID DmTftLibraryEx

Files at this revision

API Documentation at this revision

Comitter:
lex9296
Date:
Fri Apr 15 07:01:02 2022 +0000
Parent:
38:72394e4c35f8
Commit message:
Retroazione di velocita e correzione

Changed in this revision

SWPos/SWPos.cpp Show annotated file Show diff for this revision Revisions of this file
SWPos/SWPos.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
--- a/SWPos/SWPos.cpp	Tue Apr 12 07:55:59 2022 +0000
+++ b/SWPos/SWPos.cpp	Fri Apr 15 07:01:02 2022 +0000
@@ -74,12 +74,14 @@
 static bool InProgress =    false;
 
 static int64_t  i64_TargetPosition_Prec;
+//
 static bool     b_AuxCalculateProfile_003;
 static bool     b_AuxCalculateProfile_002;
 static bool     b_AuxCalculateProfile_001;
 static bool     b_AuxCalculateProfile_000;
-static int32_t  i32_ServoLockSpeed_FW;
-static int32_t  i32_ServoLockSpeed_BW;
+
+static float    f_ServoLockSpeed_FW;
+static float    f_ServoLockSpeed_BW;
 
 static double   d_X1;
 static double   d_X2;
@@ -94,12 +96,14 @@
 static double   d_n;
 static double   d_t;
 
-static int32_t  i32_ActualSpeed;
+static float    f_ActualSpeed_Local;
 static int64_t  i64_AccelerationWindow_Local;
 static int64_t  i64_DecelerationWindow_Local;
-static int32_t  i32_MaximumSpeed_FW;
-static int32_t  i32_MaximumSpeed_BW;
-static int32_t  i32_MaximumSpeed_Local;
+
+static float    f_MaximumSpeed_FW;
+static float    f_MaximumSpeed_BW;
+
+static float    f_MaximumSpeed_Local;
 static int64_t  i64_StartPosition_Local;
 static int64_t  i64_Distance_Local;
 static bool     b_GoingFW;
@@ -108,13 +112,16 @@
 static bool     b_Decelerating_Local;
 static bool     b_JogFW_Prec_Local;
 static bool     b_JogBW_Prec_Local;
+
 static int32_t  i32_Aux_ms2Acc;
 static int32_t  i32_Aux_ms2Dec;
+
 static float    f_Aux_AccelAnyms;
 static float    f_Aux_DecelAnyms;
 static float    f_MaximumJogSpeed_xW;
 
 static uint32_t ui32_PreviousStep_ms_Local;
+
 uint32_t    ui32_ActualStepSampled_ms_Local;
 uint32_t    ui32_PassedActual_ms_Local;
 
@@ -168,9 +175,9 @@
                         b_JogFW_Prec_Local = in.b_JogFW;
                         i32_Aux_ms2Acc = in.i32_JogAccel_ms;
                         //
-                        f_MaximumJogSpeed_xW =   (((in.f_JogSpeed_x100_FW)* (float)(in.i32_Max_Speed- i32_ActualSpeed)/ 100));                  // LA:  Speed to be Reached
-                        f_Aux_AccelAnyms =   (f_MaximumJogSpeed_xW/ (float)in.i32_JogAccel_ms);                                                 // LA:  Any ms Increment o'Speed
-        
+                        f_MaximumJogSpeed_xW =   (((in.f_JogSpeed_x100_FW)* (in.f_Max_Speed- f_ActualSpeed_Local)/ 100.0f));                // LA:  Speed to be Reached
+                        f_Aux_AccelAnyms =   (f_MaximumJogSpeed_xW/ (float)in.i32_JogAccel_ms);                                             // LA:  Any ms Increment o'Speed
+
                         b_Accelerating_Local =   true;
                         b_Decelerating_Local =   false;
                         out.b_MaxSpeedReached =    false;
@@ -179,11 +186,11 @@
                     //  JOG Move FW
                     //
                     if  (i32_Aux_ms2Acc > 0) {
-                        i32_Aux_ms2Acc =   (i32_Aux_ms2Acc- ui32_PassedActual_ms_Local);                                          //  LA: Ms Passed @ this Trip
-                        i32_ActualSpeed =  (int32_t)((float)(in.i32_JogAccel_ms- i32_Aux_ms2Acc)* f_Aux_AccelAnyms);        //  LA: Acc Checkpoint
+                        i32_Aux_ms2Acc =   (i32_Aux_ms2Acc- ui32_PassedActual_ms_Local);                                            //  LA: Ms Passed @ this Trip
+                        f_ActualSpeed_Local =  ((float)(in.i32_JogAccel_ms- i32_Aux_ms2Acc)* f_Aux_AccelAnyms);                     //  LA: Acc Checkpoint
                     }
                     else {
-                        i32_ActualSpeed =  (int32_t)((in.f_JogSpeed_x100_FW)* (float)(in.i32_Max_Speed- in.i32_ZeroSpeed)/ 100);                // LA:  Maximum Speed Reached
+                        f_ActualSpeed_Local =  ((in.f_JogSpeed_x100_FW)* (in.f_Max_Speed- in.f_ZeroSpeed)/ 100.0f);                 // LA:  Maximum Speed Reached
         
                         b_Accelerating_Local =  false;
                         b_Decelerating_Local =  false;
@@ -199,7 +206,7 @@
                             //  JOG Mode FW "Just" Released
                             //
                             i32_Aux_ms2Dec =   in.i32_JogDecel_ms;
-                            f_MaximumJogSpeed_xW =   (((in.f_JogSpeed_x100_FW)* (float)(i32_ActualSpeed- in.i32_ZeroSpeed)/ 100));                  // LA:  Speed to be Reached
+                            f_MaximumJogSpeed_xW =   (((in.f_JogSpeed_x100_FW)* (float)(f_ActualSpeed_Local- in.f_ZeroSpeed)/ 100));                // LA:  Speed to be Reached
                             f_Aux_DecelAnyms =   (f_MaximumJogSpeed_xW/ (float)in.i32_JogDecel_ms);                                                 // LA:  Any ms Increment o'Speed
         
                             b_Accelerating_Local =  false;
@@ -210,22 +217,22 @@
                         //  JOG Move FW, Decelerating to Zero
                         //
                         if  (i32_Aux_ms2Dec > 0) {
-                            i32_Aux_ms2Dec =   (i32_Aux_ms2Dec- ui32_PassedActual_ms_Local);                                                              //  LA: Ms Passed @ this Trip
-                            i32_ActualSpeed =  (int32_t)(f_MaximumJogSpeed_xW- (float)(in.i32_JogDecel_ms- i32_Aux_ms2Dec)* f_Aux_DecelAnyms);      //  LA: Dec Checkpoint
+                            i32_Aux_ms2Dec =   (i32_Aux_ms2Dec- ui32_PassedActual_ms_Local);                                                    //  LA: Ms Passed @ this Trip
+                            f_ActualSpeed_Local =  (f_MaximumJogSpeed_xW- (float)(in.i32_JogDecel_ms- i32_Aux_ms2Dec)* f_Aux_DecelAnyms);       //  LA: Dec Checkpoint
         
-                            b_GoingFW =   true;                   //  LA: Moves ...
-                            b_GoingBW =   false;                  //
+                            b_GoingFW =   true;                     //  LA: Moves ...
+                            b_GoingBW =   false;                    //
                         }
                         else {
-                            i32_ActualSpeed =  in.i32_ZeroSpeed;        //  LA: Zero Speed Reached
+                            f_ActualSpeed_Local =   in.f_ZeroSpeed; //  LA: Zero Speed Reached
         
                             b_Accelerating_Local =   false;
                             b_Decelerating_Local =   false;
                             out.b_MaxSpeedReached =    false;
                             //
-                            b_JogFW_Prec_Local =   false;                      //  LA: Move is Terminated, NOW
-                            b_GoingFW =    false;                  //
-                            b_GoingBW =    false;                  //
+                            b_JogFW_Prec_Local =   false;           //  LA: Move is Terminated, NOW
+                            b_GoingFW =    false;                   //
+                            b_GoingBW =    false;                   //
                         }
                     }
                 }
@@ -238,8 +245,8 @@
                         b_JogBW_Prec_Local =   in.b_JogBW;
                         i32_Aux_ms2Acc =   in.i32_JogAccel_ms;
                         //
-                        f_MaximumJogSpeed_xW =    (((in.f_JogSpeed_x100_BW)* (float)(in.i32_Max_Speed-  i32_ActualSpeed)/ 100));                    // LA:  Speed to be Reached
-                        f_Aux_AccelAnyms =   (f_MaximumJogSpeed_xW/ (float)in.i32_JogAccel_ms);                                                     // LA:  Any ms Increment o'Speed
+                        f_MaximumJogSpeed_xW =    (((in.f_JogSpeed_x100_BW)* (in.f_Max_Speed-  f_ActualSpeed_Local)/ 100.0f));          // LA:  Speed to be Reached
+                        f_Aux_AccelAnyms =   (f_MaximumJogSpeed_xW/ (float)in.i32_JogAccel_ms);                                         // LA:  Any ms Increment o'Speed
     
                         b_Accelerating_Local =  true;
                         b_Decelerating_Local =  false;
@@ -249,15 +256,15 @@
                     //  JOG Move BW
                     //
                     if  (i32_Aux_ms2Acc > 0) {
-                        i32_Aux_ms2Acc =   (i32_Aux_ms2Acc- ui32_PassedActual_ms_Local);                                                                  //  LA: Ms Passed @ this Trip
-                        i32_ActualSpeed =  (int32_t)((float)(in.i32_JogAccel_ms- i32_Aux_ms2Acc)* f_Aux_AccelAnyms);                                //  LA: Acc Checkpoint
+                        i32_Aux_ms2Acc =   (i32_Aux_ms2Acc- ui32_PassedActual_ms_Local);                                                //  LA: Ms Passed @ this Trip
+                        f_ActualSpeed_Local =  ((float)(in.i32_JogAccel_ms- i32_Aux_ms2Acc)* f_Aux_AccelAnyms);                         //  LA: Acc Checkpoint
                     }
                     else {
-                        i32_ActualSpeed =  (int32_t)((in.f_JogSpeed_x100_BW)* (float)(in.i32_Max_Speed- in.i32_ZeroSpeed)/ 100);                    //  LA: Maximum Speed Reached
-        
-                        b_Accelerating_Local =   false;
-                        b_Decelerating_Local =   false;
-                        out.b_MaxSpeedReached =    true;
+                        f_ActualSpeed_Local =  ((in.f_JogSpeed_x100_BW)* (in.f_Max_Speed- in.f_ZeroSpeed)/ 100.0f);                     //  LA: Maximum Speed Reached
+
+                        b_Accelerating_Local =  false;
+                        b_Decelerating_Local =  false;
+                        out.b_MaxSpeedReached = true;
                     }
         
                     b_GoingBW =    true;                           //  LA: Moves ...
@@ -270,9 +277,9 @@
                             //  JOG Mode BW "Just" Released
                             //
                             i32_Aux_ms2Dec = in.i32_JogDecel_ms;
-                            f_MaximumJogSpeed_xW =    (((in.f_JogSpeed_x100_BW)* (float)(i32_ActualSpeed- in.i32_ZeroSpeed)/ 100));                   // LA:  Speed to be Reached
-                            f_Aux_DecelAnyms =   (f_MaximumJogSpeed_xW/ (float)(in.i32_JogDecel_ms));                                                 // LA:  Any ms Increment o'Speed
-        
+                            f_MaximumJogSpeed_xW =    (((in.f_JogSpeed_x100_BW)* (f_ActualSpeed_Local- in.f_ZeroSpeed)/ 100.0f));           // LA:  Speed to be Reached
+                            f_Aux_DecelAnyms =   (f_MaximumJogSpeed_xW/ (float)(in.i32_JogDecel_ms));                                       // LA:  Any ms Increment o'Speed
+
                             b_Accelerating_Local =  false;
                             b_Decelerating_Local =  true;
                             out.b_MaxSpeedReached = false;
@@ -281,22 +288,22 @@
                         //  JOG Move FW, Decelerating to Zero
                         //
                         if  (i32_Aux_ms2Dec > 0) {
-                            i32_Aux_ms2Dec =   (i32_Aux_ms2Dec- ui32_PassedActual_ms_Local);                                                                      //  LA: Ms Passed @ this Trip
-                            i32_ActualSpeed =  (int32_t)(f_MaximumJogSpeed_xW- (float)(in.i32_JogDecel_ms- i32_Aux_ms2Dec)* f_Aux_DecelAnyms);              //  LA: Dec Checkpoint
+                            i32_Aux_ms2Dec =   (i32_Aux_ms2Dec- ui32_PassedActual_ms_Local);                                                //  LA: Ms Passed @ this Trip
+                            f_ActualSpeed_Local =  (f_MaximumJogSpeed_xW- (float)(in.i32_JogDecel_ms- i32_Aux_ms2Dec)* f_Aux_DecelAnyms);   //  LA: Dec Checkpoint
             
-                            b_GoingBW =    true;                   //  LA: Moves ...
-                            b_GoingFW =    false;                  //
+                            b_GoingBW =    true;                    //  LA: Moves ...
+                            b_GoingFW =    false;                   //
                         }
                         else {
-                            i32_ActualSpeed =  in.i32_ZeroSpeed;            //  LA: Zero Speed Reached
+                            f_ActualSpeed_Local =  in.f_ZeroSpeed;  //  LA: Zero Speed Reached
             
                             b_Accelerating_Local =   false;
                             b_Decelerating_Local =   false;
                             out.b_MaxSpeedReached =    false;
                             //
-                            b_JogBW_Prec_Local =   false;                      //  LA: Move is Terminated, NOW
-                            b_GoingBW =    false;                  //
-                            b_GoingFW =    false;                  //
+                            b_JogBW_Prec_Local =   false;           //  LA: Move is Terminated, NOW
+                            b_GoingBW =    false;                   //
+                            b_GoingFW =    false;                   //
                         }
                     }
                 }
@@ -328,11 +335,11 @@
                         //  wDecelerationWindow è già la Finestra di Decelerazione
                         //  wToleranceWindow è già la Finestra di Tolleranza di Posizionamento
                         //
-                        i32_MaximumSpeed_FW =   (int32_t)(((in.f_MaximumSpeed_x100_FW)* (float)(in.i32_Max_Speed- in.i32_ZeroSpeed)/ 100));
-                        i32_ServoLockSpeed_FW = (int32_t)(((in.f_ServoLockSpeed_x100_FW)* (float)(in.i32_Max_Speed- in.i32_ZeroSpeed)/ 100));
-                        i32_MaximumSpeed_BW =   (int32_t)(((in.f_MaximumSpeed_x100_BW)* (float)(in.i32_Max_Speed- in.i32_ZeroSpeed)/ 100));
-                        i32_ServoLockSpeed_BW = (int32_t)(((in.f_ServoLockSpeed_x100_BW)* (float)(in.i32_Max_Speed- in.i32_ZeroSpeed)/ 100));
-    
+                        f_MaximumSpeed_FW = (((in.f_MaximumSpeed_x100_FW)* (in.f_Max_Speed- in.f_ZeroSpeed)/ 100.0f));
+                        f_ServoLockSpeed_FW =   (((in.f_ServoLockSpeed_x100_FW)* (in.f_Max_Speed- in.f_ZeroSpeed)/ 100.0f));
+                        f_MaximumSpeed_BW = (((in.f_MaximumSpeed_x100_BW)* (in.f_Max_Speed- in.f_ZeroSpeed)/ 100.0f));
+                        f_ServoLockSpeed_BW =   (((in.f_ServoLockSpeed_x100_BW)* (in.f_Max_Speed- in.f_ZeroSpeed)/ 100.0f));
+
                         // LA:  Verifica (STATICA) del Profilo (Trapezio o Triangolo)
                         //
                         if  (i64_Distance_Local < (in.i64_AccelerationWindow+ in.i64_DecelerationWindow)) {
@@ -368,8 +375,8 @@
                                 d_X1 = (double)i64_StartPosition_Local;
                                 d_X2 = (double)(i64_StartPosition_Local+ in.i64_AccelerationWindow);
                                 //d_Y1 = (double)in.i32_ZeroSpeed;
-                                d_Y1 = (double)i32_ServoLockSpeed_FW;
-                                d_Y2 = (double)i32_MaximumSpeed_FW;
+                                d_Y1 = (double)f_ServoLockSpeed_FW;
+                                d_Y2 = (double)f_MaximumSpeed_FW;
         
                                 d_Y2_meno_Y1 = (d_Y2- d_Y1);        // LA:  From Zero to Max
                                 d_X2_meno_X1 = (d_X2- d_X1);        // LA:  Acceleration EndPoint
@@ -400,9 +407,9 @@
                 
                                 d_X1 = (double)(in.i64_TargetPosition- in.i64_DecelerationWindow);
                                 d_X2 = (double)in.i64_TargetPosition;
-                                d_Y1 = (double)i32_MaximumSpeed_FW;
+                                d_Y1 = (double)f_MaximumSpeed_FW;
                                 //d_Y2 = (double)in.i32_ZeroSpeed;
-                                d_Y2 = (double)i32_ServoLockSpeed_FW;
+                                d_Y2 = (double)f_ServoLockSpeed_FW;
         
                                 d_Y2_meno_Y1 = (d_Y2- d_Y1);        // LA:  From Max to Zero
                                 d_X2_meno_X1 = (d_X2- d_X1);        // LA:  Deceleration EndPoint
@@ -430,7 +437,7 @@
                 
                                 i64_AccelerationWindow_Local =  (long)(((d_t- d_q)/ (d_m- d_n))- (double)i64_StartPosition_Local);
                                 i64_DecelerationWindow_Local =  (long)((double)i64_TargetPosition_Prec- ((d_t- d_q)/ (d_m- d_n)));
-                                i32_MaximumSpeed_Local =    (int32_t)((d_m* ((d_t- d_q)/ (d_m- d_n)))+ d_q);
+                                f_MaximumSpeed_Local =  (float)((d_m* ((d_t- d_q)/ (d_m- d_n)))+ d_q);
                             }
     
                             else {
@@ -463,8 +470,8 @@
                                 d_X1 = (double)i64_StartPosition_Local;
                                 d_X2 = (double)(i64_StartPosition_Local- in.i64_AccelerationWindow);
                                 //d_Y1 = (double)in.i32_ZeroSpeed;
-                                d_Y1 = (double)i32_ServoLockSpeed_BW;
-                                d_Y2 = (double)i32_MaximumSpeed_BW;
+                                d_Y1 = (double)f_ServoLockSpeed_BW;
+                                d_Y2 = (double)f_MaximumSpeed_BW;
         
                                 d_Y2_meno_Y1 = (d_Y2- d_Y1);       //  LA: From Zero to Max
                                 d_X2_meno_X1 = (d_X2- d_X1);       //  LA: Acceleration EndPoint
@@ -497,9 +504,9 @@
                         
                                 d_X1 = (double)(in.i64_TargetPosition + in.i64_DecelerationWindow);
                                 d_X2 = (double)(in.i64_TargetPosition);
-                                d_Y1 = (double)(i32_MaximumSpeed_BW);
+                                d_Y1 = (double)(f_MaximumSpeed_BW);
                                 //d_Y2 = (double)(in.i32_ZeroSpeed);
-                                d_Y2 = (double)(i32_ServoLockSpeed_BW);
+                                d_Y2 = (double)(f_ServoLockSpeed_BW);
                 
                                 d_Y2_meno_Y1 = (d_Y2- d_Y1);        // LA:  From Max to Zero
                                 d_X2_meno_X1 = (d_X2- d_X1);        // LA:  Deceleration EndPoint
@@ -527,7 +534,7 @@
         
                                 i64_AccelerationWindow_Local =  (long)((double)i64_StartPosition_Local- ((d_t- d_q)/ (d_m- d_n)));
                                 i64_DecelerationWindow_Local =  (long)(((d_t- d_q)/ (d_m- d_n))- (double)i64_TargetPosition_Prec);
-                                i32_MaximumSpeed_Local =    (int32_t)((d_m* ((d_t- d_q)/ (d_m- d_n)))+ d_q);
+                                f_MaximumSpeed_Local =  (float)((d_m* ((d_t- d_q)/ (d_m- d_n)))+ d_q);
                             }
                         }
                         else {
@@ -538,9 +545,9 @@
                             i64_DecelerationWindow_Local =    in.i64_DecelerationWindow;
                 
                             if  (in.i64_ActualPosition < in.i64_TargetPosition)
-                                i32_MaximumSpeed_Local =  i32_MaximumSpeed_FW;                        // LA:  Going FW
+                                f_MaximumSpeed_Local =  f_MaximumSpeed_FW;          // LA:  Going FW
                             else
-                                i32_MaximumSpeed_Local =  i32_MaximumSpeed_BW;                        // LA:  Going BW 
+                                f_MaximumSpeed_Local =  f_MaximumSpeed_BW;          // LA:  Going BW 
                         }
                 
                         b_GoingFW =    false;
@@ -563,7 +570,7 @@
         
                         // LA:  Stop the Motion
                         //
-                        i32_ActualSpeed =  in.i32_ZeroSpeed;
+                        f_ActualSpeed_Local =  in.f_ZeroSpeed;
                         b_GoingFW =    false;
                         b_GoingBW =    false;
         
@@ -645,11 +652,11 @@
                                     d_X1 = (double)i64_StartPosition_Local;
                                     d_X2 = (double)(i64_StartPosition_Local+ i64_AccelerationWindow_Local);
                                     //d_Y1 = (double)in.i32_ZeroSpeed;
-                                    d_Y1 = (double)i32_ServoLockSpeed_FW;
-                                    d_Y2 = (double)i32_MaximumSpeed_Local;
+                                    d_Y1 = (double)f_ServoLockSpeed_FW;
+                                    d_Y2 = (double)f_MaximumSpeed_Local;
         
                                     d_Y2_meno_Y1 = (d_Y2- d_Y1);        //  LA: From Zero to Max
-                                    d_X2_meno_X1 = (d_X2- d_X1);        //  LA: Acceleration EndPoint                   */
+                                    d_X2_meno_X1 = (d_X2- d_X1);        //  LA: Acceleration EndPoint
                                     d_X2_per_Y1 =  (d_X2* d_Y1);
                                     d_X1_per_Y2 =  (d_X1* d_Y2);
                 
@@ -658,8 +665,7 @@
                 
                                     b_AuxCalculateProfile_000 =    true;
                                 }
-        
-                                i32_ActualSpeed = (int)((d_m * (double)in.i64_ActualPosition)+ d_q);
+                                f_ActualSpeed_Local = (float)((d_m * (double)in.i64_ActualPosition)+ d_q);
                             }
                 
                             //  Case is:    MiddleWalking @ Planned-Full Speed
@@ -670,14 +676,14 @@
                                     (in.i64_ActualPosition < (in.i64_TargetPosition - i64_DecelerationWindow_Local))
                                 ) {
         
-                                out.b_Accelerating =  false;
-                                out.b_Decelerating =  false;
-                                out.b_MaxSpeedReached =   true;
+                                out.b_Accelerating =    false;
+                                out.b_Decelerating =    false;
+                                out.b_MaxSpeedReached = true;
                 
-                                out.b_InPosition =    false;
-                                out.b_InToleranceFW = false;
+                                out.b_InPosition =  false;
+                                out.b_InToleranceFW =   false;
                 
-                                i32_ActualSpeed = i32_MaximumSpeed_Local;
+                                f_ActualSpeed_Local =   f_MaximumSpeed_Local;
                             }
         
                             //  Case is:    Need to Decelerate, up to the Tolerance Window
@@ -717,9 +723,9 @@
                 
                                     d_X1 = (double)(in.i64_TargetPosition- i64_DecelerationWindow_Local);
                                     d_X2 = (double)in.i64_TargetPosition;
-                                    d_Y1 = (double)i32_ActualSpeed;        // LA:  Maximum Speed Planned MIGHT have NOT been Reached
+                                    d_Y1 = (double)f_ActualSpeed_Local;        // LA:  Maximum Speed Planned MIGHT have NOT been Reached
                                     //d_Y2 = (double)in.i32_ZeroSpeed;
-                                    d_Y2 = (double)i32_ServoLockSpeed_FW;
+                                    d_Y2 = (double)f_ServoLockSpeed_FW;
                 
                                     d_Y2_meno_Y1 = (d_Y2- d_Y1);        // LA:  From Max to Zero
                                     d_X2_meno_X1 = (d_X2- d_X1);        // LA:  Deceleration EndPoint
@@ -731,23 +737,22 @@
                 
                                     b_AuxCalculateProfile_001 =    true;
                                 }
-                        
-                                i32_ActualSpeed = abs((int)((d_m * (double)in.i64_ActualPosition)+ d_q));
+                                f_ActualSpeed_Local = abs((float)((d_m * (double)in.i64_ActualPosition)+ d_q));
                             }
                 
                             //  Case is:    Tolerance Reached while Going FW
                             //              ================================
                             //
                             if  (in.i64_ActualPosition >= (in.i64_TargetPosition- in.i64_diToleranceWindow)) {
-                                out.b_Accelerating =  false;
-                                out.b_Decelerating =  false;
-                                out.b_MaxSpeedReached =   false;
+                                out.b_Accelerating =    false;
+                                out.b_Decelerating =    false;
+                                out.b_MaxSpeedReached = false;
                 
-                                out.b_InPosition =    true;
-                                out.b_InToleranceFW = true;
+                                out.b_InPosition =  true;
+                                out.b_InToleranceFW =   true;
                 
-                                i64_StartPosition_Local = in.i64_ActualPosition;
-                                i32_ActualSpeed = i32_ServoLockSpeed_FW;
+                                i64_StartPosition_Local =   in.i64_ActualPosition;
+                                f_ActualSpeed_Local =   f_ServoLockSpeed_FW;
                             }
                         }
         
@@ -797,8 +802,8 @@
                                     d_X1 =  (double)i64_StartPosition_Local;
                                     d_X2 =  (double)(i64_StartPosition_Local- i64_AccelerationWindow_Local);
                                     //d_Y1 =  (double)in.i32_ZeroSpeed;
-                                    d_Y1 =  (double)i32_ServoLockSpeed_BW;
-                                    d_Y2 =  (double)i32_MaximumSpeed_Local;
+                                    d_Y1 =  (double)f_ServoLockSpeed_BW;
+                                    d_Y2 =  (double)f_MaximumSpeed_Local;
 
                                     d_Y2_meno_Y1 = (d_Y2- d_Y1);        //  LA: From Zero to Max
                                     d_X2_meno_X1 = (d_X2- d_X1);        //  LA: Acceleration EndPoint
@@ -810,8 +815,7 @@
                 
                                     b_AuxCalculateProfile_002 = true;
                                 }
-                        
-                                i32_ActualSpeed =  (int)((d_m * (double)in.i64_ActualPosition)+ d_q);
+                                f_ActualSpeed_Local =  (float)((d_m * (double)in.i64_ActualPosition)+ d_q);
                             }
         
                             //  Case is:    MiddleWalking @ Planned-Full Speed
@@ -822,14 +826,14 @@
                                     (in.i64_ActualPosition > (in.i64_TargetPosition+ i64_DecelerationWindow_Local))
                                 ) {
         
-                                out.b_Accelerating = false;
-                                out.b_Decelerating = false;
-                                out.b_MaxSpeedReached =    true;
+                                out.b_Accelerating =    false;
+                                out.b_Decelerating =    false;
+                                out.b_MaxSpeedReached = true;
                 
-                                out.b_InPosition =     false;
-                                out.b_InToleranceBW =  false;
+                                out.b_InPosition =  false;
+                                out.b_InToleranceBW =   false;
                 
-                                i32_ActualSpeed =  i32_MaximumSpeed_Local;
+                                f_ActualSpeed_Local =   f_MaximumSpeed_Local;
                             }
                 
                             //  Case is:    Need to Decelerate, up to the Tolerance Window
@@ -869,9 +873,9 @@
                             
                                     d_X1 = (double)(in.i64_TargetPosition + i64_DecelerationWindow_Local);
                                     d_X2 = (double)in.i64_TargetPosition;
-                                    d_Y1 = (double)i32_ActualSpeed;        // LA:  Maximum Speed Planned MIGHT have NOT been Reached
+                                    d_Y1 = (double)f_ActualSpeed_Local;        // LA:  Maximum Speed Planned MIGHT have NOT been Reached
                                     //d_Y2 = (double)in.i32_ZeroSpeed;
-                                    d_Y2 = (double)i32_ServoLockSpeed_BW;
+                                    d_Y2 = (double)f_ServoLockSpeed_BW;
                 
                                     d_Y2_meno_Y1 = (d_Y2- d_Y1);        // LA:  From Max to Zero
                                     d_X2_meno_X1 = (d_X2- d_X1);        // LA:  Deceleration EndPoint
@@ -883,7 +887,7 @@
                 
                                     b_AuxCalculateProfile_003 =    true;
                                 }
-                                i32_ActualSpeed = abs((int)((d_m* (double)(in.i64_ActualPosition))+ d_q));
+                                f_ActualSpeed_Local = abs((float)((d_m* (double)(in.i64_ActualPosition))+ d_q));
                             }
         
                             //  Case is:    Tolerance Reached while Going BW
@@ -898,7 +902,7 @@
                                 out.b_InToleranceBW = true;
                         
                                 i64_StartPosition_Local = in.i64_ActualPosition;
-                                i32_ActualSpeed = i32_ServoLockSpeed_BW;
+                                f_ActualSpeed_Local = f_ServoLockSpeed_BW;
                             }
                         }
         
@@ -919,7 +923,7 @@
                             out.b_InPosition = true;
                         
                             i64_StartPosition_Local = in.i64_ActualPosition;
-                            i32_ActualSpeed = in.i32_ZeroSpeed;
+                            f_ActualSpeed_Local = in.f_ZeroSpeed;
                         }
         
                         //      ===========================
@@ -935,19 +939,19 @@
         
                                 // LA:  Going FW
                                 //
-                                if  (i32_ActualSpeed > i32_MaximumSpeed_FW)
-                                    i32_ActualSpeed =  i32_MaximumSpeed_FW;
-                                if  (i32_ActualSpeed < i32_ServoLockSpeed_FW)
-                                    i32_ActualSpeed =  i32_ServoLockSpeed_FW;
+                                if  (f_ActualSpeed_Local > f_MaximumSpeed_FW)
+                                    f_ActualSpeed_Local =   f_MaximumSpeed_FW;
+                                if  (f_ActualSpeed_Local < f_ServoLockSpeed_FW)
+                                    f_ActualSpeed_Local =   f_ServoLockSpeed_FW;
                             }        
                             else {
         
                                 // LA:  Going BW
                                 //
-                                if  (i32_ActualSpeed > i32_MaximumSpeed_BW)
-                                    i32_ActualSpeed = i32_MaximumSpeed_BW;
-                                if  (i32_ActualSpeed < i32_ServoLockSpeed_BW)
-                                    i32_ActualSpeed = i32_ServoLockSpeed_BW;
+                                if  (f_ActualSpeed_Local > f_MaximumSpeed_BW)
+                                    f_ActualSpeed_Local =   f_MaximumSpeed_BW;
+                                if  (f_ActualSpeed_Local < f_ServoLockSpeed_BW)
+                                    f_ActualSpeed_Local =   f_ServoLockSpeed_BW;
                             }
                         }
         
@@ -962,7 +966,7 @@
                             //  Se dovesse uscire, il sistema lo riporterebbe in tolleranza (o cercherebbe di farlo) a "ServolockSpeed".
                             //
         
-                            i32_ActualSpeed = in.i32_ZeroSpeed;
+                            f_ActualSpeed_Local = in.f_ZeroSpeed;
                         }
                     }
                 }
@@ -987,7 +991,7 @@
                     b_AuxCalculateProfile_002 = false;
                     b_AuxCalculateProfile_003 = false;
         
-                    i32_ActualSpeed = in.i32_ZeroSpeed;
+                    f_ActualSpeed_Local = in.f_ZeroSpeed;
                 }
             }
         }
@@ -1011,7 +1015,7 @@
             b_AuxCalculateProfile_002 = false;
             b_AuxCalculateProfile_003 = false;
         
-            i32_ActualSpeed = in.i32_ZeroSpeed;
+            f_ActualSpeed_Local = in.f_ZeroSpeed;
         }
         
         //      ===================
@@ -1020,7 +1024,7 @@
         //      ===================
         //      ===================
             
-        out.i32_ATVSpeed = i32_ActualSpeed;
+        out.f_ATVSpeed = f_ActualSpeed_Local;
         out.b_ATVDirectionFW =   b_GoingFW;
         out.b_ATVDirectionBW =   b_GoingBW;
         
--- a/SWPos/SWPos.h	Tue Apr 12 07:55:59 2022 +0000
+++ b/SWPos/SWPos.h	Fri Apr 15 07:01:02 2022 +0000
@@ -3,8 +3,8 @@
 struct in_sPosizionatoreSW {
     bool    b_AxisPowered;
     bool    b_ACPos_Homed;
-    int32_t     i32_Max_Speed;
-    int32_t     i32_ZeroSpeed;
+    float   f_Max_Speed;
+    float   f_ZeroSpeed;
 
     bool    b_JogMode;
     bool    b_JogFW;
@@ -32,25 +32,25 @@
 };
 
 struct out_sPosizionatoreSW {
-    int64_t   i64_StartPosition;
-    int64_t   i64_Distance;
+    int64_t i64_StartPosition;
+    int64_t i64_Distance;
 
-    bool   b_Accelerating;                   // LA:  bACPos_Accelerating
-    bool   b_MaxSpeedReached;
+    bool    b_Accelerating;                   // LA:  bACPos_Accelerating
+    bool    b_MaxSpeedReached;
     //
-    bool   b_Decelerating;                   //      bACPos_Decelerating
-    bool   b_InPosition;
-    bool   b_InToleranceFW;
-    bool   b_InToleranceBW;
+    bool    b_Decelerating;                   //      bACPos_Decelerating
+    bool    b_InPosition;
+    bool    b_InToleranceFW;
+    bool    b_InToleranceBW;
 
-    int32_t    i32_ATVSpeed;
-    bool   b_ATVDirectionFW;
-    bool   b_ATVDirectionBW;
+    float   f_ATVSpeed;
+    bool    b_ATVDirectionFW;
+    bool    b_ATVDirectionBW;
     //
-    bool   b_STW1_On;
-    bool   b_STW1_NoCStop;
-    bool   b_STW1_NoQStop;
-    bool   b_STW1_Enable;
+    bool    b_STW1_On;
+    bool    b_STW1_NoCStop;
+    bool    b_STW1_NoQStop;
+    bool    b_STW1_Enable;
 
     // LA:  Disposizioni transitorie e finali
     //
--- a/main.cpp	Tue Apr 12 07:55:59 2022 +0000
+++ b/main.cpp	Fri Apr 15 07:01:02 2022 +0000
@@ -22,6 +22,26 @@
 //  La retroazione sulla Velocità (Calcolata ogni "cf_MOTPeriod_s") è eseguita, nello stesso intervallo, da "PID_VelocityClosedLoop"
 //  Il parametro di Riferimento è la Velocity Calcolata
 //  Il Fattore di correzione è il PWM in uscita
+//  Con la versione Pubblicata 0022 Il Doppio PID è correttamente funzionante.
+//
+// LA:  12 Aprile 2022, Introduco la retroazione ad anello Avanzata
+//      ===========================================================
+//
+//  Provo ad escludere il PID (I PID, attualmente son due) a favore di un controllo di retroazione più incisivo.
+//  L'attuale PID non tiene conto del verso di correzione, mentre nel moto attuale mi aspetto maggiori difficoltà a frenare che ad 
+//  accelerare.
+//  PQM introduco un controllo (in retroazione di proporzionalità all'errore) che possa diversificarsi tra Accelerazione e FRENO.
+//  i.e. deve essere più incisivo quando frena, meno quando accelera.
+//
+//  15/4:   Retroazione Avanzata e correzione dinamica dell'errore.
+//
+//  In base all'errore calcolato sulla velocità, opero una retroazione semplice per far tornare il sistema in stabilità.
+//  Ad ogni "chiamata" del motion correggo l'uscita nel verso suggerito dall'errore di un fattore ad esso proporzionale.
+//  Ad oggi è il risultato migliore.
+//
+//  Committo
+//  Forco
+//  Pubblico la 0030
 //
 
 #include "QEI.h"
@@ -29,6 +49,7 @@
 
 #include "Timers.h"
 #include "Eeprom.h"
+#include "math.h"
 
 #define MAX_CHAR_PER_LINE   28
 #define TEXT_ROW_SPACING    16
@@ -43,58 +64,30 @@
 
 int64_t ci64_TargetPOS =    3096;           //  Used also Outside
 
-#include "PID.h"
-
-/*
-#define Lx 0.0001
-#define Ku 0.32200//0.922000
-#define Pu 0.0125
-#define Kp Ku*0.6
-#define Ti Pu*0.5
-#define Td Pu*0.125
-//
-#define P Kp
-#define I Kp/Ti
-#define D Kp*Td
-#define Mstate 6
-#define SorT 5
-#define Databit 0
-#define TIME 0.0125
-*/
-
-//                              Kc,     Ti,         Td,         interval
-//PID PID_VelocityClosedLoop_FW   (0.4,   0.0, /*1.0E-32,*/    1.0E-9,     cf_MOTPeriod_s);
-//PID PID_VelocityClosedLoop_BW   (0.41,  0.0, /*1.0E-32,*/    1.0E-9,     cf_MOTPeriod_s);
-//PID PID_VelocityClosedLoop_FW   (0.55,  0.0, /*1.0E-32,*/    1.0E-9,     cf_MOTPeriod_s);
-//PID PID_VelocityClosedLoop_BW   (0.55,  0.0, /*1.0E-32,*/    1.0E-2,     cf_MOTPeriod_s);
-PID PID_VelocityClosedLoop_FW   (0.55,  0.0,    0.0,     cf_MOTPeriod_s);
-PID PID_VelocityClosedLoop_BW   (0.55,  0.0,     0.0,     cf_MOTPeriod_s);
-
 // LA:  LCM_ShowTactics
 //      ===============
 //
+/*
 void    LCM_ShowTactics(
-                            int64_t i64_Pulses,
-                            int32_t i32_ATVSpeed,
-                            //
-                            float   f_ai0000_Aux,
-                            float   f_ai0001_Aux,
-                            float   f_ai0002_Aux,
-                            float   f_ai0003_Aux,
-                            float   f_ai0004_Aux,
-                            float   f_ai0005_Aux,
-                            //
-                            int32_t i32_Velocity,
-                            int32_t i32_Acceleration,
-                            int32_t i32_Jerk
-
+                        int64_t i64_Pulses,
+                        float   f_ATVSpeed,
+                        float   f_ai0000_Aux,
+                        float   f_ai0001_Aux,
+                        float   f_ai0002_Aux,
+                        float   f_ai0003_Aux,
+                        float   f_ai0004_Aux,
+                        float   f_ai0005_Aux,
+                        int32_t i32_Velocity,
+                        int32_t i32_Acceleration,
+                        int32_t i32_Jerk
                         );
+*/
 
 // LA:  SampleAndStore
 // LA:  SampleTimer ==
 //      ==============
 //
-static  void    SampleAndStore  (void);
+//static  void    SampleAndStore  (void);
 Ticker  SampleTimer;                    // LA:  To Sample 1AI any 'x'ms
 
 float   af_PlotSamples[240];            // LA:  "Horiz" Plot Array
@@ -115,12 +108,18 @@
 // LA:  MotionTimer =
 //      =============
 //
-static  void    MotionHandler   (void);
+//static  void    MotionHandler   (void);
 Ticker  MotionTimer;                    // LA:  Gestisce il rilevamento (RT) di Velocità, Accelerazione e Jerk
                                         //      Esegue il Movimento Programmato
 
-float   f_PWMPercent;                   //      Deprecated
-float   fPID_Error;                     //
+float   f_PWMPercent;                   //
+float   F_VelocityLoopFB_FW;            // LA:  Correzione Dinamica FW
+float   F_VelocityLoopFB_BW;            // LA:  Correzione Dinamica BW
+//float   fPID_Error;                     //
+
+float   fMOT_VelocityAct;               //  0.0= 0%, 1.0= 100%
+float   fMOT_VelocityReq;               //  0.0= 0%, 1.0= 100%
+float   fMOT_VelocityError;             //
 
 float   fVelocity;
 float   fAcceleration;
@@ -197,197 +196,28 @@
     HAL_NVIC_SystemReset( );
 }
 
-//  =======
-//  =======
-//  Main(s)
-//  =======
-//  =======
-//
-int main    (void){
-
-    rDIR_FWD =  true;   // LA:  Actuator Extends
-    rENA_Off =  true;   // LA:  Drive Power is Off
-    //
-    in_PosizionatoreSW.b_ServoLock =    false;
-    in_PosizionatoreSW.rtServoLock_Q =  false;
-
-    EepromInit();       // LA:  Inizializza la EEProm
-    TimersInit();       // LA:  Parte il Timer a 1ms
-
-    // LA:  FactoryReset se "userButton" premuto all'avvio
-    //
-    if  (userButton == 0) {
-        FactoryReset();
-    }
-    DisplayDriverInit();
-
-    SampleTimer.attach(&SampleAndStore, cf_SCOPeriod_s);    // LA:  Avvia l'OscilloScopio con TimeBase x [s]
-    MotionTimer.attach(&MotionHandler, cf_MOTPeriod_s);     // LA:  Avvia il Motion con TimeBase x [s]
-    PWM_PB3.period(cf_PWMPeriod_s);                         // LA:  Avvia il PWM con TimeBase x [s]
-    PWM_PB3.write((float) 0.0);                             //      Set to 0%
-
-    // LA:  Motion (1st) Setup
-    //
-    in_PosizionatoreSW.b_AxisPowered =  true;
-    in_PosizionatoreSW.b_ACPos_Homed =  true;
-    in_PosizionatoreSW.i32_Max_Speed =  20;        // [ui/ms]
-    in_PosizionatoreSW.i32_ZeroSpeed =  0;          //
-
-    //  POS Mode
-    //  ========
-    //
-//    in_PosizionatoreSW.b_ServoLock =    true;
-//    in_PosizionatoreSW.rtServoLock_Q =  false;
-    //
-    in_PosizionatoreSW.i64_TargetPosition = ci64_TargetPOS;                 // [ui]
-    in_PosizionatoreSW.i64_ActualPosition = Stabilus322699.getPulses();     //
-    in_PosizionatoreSW.i64_AccelerationWindow = 512;                        // LA:  Spazio concesso all'accelerazione.
-    in_PosizionatoreSW.i64_DecelerationWindow = 1024;                        //      Spazio concesso alla decelerazione, è prioritario rispetto all'accelerazione.
-    in_PosizionatoreSW.i64_diToleranceWindow =  16;                         //      Finestra di Tolleranza
-    //
-    in_PosizionatoreSW.f_MaximumSpeed_x100_FW = 100.0f;                      // % of "i32_Max_Speed"
-    in_PosizionatoreSW.f_MaximumSpeed_x100_BW = 100.0f;                      //
-    in_PosizionatoreSW.f_ServoLockSpeed_x100_FW =   25.0f;                   //      Riferimento di velocità minima a cui (appena) si muove l'asse [verso FW]
-//    in_PosizionatoreSW.f_ServoLockSpeed_x100_BW =   50.0f;                   //      Riferimento di velocità minima a cui (appena) si muove l'asse [verso BW]
-    in_PosizionatoreSW.f_ServoLockSpeed_x100_BW =   48.0f;                   //      Riferimento di velocità minima a cui (appena) si muove l'asse [verso BW]
-
-    //  JOG Mode
-    //  ========
-    //
-    in_PosizionatoreSW.b_JogMode =  false;
-    in_PosizionatoreSW.b_JogFW =    false;
-    in_PosizionatoreSW.b_JogBW =    false;
-    in_PosizionatoreSW.i32_JogAccel_ms =    500;    // [ms]
-    in_PosizionatoreSW.i32_JogDecel_ms =    250;    //
-    //
-    in_PosizionatoreSW.f_JogSpeed_x100_FW = (in_PosizionatoreSW.f_MaximumSpeed_x100_FW/ 2);     // LA:  JOG's the Half of Max POS's Speed
-    in_PosizionatoreSW.f_JogSpeed_x100_BW = (in_PosizionatoreSW.f_MaximumSpeed_x100_BW/ 2);     //
-
-    //  Velocity Loop PID
-    //  =================
-    //
-    //  Input Speed (ref)=  0.. 512[ui/s]
-    PID_VelocityClosedLoop_FW.setInputLimits(0.0f, (float)in_PosizionatoreSW.i32_Max_Speed);
-    PID_VelocityClosedLoop_BW.setInputLimits(0.0f, (float)in_PosizionatoreSW.i32_Max_Speed);
-    //  Output PWM  (ref)=  0.. 1
-    PID_VelocityClosedLoop_FW.setOutputLimits(0.0f, 1.0f);
-    PID_VelocityClosedLoop_BW.setOutputLimits(0.0f, 1.0f);
-
-    //  If there's a bias.
-//    PID_VelocityClosedLoop.setBias(0.3);
-//    PID_VelocityClosedLoop.setMode(AUTO_MODE);
-    PID_VelocityClosedLoop_FW.setMode(MANUAL_MODE);
-    PID_VelocityClosedLoop_BW.setMode(MANUAL_MODE);
-
-    // LA:  Color RGB Component(s)
-    //      ======================
-    //
-    //  RED     0000 1000 0000 0000     min     0x0800  02048
-    //          1111 1000 0000 0000     max     0xf800  63488
-    //
-    //  GREEN   0000 0000 0010 0000     min     0x0020  00032
-    //          0000 0111 1110 0000     max     0x07e0  02016
-    //
-    //  BLUE    0000 0000 0000 0001     min     0x0001  00001
-    //          0000 0000 0001 1111     max     0x001f  00031
-    //
-    //  La componente ROSSA ha  5 bit di escursione (0.. 31),
-    //  La componente VERDE ha  6 bit di escursione (0.. 63),
-    //  La componente BLU ha    5 bit di escursione (0.. 31),
-    //
-    //  Le componenti RGB di "Color" sono quindi scritte negli appropriati registri come segue:
-    //
-    //  writeReg(RED,   (Color & 0xf800) >> 11);
-    //  writeReg(GREEN, (Color & 0x07e0) >> 5);
-    //  writeReg(BLUE,  (Color & 0x001f));
-    //
-    LCM_SetTextColor(Scale2RGBColor  (0, 0, 0), Scale2RGBColor  (31, 0, 0));    // LA:  Red on Black
-    LCM_ClearScreen (Scale2RGBColor  (0, 0, 0));                                //      Black Background
-    LCM_DrawString  (0, 0+ (TEXT_ROW_SPACING* 0), "You Start Me Up ...");       //      Intro Text
-
-//    rDIR_FWD =  false;      // Collapse
-//    rENA_Off =  false;      // Power On
-
-    in_PosizionatoreSW.b_ServoLock =    true;
-    in_PosizionatoreSW.rtServoLock_Q =  true;
-
-    while   (1) {
-
-        // LA:  Scope, Theory of operation.
-        //      ===========================
-        //
-        //  1)  Sample a Value @ any Step
-        //  2)  Store @ the correct ms
-        //  3)  Plot the current Section of the Sampling Vector
-        //
-        LCM_ShowTactics (
-                        Stabilus322699.getPulses(),         // Row  1
-
-                        out_PosizionatoreSW.i32_ATVSpeed,   //      3
-                        adc_temp.read(),                    //      4
-                        adc_vbat.read(),                    //      5
-                        adc_vref.read(),                    //      6
-
-                        ADC12_IN9.read(),                   //      8
-                        ADC12_IN15.read(),                  //      9
-                        (f_PWMPercent* 100),                //      10
-
-                        i32_Velocity,                       //      11
-                        i32_Acceleration,                   //      12
-                        i32_Jerk                            //      13
-
-                        );
-
-        LCM_PlotScope  (
-                        Scale2RGBColor  (0, 0, 0),          //  Back:   Black
-                        Scale2RGBColor  (31, 0, 0)          //  Fore:   Red
-                        );
-
-        LCM_PlotSpeed  (
-                        Scale2RGBColor  (0, 0, 0),          //  Back:   Black
-                        Scale2RGBColor  (31, 0, 0)          //  Fore:   Red
-                        );
-
-        if  (out_PosizionatoreSW.b_InPosition)
-            if  (in_PosizionatoreSW.i64_TargetPosition > 0)
-                in_PosizionatoreSW.i64_TargetPosition = 0;
-            else
-                in_PosizionatoreSW.i64_TargetPosition = ci64_TargetPOS;
-    }
-}
-
 void    LCM_ShowTactics(
                         int64_t i64_Pulses,
-                        int32_t i32_ATVSpeed,
-                        //
+                        float   f_ATVSpeed,
                         float   f_ai0000_Aux,
                         float   f_ai0001_Aux,
                         float   f_ai0002_Aux,
                         float   f_ai0003_Aux,
                         float   f_ai0004_Aux,
                         float   f_ai0005_Aux,
-                        //
                         int32_t i32_Velocity,
                         int32_t i32_Acceleration,
                         int32_t i32_Jerk
                         ) {
 
 char    StringText[MAX_CHAR_PER_LINE+ 1];  // don't forget the /0 (end of string)
-
 static int64_t  i64_Pulses_Prec;
-static uint32_t ms_0002_prec;
-
-static float    f_ai0000_prec;
-static float    f_ai0001_prec;
-static float    f_ai0002_prec;
-static float    f_ai0003_prec;
-static float    f_ai0004_prec;
 static float    f_ai0005_prec;
 static float    f_ai0006_prec;
-
+//static float    f_ai0007_prec;
+static float    f_ai0008_prec;
 static uint32_t i32_Velocity_prec;
-static uint32_t i32_Acceleration_prec;
-static uint32_t i32_Jerk_prec;
+static float    f_ATVSpeed_prec;
 
     if  (i64_Pulses !=  i64_Pulses_Prec) {
         sprintf (StringText,
@@ -398,44 +228,41 @@
 
     if  (i32_Velocity != i32_Velocity_prec) {
         sprintf (StringText,
-                "Velocity[ui/ms]: %d ", i32_Velocity);                   //, fVelocity);
-        LCM_DrawString  (0, 0+ (TEXT_ROW_SPACING* 3), StringText);
+                "Velocity[ui/ms]: %d    ", i32_Velocity);
+        LCM_DrawString  (0, 0+ (TEXT_ROW_SPACING* 2), StringText);
         i32_Velocity_prec = i32_Velocity;
     }
 
-    if  (out_PosizionatoreSW.i32_ATVSpeed != i32_Acceleration_prec) {
+    if  (fMOT_VelocityAct != f_ATVSpeed_prec) {
         sprintf (StringText,
-                "ATVSpeed[ui/ms]: %d ", out_PosizionatoreSW.i32_ATVSpeed);               //, fAcceleration);
+                "VAct[0..1]: %f ",  fMOT_VelocityAct);
+        LCM_DrawString  (0, 0+ (TEXT_ROW_SPACING* 3), StringText);
+        f_ATVSpeed_prec = fMOT_VelocityAct;
+    }
+    if  (fMOT_VelocityReq != f_ai0008_prec) {
+        sprintf (StringText,
+                "VReq[0..1]: %f ",  fMOT_VelocityReq);
         LCM_DrawString  (0, 0+ (TEXT_ROW_SPACING* 4), StringText);
-        i32_Acceleration_prec = out_PosizionatoreSW.i32_ATVSpeed;
+        f_ai0008_prec = fMOT_VelocityReq;
     }
     if  (f_PWMPercent != f_ai0005_prec) {
         sprintf (StringText,
-                "PID_FB Compute:  %f ", f_PWMPercent);                       //, fJerk);
+                "PWM [0..1]: %f ",  f_PWMPercent);
         LCM_DrawString  (0, 0+ (TEXT_ROW_SPACING* 5), StringText);
         f_ai0005_prec = f_PWMPercent;
     }
-    if  (fPID_Error != f_ai0006_prec) {
-        sprintf (StringText,
-                "PID_FB Error:    %f ", fPID_Error);                       //, fJerk);
-        LCM_DrawString  (0, 0+ (TEXT_ROW_SPACING* 6), StringText);
-        f_ai0006_prec = fPID_Error;
-    }
-
-/*
-    if  (i32_Acceleration != i32_Acceleration_prec) {
+    if  (fMOT_VelocityError != f_ai0006_prec) {
         sprintf (StringText,
-                "Acc[ui/10ms^2]: %d ", i32_Acceleration);               //, fAcceleration);
-//        LCM_DrawString  (0, 0+ (TEXT_ROW_SPACING* 12), StringText);
-        LCM_DrawString  (0, 0+ (TEXT_ROW_SPACING* 4), StringText);
-        i32_Acceleration_prec = i32_Acceleration;
+                "Err [0..1): %f ",  fMOT_VelocityError);
+        LCM_DrawString  (0, 0+ (TEXT_ROW_SPACING* 6), StringText);
+        f_ai0006_prec = fMOT_VelocityError;
     }
-    if  (i32_Jerk != i32_Jerk_prec) {
+/*
+    if  (F_VelocityLoopFB != f_ai0007_prec) {
         sprintf (StringText,
-                "Jerk:           %d ", i32_Jerk);                       //, fJerk);
-//        LCM_DrawString  (0, 0+ (TEXT_ROW_SPACING* 13), StringText);
-        LCM_DrawString  (0, 0+ (TEXT_ROW_SPACING* 5), StringText);
-        i32_Jerk_prec = i32_Jerk;
+                "Corr[0..1]: %f ",  F_VelocityLoopFB);                       //, fJerk);
+        LCM_DrawString  (0, 0+ (TEXT_ROW_SPACING* 7), StringText);
+        f_ai0007_prec = F_VelocityLoopFB;
     }
 */
 }
@@ -460,7 +287,6 @@
 }
 
 static void MotionHandler   (void) {
-//static int16_t  i16_Index = 0;
 static uint32_t ui32_PreviousStep_ms;
 uint32_t    ui32_ActualStepSampled_ms;
 uint32_t    ui32_PassedActual_ms;
@@ -528,36 +354,218 @@
     i32_Jerk =  (i32_Acceleration- i32_Acceleration_Prec);                                  // LA:  Jerk
     i32_Acceleration_Prec = i32_Acceleration;
 
-    fVelocity = (float) i32_Velocity * fPassedActual_sxs;           //  Velocity in [ui/s]
-    fAcceleration = (float) i32_Acceleration * fPassedActual_sxs;   //  Acceleration in [ui/s^2]
-    fJerk = (float) i32_Jerk * fPassedActual_sxs;                   //  Jerk
+    fVelocity = (float)i32_Velocity * fPassedActual_sxs;            //  Velocity in [ui/s]
+    fAcceleration = (float)i32_Acceleration * fPassedActual_sxs;    //  Acceleration in [ui/s^2]
+    fJerk = (float)i32_Jerk * fPassedActual_sxs;                    //  Jerk
+
+    // LA:  Elaborazione dell'Uscita di Controllo della velocità
+    //      ====================================================
+    //
+    //  Verifica della velocità raggiunta.
+    //  Calcolo dell'ERRORE.
+    //  Elaborazione e applicazione della correzione.
+    //
 
-    // LA:  PID Compute Section
-    //      ===================
+    // LA:  i32_Velocity,                       Velocità Attuale    (Reale, rilevata)
+    // LA:  out_PosizionatoreSW.i32_ATVSpeed,   Velocità Richiesta  (Elaborata in base al profilo)
+    //
+    //  Si suppone che la velocità massima sia raggiungibile al massimo valore di f_PWMPercent  (-> 1.0)
+    //  Si suppone che la velocità minima sia raggiungibile al minimo valore di f_PWMPercent    (-> 0.0)
     //
+
+    // LA:  Calcolo dell'Errore scalato 0..1
+    //
+    fMOT_VelocityAct = ((float)abs(i32_Velocity)/ in_PosizionatoreSW.f_Max_Speed);          //  0.0= 0%, 1.0= 100%
+    fMOT_VelocityReq = (out_PosizionatoreSW.f_ATVSpeed/ in_PosizionatoreSW.f_Max_Speed);    //  0.0= 0%, 1.0= 100%
+    fMOT_VelocityError =    fMOT_VelocityReq- fMOT_VelocityAct;                             //
+
+//    f_PWMPercent =  out_PosizionatoreSW.f_ATVSpeed/ in_PosizionatoreSW.f_Max_Speed;         // LA:  In Range (float) 0.. 1
     if  (out_PosizionatoreSW.b_ATVDirectionFW) {
-        PID_VelocityClosedLoop_BW.reset();
+        F_VelocityLoopFB_BW = 0.0f;
+
+        f_PWMPercent =  (out_PosizionatoreSW.f_ATVSpeed/ in_PosizionatoreSW.f_Max_Speed)/ 4.0f;     // FW is about 4:1 BW
+        f_PWMPercent += (fMOT_VelocityError* 0.1f);
 
-        //  Update the process variable.
-        PID_VelocityClosedLoop_FW.setProcessValue((float)i32_Velocity);
-        //  Set Desired Value
-        PID_VelocityClosedLoop_FW.setSetPoint((float)out_PosizionatoreSW.i32_ATVSpeed);
-        //  Release a new output.
-
-        fPID_Error = PID_VelocityClosedLoop_FW.getError();
-        f_PWMPercent =  PID_VelocityClosedLoop_FW.compute();
+        /*
+        if  (fMOT_VelocityError > 0.001f)
+            F_VelocityLoopFB_FW +=  0.0002f;
+        if  (fMOT_VelocityError < -0.001f)
+            F_VelocityLoopFB_FW -=  0.0002f;
+        */
+        F_VelocityLoopFB_FW +=  (0.004f* fMOT_VelocityError);
+        f_PWMPercent += F_VelocityLoopFB_FW;
     }
     else {
-        PID_VelocityClosedLoop_FW.reset();
+        F_VelocityLoopFB_FW = 0.0f;
+
+        f_PWMPercent =  (out_PosizionatoreSW.f_ATVSpeed/ in_PosizionatoreSW.f_Max_Speed)/ 1.4f;
+        f_PWMPercent += (fMOT_VelocityError* 0.1f);
+
+        /*
+        if  (fMOT_VelocityError > 0.001f)
+            F_VelocityLoopFB_BW +=  0.0005f;
+        if  (fMOT_VelocityError < -0.001f)
+            F_VelocityLoopFB_BW -=  0.0005f;
+        */
+        F_VelocityLoopFB_BW +=  (0.01f* fMOT_VelocityError);
+        f_PWMPercent += F_VelocityLoopFB_BW;
+    }
+    if  (f_PWMPercent > 1.0f)
+        f_PWMPercent = 1.0f;
+    if  (f_PWMPercent < 0.0f)
+        f_PWMPercent = 0.0f;
+    PWM_PB3.write((float) 1.0- f_PWMPercent);                                           //      Set to x%
+}
+
+//  =======
+//  =======
+//  Main(s)
+//  =======
+//  =======
+//
+int main    (void){
+    rDIR_FWD =  true;   // LA:  Actuator Extends
+    rENA_Off =  true;   // LA:  Drive Power is Off
+    //
+    in_PosizionatoreSW.b_ServoLock =    false;
+    in_PosizionatoreSW.rtServoLock_Q =  false;
+
+    EepromInit();       // LA:  Inizializza la EEProm
+    TimersInit();       // LA:  Parte il Timer a 1ms
+
+    // LA:  FactoryReset se "userButton" premuto all'avvio
+    //
+    if  (userButton == 0) {
+        FactoryReset();
+    }
+    DisplayDriverInit();
+
+    SampleTimer.attach(&SampleAndStore, cf_SCOPeriod_s);    // LA:  Avvia l'OscilloScopio con TimeBase x [s]
+    MotionTimer.attach(&MotionHandler, cf_MOTPeriod_s);     // LA:  Avvia il Motion con TimeBase x [s]
+    PWM_PB3.period(cf_PWMPeriod_s);                         // LA:  Avvia il PWM con TimeBase x [s]
+    PWM_PB3.write(0.0f);                                    //      Set to 0%
+
+//  LA: Ok
+
+    // LA:  Motion (1st) Setup
+    //
+    in_PosizionatoreSW.b_AxisPowered =  true;
+    in_PosizionatoreSW.b_ACPos_Homed =  true;
+    in_PosizionatoreSW.f_Max_Speed =  20.0f;                // [ui/ms]
+    in_PosizionatoreSW.f_ZeroSpeed =  0.0f;                 //
+    
+    //  POS Mode
+    //  ========
+    //
+//    in_PosizionatoreSW.b_ServoLock =    true;
+//    in_PosizionatoreSW.rtServoLock_Q =  false;
+    //
+    in_PosizionatoreSW.i64_TargetPosition = ci64_TargetPOS;                 // [ui]
+    in_PosizionatoreSW.i64_ActualPosition = Stabilus322699.getPulses();     //
+    in_PosizionatoreSW.i64_AccelerationWindow = 64;                       // LA:  Spazio concesso alla rampa di Accelerazione
+    in_PosizionatoreSW.i64_DecelerationWindow = 1024;                       //      Spazio concesso alla rampa di Decelerazione
+    in_PosizionatoreSW.i64_diToleranceWindow =  16;                          //      Finestra di Tolleranza
+    //
+    in_PosizionatoreSW.f_MaximumSpeed_x100_FW = 100.0f;                // % of "i32_Max_Speed"
+    in_PosizionatoreSW.f_MaximumSpeed_x100_BW = 100.0f;                  //
+//    in_PosizionatoreSW.f_ServoLockSpeed_x100_FW =   16.0f;                   //      Riferimento di velocità minima a cui (appena) si muove l'asse [verso FW]
+//    in_PosizionatoreSW.f_ServoLockSpeed_x100_BW =   24.0f;                   //      Riferimento di velocità minima a cui (appena) si muove l'asse [verso BW]
+    in_PosizionatoreSW.f_ServoLockSpeed_x100_FW =   24.0f;                   //      Riferimento di velocità minima a cui (appena) si muove l'asse [verso FW]
+    in_PosizionatoreSW.f_ServoLockSpeed_x100_BW =   24.0f;                   //      Riferimento di velocità minima a cui (appena) si muove l'asse [verso BW]
+
+//  LA: Ok
 
-        //  Update the process variable.
-        PID_VelocityClosedLoop_BW.setProcessValue((float)i32_Velocity);
-        //  Set Desired Value
-        PID_VelocityClosedLoop_BW.setSetPoint((float)out_PosizionatoreSW.i32_ATVSpeed);
-        //  Release a new output.
+    //  JOG Mode
+    //  ========
+    //
+    in_PosizionatoreSW.b_JogMode =  false;
+    in_PosizionatoreSW.b_JogFW =    false;
+    in_PosizionatoreSW.b_JogBW =    false;
+    in_PosizionatoreSW.i32_JogAccel_ms =    500;    // [ms]
+    in_PosizionatoreSW.i32_JogDecel_ms =    250;    //
+    //
+    in_PosizionatoreSW.f_JogSpeed_x100_FW = (in_PosizionatoreSW.f_MaximumSpeed_x100_FW/ 2);     // LA:  JOG's the Half of Max POS's Speed
+    in_PosizionatoreSW.f_JogSpeed_x100_BW = (in_PosizionatoreSW.f_MaximumSpeed_x100_BW/ 2);     //
+
+//  LA: Ok
+
+    // LA:  Color RGB Component(s)
+    //      ======================
+    //
+    //  RED     0000 1000 0000 0000     min     0x0800  02048
+    //          1111 1000 0000 0000     max     0xf800  63488
+    //
+    //  GREEN   0000 0000 0010 0000     min     0x0020  00032
+    //          0000 0111 1110 0000     max     0x07e0  02016
+    //
+    //  BLUE    0000 0000 0000 0001     min     0x0001  00001
+    //          0000 0000 0001 1111     max     0x001f  00031
+    //
+    //  La componente ROSSA ha  5 bit di escursione (0.. 31),
+    //  La componente VERDE ha  6 bit di escursione (0.. 63),
+    //  La componente BLU ha    5 bit di escursione (0.. 31),
+    //
+    //  Le componenti RGB di "Color" sono quindi scritte negli appropriati registri come segue:
+    //
+    //  writeReg(RED,   (Color & 0xf800) >> 11);
+    //  writeReg(GREEN, (Color & 0x07e0) >> 5);
+    //  writeReg(BLUE,  (Color & 0x001f));
+    //
+    LCM_SetTextColor(Scale2RGBColor  (0, 0, 0), Scale2RGBColor  (31, 0, 0));    // LA:  Red on Black
+    LCM_ClearScreen (Scale2RGBColor  (0, 0, 0));                                //      Black Background
+    LCM_DrawString  (0, 0+ (TEXT_ROW_SPACING* 0), "You Start Me Up ...");       //      Intro Text
+
+//    rDIR_FWD =  false;      // Collapse
+//    rENA_Off =  false;      // Power On
+
+    in_PosizionatoreSW.b_ServoLock =    true;
+    in_PosizionatoreSW.rtServoLock_Q =  true;
 
-        fPID_Error = PID_VelocityClosedLoop_BW.getError();
-        f_PWMPercent =  PID_VelocityClosedLoop_BW.compute();
+//  LA: Ok
+
+    while   (1) {
+
+//  LA: Ok
+
+        // LA:  Scope, Theory of operation.
+        //      ===========================
+        //
+        //  1)  Sample a Value @ any Step
+        //  2)  Store @ the correct ms
+        //  3)  Plot the current Section of the Sampling Vector
+        //
+        LCM_ShowTactics (
+                        Stabilus322699.getPulses(),         // Row  1
+
+                        out_PosizionatoreSW.f_ATVSpeed,     //      3
+                        adc_temp.read(),                    //      4
+                        adc_vbat.read(),                    //      5
+                        adc_vref.read(),                    //      6
+
+                        ADC12_IN9.read(),                   //      8
+                        ADC12_IN15.read(),                  //      9
+                        (f_PWMPercent* 100),                //      10
+
+                        i32_Velocity,                       //      11
+                        i32_Acceleration,                   //      12
+                        i32_Jerk                            //      13
+
+                        );
+
+        LCM_PlotScope  (
+                        Scale2RGBColor  (0, 0, 0),          //  Back:   Black
+                        Scale2RGBColor  (31, 0, 0)          //  Fore:   Red
+                        );
+
+        LCM_PlotSpeed  (
+                        Scale2RGBColor  (0, 0, 0),          //  Back:   Black
+                        Scale2RGBColor  (31, 0, 0)          //  Fore:   Red
+                        );
+
+        if  (out_PosizionatoreSW.b_InPosition)
+            if  (in_PosizionatoreSW.i64_TargetPosition > 0)
+                in_PosizionatoreSW.i64_TargetPosition = 0;
+            else
+                in_PosizionatoreSW.i64_TargetPosition = ci64_TargetPOS;
     }
-    PWM_PB3.write((float) 1.0- f_PWMPercent);                                                               //      Set to x%
-}
+}
\ No newline at end of file