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

Dependencies:   X_NUCLEO_COMMON ST_INTERFACES

Dependents:   HelloWorld_IHM02A1 ConcorsoFinal HelloWorld_IHM02A1_mbedOS HelloWorld_IHM02A1-Serialinterpreter ... more

Fork of X_NUCLEO_IHM02A1 by ST Expansion SW Team

Motor Control Library

Introduction

Library to handle the X-NUCLEO-IHM02A1 Motor Control Expansion Board based on the the L6470 component.

Daisy-Chain Configuration

The two L6470 components mounted on this board are connected in daisy-chain configuration. This board can be stacked up to four times so that the eight L6470 components will be connected two-by-two in daisy-chain configuration.

Concerning the SSEL pin of the SPI communication, each expansion board must be in one of the following configuration:

  • SB_23 resistor connected only: SSEL on pin A2;
  • SB_7 resistor connected only: SSEL on pin D2;
  • SB_8 resistor connected only: SSEL on pin D10;
  • SB_9 resistor connected only: SSEL on pin D5.

Arduino Connector Compatibility Warning

X-NUCLEO-IHM02A1 is Arduino compatible with one exception: instead of using D13 pin to drive the SPI clock, it uses D3 pin, hence the default configuration for this library is with the SPI clock on D3 pin.

To be fully Arduino compatible the following patch is required:

  • to remove the SB34 resistor;
  • to solder the SB12 resistor.

Alternatively, you can route the Nucleo board’s D13 pin directly to the expansion board’s D3 pin with a wire. In case you patch your expansion board or route the pin, the SPI clock will be driven on D13 pin rather than on D3 pin, and you have also to initialize the sclk PinName variable with D13 rather than D3. This patch is known to be required, for example, on the following boards: NUCLEO-F103RB, NUCLEO-F302RB, NUCLEO-F411RE, and NUCLEO-F429ZI.

If you use D13 pin for the SPI clock, please be aware that on STM32 Nucleo boards you may not drive the LED, otherwise you will get a conflict: the LED on STM32 Nucleo boards is connected to the D13 pin.

Example Applications

