Library to handle the X_NUCLEO_IHM02A1 Motor Control Expansion Board based on the L6470 component.

Dependencies:   X_NUCLEO_COMMON

Fork of X_NUCLEO_IHM02A1 by ST

Revision:
17:4b3dc908724f
Parent:
15:31785d1acd4b
Child:
18:ddf3d5dc8137
--- 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)
     {