My Version of the Crealab MotorLib.

Fork of MotorLib by CreaLab

Files at this revision

API Documentation at this revision

Comitter:
sepp_nepp
Date:
Wed Apr 17 21:48:14 2019 +0000
Parent:
22:d2c742bdae16
Child:
24:932ea7bdc850
Commit message:
Refactor

Changed in this revision

motor.cpp Show annotated file Show diff for this revision Revisions of this file
motor.h Show annotated file Show diff for this revision Revisions of this file
--- a/motor.cpp	Thu Jan 03 23:15:42 2019 +0000
+++ b/motor.cpp	Wed Apr 17 21:48:14 2019 +0000
@@ -1,40 +1,32 @@
 #include "motor.h"
 
 
- // -------------------- MotStatus Helper ---------------------------
+  // -------------------- CreaMot Class ---------------------------
 
-void MotStatus::set(motCmands aCmd, bool AClockWise, int32_t  aNSteps) {
-    cmd = aCmd;
-    AClockWise = AClockWise;
-    NSteps  = aNSteps;
-};
-
- // -------------------- Motor Class ---------------------------
-
-Motor::Motor(PinName _MPh[4]) {
+CreaMot::CreaMot(PinName _MPh[4]) {
     initialization( _MPh , MOTOR_STEP_TIME_DEFAULT_US);
 }
 
-Motor::Motor(PinName _MPh0, PinName _MPh1, PinName _MPh2, PinName _MPh3) {
+CreaMot::CreaMot(PinName _MPh0, PinName _MPh1, PinName _MPh2, PinName _MPh3) {
     PinName _MPh[4] = {_MPh0, _MPh1, _MPh2, _MPh3};
     initialization( _MPh , MOTOR_STEP_TIME_DEFAULT_US);
 }
 
-Motor::Motor(PinName _MPh0, PinName _MPh1, PinName _MPh2, PinName _MPh3, uint32_t AStepTime_us) {
+CreaMot::CreaMot(PinName _MPh0, PinName _MPh1, PinName _MPh2, PinName _MPh3, uint32_t AStepTime_us) {
     PinName _MPh[4] = {_MPh0, _MPh1, _MPh2, _MPh3};
     initialization( _MPh, AStepTime_us);
 }
 
-void Motor::initialization(PinName _MPh[4], uint32_t AStepTime_us) {
+void CreaMot::initialization(PinName _MPh[4], uint32_t AStepTime_us) {
 
     for (int ph=0; ph<4; ph++) { MPh[ph] = new DigitalOut(_MPh[ph]); } 
     
     MotorOFF();    // Default state is all phases are OFF
     StepPhase = 0; // initial phase is Zero
     
-    Status.set(MOTOR_nop, CLOCKWISE, 0);// Default command is NOP, clockwise direction, 0 steps
+    setStatus(MOTOR_nop, CLOCKWISE, 0);// Default command is NOP, clockwise direction, 0 steps
     
-    Status.TickIsAttached = false;
+    TickIsAttached = false;
     StepTime_us = AStepTime_us;// duration in micro second for one step
 
     Steps_FullTurn = MOTOR_STEPS_FOR_A_TURN;  // Default Calibration value
@@ -51,26 +43,24 @@
 // *****************************************************************
 //   all following functions are based on centimeter information
 // *****************************************************************
-#define PI 3.141592f    /** PI needed to calcuate from angle to distances */
-#define PI_OVER_180 (PI/180.0f)  /** needed to translate from angle to circumference */
 
-/* High Level: Run Motor for a given number of centimeters, centimeters<0 are run in opposite direction. */
-void Motor::RunCentimeters  (bool AClockWise, float centimeters);
-{  RunDegrees(AClockWise, centimeters * degree_per_cm; ) }
+/* High Level: Run CreaMot for a given number of Dist_cm, Dist_cm<0 are run in opposite direction. */
+void CreaMot::RunDist_cm  (bool AClockWise, float Dist_cm);
+{  RunDegrees(AClockWise, Dist_cm * degree_per_cm; ) }
 
-/* High Level: Run Motor for a given number of centimeters in default direction. */
-void Motor::RunCentimeters  (float centimeters);
-{  RunDegrees(defaultDirection, centimeters * degree_per_cm; ) }
+/* High Level: Run CreaMot for a given number of Dist_cm in default direction. */
+void CreaMot::RunDist_cm  (float Dist_cm);
+{  RunDegrees(defaultDirection, Dist_cm * degree_per_cm; ) }
 
 /** Additional geometric information: set the wheel diameter, also sets perimeter and degrees per cm.*/
-void Motor:setDiamCM( float Adiam_cm) /**< Helper; set diameter and perim to values  */
+void CreaMot:setDiamCM( float Adiam_cm) /**< Helper; set diameter and perim to values  */
 {   diam_cm = Adiam_cm;
     perim_cm = PI*diam_cm;
     degree_per_cm=360.0f/perim_cm;
 } 
 
 /** Helper: calculate the needed wheel angle from a turn angle and a turn_radius_cm  */
-float Motor:calcAngle(float turn_angle_deg, float turn_radius_cm) 
+float CreaMot:RunTurnAngle(float turn_angle_deg, float turn_radius_cm) 
 {   // a turn radius smaller than 0 make no sense
     if( turn_radius_cm>= 0 ) 
         rotate_angle_deg = turn_angle_deg * PI_OVER_180 * turn_radius_cm * degree_per_cm;
@@ -78,7 +68,7 @@
     return rotate_angle_deg;
 } 
 
-void Motor::setSpeed_cm_sec(float speed_cm_sec)
+void CreaMot::setSpeed_cm_sec(float speed_cm_sec)
 {   if (speed_cm_sec < MIN_SPEED_CM_SEC) // catch too small or negative speeds
           setRotationPeriodSec( perim_cm / MIN_SPEED_CM_SEC); 
     else  setRotationPeriodSec( perim_cm / speed_cm_sec );
@@ -88,107 +78,120 @@
 //  all following functions are agnostic of centimeter-information
 // *****************************************************************
 
-void Motor::RunInfinite(bool AClockWise) {
-    Status.set(MOTOR_run, AClockWise, -1);
+void CreaMot::RunInfinite(bool AClockWise) {
+    setStatus(MOTOR_run, AClockWise, -1);
     StartTick();
 }
 
-/* High Level: Run Motor for a given angle, angles<0 are run in opposite direction. */
-void Motor::RunDegrees(bool AClockWise, float angle_deg) {
+/* High Level: Run CreaMot for a given angle, angles<0 are run in opposite direction. */
+void CreaMot::RunDegrees(bool AClockWise, float angle_deg) {
  RunSteps( AClockWise, (int32_t)(angle_deg * (float)Steps_FullTurn / 360.0f) );   
 }
 
-/* High Level: Run Motor for a given number of steps, steps<0 are run in opposite direction. */
-void Motor::RunSteps(bool AClockWise, int32_t steps) {
+/* High Level: Run CreaMot for a given angle in default direction, angles<0 are run in opposite direction. */
+void CreaMot::RunDegrees(float angle_deg) {
+ RunSteps( defaultDirection, (int32_t)(angle_deg * (float)Steps_FullTurn / 360.0f) );   
+}
+
+/* High Level: Run CreaMot for a given number of steps, steps<0 are run in opposite direction. */
+void CreaMot::RunSteps(bool AClockWise, int32_t steps) {
     if (steps!=0) 
-        { Status.set(MOTOR_run, AClockWise ^^ (steps<0), abs(steps));
+        { setStatus(MOTOR_run, AClockWise ^^ (steps<0), abs(steps));
           StartTick(); }
 }
 
-void Motor::PauseRun() 
-{   if (Status.cmd==MOTOR_run) Status.cmd = MOTOR_pause;  }
+void CreaMot::PauseRun() 
+{   if (CurrCmd==MOTOR_run) CurrCmd = MOTOR_pause;  }
 
-void Motor::RestartRun() 
-{   if (Status.cmd==MOTOR_pause) Status.cmd = MOTOR_run;  }
+void CreaMot::RestartRun() 
+{   if (CurrCmd==MOTOR_pause) CurrCmd = MOTOR_run;  }
 
-void Motor::StopRun() 
-{   Status.cmd = MOTOR_stop;  } 
+void CreaMot::StopRun() 
+{   CurrCmd = MOTOR_stop;  } 
 
-MotStatus Motor::getStatus() { return Status; }
+MotStatus CreaMot::getStatus() { return Status; }
 
 /*******************************************************
  **   Ticker / Timing procedures
  *******************************************************/
 //Get, set the scaling
-uint32_t Motor::getStepsFullTurn()
+uint32_t CreaMot::getStepsFullTurn()
 {    return Steps_FullTurn;  }
 
-void Motor::setStepsFullTurn(uint32_t StepsFullTurn) 
+void CreaMot::setStepsFullTurn(uint32_t StepsFullTurn) 
 {   Steps_FullTurn = StepsFullTurn; }
 
-void Motor::setRotationPeriodSec(float Seconds_Per_Turn) {
+void CreaMot::setRotationPeriodSec(float Seconds_Per_Turn) {
     // rescale to usec and pass on to the next handler. 
     setStepTime_us( uint32_t(Seconds_Per_Turn / Steps_FullTurn * 1000000) ) ;
 }
-void Motor::setStepTime_us(uint32_t AStepTime_us) {
+void CreaMot::setStepTime_us(uint32_t AStepTime_us) {
     if(StepTime_us == AStepTime_us) return; // avoid futile activity
     if (StepTime_us < MOTOR_STEP_TIME_MIN_US) // filter too small values
        StepTime_us = MOTOR_STEP_TIME_MIN_US;
        else StepTime_us = AStepTime_us; // or if OK then assign value
     // if ticker already running recreate a new ticker;
-    if(Status.TickIsAttached) { StopTick(); StartTick(); }
+    if(TickIsAttached) { StopTick(); StartTick(); }
  }
 
-void Motor::StartTick() {
-    if(!Status.TickIsAttached)   {
-        // Connect Interrupt routine in which the Motor and all the state machine is performed
-        MotorSysTick.attach_us(callback(this, &Motor::ProcessMotorStateMachine), StepTime_us);
+void CreaMot::StartTick() {
+    if(!TickIsAttached)   {
+        // Connect Interrupt routine in which the CreaMot and all the state machine is performed
+        MotorSysTick.attach_us(callback(this, &CreaMot::ProcessMotorStateMachine), StepTime_us);
         // last=tuneTimings.read_us();
-        Status.TickIsAttached=true;
+        TickIsAttached=true;
         }
 }
 
-void Motor::ProcessMotorStateMachine()
+void CreaMot::ProcessMotorStateMachine()
 {
-    switch(Status.cmd) {
+    switch(CurrCmd) {
         case MOTOR_run: {
-            switch(Status.state) {
+            switch(CurrState) {
                 case Motor_OFF:
-                    MotorON(); // First only turn on the Motor ..
+                    MotorON(); // First only turn on the CreaMot ..
                     break;
                 case Motor_ZERO:
                 case Motor_ON:
-                        Status.state = Motor_RUN;
+                        CurrState = Motor_RUN;
                 case Motor_RUN:
-                    if (Status.NSteps==0)  // No more steps to go
-                        { Status.cmd = MOTOR_stop; 
+                    if (NStepsToDo==0)  // No more steps to go
+                        { CurrCmd = MOTOR_stop; 
                           if (_callback) _callback.call(); } 
                       else // More steps to go
                         { StepOnce(); 
-                        Status.NSteps--;}
+                        NStepsToDo--;}
                     break;
-                } // switch(Status.state)
+                } // switch(CurrState)
             } // case MOTOR_run
         case MOTOR_stop:
             StopTick();
-            Status.cmd = MOTOR_nop; 
+            CurrCmd = MOTOR_nop; 
             MotorOFF(); 
             break;       
         case MOTOR_nop:
         case MOTOR_pause:
         default: break;
-    } // switch(Status.cmd)
+    } // switch(CurrCmd)
 }
 
-void Motor::StopTick() {
-    if(Status.TickIsAttached)   
-      { MotorSysTick.detach(); Status.TickIsAttached=false; }
+void CreaMot::StopTick() {
+    if(TickIsAttached)   
+      { MotorSysTick.detach(); TickIsAttached=false; }
 }
 
 /*******************************************************
- **   all the low level direct Motor HW access
+ **   all the low level direct CreaMot HW access
  *******************************************************/
- void Motor::MotorTest()    // Just to check that it make a full turn back and forth
+ 
+void CreaMot::setStatus(motCmands aCmd, bool AClockWise, int32_t  aNSteps) {
+    cmd = aCmd;
+    AClockWise = AClockWise;
+    NSteps  = aNSteps;
+};
+
+
+ void CreaMot::MotorTest()    // Just to check that it make a full turn back and forth
 {
     int i;
     MotorON();
@@ -204,36 +207,36 @@
     MotorOFF();
 }
 
- /** Turn off all Motor Phases, no more current flowing */
-void Motor::MotorOFF() 
+ /** Turn off all CreaMot Phases, no more current flowing */
+void CreaMot::MotorOFF() 
 {   for (int ph=0; ph<4; ph++) *MPh[ph] = 0;  
-    Status.state=Motor_OFF;
+    CurrState=Motor_OFF;
 }
 
-/** Turn on the Motor Phase, In the last used phase, memorized in StepPhases 
+/** Turn on the CreaMot Phase, In the last used phase, memorized in StepPhases 
 *  Equivalent to what previously the function "void Start();" did */
-void Motor::MotorON()
+void CreaMot::MotorON()
 {   SetPhases(); // attention, does not change StepPhase!
-    if (StepPhase==0)  Status.state=Motor_ZERO;  
-        else Status.state=Motor_ON;
+    if (StepPhase==0)  CurrState=Motor_ZERO;  
+        else CurrState=Motor_ON;
 } 
 
-/** Motor phases turned on and put to Zero Position*/    
-void Motor::MotorZero() {
+/** CreaMot phases turned on and put to Zero Position*/    
+void CreaMot::MotorZero() {
     StepPhase = 0;  // sets the phases to 0
     SetPhases(); 
-    Status.state=Motor_ZERO;
+    CurrState=Motor_ZERO;
 }
 
-void    Motor::StepOnce()     // Move the Motor in the used 'direction'
+void    CreaMot::StepOnce()     // Move the CreaMot in the Status 'direction'
 {   if (Status.AClockWise) StepClkW(); else StepCCW();
 }
 
-void    Motor::StepClkW()    // Move the Motor one step Clockwise
+void    CreaMot::StepClkW()    // Move the CreaMot one step Clockwise
 {   if (StepPhase<7) StepPhase++;  else  StepPhase = 0;
     SetPhases();
 }
-void    Motor::StepCCW()    // Move the Motor one step Clockwise
+void    CreaMot::StepCCW()    // Move the CreaMot one step Clockwise
 {   if (StepPhase>0) StepPhase--;  else  StepPhase = 7;
     SetPhases();
 }
@@ -244,6 +247,6 @@
       {0, 0, 0, 1, 1, 1, 0, 0}, 
       {0, 0, 0, 0, 0, 1, 1, 1}};
       
-void    Motor::SetPhases()    // Engage Motor Phases according to StepPhase
+void    CreaMot::SetPhases()    // Engage CreaMot Phases according to StepPhase
 { for (int ph=0; ph<4; ph++) { *MPh[ph] = MotPh[ph][StepPhase]; }   }
 
--- a/motor.h	Thu Jan 03 23:15:42 2019 +0000
+++ b/motor.h	Wed Apr 17 21:48:14 2019 +0000
@@ -1,10 +1,12 @@
 /**
- * @file motor.h
- * \brief File contains Crealab Motor Library.
+ * @file CreaMot.h
+ * \brief File contains Crealab CreaMot Library.
  
- * motor.h contains the class Motor, and related enums and structs.
+ * CreaMot.h contains the class CreaMot, and related enums and structs.
  * Includes only "mbed.h".
- 
+ *
+ * MotStatus structure is dissolved into the CreaMot Class
+ *
  * Rotation directions are now consistently called Clockwise, and Counterclockwise (CCW), 
  * instead of mix them with Left and Right. 
  * Doxygens Tags are preceeded by either a backslash @\ or by an at symbol @@.
@@ -13,35 +15,38 @@
  * @date 01. Nov. 2018.
  * @see https://os.mbed.com/users/sepp_nepp/code/MotorLib/  */
  
- // -------------------- Motor ---------------------------
+ // -------------------- CreaMot ---------------------------
  
 #ifndef MOTOR_H
 #define MOTOR_H
 
 #include "mbed.h"
 
-#define MOTOR_STEP_TIME_MIN_US 700      /**< Shortest Time between two motor steps = 0.7ms, was MOTOR_STEP_TIME_MIN*/
-#define MOTOR_STEP_TIME_DEFAULT_US 5000 /**< Default Time between two motor steps = 5ms, was MOTOR_STEP_TIME_DEFAULT*/
-#define MOTOR_STEPS_FOR_A_TURN 4096     /**< Default number of motor steps to complete a turn = 4096 steps  */
+#define MOTOR_STEP_TIME_MIN_US 700      /**< Shortest Time between two CreaMot steps = 0.7ms, was MOTOR_STEP_TIME_MIN*/
+#define MOTOR_STEP_TIME_DEFAULT_US 5000 /**< Default Time between two CreaMot steps = 5ms, was MOTOR_STEP_TIME_DEFAULT*/
+#define MOTOR_STEPS_FOR_A_TURN 4096     /**< Default number of CreaMot steps to complete a turn = 4096 steps  */
 #define CLOCKWISE true                  /**< Constant for Clockwise direction */
 #define COUNTERCLOCKWISE false          /**< Constant for Counter-Clockwise direction */
-#define MIN_SPEED_CM_SEC 0.1f           /**< Constant for minimum speed in cm/sec */
+#define MAX_SPEED_CM_SEC 30.0f    /**< Clamp maximum advancement speed = 30cm/sec, was MAX_SPEED */
+#define MIN_SPEED_CM_SEC 0.001f   /**< Clamp minimum advancement speed = 10um/sec */
+#define PI 3.141592f    /** PI needed to calcuate from angle to distances */
+#define PI_OVER_180 (PI/180.0f)  /** needed to translate from angle to circumference */
 
 /** \enum motStates 
-* \brief Possible States of Motor state machine
+* \brief Possible States of CreaMot state machine
 * 
 * Motor_CALIB is deprecated, was removed from the enum structure */
 typedef enum {
     Motor_OFF = 0,  /**< All phase currents is off, replaces Motor_STOP. */  
-    Motor_ZERO,     /**< Motor at phase position 0 and ON, only reached by call of Zero() procedure. */  
-    Motor_ON,       /**< Phases are engaged, but Motor state machine stopped, replaces Motor_PAUSE. */  
-    Motor_RUN       /**< Phases are engaged, and Motor state machine runs*/  
+    Motor_ZERO,     /**< CreaMot at phase position 0 and ON, only reached by call of Zero() procedure. */  
+    Motor_ON,       /**< Phases are engaged, but CreaMot state machine stopped, replaces Motor_PAUSE. */  
+    Motor_RUN       /**< Phases are engaged, and CreaMot state machine runs*/  
 } motStates;
 
 /** \enum motCmands 
-* \brief Commands that are handled by the Motor state machine
+* \brief Commands that are handled by the CreaMot state machine
 *
-* These Commands are issued asynchonously by call Motor class methods.
+* These Commands are issued asynchonously by calling CreaMot class methods.
 * They are executed in the state machine called by the ticker handler.
 *
 * OFF and STOP commands do not go through the state machine.
@@ -50,72 +55,65 @@
 */
 typedef enum {
     MOTOR_nop = 0,  /**< No active command to execute. */
-    MOTOR_run,      /**< Run Motor until Nsteps are achieved. */
-    MOTOR_stop,     /**< Stop immediately all activity, turn off Motor. */
-    MOTOR_pause     /**< Motor is temporarily paused from the state run. */
+    MOTOR_run,      /**< Run CreaMot until Nsteps are achieved. */
+    MOTOR_stop,     /**< Stop immediately all activity, turn off CreaMot. */
+    MOTOR_pause     /**< CreaMot is temporarily paused from the state run. */
 } motCmands;
 
-/** \struct MotStatus
-* \brief Structure of Motor Status registers.
-*
-* Used by Motor Class to hold all Status 'Registers'. 
-* The structure can be requested to get by Motor.getStatus(). 
-*/
-typedef struct {
-    motStates   state;      /**< General state that the motor state machine is in.*/
-    motCmands   cmd;        /**< Command asked to be executed currently by the state machine.*/
-    bool        ClockWise;  /**< Direction that the Motor is asked to run. True if Clockwise */
-    int32_t     NSteps;     /**< Number of steps remain for the Motor to run. 
-                                NSteps=0: all steps finished; NSteps<0: indicates to run "forever" */
-    bool        TickIsAttached; 
-                        /**< Indicates if Ticker is attached.
-                            Ticker is automatically attached while Motor runs, or paused; 
-                            detaches when finished a run, or stopped.  */
-    void set(motCmands aCmd, bool AClockWise, int32_t  aNSteps); 
-                        /**< Helper; set Command, Direction and NSteps in one call. */
-} MotStatus;
-
 /** ATTENTION UNDER CONSTRUCTION, DO NOT YET USE.
 *
-*Class of a Four Phase Stepper Motor.
+* Class of a Four Phase Stepper CreaMot.
+*
+* Perform Runs for number of steps, or given amount angle, but also Low-Level steps. 
 *
-*Perform Runs for number of steps, or given amount angle, but also Low-Level steps. 
+* High-Level Run functions have 'Run' in their name.
+* They rely on tickers and return immediately after ticker is set up. 
+* A state-machine evaluates the one ongoing command versus the CreaMot state at every tick.
+* When End of Run is detected tickers stop, and CreaMot turns off. 
 *
-*High-Level Run functions have 'Run' in their name.
-*They rely on tickers and return immediately after ticker is set up. 
-*A state-machine evaluates commands versus the Motor state at every tick.
-*When End of Run is detected tickers stop, and Motor turns off. 
+* To define the speed of the CreaMot set the variable StepTime_us, either by
+*    a) Using the createor CreaMot(...., uint32_t AStepTime_us);
+*    b) Calling function setStepTime_us(uint32_t AStepTime_us); any time
+*    c) or leave it to the default value MOTOR_STEP_TIME_DEFAULT_US = 5000
 *
-*Callbacks can be attached to react to 'end of run' events. 
+* To be able to run the CreaMot for a given angle, set the number of steps per full turn
+*    with the function "setStepsFullTurn"
+*    That value defaults to MOTOR_STEPS_FOR_A_TURN = 4096
+*
+* To be able to run the CreaMot for a given perimeter distance in centimeters, 
+*    set the wheel diameter with the function setDiamCM( float Adiam_cm); 
+*
+* Callbacks can be attached to react to 'end of run' events. 
+*
 *Attention: the attached Callback is called within a Ticker Callback.
 *    Your code you execute in the Callback should be short, must not use waits, or any long routines.
-*    Do not call any Motor run commands in the callback, as it creates conflict situations.
+*    Do not call any CreaMot run commands in the callback, as it creates conflict situations.
 *    Long Callback code may impair this and any other Ticker functions that run in your application.
 *
 *Low-Level functions directly talk to the hardware without ticker. 
-*Use of Low-Level functions while tickers still run may lead to unexpected behavior. 
+*   Use of Low-Level functions while tickers still run may lead to unexpected behavior. 
 *
 * NB: all times are uint32_t, step numbers are int32_t
 */
-class Motor
+class CreaMot
 {
 public:
-    /** Motor Class Creator
+    /** CreaMot Class Creator
     *
     * Creates the class, initiallizes all fields, creates Phase Pins.  
-    * Time between two steps defaults here to MOTOR_STEP_TIME_DEFAULT_US=5000usec.
+    * Time between two steps defaults here to MOTOR_STEP_TIME_DEFAULT_US = 5000usec.
     * Pin names are used to create digital outputs: Pin0 = new DigitalOut(_MPh0)
     *
     @code
        PinName MotPhases[] = {PB_1, PB_15, PB_14, PB_13};
-       Motor MotorName(MotPhases); // Call this creator for example like this:  
+       CreaMot MotorName(MotPhases); // Call this creator for example like this:  
     @endcode 
     * 
     * @param _MPh Array of Names of the 4 Digital Pins of type PinNames 
     */
-    Motor(PinName _MPh[4] );
+    CreaMot(PinName _MPh[4] );
     
-    /** Motor Class Creator
+    /** CreaMot Class Creator
     *
     * Creates the class, initiallizes all fields, creates Phase Pins.  
     * Time between two steps defaults here to MOTOR_STEP_TIME_DEFAULT_US=5000usec.
@@ -123,14 +121,14 @@
     *
     @code
       // Call this creator for example like this:
-       Motor MotorName(PB_1, PB_15, PB_14, PB_13);
+       CreaMot MotorName(PB_1, PB_15, PB_14, PB_13);
     @endcode 
     * 
     * @param <_MPh0, _MPh1, _MPh2, _MPh3> List of Names of the 4 Digital Pins of type PinNames    
     */
-    Motor(PinName _MPh0, PinName _MPh1, PinName _MPh2, PinName _MPh3);
+    CreaMot(PinName _MPh0, PinName _MPh1, PinName _MPh2, PinName _MPh3);
     
-    /** Motor Class Creator
+    /** CreaMot Class Creator
     *
     * Creates the class, initiallizes all fields, creates Phase Pins.  
     * Time between two steps is passed as parameter.
@@ -138,13 +136,13 @@
     *
     @code
       // Call this creator for example like this:
-       Motor MotorName(PB_1, PB_15, PB_14, PB_13);
+       CreaMot MotorName(PB_1, PB_15, PB_14, PB_13, 6000);
     @endcode 
     *
     * @param <_MPh0, _MPh1, _MPh2, _MPh3> List of Names of the 4 Digital Pins of type PinNames    
-    * @param <AStepTime_us> Lthe time in usec between two steps, thats used initially.   
+    * @param <AStepTime_us> the time in usec between two steps, thats used initially.   
     */
-    Motor(PinName _MPh0, PinName _MPh1, PinName _MPh2, PinName _MPh3, uint32_t AStepTime_us);
+    CreaMot(PinName _MPh0, PinName _MPh1, PinName _MPh2, PinName _MPh3, uint32_t AStepTime_us);
 
 private:
     // deprecated: void initialization(PinName _MPh0, PinName _MPh1, PinName _MPh2, PinName _MPh3, uint32_t AStepTime_us);
@@ -153,8 +151,8 @@
 public:
     /** Attach a basic Callback function.
     *
-    * Only called when a Run Command reaches it's requested end.
-    * Not called when the Motor is stopped by a call of Stop Function, or any other events.
+    * A callback is called when the current Command reaches it's requested end.
+    * Not called when the CreaMot is stopped by a call of Stop Function, or any other events.
     * For use see precautions at Class description above. 
     * Formerly called setMotorCallback()
     *
@@ -186,7 +184,7 @@
 
     /** Attach a Callback function, member of a class.
     * Only called when a Run Command reaches it's requested end.
-    * Not called when the Motor is stopped by a call of Stop Function, or any other events.
+    * Not called when the CreaMot is stopped by a call of Stop Function, or any other events.
     * For use see precautions at Class description above. 
     * @param <*object> Class pointer which possesses callback member.
     * @param <*CBmember> Pointer to callback function, member of Class.
@@ -213,37 +211,46 @@
     /** Remove the Callback function that may have been attached previously. */
     void callbackRemove() { _callback = NULL; };
 
-public 
+public: 
     // *********************************************************************
-    //  all following functions are agnostic of centimeter-information
+    //  all following functions use wheel diameter to achieve cm distance
     // *********************************************************************
 
-    /** High Level: Run Motor for a given number of centimeters.
+    /** High Level: Run CreaMot for a given number of centimeters.
     *
-    * Runs Motor for a given circumference in cimeters in given direction. 
+    * Runs CreaMot for a given wheel circumference in cimeters in given direction. 
     * You must setup the perimeter and diameter with setDiam(Adiam_cm) in advance, otherwise no reaction.
-    * Call Pause() or Stop() to pause or end the Motor run prematurely.
+    * Call Pause() or Stop() to pause or end the CreaMot run prematurely.
     * While run: Uses ticker; State: first Motor_ON then Motor_RUN; cmd=MOTOR_run.
     * At end: calls attached Callback, stops ticker; State: Motor_OFF; cmd=MOTOR_stop then MOTOR_nop.
     * @param[in] <AClockWise> Given Direction, true for CLOCKWISE, false for COUNTERCLOCKWISE.
-    * @param[in] <centimeters> Circumference to rotate for, in cm, centimeters<0 are run in opposite direction.
+    * @param[in] <Dist_cm> Circumference to rotate for, in cm, Dist_cm<0 are run in opposite direction.
     */
-   void RunCentimeters  (bool AClockWise, float centimeters);
+    void RunDist_cm  (bool AClockWise, float Dist_cm);
    
-    /** High Level: Run Motor for a given number of centimeters in default direction.
-    * Same as RunCentimeters(AClockWise,centimeters) but uses Default diretion.*/
-   void RunCentimeters  (float centimeters);
+    /** High Level: Run CreaMot for a given number of centimeters in default direction.
+    * Same as RunDist_cm(AClockWise,Dist_cm) but uses Default diretion.*/
+    void RunDist_cm  (float Dist_cm);
+    
+    /** High Level: Run CreaMot for a turn angle around a turn_radius_cm  in default direction
+    *
+    * Runs CreaMot for a given wheel circumference in cimeters in given direction. 
+    * You must setup the perimeter and diameter with setDiam(Adiam_cm) in advance, otherwise no reaction.
+    * Call Pause() or Stop() to pause or end the CreaMot run prematurely.
+    * While run: Uses ticker; State: first Motor_ON then Motor_RUN; cmd=MOTOR_run.
+    * At end: calls attached Callback, stops ticker; State: Motor_OFF; cmd=MOTOR_stop then MOTOR_nop.
+    * @param[in] <turn_angle_deg> Given turn angle in degrees that should be run
+    * @param[in] <turn_radius_cm> Given Trun radius that should be run */
+    float RunTurnAngle(float turn_angle_deg, float turn_radius_cm); 
 
     /** Additional geometric information: set the wheel diameter, also sets perimeter and degrees per cm.*/
     void setDiamCM( float Adiam_cm); 
 
-    /** Set Motor speed in centimeter/sec, based on perimeter in cm */
-    void setSpeed_cm_sec(float speed_cm_sec)
+    /** Set CreaMot speed in centimeter/sec, based on perimeter in cm */
+    void setSpeed_cm_sec(float speed_cm_sec);
 
-    /** Helper: calculate the needed wheel angle from a turn angle and a turn_radius_cm  */
-    float calcAngle(float turn_angle_deg, float turn_radius_cm) 
 
-    /** Calculated wheel Angle from calcAngle Helper function */
+    /** Calculated wheel Angle from calcAngle() Helper function */
     float rotate_angle_deg;
 
     /** Additional geometric information: wheel diameter in centimeter */
@@ -259,27 +266,34 @@
     bool defaultDirection;
     
     /** State value that is used and managed by the class owner.
-    * Used for example by Creabot library to indicate if this is the left or right motor. 
+    * Used for example by Creabot library to indicate if this is the left or right CreaMot. 
     */
     char StateValue;
 
-public 
+public: 
     // *****************************************************************
-    //  all following functions are agnostic of centimeter-information
+    //  following functions are agnostic of wheel dimensions in centimeters
     // *****************************************************************
 
-   /** High Level: Run Motor for a given angle.
+   /** High Level: Run CreaMot for a given angle.
     *
-    * Runs Motor for a given angle in given direction. 
-    * Call Pause() or Stop() to pause or end the Motor run prematurely.
-    * While run: Uses ticker; State: first Motor_ON then Motor_RUN; cmd=MOTOR_run.
+    * Runs CreaMot for a given angle in given direction. 
+    * Angles<0 are run in opposite direction.
+    * Call Pause() or Stop() to pause or end the CreaMot run prematurely.
+    * While running: Uses ticker; 
+    * State: first Motor_ON then Motor_RUN; cmd=MOTOR_run.
     * At end: calls attached Callback, stops ticker; State: Motor_OFF; cmd=MOTOR_stop then MOTOR_nop.
     * @param[in] <AClockWise> Given Direction, true for CLOCKWISE, false for COUNTERCLOCKWISE.
     * @param[in] <angle_deg> Angle>0 to rotate for, in degrees, Angles<0 are run in opposite direction.     
     */
    void RunDegrees  (bool AClockWise, float angle_deg);
+   
+   /** High Level: Run CreaMot for a given angle in default direction
+   * for details see RunDegrees  (bool AClockWise, float angle_deg);
+   */
+   void RunDegrees  (float angle_deg);
 
-    /** High Level: Run Motor for a number of Steps.
+    /** High Level: Run CreaMot for a number of Steps.
     * 
     * During Run: Uses ticker; State: first Motor_ON then Motor_RUN; cmd=MOTOR_run.
     * Call Pause() or Stop() to pause or end the run prematurely.
@@ -289,17 +303,17 @@
     */
    void RunSteps (bool AClockWise, int32_t Nsteps);
 
-    /** High Level: Run Motor "unlimited"
+    /** High Level: Run CreaMot "unlimited"
     *
-    * Runs Motor with out limit in given direction, precisely runs 4Billion Steps.
+    * Runs CreaMot with out limit in given direction, precisely runs 4Billion Steps.
     * While run: Uses ticker; State: first Motor_ON then Motor_RUN; cmd=MOTOR_run.
-    * Call Pause() or Stop() to pause or end the Motor run.
+    * Call Pause() or Stop() to pause or end the CreaMot run.
     * @param[in] <AClockWise> Given Direction, true for CLOCKWISE, false for COUNTERCLOCKWISE.
     */
     void RunInfinite (bool AClockWise);
 
-    /** High Level: Pause a motor Run.
-     * Put Motor into Pause state, Run is suspended, but only effective if Status.cmd=MOTOR_run.
+    /** High Level: Pause a CreaMot Run.
+     * Put CreaMot into Pause state, Run is suspended, but only effective if Status.cmd=MOTOR_run.
      * Retains the number of steps that remain to be run if restarting run.
      * While paused: still uses ticker; State: Motor_RUN; cmd=MOTOR_pause.
      * Use RestartRun(); to continue. */
@@ -320,19 +334,12 @@
     
 public: // All the ticker timing related parameters
 
-    /** MidLevel: Get Motor status
-    *
-    * Gets the Status of the different internal mechanisms. 
-    * See documentation of MotStatus Structure.
-    * @return MotStatus The structure of Motor status registers. */
-    MotStatus getStatus();
-
     /** MidLevel: Get number of Steps per Full turn
     
     * Defaults to MOTOR_STEPS_FOR_A_TURN = 4096.
     * Used by RunDegrees() to translate from angle in degrees to number of steps.
     * Old Name was: getCalibration, but that was not a good explicit name. 
-    * @return  int32_t The structure of Motor status registers. */
+    * @return  int32_t The structure of CreaMot status registers. */
     int32_t getStepsFullTurn();
 
     /** MidLevel: Set number of Steps per Full turn.
@@ -340,50 +347,60 @@
     * Defaults is MOTOR_STEPS_FOR_A_TURN = 4096.
     * Used by RunDegrees() to translate from degrees to number of steps.
     * Old Name was: setCalibration, but not good explicit name.
-    * @param <StepsFullTurn> Number of steps needed to complete a full motor turn
+    * @param <StepsFullTurn> Number of steps needed to complete a full CreaMot turn
     */
     void setStepsFullTurn(int32_t StepsFullTurn);
 
-    /** Mid Level: Get the Motor step time. 
+    /** Mid Level: Get the CreaMot step time. 
     
-    * Step time is time between two Motor steps, and is given in microseconds
+    * Step time is time between two CreaMot steps, and is given in microseconds
     * and is passed to the ticker as delay time. 
-    * So the larger the value the slower the motor speed.  
+    * So the larger the value the slower the CreaMot speed.  
     * Defaults to MOTOR_STEP_TIME_DEFAULT_US = 5000.
-    * @return  uint32_t The structure of Motor status registers.
+    * @return  uint32_t The structure of CreaMot status registers.
     */
-    uint32_t getStepTime_us;
+    uint32_t getStepTime_us();
     
-    /** Set the time in microseconds between two Motor steps.
+    /** Set the time in microseconds between two CreaMot steps.
     *  Defaults to MOTOR_STEP_TIME_DEFAULT_US = 5000usec.
     *  Filters values below Minimum Value = 700.
     *  Passed to the ticker as delay time.
     *  Can be called while ticker is running, and takes immediate effect. 
     *  Was previously called setStepTime(), but was not clear which units.  
-    * @param <AStepTime_us> the time in microseconds between two Motor steps
+    * @param <AStepTime_us> the time in microseconds between two CreaMot steps
     */
     void setStepTime_us(uint32_t AStepTime_us);
 
     /** Set the time in seconds to get one full turn, rotation of 360°.
     * was previously called setSpeed().  
-    * @param <Seconds_Per_Turn> Period of Rotation, e.g. if =20.0 then Motor will do 360° in 20 seconds.
+    * @param <Seconds_Per_Turn> Period of Rotation, e.g. if =20.0 then CreaMot will do 360° in 20 seconds.
     */
     void setRotationPeriodSec(float Seconds_Per_Turn) ;
 
 private:
-    // all the  Ticker and Timing procedures, used to run the Motor for a duration
+    // all the  Ticker and Timing procedures, used to run the CreaMot for a duration
     void StartTick();
     void ProcessMotorStateMachine();
     // The call back function pointer that is called when the Processor
     // State Machine reaches its end.
     Callback<void()> _callback;
     void StopTick();
-    MotStatus   Status;
-    timestamp_t StepTime_us;    // Time in µs for one Motor step
-    Ticker      MotorSysTick;   // System Timer for Motor
+    timestamp_t StepTime_us;    // Time in µs for one CreaMot step
+    Ticker      MotorSysTick;   // System Timer for CreaMot
     int32_t     Steps_FullTurn; // Number of step for a complete turn
-
-public: // all the low level direct Motor HW access, States are immediately reached
+    bool        ClockWise;  /**< Direction that the CreaMot is asked to run. True if Clockwise */
+    int32_t     NStepsToDo; /**< Number of steps remain for the CreaMot to run. 
+                                NSteps=0: all steps finished; NSteps<0: indicates to run "forever" */
+    bool        TickIsAttached; /**< Indicates if Ticker is attached.
+                            Ticker is automatically attached while CreaMot runs, or paused; 
+                            detaches when finished a run, or stopped.  */
+    
+public: // all the low level direct CreaMot HW access, States are immediately reached
+    motStates   CurrState;  /**< General state that the CreaMot state machine is in.*/
+    motCmands   CurrCmd;    /**< Command asked to be executed currently by the state machine.*/
+    void setStatus(motCmands aCmd, bool AClockWise, int32_t  aNSteps); 
+                        /**< Helper; set Command, Direction and NSteps in one call. */
+    
 
     /** Low Level: Run one full turn clockwise then anticlockwise. 
     * After: State: Motor_OFF.
@@ -391,41 +408,40 @@
     */
     void MotorTest();
 
-    /** Low Level: turn off all Motor Phases
+    /** Low Level: turn off all CreaMot Phases
     * No more current flows, reduces holding force.
     * After: State: Motor_OFF.
     * StepPhases memorizes the last used phase.
     * Equivalent what previously the function "void Stop();" did .  */
     void MotorOFF();
     
-    /** Low Level: turn on the Motor Phases in the last used phase.
+    /** Low Level: turn on the CreaMot Phases in the last used phase.
     * The last used phase is held in StepPhases.
     * After: State: Motor_ON, or Motor_ZERO if StepPhases==0
     * Equivalent to what previously the function "void Start();" did.  */
     void MotorON();
     
-    /** Low Level: Advance Motor one step, rotates in direction of variable AClockWise. */
+    /** Low Level: Advance CreaMot one step, rotates in direction of variable AClockWise. */
     void StepOnce();
     
-    /** Low Level: Advance Motor one step, rotates CounterClockwise. */
+    /** Low Level: Advance CreaMot one step, rotates CounterClockwise. */
     void StepCCW();
     
-    /** Low Level: Advance Motor one step, rotates Clockwise. */
+    /** Low Level: Advance CreaMot one step, rotates Clockwise. */
     void StepClkW();
     
-    /** Low Level: turn on the Motor Phases in Zero Position. 
+    /** Low Level: turn on the CreaMot Phases in Zero Position. 
      * After: State: Motor_ZERO, StepPhases==0
      */
     void MotorZero();
     
-    
 private:
 
-    /** Low Level: Engage Motor Phases according to MotorIndex. */
+    /** Low Level: Engage CreaMot Phases according to MotorIndex. */
     void SetPhases(); 
 
     DigitalOut *MPh[4];       // Digital outputs, one per phase
-    int        StepPhase;     // Motor Phase Variable, counts up and down with every step
+    int        StepPhase;     // CreaMot Phase Variable, counts up and down with every step
 };
 
 #endif