motor board library

Dependencies:   ST_INTERFACES X_NUCLEO_COMMON

Dependents:   selfbalansingcar

Fork of X_NUCLEO_IHM02A1 by ST

Files at this revision

API Documentation at this revision

Comitter:
Davidroid
Date:
Thu Apr 07 16:55:51 2016 +0000
Parent:
16:0d5be428b264
Child:
18:ddf3d5dc8137
Commit message:
+ StepperMotor interface updated: step-modes added, getter/setter methods for parameters removed.

Changed in this revision

Components/Interfaces/StepperMotor_class.h Show annotated file Show diff for this revision Revisions of this file
Components/l6470/l6470_class.cpp Show annotated file Show diff for this revision Revisions of this file
Components/l6470/l6470_class.h Show annotated file Show diff for this revision Revisions of this file
--- a/Components/Interfaces/StepperMotor_class.h	Fri Mar 11 15:49:04 2016 +0000
+++ b/Components/Interfaces/StepperMotor_class.h	Thu Apr 07 16:55:51 2016 +0000
@@ -2,8 +2,8 @@
  ******************************************************************************
  * @file    StepperMotor_class.h
  * @author  Davide Aliprandi, STMicroelectronics
- * @version V1.0.0
- * @date    November 12th, 2015
+ * @version V1.1.0
+ * @date    April 6th, 2016
  * @brief   This file contains the abstract class describing the interface of a
  *          stepper-motor component.
  ******************************************************************************
@@ -60,11 +60,29 @@
      */
     typedef enum
     {
-      BWD = 0, /* Backward. */
-      FWD = 1  /* Forward. */
+        BWD = 0, /* Backward. */
+        FWD = 1  /* Forward. */
     } direction_t;
 
     /**
+     * @brief Step modes.
+     */
+    typedef enum
+    {
+        STEP_MODE_FULL = 0, /* Full-step. */
+        STEP_MODE_HALF,     /* Half-step. */
+        STEP_MODE_1_4,      /* 1/4 microstep. */
+        STEP_MODE_1_8,      /* 1/8 microstep. */
+        STEP_MODE_1_16,     /* 1/16 microstep. */
+        STEP_MODE_1_32,     /* 1/32 microstep. */
+        STEP_MODE_1_64,     /* 1/64 microstep. */
+        STEP_MODE_1_128,    /* 1/128 microstep. */
+        STEP_MODE_1_256,    /* 1/256 microstep. */
+        STEP_MODE_UNKNOWN,  /* Unknown. */
+        STEP_MODE_WAVE      /* Full-step one-phase-on. */
+    } step_mode_t;
+
+    /**
      * @brief  Getting the status.
      * @param  None.
      * @retval The status.
@@ -72,13 +90,6 @@
     virtual unsigned int GetStatus(void) = 0;
 
     /**
-     * @brief  Getting a parameter.
-     * @param  parameter The parameter's identifier (or its register address).
-     * @retval The parameter's value.
-     */
-    virtual float GetParameter(unsigned int parameter) = 0;
-
-    /**
      * @brief  Getting the position.
      * @param  None.
      * @retval The position.
@@ -134,14 +145,6 @@
      */
     virtual direction_t GetDirection(void) = 0;
 
-   /**
-     * @brief  Setting a parameter.
-     * @param  parameter The parameter's identifier (or its register address).
-     * @param  value The parameter's value.
-     * @retval None.
-     */
-    virtual void SetParameter(unsigned int parameter, float value) = 0;
-
     /**
      * @brief  Setting the current position to be the home position.
      * @param  None.
@@ -159,30 +162,37 @@
     /**
      * @brief  Setting the maximum speed in pps.
      * @param  speed The maximum speed in pps.
-     * @retval None.
+     * @retval "true" in case of success, "false" otherwise.
      */
-    virtual void SetMaxSpeed(unsigned int speed) = 0;
+    virtual bool SetMaxSpeed(unsigned int speed) = 0;
 
     /**
      * @brief  Setting the minimum speed in pps.
      * @param  speed The minimum speed in pps.
-     * @retval None.
+     * @retval "true" in case of success, "false" otherwise.
      */
