motor board library
Dependencies: ST_INTERFACES X_NUCLEO_COMMON
Fork of X_NUCLEO_IHM02A1 by
Revision 17:4b3dc908724f, committed 2016-04-07
- 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
--- 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)
{
