Expansion SW library to control high power stepper motor(s) using IHM03A1 expansion board(s) with Powerstep01 driver.

Dependencies:   X_NUCLEO_COMMON ST_INTERFACES

Dependents:   IHM03A1_ExampleFor1Motor HelloWorld_IHM03A1 IHM03A1_ExampleFor3Motors KYPHOS_Stepper_Motor_Control

Fork of X_NUCLEO_IHM03A1 by ST Expansion SW Team

Motor Control Library

Library to handle the X-NUCLEO-IHM03A1 Motor Control Expansion Board based on the Powerstep01 component.

It features the:

  • read and write of Powerstep01 registers
  • Nucleo and expansion board configuration (GPIOs, PWMs, IRQs, etc.)
  • Powerstep01 application commands handling
  • FLAG and BUSY interrupt handling (alarm reporting)
  • Daisy chain handling

The API allows to easily:

  • perform various positioning, moves and stops
  • get/set or monitor the motor positions
  • set home position and mark another position
  • get/set minimum and maximum speed
  • get current speed
  • get/set acceleration and deceleration
  • get/set the step mode (up to 1/128)
  • get/set the control method
  • get/set parameters for voltage mode driving
  • get/set parameters for current mode driving
  • get/set parameters for gate driving
  • configure various protections such as overcurrent detection
  • enable/disable alarms
  • handle step-clock
  • get system status

Daisy-Chain Configuration

The IHM03A1 board can be stacked up to three times so that the Powerstep01 components will be connected in daisy-chain configuration. For this purpose, some resistors must be correctly connected on the boards as depicted here below:

/media/uploads/nucleosam/driving1steppermotor.png /media/uploads/nucleosam/driving2steppermotors.png /media/uploads/nucleosam/driving3steppermotors.png

Platform compatibility

Compatible platforms have been tested with the default configuration provided by the HelloWorld_IHM03A1 example.