-    virtual void SetMinSpeed(unsigned int speed) = 0;
+    virtual bool SetMinSpeed(unsigned int speed) = 0;
 
     /**
      * @brief  Setting the acceleration in pps^2.
      * @param  acceleration The acceleration in pps^2.
-     * @retval None.
+     * @retval "true" in case of success, "false" otherwise.
      */
-    virtual void SetAcceleration(unsigned int acceleration) = 0;
+    virtual bool SetAcceleration(unsigned int acceleration) = 0;
 
     /**
      * @brief  Setting the deceleration in pps^2.
      * @param  deceleration The deceleration in pps^2.
-     * @retval None.
+     * @retval "true" in case of success, "false" otherwise.
      */
-    virtual void SetDeceleration(unsigned int deceleration) = 0;
+    virtual bool SetDeceleration(unsigned int deceleration) = 0;
+
+    /**
+     * @brief  Setting the Step Mode.
+     * @param  step_mode The Step Mode.
+     * @retval "true" in case of success, "false" otherwise.
+     */
+    virtual bool SetStepMode(step_mode_t step_mode) = 0;
 
     /**
      * @brief  Going to a specified position.
--- a/Components/l6470/l6470_class.cpp	Fri Mar 11 15:49:04 2016 +0000
+++ b/Components/l6470/l6470_class.cpp	Thu Apr 07 16:55:51 2016 +0000
@@ -1420,9 +1420,9 @@
   StepperMotorRegister.K_THERM = MotorParameterData->kterm;
   StepperMotorRegister.OCD_TH = L6470_mA_2_OcdTh(MotorParameterData->ocdth);
   StepperMotorRegister.STALL_TH = L6470_mA_2_StallTh(MotorParameterData->stallth);
-  StepperMotorRegister.STEP_MODE = MotorParameterData->step_sel;
   StepperMotorRegister.ALARM_EN = MotorParameterData->alarmen;
   StepperMotorRegister.CONFIG = MotorParameterData->config;
+  StepperMotorRegister.STEP_MODE = MotorParameterData->step_sel;
 
   /* Write the L6470 registers with the prepared data */
   L6470_SetParam(L6470_ACC_ID, StepperMotorRegister.ACC);
@@ -1441,9 +1441,10 @@
   L6470_SetParam(L6470_K_THERM_ID, StepperMotorRegister.K_THERM);
   L6470_SetParam(L6470_OCD_TH_ID, StepperMotorRegister.OCD_TH);
   L6470_SetParam(L6470_STALL_TH_ID, StepperMotorRegister.STALL_TH);
-  L6470_SetParam(L6470_STEP_MODE_ID, StepperMotorRegister.STEP_MODE);
   L6470_SetParam(L6470_ALARM_EN_ID, StepperMotorRegister.ALARM_EN);
   L6470_SetParam(L6470_CONFIG_ID, StepperMotorRegister.CONFIG);
+  if (!SetStepMode((StepperMotor::step_mode_t) StepperMotorRegister.STEP_MODE))
+    return COMPONENT_ERROR;
   
   return COMPONENT_OK;
 }
--- a/Components/l6470/l6470_class.h	Fri Mar 11 15:49:04 2016 +0000
+++ b/Components/l6470/l6470_class.h	Thu Apr 07 16:55:51 2016 +0000
@@ -194,14 +194,40 @@
         return (unsigned int) L6470_GetStatus();
     }
 
-    /**
+   /**
      * @brief  Getting a parameter.
-     * @param  parameter The parameter's identifier (or its register address).
+     * @param  parameter A parameter's register address.
      * @retval The parameter's value.
+     * @note   The parameter can be one of the following:
+     *           + L6470_ABS_POS_ID
+     *           + L6470_EL_POS_ID
+     *           + L6470_MARK_ID
+     *           + L6470_SPEED_ID
+     *           + L6470_ACC_ID
+     *           + L6470_DEC_ID
+     *           + L6470_MAX_SPEED_ID
+     *           + L6470_MIN_SPEED_ID
+     *           + L6470_FS_SPD_ID
+     *           + L6470_KVAL_HOLD_ID
+     *           + L6470_KVAL_RUN_ID
+     *           + L6470_KVAL_ACC_ID
+     *           + L6470_KVAL_DEC_ID
+     *           + L6470_INT_SPEED_ID
+     *           + L6470_ST_SLP_ID
+     *           + L6470_FN_SLP_ACC_ID
+     *           + L6470_FN_SLP_DEC_ID
+     *           + L6470_K_THERM_ID
+     *           + L6470_ADC_OUT_ID
+     *           + L6470_OCD_TH_ID
+     *           + L6470_STALL_TH_ID
+     *           + L6470_STEP_MODE_ID
+     *           + L6470_ALARM_EN_ID
+     *           + L6470_CONFIG_ID
+     *           + L6470_STATUS_ID
      */