Committer:
Davidroid
Date:
Fri Nov 20 18:07:45 2015 +0000
Revision:
0:92706998571a
Child:
1:b78dab6d2c58
Library to handle the X_NUCLEO_IHM02A1 Motor Control Expansion Board based on the the L6470 component.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Davidroid 0:92706998571a 1 /**
Davidroid 0:92706998571a 2 ******************************************************************************
Davidroid 0:92706998571a 3 * @file microstepping_motor.h
Davidroid 0:92706998571a 4 * @author IPD SYSTEM LAB & TECH MKTG
Davidroid 0:92706998571a 5 * @version V0.0.1
Davidroid 0:92706998571a 6 * @date 04-June-2015
Davidroid 0:92706998571a 7 * @brief This file contains all the functions prototypes for the microstepping
Davidroid 0:92706998571a 8 * motor driver with motion engine.
Davidroid 0:92706998571a 9 ******************************************************************************
Davidroid 0:92706998571a 10 * @attention
Davidroid 0:92706998571a 11 *
Davidroid 0:92706998571a 12 * <h2><center>&copy; COPYRIGHT(c) 2014 STMicroelectronics</center></h2>
Davidroid 0:92706998571a 13 *
Davidroid 0:92706998571a 14 * Redistribution and use in source and binary forms, with or without modification,
Davidroid 0:92706998571a 15 * are permitted provided that the following conditions are met:
Davidroid 0:92706998571a 16 * 1. Redistributions of source code must retain the above copyright notice,
Davidroid 0:92706998571a 17 * this list of conditions and the following disclaimer.
Davidroid 0:92706998571a 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
Davidroid 0:92706998571a 19 * this list of conditions and the following disclaimer in the documentation
Davidroid 0:92706998571a 20 * and/or other materials provided with the distribution.
Davidroid 0:92706998571a 21 * 3. Neither the name of STMicroelectronics nor the names of its contributors
Davidroid 0:92706998571a 22 * may be used to endorse or promote products derived from this software
Davidroid 0:92706998571a 23 * without specific prior written permission.
Davidroid 0:92706998571a 24 *
Davidroid 0:92706998571a 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
Davidroid 0:92706998571a 26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Davidroid 0:92706998571a 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Davidroid 0:92706998571a 28 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
Davidroid 0:92706998571a 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Davidroid 0:92706998571a 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
Davidroid 0:92706998571a 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
Davidroid 0:92706998571a 32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
Davidroid 0:92706998571a 33 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Davidroid 0:92706998571a 34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Davidroid 0:92706998571a 35 *
Davidroid 0:92706998571a 36 ******************************************************************************
Davidroid 0:92706998571a 37 */
Davidroid 0:92706998571a 38
Davidroid 0:92706998571a 39 /* Define to prevent recursive inclusion -------------------------------------*/
Davidroid 0:92706998571a 40 #ifndef __MICROSTEPPINGMOTOR_H
Davidroid 0:92706998571a 41 #define __MICROSTEPPINGMOTOR_H
Davidroid 0:92706998571a 42
Davidroid 0:92706998571a 43 #ifdef __cplusplus
Davidroid 0:92706998571a 44 extern "C" {
Davidroid 0:92706998571a 45 #endif
Davidroid 0:92706998571a 46
Davidroid 0:92706998571a 47 /* Includes ------------------------------------------------------------------*/
Davidroid 0:92706998571a 48 #include <stdint.h>
Davidroid 0:92706998571a 49 #include "component.h"
Davidroid 0:92706998571a 50
Davidroid 0:92706998571a 51 /** @addtogroup BSP
Davidroid 0:92706998571a 52 * @{
Davidroid 0:92706998571a 53 */
Davidroid 0:92706998571a 54
Davidroid 0:92706998571a 55 /** @addtogroup Components
Davidroid 0:92706998571a 56 * @{
Davidroid 0:92706998571a 57 */
Davidroid 0:92706998571a 58
Davidroid 0:92706998571a 59 /** @defgroup MicrosteppingMotorDriver
Davidroid 0:92706998571a 60 * @{
Davidroid 0:92706998571a 61 */
Davidroid 0:92706998571a 62
Davidroid 0:92706998571a 63 /** @defgroup StepperMotorExportedTypes
Davidroid 0:92706998571a 64 * @{
Davidroid 0:92706998571a 65 */
Davidroid 0:92706998571a 66
Davidroid 0:92706998571a 67 /**
Davidroid 0:92706998571a 68 * @brief The L6470 Registers Identifiers.
Davidroid 0:92706998571a 69 */
Davidroid 0:92706998571a 70 typedef enum {
Davidroid 0:92706998571a 71 L6470_ABS_POS_ID = 0, //!< Current position
Davidroid 0:92706998571a 72 L6470_EL_POS_ID, //!< Electrical position
Davidroid 0:92706998571a 73 L6470_MARK_ID, //!< Mark position
Davidroid 0:92706998571a 74 L6470_SPEED_ID, //!< Current speed
Davidroid 0:92706998571a 75 L6470_ACC_ID, //!< Acceleration
Davidroid 0:92706998571a 76 L6470_DEC_ID, //!< Deceleration
Davidroid 0:92706998571a 77 L6470_MAX_SPEED_ID, //!< Maximum speed
Davidroid 0:92706998571a 78 L6470_MIN_SPEED_ID, //!< Minimum speed
Davidroid 0:92706998571a 79 L6470_FS_SPD_ID, //!< Full-step speed
Davidroid 0:92706998571a 80 L6470_KVAL_HOLD_ID, //!< Holding KVAL
Davidroid 0:92706998571a 81 L6470_KVAL_RUN_ID, //!< Constant speed KVAL
Davidroid 0:92706998571a 82 L6470_KVAL_ACC_ID, //!< Acceleration starting KVAL
Davidroid 0:92706998571a 83 L6470_KVAL_DEC_ID, //!< Deceleration starting KVAL
Davidroid 0:92706998571a 84 L6470_INT_SPEED_ID, //!< Intersect speed
Davidroid 0:92706998571a 85 L6470_ST_SLP_ID, //!< Start slope
Davidroid 0:92706998571a 86 L6470_FN_SLP_ACC_ID, //!< Acceleration final slope
Davidroid 0:92706998571a 87 L6470_FN_SLP_DEC_ID, //!< Deceleration final slope
Davidroid 0:92706998571a 88 L6470_K_THERM_ID, //!< Thermal compensation factor
Davidroid 0:92706998571a 89 L6470_ADC_OUT_ID, //!< ADC output, (the reset value is according to startup conditions)
Davidroid 0:92706998571a 90 L6470_OCD_TH_ID, //!< OCD threshold
Davidroid 0:92706998571a 91 L6470_STALL_TH_ID, //!< STALL threshold
Davidroid 0:92706998571a 92 L6470_STEP_MODE_ID, //!< Step mode
Davidroid 0:92706998571a 93 L6470_ALARM_EN_ID, //!< Alarm enable
Davidroid 0:92706998571a 94 L6470_CONFIG_ID, //!< IC configuration
Davidroid 0:92706998571a 95 L6470_STATUS_ID //!< Status, (the reset value is according to startup conditions)
Davidroid 0:92706998571a 96 } eL6470_RegId_t;
Davidroid 0:92706998571a 97
Davidroid 0:92706998571a 98 /**
Davidroid 0:92706998571a 99 * @brief The L6470 Application Commands Identifiers.
Davidroid 0:92706998571a 100 */
Davidroid 0:92706998571a 101 typedef enum {
Davidroid 0:92706998571a 102 L6470_NOP_ID = 0, //!< Nothing
Davidroid 0:92706998571a 103 L6470_SETPARAM_ID, //!< Writes VALUE in PARAM register
Davidroid 0:92706998571a 104 L6470_GETPARAM_ID, //!< Returns the stored value in PARAM register
Davidroid 0:92706998571a 105 L6470_RUN_ID, //!< Sets the target speed and the motor direction
Davidroid 0:92706998571a 106 L6470_STEPCLOCK_ID, //!< Puts the device into Step-clock mode and imposes DIR direction
Davidroid 0:92706998571a 107 L6470_MOVE_ID, //!< Makes N_STEP (micro)steps in DIR direction (Not performable when motor is running)
Davidroid 0:92706998571a 108 L6470_GOTO_ID, //!< Brings motor into ABS_POS position (minimum path)
Davidroid 0:92706998571a 109 L6470_GOTODIR_ID, //!< Brings motor into ABS_POS position forcing DIR direction
Davidroid 0:92706998571a 110 L6470_GOUNTIL_ID, //!< Performs a motion in DIR direction with speed SPD until SW is closed, the ACT action is executed then a SoftStop takes place
Davidroid 0:92706998571a 111 L6470_RELEASESW_ID, //!< Performs a motion in DIR direction at minimum speed until the SW is released (open), the ACT action is executed then a HardStop takes place
Davidroid 0:92706998571a 112 L6470_GOHOME_ID, //!< Brings the motor into HOME position
Davidroid 0:92706998571a 113 L6470_GOMARK_ID, //!< Brings the motor into MARK position
Davidroid 0:92706998571a 114 L6470_RESETPOS_ID, //!< Resets the ABS_POS register (set HOME position)
Davidroid 0:92706998571a 115 L6470_RESETDEVICE_ID, //!< Device is reset to power-up conditions
Davidroid 0:92706998571a 116 L6470_SOFTSTOP_ID, //!< Stops motor with a deceleration phase
Davidroid 0:92706998571a 117 L6470_HARDSTOP_ID, //!< Stops motor immediately
Davidroid 0:92706998571a 118 L6470_SOFTHIZ_ID, //!< Puts the bridges into high impedance status after a deceleration phase
Davidroid 0:92706998571a 119 L6470_HARDHIZ_ID, //!< Puts the bridges into high impedance status immediately
Davidroid 0:92706998571a 120 L6470_GETSTATUS_ID //!< Returns the STATUS register value
Davidroid 0:92706998571a 121 } eL6470_AppCmdId_t;
Davidroid 0:92706998571a 122
Davidroid 0:92706998571a 123 /**
Davidroid 0:92706998571a 124 * @brief The L6470 Status Register Flag identifiers.
Davidroid 0:92706998571a 125 */
Davidroid 0:92706998571a 126 typedef enum {
Davidroid 0:92706998571a 127 HiZ_ID = 0, //!< HiZ flag identifier inside the L6470 Status Register
Davidroid 0:92706998571a 128 BUSY_ID, //!< BUSY flag identifier inside the L6470 Status Register
Davidroid 0:92706998571a 129 SW_F_ID, //!< SW_F flag identifier inside the L6470 Status Register
Davidroid 0:92706998571a 130 SW_EVN_ID, //!< SW_EVN flag identifier inside the L6470 Status Register
Davidroid 0:92706998571a 131 DIR_ID, //!< DIR flag identifier inside the L6470 Status Register
Davidroid 0:92706998571a 132 MOT_STATUS_ID, //!< MOT_STATUS flag identifier inside the L6470 Status Register
Davidroid 0:92706998571a 133 NOTPERF_CMD_ID, //!< NOTPERF_CMD flag identifier inside the L6470 Status Register
Davidroid 0:92706998571a 134 WRONG_CMD_ID, //!< WRONG_CMD flag identifier inside the L6470 Status Register
Davidroid 0:92706998571a 135 UVLO_ID, //!< UVLO flag identifier inside the L6470 Status Register
Davidroid 0:92706998571a 136 TH_WRN_ID, //!< TH_WRN flag identifier inside the L6470 Status Register
Davidroid 0:92706998571a 137 TH_SD_ID, //!< TH_SD flag identifier inside the L6470 Status Register
Davidroid 0:92706998571a 138 OCD_ID, //!< OCD flag identifier inside the L6470 Status Register
Davidroid 0:92706998571a 139 STEP_LOSS_A_ID, //!< STEP_LOSS_A flag identifier inside the L6470 Status Register
Davidroid 0:92706998571a 140 STEP_LOSS_B_ID, //!< STEP_LOSS_B flag identifier inside the L6470 Status Register
Davidroid 0:92706998571a 141 SCK_MOD_ID //!< SCK_MOD flag identifier inside the L6470 Status Register
Davidroid 0:92706998571a 142 } eL6470_StatusRegisterFlagId_t;
Davidroid 0:92706998571a 143
Davidroid 0:92706998571a 144 /**
Davidroid 0:92706998571a 145 * @brief The L6470 Direction identifiers.
Davidroid 0:92706998571a 146 */
Davidroid 0:92706998571a 147 typedef enum {
Davidroid 0:92706998571a 148 L6470_DIR_REV_ID = 0, //!< Reverse direction
Davidroid 0:92706998571a 149 L6470_DIR_FWD_ID //!< Forward direction
Davidroid 0:92706998571a 150 } eL6470_DirId_t;
Davidroid 0:92706998571a 151
Davidroid 0:92706998571a 152 /**
Davidroid 0:92706998571a 153 * @brief The L6470 Action identifiers about ABS_POS register.
Davidroid 0:92706998571a 154 */
Davidroid 0:92706998571a 155 typedef enum {
Davidroid 0:92706998571a 156 L6470_ACT_RST_ID = 0, //!< ABS_POS register is reset
Davidroid 0:92706998571a 157 L6470_ACT_CPY_ID //!< ABS_POS register value is copied into the MARK register
Davidroid 0:92706998571a 158 } eL6470_ActId_t;
Davidroid 0:92706998571a 159
Davidroid 0:92706998571a 160 /**
Davidroid 0:92706998571a 161 * @brief The L6470 Status Register Flag states.
Davidroid 0:92706998571a 162 */
Davidroid 0:92706998571a 163 typedef enum {
Davidroid 0:92706998571a 164 ZERO_F = 0, //!< The flag is '0'
Davidroid 0:92706998571a 165 ONE_F = !ZERO_F //!< The flag is '1'
Davidroid 0:92706998571a 166 } eFlagStatus_t;
Davidroid 0:92706998571a 167
Davidroid 0:92706998571a 168 /**
Davidroid 0:92706998571a 169 * @brief The L6470 Motor Directions.
Davidroid 0:92706998571a 170 */
Davidroid 0:92706998571a 171 typedef enum {
Davidroid 0:92706998571a 172 REVERSE_F = 0, //!< Reverse motor direction
Davidroid 0:92706998571a 173 FORWARD_F = !REVERSE_F //!< Forward motor direction
Davidroid 0:92706998571a 174 } eMotorDirection_t;
Davidroid 0:92706998571a 175
Davidroid 0:92706998571a 176 /**
Davidroid 0:92706998571a 177 * @brief The L6470 Motor Status.
Davidroid 0:92706998571a 178 */
Davidroid 0:92706998571a 179 typedef enum {
Davidroid 0:92706998571a 180 STOPPED_F = 0, //!< Stopped
Davidroid 0:92706998571a 181 ACCELERATION_F = 1, //!< Acceleration
Davidroid 0:92706998571a 182 DECELERATION_F = 2, //!< Deceleration
Davidroid 0:92706998571a 183 CONSTANTSPEED_F = 3 //!< Constant speed
Davidroid 0:92706998571a 184 } eMotorStatus_t;
Davidroid 0:92706998571a 185
Davidroid 0:92706998571a 186 /**
Davidroid 0:92706998571a 187 * @brief The possible stepping modes for L6470.
Davidroid 0:92706998571a 188 */
Davidroid 0:92706998571a 189 typedef enum
Davidroid 0:92706998571a 190 {
Davidroid 0:92706998571a 191 FULL_STEP = 0x00, //!< Full-step
Davidroid 0:92706998571a 192 HALF_STEP = 0x01, //!< Half-step
Davidroid 0:92706998571a 193 MICROSTEP_1_4 = 0x02, //!< 1/4 microstep
Davidroid 0:92706998571a 194 MICROSTEP_1_8 = 0x03, //!< 1/8 microstep
Davidroid 0:92706998571a 195 MICROSTEP_1_16 = 0x04, //!< 1/16 microstep
Davidroid 0:92706998571a 196 MICROSTEP_1_32 = 0x05, //!< 1/32 microstep
Davidroid 0:92706998571a 197 MICROSTEP_1_64 = 0x06, //!< 1/64 microstep
Davidroid 0:92706998571a 198 MICROSTEP_1_128 = 0x07 //!< 1/128 microstep
Davidroid 0:92706998571a 199 } eMotorStepMode_t;
Davidroid 0:92706998571a 200
Davidroid 0:92706998571a 201 /**
Davidroid 0:92706998571a 202 * @brief The identifiers for the possible L6470 alarm conditions.
Davidroid 0:92706998571a 203 */
Davidroid 0:92706998571a 204 typedef enum
Davidroid 0:92706998571a 205 {
Davidroid 0:92706998571a 206 L6470_OVERCURRENT = 0x01, //!< Overcurrent
Davidroid 0:92706998571a 207 L6470_THERMAL_SHUTDOWN = 0x02, //!< Thermal shutdown
Davidroid 0:92706998571a 208 L6470_THERMAL_WARNING = 0x04, //!< Thermal warning
Davidroid 0:92706998571a 209 L6470_UNDERVOLTAGE = 0x08, //!< Undervoltage
Davidroid 0:92706998571a 210 L6470_STALL_DETECTION_A = 0x10, //!< Stall detection (Bridge A)
Davidroid 0:92706998571a 211 L6470_STALL_DETECTION_B = 0x20, //!< Stall detection (Bridge B)
Davidroid 0:92706998571a 212 L6470_SWITCH_TURN_ON_EVENT = 0x40, //!< Switch turn-on event
Davidroid 0:92706998571a 213 L6470_WRONG_OR_NON_PERFORMABLE_COMMAND = 0x80 //!< Wrong or non-performable command
Davidroid 0:92706998571a 214 } eL6470_AlarmCondition_t;
Davidroid 0:92706998571a 215
Davidroid 0:92706998571a 216 /**
Davidroid 0:92706998571a 217 * @brief The L6470 STEP_MODE Register (see L6470 DataSheet for more details).
Davidroid 0:92706998571a 218 */
Davidroid 0:92706998571a 219 typedef struct {
Davidroid 0:92706998571a 220 uint8_t STEP_SEL: 3; //!< Step mode
Davidroid 0:92706998571a 221 uint8_t WRT: 1; //!< When the register is written, this bit should be set to 0.
Davidroid 0:92706998571a 222 uint8_t SYNC_SEL: 3; //!< Synchronization selection
Davidroid 0:92706998571a 223 uint8_t SYNC_EN: 1; //!< Synchronization enable
Davidroid 0:92706998571a 224 } sL6470_StepModeRegister_t;
Davidroid 0:92706998571a 225
Davidroid 0:92706998571a 226 /**
Davidroid 0:92706998571a 227 * @brief The L6470 ALARM_EN Register (see L6470 DataSheet for more details).
Davidroid 0:92706998571a 228 */
Davidroid 0:92706998571a 229 typedef struct {
Davidroid 0:92706998571a 230 uint8_t OCD_EN: 1; //!< Overcurrent
Davidroid 0:92706998571a 231 uint8_t TH_SD_EN: 1; //!< Thermal shutdown
Davidroid 0:92706998571a 232 uint8_t TH_WRN_EN: 1; //!< Thermal warning
Davidroid 0:92706998571a 233 uint8_t UVLO_EN: 1; //!< Undervoltage
Davidroid 0:92706998571a 234 uint8_t STEP_LOSS_A_EN: 1; //!< Stall detection (Bridge A)
Davidroid 0:92706998571a 235 uint8_t STEP_LOSS_B_EN: 1; //!< Stall detection (Bridge B)
Davidroid 0:92706998571a 236 uint8_t SW_EVN_EN: 1; //!< Switch turn-on event
Davidroid 0:92706998571a 237 uint8_t WRONG_NOTPERF_CMD_EN: 1; //!< Wrong or non-performable command
Davidroid 0:92706998571a 238 } sL6470_AlarmEnRegister_t;
Davidroid 0:92706998571a 239
Davidroid 0:92706998571a 240 /**
Davidroid 0:92706998571a 241 * @brief The L6470 CONFIG Register (see L6470 DataSheet for more details).
Davidroid 0:92706998571a 242 */
Davidroid 0:92706998571a 243 typedef struct {
Davidroid 0:92706998571a 244 uint8_t OSC_SEL: 3; //!< Oscillator Selection
Davidroid 0:92706998571a 245 uint8_t EXT_CLK: 1; //!< External Clock
Davidroid 0:92706998571a 246 uint8_t SW_MODE: 1; //!< Switch mode
Davidroid 0:92706998571a 247 uint8_t EN_VSCOMP: 1; //!< Motor supply voltage compensation
Davidroid 0:92706998571a 248 uint8_t RESERVED: 1; //!< RESERVED
Davidroid 0:92706998571a 249 uint8_t OC_SD: 1; //!< Overcurrent event
Davidroid 0:92706998571a 250 uint8_t POW_SR: 2; //!< Output slew rate
Davidroid 0:92706998571a 251 uint8_t F_PWM_DEC: 3; //!< Multiplication factor
Davidroid 0:92706998571a 252 uint8_t F_PWM_INT: 3; //!< Integer division factor
Davidroid 0:92706998571a 253 } sL6470_ConfigRegister_t;
Davidroid 0:92706998571a 254
Davidroid 0:92706998571a 255 /**
Davidroid 0:92706998571a 256 * @brief The L6470 STATUS Register (see L6470 DataSheet for more details).
Davidroid 0:92706998571a 257 */
Davidroid 0:92706998571a 258 typedef struct {
Davidroid 0:92706998571a 259 uint8_t HiZ: 1; //!< The bridges are in high impedance state (the flag is active high)
Davidroid 0:92706998571a 260 uint8_t BUSY: 1; //!< BUSY pin status (the flag is active low)
Davidroid 0:92706998571a 261 uint8_t SW_F: 1; //!< SW input status (the flag is low for open and high for closed)
Davidroid 0:92706998571a 262 uint8_t SW_EVN: 1; //!< Switch turn-on event (the flag is active high)
Davidroid 0:92706998571a 263 uint8_t DIR: 1; //!< The current motor direction (1 as forward, 0 as reverse)
Davidroid 0:92706998571a 264 uint8_t MOT_STATUS: 2; //!< The current motor status (0 as stopped, 1 as acceleration, 2 as deceleration, 3 as constant speed)
Davidroid 0:92706998571a 265 uint8_t NOTPERF_CMD: 1; //!< The command received by SPI cannot be performed (the flag is active high)
Davidroid 0:92706998571a 266 uint8_t WRONG_CMD: 1; //!< The command received by SPI does not exist at all (the flag is active high)
Davidroid 0:92706998571a 267 uint8_t UVLO: 1; //!< Undervoltage lockout or reset events (the flag is active low)
Davidroid 0:92706998571a 268 uint8_t TH_WRN: 1; //!< Thermal warning event (the flag is active low)
Davidroid 0:92706998571a 269 uint8_t TH_SD: 1; //!< Thermal shutdown event (the flag is active low)
Davidroid 0:92706998571a 270 uint8_t OCD: 1; //!< Overcurrent detection event (the flag is active low)
Davidroid 0:92706998571a 271 uint8_t STEP_LOSS_A: 1; //!< Stall detection on bridge A (the flag is active low)
Davidroid 0:92706998571a 272 uint8_t STEP_LOSS_B: 1; //!< Stall detection on bridge B (the flag is active low)
Davidroid 0:92706998571a 273 uint8_t SCK_MOD: 1; //!< Step-clock mode (the flag is active high)
Davidroid 0:92706998571a 274 } sL6470_StatusRegister_t;
Davidroid 0:92706998571a 275
Davidroid 0:92706998571a 276 /**
Davidroid 0:92706998571a 277 * @brief Motor Parameter Data
Davidroid 0:92706998571a 278 */
Davidroid 0:92706998571a 279 typedef struct
Davidroid 0:92706998571a 280 {
Davidroid 0:92706998571a 281 float motorvoltage; //!< motor supply voltage in V
Davidroid 0:92706998571a 282 float fullstepsperrevolution; //!< min number of steps per revolution for the motor
Davidroid 0:92706998571a 283 float phasecurrent; //!< max motor phase voltage in A
Davidroid 0:92706998571a 284 float phasevoltage; //!< max motor phase voltage in V
Davidroid 0:92706998571a 285 float speed; //!< motor initial speed [step/s]
Davidroid 0:92706998571a 286 float acc; //!< motor acceleration [step/s^2] (comment for infinite acceleration mode)
Davidroid 0:92706998571a 287 float dec; //!< motor deceleration [step/s^2] (comment for infinite deceleration mode)
Davidroid 0:92706998571a 288 float maxspeed; //!< motor maximum speed [step/s]
Davidroid 0:92706998571a 289 float minspeed; //!< motor minimum speed [step/s]
Davidroid 0:92706998571a 290 float fsspd; //!< motor full-step speed threshold [step/s]
Davidroid 0:92706998571a 291 float kvalhold; //!< holding kval [V]
Davidroid 0:92706998571a 292 float kvalrun; //!< constant speed kval [V]
Davidroid 0:92706998571a 293 float kvalacc; //!< acceleration starting kval [V]
Davidroid 0:92706998571a 294 float kvaldec; //!< deceleration starting kval [V]
Davidroid 0:92706998571a 295 float intspeed; //!< intersect speed for bemf compensation curve slope changing [step/s]
Davidroid 0:92706998571a 296 float stslp; //!< start slope [s/step]
Davidroid 0:92706998571a 297 float fnslpacc; //!< acceleration final slope [s/step]
Davidroid 0:92706998571a 298 float fnslpdec; //!< deceleration final slope [s/step]
Davidroid 0:92706998571a 299 uint8_t kterm; //!< thermal compensation factor (range [0, 15])
Davidroid 0:92706998571a 300 float ocdth; //!< ocd threshold [ma] (range [375 ma, 6000 ma])
Davidroid 0:92706998571a 301 float stallth; //!< stall threshold [ma] (range [31.25 ma, 4000 ma])
Davidroid 0:92706998571a 302 uint8_t step_sel; //!< step mode selection
Davidroid 0:92706998571a 303 uint8_t alarmen; //!< alarm conditions enable
Davidroid 0:92706998571a 304 uint16_t config; //!< ic configuration
Davidroid 0:92706998571a 305 } MICROSTEPPING_MOTOR_InitTypeDef;
Davidroid 0:92706998571a 306
Davidroid 0:92706998571a 307 /**
Davidroid 0:92706998571a 308 * @brief Stepper Motor Registers
Davidroid 0:92706998571a 309 */
Davidroid 0:92706998571a 310 typedef struct
Davidroid 0:92706998571a 311 {
Davidroid 0:92706998571a 312 uint32_t ABS_POS; //!< CurrentPosition Register
Davidroid 0:92706998571a 313 uint16_t EL_POS; //!< ElectricalPosition Register
Davidroid 0:92706998571a 314 uint32_t MARK; //!< MarkPosition Register
Davidroid 0:92706998571a 315 uint32_t SPEED; //!< CurrentSpeed Register
Davidroid 0:92706998571a 316 uint16_t ACC; //!< Acceleration Register
Davidroid 0:92706998571a 317 uint16_t DEC; //!< Deceleration Register
Davidroid 0:92706998571a 318 uint16_t MAX_SPEED; //!< MaximumSpeed Register
Davidroid 0:92706998571a 319 uint16_t MIN_SPEED; //!< MinimumSpeed Register
Davidroid 0:92706998571a 320 uint16_t FS_SPD; //!< FullStepSpeed Register
Davidroid 0:92706998571a 321 uint8_t KVAL_HOLD; //!< HoldingKval Register
Davidroid 0:92706998571a 322 uint8_t KVAL_RUN; //!< ConstantSpeedKval Register
Davidroid 0:92706998571a 323 uint8_t KVAL_ACC; //!< AccelerationStartingKval Register
Davidroid 0:92706998571a 324 uint8_t KVAL_DEC; //!< DecelerationStartingKval Register
Davidroid 0:92706998571a 325 uint16_t INT_SPEED; //!< IntersectSpeed Register
Davidroid 0:92706998571a 326 uint8_t ST_SLP; //!< StartSlope Register
Davidroid 0:92706998571a 327 uint8_t FN_SLP_ACC; //!< AccelerationFinalSlope Register
Davidroid 0:92706998571a 328 uint8_t FN_SLP_DEC; //!< DecelerationFinalSlope Register
Davidroid 0:92706998571a 329 uint8_t K_THERM; //!< ThermalCompensationFactor Register
Davidroid 0:92706998571a 330 uint8_t ADC_OUT; //!< AdcOutput Register
Davidroid 0:92706998571a 331 uint8_t OCD_TH; //!< OcdThreshold Register
Davidroid 0:92706998571a 332 uint8_t STALL_TH; //!< StallThreshold Register
Davidroid 0:92706998571a 333 uint8_t STEP_MODE; //!< StepMode Register
Davidroid 0:92706998571a 334 uint8_t ALARM_EN; //!< AlarmEnable Register
Davidroid 0:92706998571a 335 uint16_t CONFIG; //!< Config Register
Davidroid 0:92706998571a 336 uint16_t STATUS; //!< Status Register
Davidroid 0:92706998571a 337 } StepperMotorRegister_t;
Davidroid 0:92706998571a 338
Davidroid 0:92706998571a 339 /**
Davidroid 0:92706998571a 340 * @brief Stepper Motor Driver Structure
Davidroid 0:92706998571a 341 */
Davidroid 0:92706998571a 342 typedef struct
Davidroid 0:92706998571a 343 {
Davidroid 0:92706998571a 344 /* ACTION ----------------------------------------------------------------*
Davidroid 0:92706998571a 345 * Declare here the component's generic functions. *
Davidroid 0:92706998571a 346 * Tag this group of functions with the " Generic " C-style comment. *
Davidroid 0:92706998571a 347 * A component's interface has to define at least the two generic *
Davidroid 0:92706998571a 348 * functions provided here below within the "Example" section, as the *
Davidroid 0:92706998571a 349 * first and second functions of its Virtual Table. They have to be *
Davidroid 0:92706998571a 350 * specified exactly in the given way. *
Davidroid 0:92706998571a 351 * *
Davidroid 0:92706998571a 352 * Example: *
Davidroid 0:92706998571a 353 * DrvStatusTypeDef (*Init)(void *handle, INTERFACE_InitTypeDef *init); *
Davidroid 0:92706998571a 354 * DrvStatusTypeDef (*ReadID)(void *handle, uint8_t *id); *
Davidroid 0:92706998571a 355 *------------------------------------------------------------------------*/
Davidroid 0:92706998571a 356 /* Generic */
Davidroid 0:92706998571a 357 DrvStatusTypeDef (*Init)(void *handle, MICROSTEPPING_MOTOR_InitTypeDef *init);
Davidroid 0:92706998571a 358 DrvStatusTypeDef (*ReadID)(void *handle, uint8_t *id);
Davidroid 0:92706998571a 359
Davidroid 0:92706998571a 360 /* ACTION ----------------------------------------------------------------*
Davidroid 0:92706998571a 361 * Declare here the component's specific functions. *
Davidroid 0:92706998571a 362 * Tag this group of functions with the " Specific " C-style comment. *
Davidroid 0:92706998571a 363 * Do not specify any function if not required. *
Davidroid 0:92706998571a 364 * *
Davidroid 0:92706998571a 365 * Example: *
Davidroid 0:92706998571a 366 * DrvStatusTypeDef (*GetValue)(void *handle, float *pfData); *
Davidroid 0:92706998571a 367 *------------------------------------------------------------------------*/
Davidroid 0:92706998571a 368 /* Specific */
Davidroid 0:92706998571a 369 void (*SetParam)(void *handle, eL6470_RegId_t L6470_RegId, uint32_t Value);
Davidroid 0:92706998571a 370 uint32_t (*GetParam)(void *handle, eL6470_RegId_t L6470_RegId);
Davidroid 0:92706998571a 371 void (*Run)(void *handle, eL6470_DirId_t L6470_DirId, uint32_t Speed);
Davidroid 0:92706998571a 372 void (*StepClock)(void *handle, eL6470_DirId_t L6470_DirId);
Davidroid 0:92706998571a 373 void (*Move)(void *handle, eL6470_DirId_t L6470_DirId, uint32_t N_Step);
Davidroid 0:92706998571a 374 void (*GoTo)(void *handle, uint32_t AbsPos);
Davidroid 0:92706998571a 375 void (*GoToDir)(void *handle, eL6470_DirId_t L6470_DirId, uint32_t AbsPos);
Davidroid 0:92706998571a 376 void (*GoUntil)(void *handle, eL6470_ActId_t L6470_ActId, eL6470_DirId_t L6470_DirId, uint32_t Speed);
Davidroid 0:92706998571a 377 void (*ReleaseSW)(void *handle, eL6470_ActId_t L6470_ActId, eL6470_DirId_t L6470_DirId);
Davidroid 0:92706998571a 378 void (*GoHome)(void *handle);
Davidroid 0:92706998571a 379 void (*GoMark)(void *handle);
Davidroid 0:92706998571a 380 void (*ResetPos)(void *handle);
Davidroid 0:92706998571a 381 void (*ResetDevice)(void *handle);
Davidroid 0:92706998571a 382 void (*SoftStop)(void *handle);
Davidroid 0:92706998571a 383 void (*HardStop)(void *handle);
Davidroid 0:92706998571a 384 void (*SoftHiZ)(void *handle);
Davidroid 0:92706998571a 385 void (*HardHiZ)(void *handle);
Davidroid 0:92706998571a 386 uint16_t (*GetStatus)(void *handle);
Davidroid 0:92706998571a 387 void (*PrepareSetParam)(void *handle, eL6470_RegId_t L6470_RegId, uint32_t Value);
Davidroid 0:92706998571a 388 void (*PrepareGetParam)(void *handle, eL6470_RegId_t L6470_RegId);
Davidroid 0:92706998571a 389 void (*PrepareRun)(void *handle, eL6470_DirId_t L6470_DirId, uint32_t Speed);
Davidroid 0:92706998571a 390 void (*PrepareStepClock)(void *handle, eL6470_DirId_t L6470_DirId);
Davidroid 0:92706998571a 391 void (*PrepareMove)(void *handle, eL6470_DirId_t L6470_DirId, uint32_t N_Step);
Davidroid 0:92706998571a 392 void (*PrepareGoTo)(void *handle, uint32_t AbsPos);
Davidroid 0:92706998571a 393 void (*PrepareGoToDir)(void *handle, eL6470_DirId_t L6470_DirId, uint32_t AbsPos);
Davidroid 0:92706998571a 394 void (*PrepareGoUntil)(void *handle, eL6470_ActId_t L6470_ActId, eL6470_DirId_t L6470_DirId, uint32_t Speed);
Davidroid 0:92706998571a 395 void (*PrepareReleaseSW)(void *handle, eL6470_ActId_t L6470_ActId, eL6470_DirId_t L6470_DirId);
Davidroid 0:92706998571a 396 void (*PrepareGoHome)(void *handle);
Davidroid 0:92706998571a 397 void (*PrepareGoMark)(void *handle);
Davidroid 0:92706998571a 398 void (*PrepareResetPos)(void *handle);
Davidroid 0:92706998571a 399 void (*PrepareResetDevice)(void *handle);
Davidroid 0:92706998571a 400 void (*PrepareSoftStop)(void *handle);
Davidroid 0:92706998571a 401 void (*PrepareHardStop)(void *handle);
Davidroid 0:92706998571a 402 void (*PrepareSoftHiZ)(void *handle);
Davidroid 0:92706998571a 403 void (*PrepareHardHiZ)(void *handle);
Davidroid 0:92706998571a 404 void (*PrepareGetStatus)(void *handle);
Davidroid 0:92706998571a 405 uint8_t (*CheckStatusRegisterFlag)(void *handle, uint8_t L6470_StatusRegisterFlagId);
Davidroid 0:92706998571a 406 uint8_t* (*PerformPreparedApplicationCommand)(void *handle);
Davidroid 0:92706998571a 407 uint8_t* (*GetRegisterName)(void *handle, uint8_t id);
Davidroid 0:92706998571a 408 int32_t (*AbsPos_2_Position)(void *handle, uint32_t AbsPos);
Davidroid 0:92706998571a 409 uint32_t (*Position_2_AbsPos)(void *handle, int32_t Position);
Davidroid 0:92706998571a 410 float (*Speed_2_Step_s)(void *handle, uint32_t Speed);
Davidroid 0:92706998571a 411 uint32_t (*Step_s_2_Speed)(void *handle, float Step_s);
Davidroid 0:92706998571a 412 float (*Acc_2_Step_s2)(void *handle, uint16_t Acc);
Davidroid 0:92706998571a 413 uint16_t (*Step_s2_2_Acc)(void *handle, float Step_s2);
Davidroid 0:92706998571a 414 float (*Dec_2_Step_s2)(void *handle, uint16_t Dec);
Davidroid 0:92706998571a 415 uint16_t (*Step_s2_2_Dec)(void *handle, float Step_s2);
Davidroid 0:92706998571a 416 float (*MaxSpeed_2_Step_s)(void *handle, uint16_t MaxSpeed);
Davidroid 0:92706998571a 417 uint16_t (*Step_s_2_MaxSpeed)(void *handle, float Step_s);
Davidroid 0:92706998571a 418 float (*MinSpeed_2_Step_s)(void *handle, uint16_t MinSpeed);
Davidroid 0:92706998571a 419 uint16_t (*Step_s_2_MinSpeed)(void *handle, float Step_s);
Davidroid 0:92706998571a 420 float (*FsSpd_2_Step_s)(void *handle, uint16_t FsSpd);
Davidroid 0:92706998571a 421 uint16_t (*Step_s_2_FsSpd)(void *handle, float Step_s);
Davidroid 0:92706998571a 422 float (*IntSpeed_2_Step_s)(void *handle, uint16_t IntSpeed);
Davidroid 0:92706998571a 423 uint16_t (*Step_s_2_IntSpeed)(void *handle, float Step_s);
Davidroid 0:92706998571a 424 float (*StSlp_2_s_Step)(void *handle, uint8_t StSlp);
Davidroid 0:92706998571a 425 uint8_t (*s_Step_2_StSlp)(void *handle, float s_Step);
Davidroid 0:92706998571a 426 float (*FnSlpAcc_2_s_Step)(void *handle, uint8_t FnSlpAcc);
Davidroid 0:92706998571a 427 uint8_t (*s_Step_2_FnSlpAcc)(void *handle, float s_Step);
Davidroid 0:92706998571a 428 float (*FnSlpDec_2_s_Step)(void *handle, uint8_t FnSlpDec);
Davidroid 0:92706998571a 429 uint8_t (*s_Step_2_FnSlpDec)(void *handle, float s_Step);
Davidroid 0:92706998571a 430 float (*OcdTh_2_mA)(void *handle, uint8_t OcdTh);
Davidroid 0:92706998571a 431 uint8_t (*mA_2_OcdTh)(void *handle, float mA);
Davidroid 0:92706998571a 432 float (*StallTh_2_mA)(void *handle, uint8_t StallTh);
Davidroid 0:92706998571a 433 uint8_t (*mA_2_StallTh)(void *handle, float mA);
Davidroid 0:92706998571a 434 } MICROSTEPPING_MOTOR_DrvVTableTypeDef;
Davidroid 0:92706998571a 435
Davidroid 0:92706998571a 436 /**
Davidroid 0:92706998571a 437 * @brief Stepper Motor Board Driver Structure
Davidroid 0:92706998571a 438 */
Davidroid 0:92706998571a 439 typedef struct
Davidroid 0:92706998571a 440 {
Davidroid 0:92706998571a 441 void (*SetParam)(uint8_t, uint8_t, eL6470_RegId_t, uint32_t);
Davidroid 0:92706998571a 442 uint32_t (*GetParam)(uint8_t, uint8_t, eL6470_RegId_t);
Davidroid 0:92706998571a 443 void (*Run)(uint8_t, uint8_t, eL6470_DirId_t, uint32_t);
Davidroid 0:92706998571a 444 void (*StepClock)(uint8_t, uint8_t, eL6470_DirId_t);
Davidroid 0:92706998571a 445 void (*Move)(uint8_t, uint8_t, eL6470_DirId_t, uint32_t);
Davidroid 0:92706998571a 446 void (*GoTo)(uint8_t, uint8_t L6470_Id, uint32_t AbsPos);
Davidroid 0:92706998571a 447 void (*GoToDir)(uint8_t, uint8_t, eL6470_DirId_t, uint32_t);
Davidroid 0:92706998571a 448 void (*GoUntil)(uint8_t, uint8_t, eL6470_ActId_t, eL6470_DirId_t, uint32_t);
Davidroid 0:92706998571a 449 void (*ReleaseSW)(uint8_t, uint8_t, eL6470_ActId_t, eL6470_DirId_t);
Davidroid 0:92706998571a 450 void (*GoHome)(uint8_t, uint8_t);
Davidroid 0:92706998571a 451 void (*GoMark)(uint8_t, uint8_t);
Davidroid 0:92706998571a 452 void (*ResetPos)(uint8_t, uint8_t);
Davidroid 0:92706998571a 453 void (*ResetDevice)(uint8_t, uint8_t);
Davidroid 0:92706998571a 454 void (*SoftStop)(uint8_t, uint8_t);
Davidroid 0:92706998571a 455 void (*HardStop)(uint8_t, uint8_t);
Davidroid 0:92706998571a 456 void (*SoftHiZ)(uint8_t, uint8_t);
Davidroid 0:92706998571a 457 void (*HardHiZ)(uint8_t, uint8_t);
Davidroid 0:92706998571a 458 uint16_t (*GetStatus)(uint8_t, uint8_t);
Davidroid 0:92706998571a 459 uint8_t (*CheckStatusRegisterFlag)(uint8_t, uint8_t, uint8_t);
Davidroid 0:92706998571a 460 uint8_t* (*PerformPreparedApplicationCommand)(uint8_t);
Davidroid 0:92706998571a 461 } MICROSTEPPING_MOTOR_EB_DrvVTableTypeDef;
Davidroid 0:92706998571a 462
Davidroid 0:92706998571a 463 /**
Davidroid 0:92706998571a 464 * @brief Stepper Motor Handle Structure
Davidroid 0:92706998571a 465 */
Davidroid 0:92706998571a 466 typedef struct __StepperMotorDriver_HandleTypeDef
Davidroid 0:92706998571a 467 {
Davidroid 0:92706998571a 468 uint8_t DaisyChainPosition;
Davidroid 0:92706998571a 469 void (*Config)(MICROSTEPPING_MOTOR_InitTypeDef*);
Davidroid 0:92706998571a 470 MICROSTEPPING_MOTOR_DrvVTableTypeDef *Command;
Davidroid 0:92706998571a 471 } StepperMotorDriverHandle_t;
Davidroid 0:92706998571a 472
Davidroid 0:92706998571a 473 /**
Davidroid 0:92706998571a 474 * @brief Stepper Motor Handle Structure
Davidroid 0:92706998571a 475 */
Davidroid 0:92706998571a 476 typedef struct __StepperMotorBoard_HandleTypeDef
Davidroid 0:92706998571a 477 {
Davidroid 0:92706998571a 478 uint8_t StackedPosition;
Davidroid 0:92706998571a 479 void (*Config)(MICROSTEPPING_MOTOR_InitTypeDef*);
Davidroid 0:92706998571a 480 MICROSTEPPING_MOTOR_EB_DrvVTableTypeDef *Command;
Davidroid 0:92706998571a 481 StepperMotorDriverHandle_t *StepperMotorDriverHandle[2];
Davidroid 0:92706998571a 482 uint8_t (*Select)(uint8_t);
Davidroid 0:92706998571a 483 } StepperMotorBoardHandle_t;
Davidroid 0:92706998571a 484
Davidroid 0:92706998571a 485 /**
Davidroid 0:92706998571a 486 * @}
Davidroid 0:92706998571a 487 */ /* StepperMotorExportedTypes */
Davidroid 0:92706998571a 488
Davidroid 0:92706998571a 489 /**
Davidroid 0:92706998571a 490 * @}
Davidroid 0:92706998571a 491 */ /* MicrosteppingMotorDriver */
Davidroid 0:92706998571a 492
Davidroid 0:92706998571a 493 /**
Davidroid 0:92706998571a 494 * @}
Davidroid 0:92706998571a 495 */ /* Components */
Davidroid 0:92706998571a 496
Davidroid 0:92706998571a 497 /**
Davidroid 0:92706998571a 498 * @}
Davidroid 0:92706998571a 499 */ /* BSP */
Davidroid 0:92706998571a 500
Davidroid 0:92706998571a 501 #ifdef __cplusplus
Davidroid 0:92706998571a 502 }
Davidroid 0:92706998571a 503 #endif
Davidroid 0:92706998571a 504
Davidroid 0:92706998571a 505 #endif /* __MICROSTEPPINGMOTOR_H */
Davidroid 0:92706998571a 506
Davidroid 0:92706998571a 507 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/