Committer:
nucleosam
Date:
Thu Apr 07 16:11:47 2016 +0000
Revision:
1:8ce2a5d6fbf8
Parent:
0:00a3c3f5a8f0
StepperMotor class modification and induced changes

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nucleosam 0:00a3c3f5a8f0 1 /**
nucleosam 0:00a3c3f5a8f0 2 ******************************************************************************
nucleosam 0:00a3c3f5a8f0 3 * @file StepperMotor_class.h
nucleosam 1:8ce2a5d6fbf8 4 * @author Davide Aliprandi, STMicroelectronics
nucleosam 1:8ce2a5d6fbf8 5 * @version V1.1.0
nucleosam 1:8ce2a5d6fbf8 6 * @date April 6th, 2016
nucleosam 0:00a3c3f5a8f0 7 * @brief This file contains the abstract class describing the interface of a
nucleosam 0:00a3c3f5a8f0 8 * stepper-motor component.
nucleosam 0:00a3c3f5a8f0 9 ******************************************************************************
nucleosam 0:00a3c3f5a8f0 10 * @attention
nucleosam 0:00a3c3f5a8f0 11 *
nucleosam 1:8ce2a5d6fbf8 12 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
nucleosam 0:00a3c3f5a8f0 13 *
nucleosam 0:00a3c3f5a8f0 14 * Redistribution and use in source and binary forms, with or without modification,
nucleosam 0:00a3c3f5a8f0 15 * are permitted provided that the following conditions are met:
nucleosam 0:00a3c3f5a8f0 16 * 1. Redistributions of source code must retain the above copyright notice,
nucleosam 0:00a3c3f5a8f0 17 * this list of conditions and the following disclaimer.
nucleosam 0:00a3c3f5a8f0 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
nucleosam 0:00a3c3f5a8f0 19 * this list of conditions and the following disclaimer in the documentation
nucleosam 0:00a3c3f5a8f0 20 * and/or other materials provided with the distribution.
nucleosam 0:00a3c3f5a8f0 21 * 3. Neither the name of STMicroelectronics nor the names of its contributors
nucleosam 0:00a3c3f5a8f0 22 * may be used to endorse or promote products derived from this software
nucleosam 0:00a3c3f5a8f0 23 * without specific prior written permission.
nucleosam 0:00a3c3f5a8f0 24 *
nucleosam 0:00a3c3f5a8f0 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
nucleosam 0:00a3c3f5a8f0 26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
nucleosam 0:00a3c3f5a8f0 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
nucleosam 0:00a3c3f5a8f0 28 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
nucleosam 0:00a3c3f5a8f0 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
nucleosam 0:00a3c3f5a8f0 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
nucleosam 0:00a3c3f5a8f0 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
nucleosam 0:00a3c3f5a8f0 32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
nucleosam 0:00a3c3f5a8f0 33 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
nucleosam 0:00a3c3f5a8f0 34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
nucleosam 0:00a3c3f5a8f0 35 *
nucleosam 0:00a3c3f5a8f0 36 ******************************************************************************
nucleosam 0:00a3c3f5a8f0 37 */
nucleosam 0:00a3c3f5a8f0 38
nucleosam 0:00a3c3f5a8f0 39
nucleosam 0:00a3c3f5a8f0 40 /* Define to prevent from recursive inclusion --------------------------------*/
nucleosam 0:00a3c3f5a8f0 41
nucleosam 0:00a3c3f5a8f0 42 #ifndef __STEPPERMOTOR_CLASS_H
nucleosam 0:00a3c3f5a8f0 43 #define __STEPPERMOTOR_CLASS_H
nucleosam 0:00a3c3f5a8f0 44
nucleosam 0:00a3c3f5a8f0 45
nucleosam 0:00a3c3f5a8f0 46 /* Includes ------------------------------------------------------------------*/
nucleosam 0:00a3c3f5a8f0 47
nucleosam 0:00a3c3f5a8f0 48 #include <Component_class.h>
nucleosam 0:00a3c3f5a8f0 49
nucleosam 0:00a3c3f5a8f0 50
nucleosam 0:00a3c3f5a8f0 51 /* Classes ------------------------------------------------------------------*/
nucleosam 0:00a3c3f5a8f0 52
nucleosam 0:00a3c3f5a8f0 53 /** An abstract class for StepperMotor components.
nucleosam 0:00a3c3f5a8f0 54 */
nucleosam 0:00a3c3f5a8f0 55 class StepperMotor : public Component
nucleosam 0:00a3c3f5a8f0 56 {
nucleosam 0:00a3c3f5a8f0 57 public:
nucleosam 0:00a3c3f5a8f0 58 /**
nucleosam 0:00a3c3f5a8f0 59 * @brief Rotation modes.
nucleosam 0:00a3c3f5a8f0 60 */
nucleosam 0:00a3c3f5a8f0 61 typedef enum
nucleosam 0:00a3c3f5a8f0 62 {
nucleosam 1:8ce2a5d6fbf8 63 BWD = 0, /* Backward. */
nucleosam 1:8ce2a5d6fbf8 64 FWD = 1 /* Forward. */
nucleosam 0:00a3c3f5a8f0 65 } direction_t;
nucleosam 0:00a3c3f5a8f0 66
nucleosam 0:00a3c3f5a8f0 67 /**
nucleosam 1:8ce2a5d6fbf8 68 * @brief Step modes.
nucleosam 0:00a3c3f5a8f0 69 */
nucleosam 1:8ce2a5d6fbf8 70 typedef enum
nucleosam 1:8ce2a5d6fbf8 71 {
nucleosam 1:8ce2a5d6fbf8 72 STEP_MODE_FULL = 0, /* Full-step. */
nucleosam 1:8ce2a5d6fbf8 73 STEP_MODE_HALF, /* Half-step. */
nucleosam 1:8ce2a5d6fbf8 74 STEP_MODE_1_4, /* 1/4 microstep. */
nucleosam 1:8ce2a5d6fbf8 75 STEP_MODE_1_8, /* 1/8 microstep. */
nucleosam 1:8ce2a5d6fbf8 76 STEP_MODE_1_16, /* 1/16 microstep. */
nucleosam 1:8ce2a5d6fbf8 77 STEP_MODE_1_32, /* 1/32 microstep. */
nucleosam 1:8ce2a5d6fbf8 78 STEP_MODE_1_64, /* 1/64 microstep. */
nucleosam 1:8ce2a5d6fbf8 79 STEP_MODE_1_128, /* 1/128 microstep. */
nucleosam 1:8ce2a5d6fbf8 80 STEP_MODE_1_256, /* 1/256 microstep. */
nucleosam 1:8ce2a5d6fbf8 81 STEP_MODE_UNKNOWN,
nucleosam 1:8ce2a5d6fbf8 82 STEP_MODE_WAVE /* Full-step one-phase-on*/
nucleosam 1:8ce2a5d6fbf8 83 } step_mode_t;
nucleosam 1:8ce2a5d6fbf8 84
nucleosam 0:00a3c3f5a8f0 85 /**
nucleosam 0:00a3c3f5a8f0 86 * @brief Getting the status.
nucleosam 0:00a3c3f5a8f0 87 * @param None.
nucleosam 0:00a3c3f5a8f0 88 * @retval The status.
nucleosam 0:00a3c3f5a8f0 89 */
nucleosam 0:00a3c3f5a8f0 90 virtual unsigned int GetStatus(void) = 0;
nucleosam 0:00a3c3f5a8f0 91
nucleosam 0:00a3c3f5a8f0 92 /**
nucleosam 0:00a3c3f5a8f0 93 * @brief Getting the position.
nucleosam 0:00a3c3f5a8f0 94 * @param None.
nucleosam 0:00a3c3f5a8f0 95 * @retval The position.
nucleosam 0:00a3c3f5a8f0 96 */
nucleosam 0:00a3c3f5a8f0 97 virtual signed int GetPosition(void) = 0;
nucleosam 0:00a3c3f5a8f0 98
nucleosam 0:00a3c3f5a8f0 99 /**
nucleosam 0:00a3c3f5a8f0 100 * @brief Getting the marked position.
nucleosam 0:00a3c3f5a8f0 101 * @param None.
nucleosam 0:00a3c3f5a8f0 102 * @retval The marked position.
nucleosam 0:00a3c3f5a8f0 103 */
nucleosam 0:00a3c3f5a8f0 104 virtual signed int GetMark(void) = 0;
nucleosam 1:8ce2a5d6fbf8 105
nucleosam 0:00a3c3f5a8f0 106 /**
nucleosam 0:00a3c3f5a8f0 107 * @brief Getting the current speed in pps.
nucleosam 0:00a3c3f5a8f0 108 * @param None.
nucleosam 0:00a3c3f5a8f0 109 * @retval The current speed in pps.
nucleosam 0:00a3c3f5a8f0 110 */
nucleosam 0:00a3c3f5a8f0 111 virtual unsigned int GetSpeed(void) = 0;
nucleosam 0:00a3c3f5a8f0 112
nucleosam 0:00a3c3f5a8f0 113 /**
nucleosam 0:00a3c3f5a8f0 114 * @brief Getting the maximum speed in pps.
nucleosam 0:00a3c3f5a8f0 115 * @param None.
nucleosam 0:00a3c3f5a8f0 116 * @retval The maximum speed in pps.
nucleosam 0:00a3c3f5a8f0 117 */
nucleosam 0:00a3c3f5a8f0 118 virtual unsigned int GetMaxSpeed(void) = 0;
nucleosam 0:00a3c3f5a8f0 119
nucleosam 0:00a3c3f5a8f0 120 /**
nucleosam 0:00a3c3f5a8f0 121 * @brief Getting the minimum speed in pps.
nucleosam 0:00a3c3f5a8f0 122 * @param None.
nucleosam 0:00a3c3f5a8f0 123 * @retval The minimum speed in pps.
nucleosam 0:00a3c3f5a8f0 124 */
nucleosam 0:00a3c3f5a8f0 125 virtual unsigned int GetMinSpeed(void) = 0;
nucleosam 0:00a3c3f5a8f0 126
nucleosam 0:00a3c3f5a8f0 127 /**
nucleosam 0:00a3c3f5a8f0 128 * @brief Getting the acceleration in pps^2.
nucleosam 0:00a3c3f5a8f0 129 * @param None.
nucleosam 0:00a3c3f5a8f0 130 * @retval The acceleration in pps^2.
nucleosam 0:00a3c3f5a8f0 131 */
nucleosam 0:00a3c3f5a8f0 132 virtual unsigned int GetAcceleration(void) = 0;
nucleosam 0:00a3c3f5a8f0 133
nucleosam 0:00a3c3f5a8f0 134 /**
nucleosam 0:00a3c3f5a8f0 135 * @brief Getting the deceleration in pps^2.
nucleosam 0:00a3c3f5a8f0 136 * @param None.
nucleosam 0:00a3c3f5a8f0 137 * @retval The deceleration in pps^2.
nucleosam 0:00a3c3f5a8f0 138 */
nucleosam 0:00a3c3f5a8f0 139 virtual unsigned int GetDeceleration(void) = 0;
nucleosam 1:8ce2a5d6fbf8 140
nucleosam 0:00a3c3f5a8f0 141 /**
nucleosam 0:00a3c3f5a8f0 142 * @brief Getting the direction of rotation.
nucleosam 0:00a3c3f5a8f0 143 * @param None.
nucleosam 0:00a3c3f5a8f0 144 * @retval The direction of rotation.
nucleosam 0:00a3c3f5a8f0 145 */
nucleosam 0:00a3c3f5a8f0 146 virtual direction_t GetDirection(void) = 0;
nucleosam 0:00a3c3f5a8f0 147
nucleosam 0:00a3c3f5a8f0 148 /**
nucleosam 0:00a3c3f5a8f0 149 * @brief Setting the current position to be the home position.
nucleosam 0:00a3c3f5a8f0 150 * @param None.
nucleosam 0:00a3c3f5a8f0 151 * @retval None.
nucleosam 0:00a3c3f5a8f0 152 */
nucleosam 0:00a3c3f5a8f0 153 virtual void SetHome(void) = 0;
nucleosam 0:00a3c3f5a8f0 154
nucleosam 0:00a3c3f5a8f0 155 /**
nucleosam 0:00a3c3f5a8f0 156 * @brief Setting the current position to be the marked position.
nucleosam 0:00a3c3f5a8f0 157 * @param None.
nucleosam 0:00a3c3f5a8f0 158 * @retval None.
nucleosam 0:00a3c3f5a8f0 159 */
nucleosam 0:00a3c3f5a8f0 160 virtual void SetMark(void) = 0;
nucleosam 0:00a3c3f5a8f0 161
nucleosam 0:00a3c3f5a8f0 162 /**
nucleosam 0:00a3c3f5a8f0 163 * @brief Setting the maximum speed in pps.
nucleosam 0:00a3c3f5a8f0 164 * @param speed The maximum speed in pps.
nucleosam 1:8ce2a5d6fbf8 165 * @retval "true" in case of success, "false" otherwise.
nucleosam 0:00a3c3f5a8f0 166 */
nucleosam 0:00a3c3f5a8f0 167 virtual bool SetMaxSpeed(unsigned int speed) = 0;
nucleosam 0:00a3c3f5a8f0 168
nucleosam 0:00a3c3f5a8f0 169 /**
nucleosam 0:00a3c3f5a8f0 170 * @brief Setting the minimum speed in pps.
nucleosam 0:00a3c3f5a8f0 171 * @param speed The minimum speed in pps.
nucleosam 1:8ce2a5d6fbf8 172 * @retval "true" in case of success, "false" otherwise.
nucleosam 0:00a3c3f5a8f0 173 */
nucleosam 0:00a3c3f5a8f0 174 virtual bool SetMinSpeed(unsigned int speed) = 0;
nucleosam 0:00a3c3f5a8f0 175
nucleosam 0:00a3c3f5a8f0 176 /**
nucleosam 0:00a3c3f5a8f0 177 * @brief Setting the acceleration in pps^2.
nucleosam 0:00a3c3f5a8f0 178 * @param acceleration The acceleration in pps^2.
nucleosam 1:8ce2a5d6fbf8 179 * @retval "true" in case of success, "false" otherwise.
nucleosam 0:00a3c3f5a8f0 180 */
nucleosam 1:8ce2a5d6fbf8 181 virtual bool SetAcceleration(unsigned int acceleration) = 0;
nucleosam 0:00a3c3f5a8f0 182
nucleosam 0:00a3c3f5a8f0 183 /**
nucleosam 0:00a3c3f5a8f0 184 * @brief Setting the deceleration in pps^2.
nucleosam 0:00a3c3f5a8f0 185 * @param deceleration The deceleration in pps^2.
nucleosam 1:8ce2a5d6fbf8 186 * @retval "true" in case of success, "false" otherwise.
nucleosam 0:00a3c3f5a8f0 187 */
nucleosam 1:8ce2a5d6fbf8 188 virtual bool SetDeceleration(unsigned int deceleration) = 0;
nucleosam 1:8ce2a5d6fbf8 189
nucleosam 0:00a3c3f5a8f0 190 /**
nucleosam 0:00a3c3f5a8f0 191 * @brief Setting the Step Mode.
nucleosam 0:00a3c3f5a8f0 192 * @param step_mode The Step Mode.
nucleosam 1:8ce2a5d6fbf8 193 * @retval "true" in case of success, "false" otherwise.
nucleosam 0:00a3c3f5a8f0 194 */
nucleosam 1:8ce2a5d6fbf8 195 virtual bool SetStepMode(step_mode_t step_mode) = 0;
nucleosam 0:00a3c3f5a8f0 196
nucleosam 0:00a3c3f5a8f0 197 /**
nucleosam 0:00a3c3f5a8f0 198 * @brief Going to a specified position.
nucleosam 0:00a3c3f5a8f0 199 * @param position The desired position.
nucleosam 0:00a3c3f5a8f0 200 * @retval None.
nucleosam 0:00a3c3f5a8f0 201 */
nucleosam 0:00a3c3f5a8f0 202 virtual void GoTo(signed int position) = 0;
nucleosam 0:00a3c3f5a8f0 203
nucleosam 0:00a3c3f5a8f0 204 /**
nucleosam 0:00a3c3f5a8f0 205 * @brief Going to the home position.
nucleosam 0:00a3c3f5a8f0 206 * @param None.
nucleosam 0:00a3c3f5a8f0 207 * @retval None.
nucleosam 0:00a3c3f5a8f0 208 */
nucleosam 0:00a3c3f5a8f0 209 virtual void GoHome(void) = 0;
nucleosam 0:00a3c3f5a8f0 210
nucleosam 0:00a3c3f5a8f0 211 /**
nucleosam 0:00a3c3f5a8f0 212 * @brief Going to the marked position.
nucleosam 0:00a3c3f5a8f0 213 * @param None.
nucleosam 0:00a3c3f5a8f0 214 * @retval None.
nucleosam 0:00a3c3f5a8f0 215 */
nucleosam 0:00a3c3f5a8f0 216 virtual void GoMark(void) = 0;
nucleosam 0:00a3c3f5a8f0 217
nucleosam 0:00a3c3f5a8f0 218 /**
nucleosam 0:00a3c3f5a8f0 219 * @brief Running the motor towards a specified direction.
nucleosam 0:00a3c3f5a8f0 220 * @param direction The direction of rotation.
nucleosam 0:00a3c3f5a8f0 221 * @retval None.
nucleosam 0:00a3c3f5a8f0 222 */
nucleosam 0:00a3c3f5a8f0 223 virtual void Run(direction_t direction) = 0;
nucleosam 0:00a3c3f5a8f0 224
nucleosam 0:00a3c3f5a8f0 225 /**
nucleosam 0:00a3c3f5a8f0 226 * @brief Moving the motor towards a specified direction for a certain number of steps.
nucleosam 0:00a3c3f5a8f0 227 * @param direction The direction of rotation.
nucleosam 0:00a3c3f5a8f0 228 * @param steps The desired number of steps.
nucleosam 0:00a3c3f5a8f0 229 * @retval None.
nucleosam 0:00a3c3f5a8f0 230 */
nucleosam 0:00a3c3f5a8f0 231 virtual void Move(direction_t direction, unsigned int steps) = 0;
nucleosam 0:00a3c3f5a8f0 232
nucleosam 0:00a3c3f5a8f0 233 /**
nucleosam 0:00a3c3f5a8f0 234 * @brief Stopping the motor through an immediate deceleration up to zero speed.
nucleosam 0:00a3c3f5a8f0 235 * @param None.
nucleosam 0:00a3c3f5a8f0 236 * @retval None.
nucleosam 0:00a3c3f5a8f0 237 */
nucleosam 0:00a3c3f5a8f0 238 virtual void SoftStop(void) = 0;
nucleosam 0:00a3c3f5a8f0 239
nucleosam 0:00a3c3f5a8f0 240 /**
nucleosam 0:00a3c3f5a8f0 241 * @brief Stopping the motor through an immediate infinite deceleration.
nucleosam 0:00a3c3f5a8f0 242 * @param None.
nucleosam 0:00a3c3f5a8f0 243 * @retval None.
nucleosam 0:00a3c3f5a8f0 244 */
nucleosam 0:00a3c3f5a8f0 245 virtual void HardStop(void) = 0;
nucleosam 0:00a3c3f5a8f0 246
nucleosam 0:00a3c3f5a8f0 247 /**
nucleosam 0:00a3c3f5a8f0 248 * @brief Disabling the power bridge after performing a deceleration to zero.
nucleosam 0:00a3c3f5a8f0 249 * @param None.
nucleosam 0:00a3c3f5a8f0 250 * @retval None.
nucleosam 0:00a3c3f5a8f0 251 */
nucleosam 0:00a3c3f5a8f0 252 virtual void SoftHiZ(void) = 0;
nucleosam 0:00a3c3f5a8f0 253
nucleosam 0:00a3c3f5a8f0 254 /**
nucleosam 0:00a3c3f5a8f0 255 * @brief Disabling the power bridge immediately.
nucleosam 0:00a3c3f5a8f0 256 * @param None.
nucleosam 0:00a3c3f5a8f0 257 * @retval None.
nucleosam 0:00a3c3f5a8f0 258 */
nucleosam 0:00a3c3f5a8f0 259 virtual void HardHiZ(void) = 0;
nucleosam 0:00a3c3f5a8f0 260
nucleosam 0:00a3c3f5a8f0 261 /**
nucleosam 0:00a3c3f5a8f0 262 * @brief Waiting while the motor is active.
nucleosam 0:00a3c3f5a8f0 263 * @param None.
nucleosam 0:00a3c3f5a8f0 264 * @retval None.
nucleosam 0:00a3c3f5a8f0 265 */
nucleosam 0:00a3c3f5a8f0 266 virtual void WaitWhileActive(void) = 0;
nucleosam 0:00a3c3f5a8f0 267 };
nucleosam 0:00a3c3f5a8f0 268
nucleosam 0:00a3c3f5a8f0 269 #endif /* __STEPPERMOTOR_CLASS_H */
nucleosam 0:00a3c3f5a8f0 270
nucleosam 1:8ce2a5d6fbf8 271 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/