-    virtual float GetParameter(unsigned int parameter)
+    virtual unsigned int GetParameter(unsigned int parameter)
     {
-        return (float) L6470_GetParam((eL6470_RegId_t) parameter);
+        return (unsigned int) L6470_GetParam((eL6470_RegId_t) parameter);
     }
 
     /**
@@ -285,12 +311,61 @@
     }
 
    /**
-     * @brief  Setting a parameter.
-     * @param  parameter The parameter's identifier (or its register address).
-     * @param  value The parameter's value.
-     * @retval None.
+     * @brief   Setting a parameter.
+     * @param   parameter A parameter's register address.
+     * @param   value The parameter's value.
+     * @retval  None.
+     * @note    The parameter can be one of the following:
+     *           + L6470_ABS_POS_ID
+     *           + L6470_EL_POS_ID
+     *           + L6470_MARK_ID
+     *           + L6470_SPEED_ID
+     *           + L6470_ACC_ID
+     *           + L6470_DEC_ID
+     *           + L6470_MAX_SPEED_ID
+     *           + L6470_MIN_SPEED_ID
+     *           + L6470_FS_SPD_ID
+     *           + L6470_KVAL_HOLD_ID
+     *           + L6470_KVAL_RUN_ID
+     *           + L6470_KVAL_ACC_ID
+     *           + L6470_KVAL_DEC_ID
+     *           + L6470_INT_SPEED_ID
+     *           + L6470_ST_SLP_ID
+     *           + L6470_FN_SLP_ACC_ID
+     *           + L6470_FN_SLP_DEC_ID
+     *           + L6470_K_THERM_ID
+     *           + L6470_ADC_OUT_ID
+     *           + L6470_OCD_TH_ID
+     *           + L6470_STALL_TH_ID
+     *           + L6470_STEP_MODE_ID
+     *           + L6470_ALARM_EN_ID
+     *           + L6470_CONFIG_ID
+     *           + L6470_STATUS_ID
+     * @warning Some registers can only be written in particular conditions (see L6470's datasheet).
+     *          Any attempt to write one of those registers when the conditions are not satisfied
+     *          causes the command to be ignored and the NOTPERF_CMD flag to rise at the end of the
+     *          last argument byte. Any attempt to set an inexistent register (wrong address value)
+     *          causes the command to be ignored and the WRONG_CMD flag to rise.
+     *          For example, setting some parameters requires first to disable the power bridge;
+     *          this can be done through the SoftHiZ() method.
+     *          They are the following:
+     *           + L6470_ABS_POS_ID
+     *           + L6470_EL_POS_ID
+     *           + L6470_SPEED_ID
+     *           + L6470_ACC_ID
+     *           + L6470_DEC_ID
+     *           + L6470_MAX_SPEED_ID
+     *           + L6470_MIN_SPEED_ID
+     *           + L6470_INT_SPEED_ID
+     *           + L6470_ST_SLP_ID
+     *           + L6470_FN_SLP_ACC_ID
+     *           + L6470_FN_SLP_DEC_ID
+     *           + L6470_ADC_OUT_ID
+     *           + L6470_STEP_MODE_ID
+     *           + L6470_CONFIG_ID
+     *           + L6470_STATUS_ID
      */
-    virtual void SetParameter(unsigned int parameter, float value)
+    virtual void SetParameter(unsigned int parameter, unsigned int value)
     {
         L6470_SetParam((eL6470_RegId_t) parameter, (uint32_t) value);
     }
@@ -328,41 +403,64 @@
     /**
      * @brief  Setting the maximum speed in pps.
      * @param  speed The maximum speed in pps.
-     * @retval None.
+     * @retval "true" in case of success, "false" otherwise.
      */
