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:
davide.aliprandi@st.com
Date:
Fri Mar 10 11:09:21 2017 +0100
Revision:
22:ba7f4131a5e0
Aligning to ARM mbed coding style.

Who changed what in which revision?

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