My Version of the Crealab MotorLib.

Fork of MotorLib by CreaLab

Revision:
24:932ea7bdc850
Parent:
23:6060422cd6eb
--- a/motor.cpp	Wed Apr 17 21:48:14 2019 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,252 +0,0 @@
-#include "motor.h"
-
-
-  // -------------------- CreaMot Class ---------------------------
-
-CreaMot::CreaMot(PinName _MPh[4]) {
-    initialization( _MPh , MOTOR_STEP_TIME_DEFAULT_US);
-}
-
-CreaMot::CreaMot(PinName _MPh0, PinName _MPh1, PinName _MPh2, PinName _MPh3) {
-    PinName _MPh[4] = {_MPh0, _MPh1, _MPh2, _MPh3};
-    initialization( _MPh , MOTOR_STEP_TIME_DEFAULT_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 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
-    
-    setStatus(MOTOR_nop, CLOCKWISE, 0);// Default command is NOP, clockwise direction, 0 steps
-    
-    TickIsAttached = false;
-    StepTime_us = AStepTime_us;// duration in micro second for one step
-
-    Steps_FullTurn = MOTOR_STEPS_FOR_A_TURN;  // Default Calibration value
-    _callback = NULL; // No default Callback
-    
-    // All geometric information defaults to 0:
-    rotate_angle_deg = 0; // calculated wheel rotation angle 
-    diam_cm          = 0; // wheel diameter in centimeter
-    perim_cm         = 0; // wheel perimeter in centimeter
-    degree_per_cm    = 0; // rotation angle in degrees per cm circumference
-    defaultDirection = CLOCKWISE;
-}
-
-// *****************************************************************
-//   all following functions are based on centimeter information
-// *****************************************************************
-
-/* 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 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 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 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;
-        else rotate_angle_deg = 0;
-    return rotate_angle_deg;
-} 
-
-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 );
-}
-
-// *****************************************************************
-//  all following functions are agnostic of centimeter-information
-// *****************************************************************
-
-void CreaMot::RunInfinite(bool AClockWise) {
-    setStatus(MOTOR_run, AClockWise, -1);
-    StartTick();
-}
-
-/* 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 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) 
-        { setStatus(MOTOR_run, AClockWise ^^ (steps<0), abs(steps));
-          StartTick(); }
-}
-
-void CreaMot::PauseRun() 
-{   if (CurrCmd==MOTOR_run) CurrCmd = MOTOR_pause;  }
-
-void CreaMot::RestartRun() 
-{   if (CurrCmd==MOTOR_pause) CurrCmd = MOTOR_run;  }
-
-void CreaMot::StopRun() 
-{   CurrCmd = MOTOR_stop;  } 
-
-MotStatus CreaMot::getStatus() { return Status; }
-
-/*******************************************************
- **   Ticker / Timing procedures
- *******************************************************/
-//Get, set the scaling
-uint32_t CreaMot::getStepsFullTurn()
-{    return Steps_FullTurn;  }
-
-void CreaMot::setStepsFullTurn(uint32_t StepsFullTurn) 
-{   Steps_FullTurn = StepsFullTurn; }
-
-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 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(TickIsAttached) { StopTick(); StartTick(); }
- }
-
-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();
-        TickIsAttached=true;
-        }
-}
-
-void CreaMot::ProcessMotorStateMachine()
-{
-    switch(CurrCmd) {
-        case MOTOR_run: {
-            switch(CurrState) {
-                case Motor_OFF:
-                    MotorON(); // First only turn on the CreaMot ..
-                    break;
-                case Motor_ZERO:
-                case Motor_ON:
-                        CurrState = Motor_RUN;
-                case Motor_RUN:
-                    if (NStepsToDo==0)  // No more steps to go
-                        { CurrCmd = MOTOR_stop; 
-                          if (_callback) _callback.call(); } 
-                      else // More steps to go
-                        { StepOnce(); 
-                        NStepsToDo--;}
-                    break;
-                } // switch(CurrState)
-            } // case MOTOR_run
-        case MOTOR_stop:
-            StopTick();
-            CurrCmd = MOTOR_nop; 
-            MotorOFF(); 
-            break;       
-        case MOTOR_nop:
-        case MOTOR_pause:
-        default: break;
-    } // switch(CurrCmd)
-}
-
-void CreaMot::StopTick() {
-    if(TickIsAttached)   
-      { MotorSysTick.detach(); TickIsAttached=false; }
-}
-
-/*******************************************************
- **   all the low level direct CreaMot HW access
- *******************************************************/
- 
-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();
-    for (i=0; i<Steps_FullTurn; i++) {
-        wait(0.005);
-        StepClkW();
-        }   
-    wait(0.5);
-    for (i=0; i<Steps_FullTurn; i++) {
-        wait(0.005);
-        StepCCW();
-        }   
-    MotorOFF();
-}
-
- /** Turn off all CreaMot Phases, no more current flowing */
-void CreaMot::MotorOFF() 
-{   for (int ph=0; ph<4; ph++) *MPh[ph] = 0;  
-    CurrState=Motor_OFF;
-}
-
-/** Turn on the CreaMot Phase, In the last used phase, memorized in StepPhases 
-*  Equivalent to what previously the function "void Start();" did */
-void CreaMot::MotorON()
-{   SetPhases(); // attention, does not change StepPhase!
-    if (StepPhase==0)  CurrState=Motor_ZERO;  
-        else CurrState=Motor_ON;
-} 
-
-/** CreaMot phases turned on and put to Zero Position*/    
-void CreaMot::MotorZero() {
-    StepPhase = 0;  // sets the phases to 0
-    SetPhases(); 
-    CurrState=Motor_ZERO;
-}
-
-void    CreaMot::StepOnce()     // Move the CreaMot in the Status 'direction'
-{   if (Status.AClockWise) StepClkW(); else StepCCW();
-}
-
-void    CreaMot::StepClkW()    // Move the CreaMot one step Clockwise
-{   if (StepPhase<7) StepPhase++;  else  StepPhase = 0;
-    SetPhases();
-}
-void    CreaMot::StepCCW()    // Move the CreaMot one step Clockwise
-{   if (StepPhase>0) StepPhase--;  else  StepPhase = 7;
-    SetPhases();
-}
-
-static const int MotPh[4][8] = 
-    { {1, 1, 0, 0, 0, 0, 0, 1}, 
-      {0, 1, 1, 1, 0, 0, 0, 0}, 
-      {0, 0, 0, 1, 1, 1, 0, 0}, 
-      {0, 0, 0, 0, 0, 1, 1, 1}};
-      
-void    CreaMot::SetPhases()    // Engage CreaMot Phases according to StepPhase
-{ for (int ph=0; ph<4; ph++) { *MPh[ph] = MotPh[ph][StepPhase]; }   }
-