-    virtual void SetMaxSpeed(unsigned int speed)
+    virtual bool SetMaxSpeed(unsigned int speed)
     {
         L6470_SetParam((eL6470_RegId_t) L6470_MAX_SPEED_ID, (uint32_t) L6470_Step_s_2_MaxSpeed((float) speed));
+        return true;
     }
 
     /**
      * @brief  Setting the minimum speed in pps.
      * @param  speed The minimum speed in pps.
-     * @retval None.
+     * @retval "true" in case of success, "false" otherwise.
      */
-    virtual void SetMinSpeed(unsigned int speed)
+    virtual bool SetMinSpeed(unsigned int speed)
     {
         L6470_SetParam((eL6470_RegId_t) L6470_MIN_SPEED_ID, (uint32_t) L6470_Step_s_2_MinSpeed((float) speed));
+        return true;
     }
 
     /**
      * @brief  Setting the acceleration in pps^2.
      * @param  acceleration The acceleration in pps^2.
-     * @retval None.
+     * @retval "true" in case of success, "false" otherwise.
      */
-    virtual void SetAcceleration(unsigned int acceleration)
+    virtual bool SetAcceleration(unsigned int acceleration)
     {
         L6470_SetParam((eL6470_RegId_t) L6470_ACC_ID, (uint32_t) L6470_Step_s2_2_Acc((float) acceleration));
+        return true;
     }
 
     /**
      * @brief  Setting the deceleration in pps^2.
      * @param  deceleration The deceleration in pps^2.
-     * @retval None.
+     * @retval "true" in case of success, "false" otherwise.
      */
-    virtual void SetDeceleration(unsigned int deceleration)
+    virtual bool SetDeceleration(unsigned int deceleration)
     {
         L6470_SetParam((eL6470_RegId_t) L6470_DEC_ID, (uint32_t) L6470_Step_s2_2_Dec((float) deceleration));
+        return true;
+    }
+
+    /**
+     * @brief   Setting the Step Mode.
+     * @param   step_mode The Step Mode.
+     * @retval "true" in case of success, "false" otherwise.
+     * @warning Setting the step mode implies first disabling the power bridge through
+     *          the SoftHiZ() method.
+     * @warning Every time step mode is changed, the values of the home
+     *          and mark positions lose meaning and are reset.
+     */
+    virtual bool SetStepMode(step_mode_t step_mode)
+    {
+        if ((eMotorStepMode_t) step_mode > MICROSTEP_1_128)
+            return false;
+
+        SoftHiZ();
+        L6470_SetParam((eL6470_RegId_t) L6470_STEP_MODE_ID, (eMotorStepMode_t) step_mode);
+        return true;
     }
 
     /**
@@ -508,12 +606,15 @@
     }
 
     /**
-      * @brief  Switching to step-clock mode.
-      * @param  direction The direction of rotation.
-      * @retval None.
-      */
+     * @brief   Switching to step-clock mode.
+     * @param   direction The direction of rotation.
+     * @retval  None.
+     * @warning Setting the step-clock mode implies first disabling the power bridge through
+     *          the SoftHiZ() method.
+     */
     virtual void StepClock(direction_t direction)
     {
+        SoftHiZ();
         L6470_StepClock((eL6470_DirId_t) (direction == StepperMotor::FWD ? L6470_DIR_FWD_ID : L6470_DIR_REV_ID));
     }
 
@@ -554,11 +655,37 @@
         prepared_action = PREPARED_NO_ACTION;
     }
 
-    /**
+   /**
      * @brief  Preparing the command to get a parameter.
-     * @param  parameter The parameter's identifier (or its register address).
+     * @param  parameter A parameter's register address.
      * @retval None.
      * @note   The command will be sent by issuing "PerformAction()".
+     *         The parameter can be one of the following:
+     *           + L6470_ABS_POS_ID
+     *           + L6470_EL_POS_ID
+     *           + L6470_MARK_ID
+     *           + L6470_SPEED_ID
+     *           + L6470_ACC_ID
+     *           + L6470_DEC_ID
+     *           + L6470_MAX_SPEED_ID
+     *           + L6470_MIN_SPEED_ID
+     *           + L6470_FS_SPD_ID
+     *           + L6470_KVAL_HOLD_ID
+     *           + L6470_KVAL_RUN_ID
+     *           + L6470_KVAL_ACC_ID
+     *           + L6470_KVAL_DEC_ID
+     *           + L6470_INT_SPEED_ID
+     *           + L6470_ST_SLP_ID
+     *           + L6470_FN_SLP_ACC_ID
+     *           + L6470_FN_SLP_DEC_ID
+     *           + L6470_K_THERM_ID
+     *           + L6470_ADC_OUT_ID
+     *           + L6470_OCD_TH_ID
+     *           + L6470_STALL_TH_ID
+     *           + L6470_STEP_MODE_ID
+     *           + L6470_ALARM_EN_ID
+     *           + L6470_CONFIG_ID
+     *           + L6470_STATUS_ID
      */
     virtual void PrepareGetParameter(unsigned int parameter)
     {
@@ -670,10 +797,59 @@
 
    /**
      * @brief  Preparing the command to set a parameter.
-     * @param  parameter The parameter's identifier (or its register address).
+     * @param  parameter A parameter's register address.
      * @param  value The parameter's value.
      * @retval None.
      * @note   The command will be sent by issuing "PerformAction()".
+     *         The parameter can be one of the following:
+     *           + L6470_ABS_POS_ID
+     *           + L6470_EL_POS_ID
+     *           + L6470_MARK_ID
+     *           + L6470_SPEED_ID
+     *           + L6470_ACC_ID
+     *           + L6470_DEC_ID
+     *           + L6470_MAX_SPEED_ID
+     *           + L6470_MIN_SPEED_ID
+     *           + L6470_FS_SPD_ID
+     *           + L6470_KVAL_HOLD_ID
+     *           + L6470_KVAL_RUN_ID
+     *           + L6470_KVAL_ACC_ID
+     *           + L6470_KVAL_DEC_ID
+     *           + L6470_INT_SPEED_ID
+     *           + L6470_ST_SLP_ID
+     *           + L6470_FN_SLP_ACC_ID
+     *           + L6470_FN_SLP_DEC_ID
+     *           + L6470_K_THERM_ID
+     *           + L6470_ADC_OUT_ID
+     *           + L6470_OCD_TH_ID
+     *           + L6470_STALL_TH_ID
+     *           + L6470_STEP_MODE_ID
+     *           + L6470_ALARM_EN_ID
+     *           + L6470_CONFIG_ID
+     *           + L6470_STATUS_ID
+     * @warning Some registers can only be written in particular conditions (see L6470's datasheet).
+     *          Any attempt to write one of those registers when the conditions are not satisfied
+     *          causes the command to be ignored and the NOTPERF_CMD flag to rise at the end of the
+     *          last argument byte. Any attempt to set an inexistent register (wrong address value)
+     *          causes the command to be ignored and the WRONG_CMD flag to rise.
+     *          For example, setting some parameters requires first to disable the power bridge;
+     *          this can be done through the SoftHiZ() method.
+     *          They are the following:
+     *           + L6470_ABS_POS_ID
+     *           + L6470_EL_POS_ID
+     *           + L6470_SPEED_ID
+     *           + L6470_ACC_ID
+     *           + L6470_DEC_ID
+     *           + L6470_MAX_SPEED_ID
+     *           + L6470_MIN_SPEED_ID
+     *           + L6470_INT_SPEED_ID
+     *           + L6470_ST_SLP_ID
+     *           + L6470_FN_SLP_ACC_ID
+     *           + L6470_FN_SLP_DEC_ID
+     *           + L6470_ADC_OUT_ID
+     *           + L6470_STEP_MODE_ID
+     *           + L6470_CONFIG_ID
+     *           + L6470_STATUS_ID
      */
     virtual void PrepareSetParameter(unsigned int parameter, unsigned int value)
     {
@@ -946,10 +1122,12 @@
     }
 
     /**
-      * @brief  Preparing the command to switch to step-clock mode.
-      * @param  direction The direction of rotation.
-      * @retval None.
-      * @note   The command will be sent by issuing "PerformAction()".
+      * @brief   Preparing the command to switch to step-clock mode.
+      * @param   direction The direction of rotation.
+      * @retval  None.
+      * @warning Setting the step-clock mode requires an explicit action by the user to first
+      *          disable the power bridge through the SoftHiZ() method.
+      * @note    The command will be sent by issuing "PerformAction()".
       */
     virtual void PrepareStepClock(direction_t direction)
     {