ST Expansion SW Team / X_NUCLEO_IHM14A1

Dependencies:   ST_INTERFACES

Dependents:   HelloWorld_IHM14A1

Fork of X_NUCLEO_IHM14A1 by Davide Aliprandi

Committer:
Davidroid
Date:
Thu Sep 27 14:05:44 2018 +0000
Revision:
2:4fd08b67958c
Parent:
1:bc265521eb00
Library to handle the X-NUCLEO-IHM14A1 Motor Control Expansion Board based on the STSPIN820 component.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Davidroid 1:bc265521eb00 1 /**
Davidroid 2:4fd08b67958c 2 *******************************************************************************
Davidroid 2:4fd08b67958c 3 * @file STSPIN820.cpp
Davidroid 2:4fd08b67958c 4 * @author STM
Davidroid 2:4fd08b67958c 5 * @version V1.0.0
Davidroid 2:4fd08b67958c 6 * @date August 7th, 2017
Davidroid 2:4fd08b67958c 7 * @brief STSPIN820 driver (fully integrated microstepping motor driver).
Davidroid 2:4fd08b67958c 8 * @note (C) COPYRIGHT 2017 STMicroelectronics
Davidroid 2:4fd08b67958c 9 *******************************************************************************
Davidroid 2:4fd08b67958c 10 * @attention
Davidroid 2:4fd08b67958c 11 *
Davidroid 2:4fd08b67958c 12 * <h2><center>&copy; COPYRIGHT(c) 2017 STMicroelectronics</center></h2>
Davidroid 2:4fd08b67958c 13 *
Davidroid 2:4fd08b67958c 14 * Redistribution and use in source and binary forms, with or without modification,
Davidroid 2:4fd08b67958c 15 * are permitted provided that the following conditions are met:
Davidroid 2:4fd08b67958c 16 * 1. Redistributions of source code must retain the above copyright notice,
Davidroid 2:4fd08b67958c 17 * this list of conditions and the following disclaimer.
Davidroid 2:4fd08b67958c 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
Davidroid 2:4fd08b67958c 19 * this list of conditions and the following disclaimer in the documentation
Davidroid 2:4fd08b67958c 20 * and/or other materials provided with the distribution.
Davidroid 2:4fd08b67958c 21 * 3. Neither the name of STMicroelectronics nor the names of its contributors
Davidroid 2:4fd08b67958c 22 * may be used to endorse or promote products derived from this software
Davidroid 2:4fd08b67958c 23 * without specific prior written permission.
Davidroid 2:4fd08b67958c 24 *
Davidroid 2:4fd08b67958c 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
Davidroid 2:4fd08b67958c 26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Davidroid 2:4fd08b67958c 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Davidroid 2:4fd08b67958c 28 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
Davidroid 2:4fd08b67958c 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Davidroid 2:4fd08b67958c 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
Davidroid 2:4fd08b67958c 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
Davidroid 2:4fd08b67958c 32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
Davidroid 2:4fd08b67958c 33 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Davidroid 2:4fd08b67958c 34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Davidroid 2:4fd08b67958c 35 *
Davidroid 2:4fd08b67958c 36 *******************************************************************************
Davidroid 2:4fd08b67958c 37 */
Davidroid 1:bc265521eb00 38
Davidroid 1:bc265521eb00 39
Davidroid 1:bc265521eb00 40 /* Generated with STM32CubeTOO -----------------------------------------------*/
Davidroid 1:bc265521eb00 41
Davidroid 1:bc265521eb00 42
Davidroid 1:bc265521eb00 43 /* Revision ------------------------------------------------------------------*/
Davidroid 1:bc265521eb00 44 /*
Davidroid 1:bc265521eb00 45 Repository: http://svn.x-nucleodev.codex.cro.st.com/svnroot/X-NucleoDev
Davidroid 1:bc265521eb00 46 Branch/Trunk/Tag: trunk
Davidroid 1:bc265521eb00 47 Based on: X-CUBE-SPN14/trunk/Drivers/BSP/Components/STSPIN820/STSPIN820.c
Davidroid 1:bc265521eb00 48 Revision: 0
Davidroid 1:bc265521eb00 49 */
Davidroid 1:bc265521eb00 50
Davidroid 1:bc265521eb00 51
Davidroid 1:bc265521eb00 52 /* Includes ------------------------------------------------------------------*/
Davidroid 1:bc265521eb00 53
Davidroid 1:bc265521eb00 54 #include "STSPIN820.h"
Davidroid 1:bc265521eb00 55
Davidroid 2:4fd08b67958c 56
Davidroid 2:4fd08b67958c 57 /* Variables ----------------------------------------------------------------*/
Davidroid 2:4fd08b67958c 58
Davidroid 2:4fd08b67958c 59 /* Number of devices. */
Davidroid 2:4fd08b67958c 60 uint8_t STSPIN820::number_of_devices = 0;
Davidroid 2:4fd08b67958c 61
Davidroid 2:4fd08b67958c 62
Davidroid 1:bc265521eb00 63 /* Private function prototypes -----------------------------------------------*/
Davidroid 1:bc265521eb00 64
Davidroid 1:bc265521eb00 65 /** @defgroup STSPIN820_Private_Functions STSPIN820 Private Functions
Davidroid 1:bc265521eb00 66 * @{
Davidroid 1:bc265521eb00 67 */
Davidroid 1:bc265521eb00 68 /* Methods -------------------------------------------------------------------*/
Davidroid 1:bc265521eb00 69
Davidroid 1:bc265521eb00 70 /** @defgroup STSPIN820_Exported_Variables STSPIN820 Exported Variables
Davidroid 1:bc265521eb00 71 * @{
Davidroid 1:bc265521eb00 72 */
Davidroid 1:bc265521eb00 73
Davidroid 1:bc265521eb00 74 /** @defgroup STSPIN820_Library_Functions STSPIN820 Library Functions
Davidroid 1:bc265521eb00 75 * @{
Davidroid 1:bc265521eb00 76 */
Davidroid 1:bc265521eb00 77
Davidroid 2:4fd08b67958c 78 /**********************************************************
Davidroid 2:4fd08b67958c 79 * @brief Starts the STSPIN820 library
Davidroid 2:4fd08b67958c 80 * @param init Initialization structure.
Davidroid 2:4fd08b67958c 81 * @retval COMPONENT_OK in case of success.
Davidroid 1:bc265521eb00 82 **********************************************************/
Davidroid 2:4fd08b67958c 83 status_t STSPIN820::STSPIN820_Init(void *init)
Davidroid 1:bc265521eb00 84 {
Davidroid 1:bc265521eb00 85 /* Initialise the GPIOs */
Davidroid 2:4fd08b67958c 86 STSPIN820_GpioInit();
Davidroid 1:bc265521eb00 87
Davidroid 1:bc265521eb00 88 /* Initialise the timer used for the step clock and ------------------------*/
Davidroid 1:bc265521eb00 89 /* the PWM for the reference voltage generation ----------------------------*/
Davidroid 2:4fd08b67958c 90 STSPIN820_TimStckInit();
Davidroid 2:4fd08b67958c 91 STSPIN820_PwmRefInit();
Davidroid 1:bc265521eb00 92
Davidroid 2:4fd08b67958c 93 if (init == 0)
Davidroid 1:bc265521eb00 94 {
Davidroid 1:bc265521eb00 95 /* Set all context variables to the predefined values */
Davidroid 1:bc265521eb00 96 /* from STSPIN820_config.h */
Davidroid 1:bc265521eb00 97 STSPIN820_SetDeviceParamsToPredefinedValues();
Davidroid 1:bc265521eb00 98 }
Davidroid 1:bc265521eb00 99 else
Davidroid 1:bc265521eb00 100 {
Davidroid 2:4fd08b67958c 101 STSPIN820_SetDeviceParamsToGivenValues((STSPIN820_init_t*) init);
Davidroid 1:bc265521eb00 102 }
Davidroid 2:4fd08b67958c 103
Davidroid 2:4fd08b67958c 104 return COMPONENT_OK;
Davidroid 1:bc265521eb00 105 }
Davidroid 1:bc265521eb00 106
Davidroid 2:4fd08b67958c 107 /**********************************************************
Davidroid 1:bc265521eb00 108 * @brief Read id
Davidroid 2:4fd08b67958c 109 * @param id pointer to the identifier to be read.
Davidroid 2:4fd08b67958c 110 * @retval COMPONENT_OK in case of success.
Davidroid 1:bc265521eb00 111 **********************************************************/
Davidroid 2:4fd08b67958c 112 status_t STSPIN820::STSPIN820_ReadId(uint8_t *id)
Davidroid 1:bc265521eb00 113 {
Davidroid 2:4fd08b67958c 114 *id = device_instance;
Davidroid 2:4fd08b67958c 115
Davidroid 2:4fd08b67958c 116 return COMPONENT_OK;
Davidroid 1:bc265521eb00 117 }
Davidroid 1:bc265521eb00 118
Davidroid 2:4fd08b67958c 119 /**********************************************************
Davidroid 1:bc265521eb00 120 * @brief Attach a user callback to the error Handler.
Davidroid 1:bc265521eb00 121 * The call back will be then called each time the library
Davidroid 1:bc265521eb00 122 * detects an error
Davidroid 1:bc265521eb00 123 * @param[in] callback Name of the callback to attach
Davidroid 1:bc265521eb00 124 * to the error Hanlder
Davidroid 1:bc265521eb00 125 * @retval None
Davidroid 1:bc265521eb00 126 **********************************************************/
Davidroid 1:bc265521eb00 127 void STSPIN820::STSPIN820_AttachErrorHandler(void (*callback)(uint16_t error))
Davidroid 1:bc265521eb00 128 {
Davidroid 1:bc265521eb00 129 error_handler_callback = (void (*)(uint16_t error))callback;
Davidroid 1:bc265521eb00 130 }
Davidroid 1:bc265521eb00 131
Davidroid 2:4fd08b67958c 132 /**********************************************************
Davidroid 1:bc265521eb00 133 * @brief Attach a user callback to the flag Interrupt
Davidroid 1:bc265521eb00 134 * The call back will be then called each time the status
Davidroid 1:bc265521eb00 135 * flag pin will be pulled down due to the occurrence of
Davidroid 1:bc265521eb00 136 * a programmed alarms ( OCD, thermal pre-warning or
Davidroid 1:bc265521eb00 137 * shutdown, UVLO, wrong command, non-performable command)
Davidroid 1:bc265521eb00 138 * @param[in] callback Name of the callback to attach
Davidroid 1:bc265521eb00 139 * to the Flag Interrupt
Davidroid 1:bc265521eb00 140 * @retval None
Davidroid 1:bc265521eb00 141 **********************************************************/
Davidroid 1:bc265521eb00 142 void STSPIN820::STSPIN820_AttachFlagInterrupt(void (*callback)(void))
Davidroid 1:bc265521eb00 143 {
Davidroid 1:bc265521eb00 144 flag_interrupt_callback = (void (*)(void))callback;
Davidroid 1:bc265521eb00 145 }
Davidroid 1:bc265521eb00 146
Davidroid 2:4fd08b67958c 147 /**********************************************************
Davidroid 1:bc265521eb00 148 * @brief Check if STSPIN820 has a fault by reading EN pin position.
Davidroid 1:bc265521eb00 149 * @retval One if STSPIN820 has EN pin down, otherwise zero
Davidroid 1:bc265521eb00 150 **********************************************************/
Davidroid 1:bc265521eb00 151 uint8_t STSPIN820::STSPIN820_CheckStatusHw(void)
Davidroid 1:bc265521eb00 152 {
Davidroid 2:4fd08b67958c 153 if(!STSPIN820_EN_FAULT_PIN_GetState())
Davidroid 1:bc265521eb00 154 {
Davidroid 1:bc265521eb00 155 return 0x01;
Davidroid 1:bc265521eb00 156 }
Davidroid 1:bc265521eb00 157 else
Davidroid 1:bc265521eb00 158 {
Davidroid 1:bc265521eb00 159 return 0x00;
Davidroid 1:bc265521eb00 160 }
Davidroid 1:bc265521eb00 161 }
Davidroid 1:bc265521eb00 162
Davidroid 2:4fd08b67958c 163 /**********************************************************
Davidroid 1:bc265521eb00 164 * @brief Disable the power bridges (leave the output bridges HiZ)
Davidroid 1:bc265521eb00 165 * @retval None
Davidroid 1:bc265521eb00 166 **********************************************************/
Davidroid 2:4fd08b67958c 167 void STSPIN820::STSPIN820_Disable(void)
Davidroid 1:bc265521eb00 168 {
Davidroid 2:4fd08b67958c 169 STSPIN820_Disable_Power_Bridges();
Davidroid 1:bc265521eb00 170 }
Davidroid 1:bc265521eb00 171
Davidroid 2:4fd08b67958c 172 /**********************************************************
Davidroid 1:bc265521eb00 173 * @brief Enable the power bridges
Davidroid 1:bc265521eb00 174 * @retval None
Davidroid 1:bc265521eb00 175 **********************************************************/
Davidroid 2:4fd08b67958c 176 void STSPIN820::STSPIN820_Enable(void)
Davidroid 1:bc265521eb00 177 {
Davidroid 2:4fd08b67958c 178 STSPIN820_Enable_Power_Bridges();
Davidroid 1:bc265521eb00 179 }
Davidroid 1:bc265521eb00 180
Davidroid 2:4fd08b67958c 181 /**********************************************************
Davidroid 1:bc265521eb00 182 * @brief Error handler which calls the user callback (if defined)
Davidroid 1:bc265521eb00 183 * @param[in] error Number of the error
Davidroid 1:bc265521eb00 184 * @retval None
Davidroid 1:bc265521eb00 185 **********************************************************/
Davidroid 1:bc265521eb00 186 void STSPIN820::STSPIN820_ErrorHandler(uint16_t error)
Davidroid 1:bc265521eb00 187 {
Davidroid 1:bc265521eb00 188 if (error_handler_callback != 0)
Davidroid 1:bc265521eb00 189 {
Davidroid 1:bc265521eb00 190 (void) error_handler_callback(error);
Davidroid 1:bc265521eb00 191 }
Davidroid 1:bc265521eb00 192 else
Davidroid 1:bc265521eb00 193 {
Davidroid 1:bc265521eb00 194 while(1)
Davidroid 1:bc265521eb00 195 {
Davidroid 1:bc265521eb00 196 /* Infinite loop */
Davidroid 1:bc265521eb00 197 }
Davidroid 1:bc265521eb00 198 }
Davidroid 1:bc265521eb00 199 }
Davidroid 1:bc265521eb00 200
Davidroid 2:4fd08b67958c 201 /**********************************************************
Davidroid 1:bc265521eb00 202 * @brief Exit STSPIN820 device from standby (low power consumption)
Davidroid 1:bc265521eb00 203 * @retval None
Davidroid 1:bc265521eb00 204 **********************************************************/
Davidroid 2:4fd08b67958c 205 void STSPIN820::STSPIN820_ExitDeviceFromStandby(void)
Davidroid 1:bc265521eb00 206 {
Davidroid 1:bc265521eb00 207 uint32_t sequencerPosition = device_prm.sequencerPosition;
Davidroid 1:bc265521eb00 208
Davidroid 1:bc265521eb00 209 /* Exit standby and set step mode */
Davidroid 1:bc265521eb00 210 /* Disable step clock */
Davidroid 2:4fd08b67958c 211 if (STSPIN820_TimStckStop(&toggle_odd) == 0)
Davidroid 1:bc265521eb00 212 {
Davidroid 1:bc265521eb00 213 STSPIN820_ErrorHandler(STSPIN820_ERROR_STEP_CLOCK);
Davidroid 1:bc265521eb00 214 }
Davidroid 1:bc265521eb00 215
Davidroid 1:bc265521eb00 216 /* Let the PWM REF and bridges enabled at least for DISABLE_DELAY time */
Davidroid 1:bc265521eb00 217 /* after the last step clock rising edge triggering the last step */
Davidroid 2:4fd08b67958c 218 STSPIN820_Delay(DISABLE_DELAY);
Davidroid 1:bc265521eb00 219 /* Set reference voltage to 0 */
Davidroid 2:4fd08b67958c 220 STSPIN820_SetTorque( CURRENT_TORQUE, 0);
Davidroid 1:bc265521eb00 221
Davidroid 1:bc265521eb00 222 /* Disable power bridges */
Davidroid 2:4fd08b67958c 223 STSPIN820_Disable_Power_Bridges();
Davidroid 1:bc265521eb00 224
Davidroid 1:bc265521eb00 225 device_prm.commandExecuted = NO_CMD;
Davidroid 1:bc265521eb00 226 device_prm.stepsToTake = 0;
Davidroid 1:bc265521eb00 227 device_prm.speed = 0;
Davidroid 1:bc265521eb00 228
Davidroid 1:bc265521eb00 229 /* Reset the microstepping sequencer position */
Davidroid 1:bc265521eb00 230 device_prm.sequencerPosition = 0;
Davidroid 1:bc265521eb00 231
Davidroid 1:bc265521eb00 232 /* Reset current and mark positions */
Davidroid 1:bc265521eb00 233 device_prm.currentPosition = 0;
Davidroid 1:bc265521eb00 234 device_prm.markPosition = 0;
Davidroid 1:bc265521eb00 235
Davidroid 2:4fd08b67958c 236 STSPIN820_SetStepMode(device_prm.stepMode);
Davidroid 2:4fd08b67958c 237 STSPIN820_ReleaseReset();
Davidroid 2:4fd08b67958c 238 STSPIN820_Delay(AFTER_STANDBY_EXIT_DEAD_TIME);
Davidroid 1:bc265521eb00 239
Davidroid 2:4fd08b67958c 240 STSPIN820_SetHome();
Davidroid 2:4fd08b67958c 241 STSPIN820_SetMark();
Davidroid 1:bc265521eb00 242
Davidroid 1:bc265521eb00 243 if (device_prm.sequencerPosition != 0)
Davidroid 1:bc265521eb00 244 {
Davidroid 1:bc265521eb00 245 /* Set direction to FORWARD to ensure the HW sequencer is increased at */
Davidroid 1:bc265521eb00 246 /* each step clock rising edge */
Davidroid 2:4fd08b67958c 247 STSPIN820_SetDirection(FORWARD);
Davidroid 1:bc265521eb00 248 /* Going out of standby */
Davidroid 1:bc265521eb00 249 device_prm.motionState = STANDBYTOINACTIVE;
Davidroid 1:bc265521eb00 250 /* Initialize the step clock timer */
Davidroid 2:4fd08b67958c 251 STSPIN820_TimStckInit();
Davidroid 1:bc265521eb00 252 /* Program the step clock */
Davidroid 2:4fd08b67958c 253 STSPIN820_TimStckCompareInit();
Davidroid 2:4fd08b67958c 254 STSPIN820_TimStckSetFreq(STSPIN820_MAX_STCK_FREQ);
Davidroid 1:bc265521eb00 255 toggle_odd = 0;
Davidroid 2:4fd08b67958c 256 STSPIN820_TimStckStart();
Davidroid 1:bc265521eb00 257 while (device_prm.sequencerPosition != 0);
Davidroid 1:bc265521eb00 258 while (toggle_odd!=0);
Davidroid 1:bc265521eb00 259 device_prm.sequencerPosition = sequencerPosition;
Davidroid 1:bc265521eb00 260 }
Davidroid 1:bc265521eb00 261
Davidroid 1:bc265521eb00 262 device_prm.motionState = INACTIVE;
Davidroid 1:bc265521eb00 263 }
Davidroid 1:bc265521eb00 264
Davidroid 2:4fd08b67958c 265 /**********************************************************
Davidroid 1:bc265521eb00 266 * @brief Return the acceleration of the specified device
Davidroid 1:bc265521eb00 267 * @retval Acceleration in pps^2
Davidroid 1:bc265521eb00 268 **********************************************************/
Davidroid 2:4fd08b67958c 269 uint16_t STSPIN820::STSPIN820_GetAcceleration(void)
Davidroid 1:bc265521eb00 270 {
Davidroid 1:bc265521eb00 271 return (device_prm.acceleration);
Davidroid 1:bc265521eb00 272 }
Davidroid 1:bc265521eb00 273
Davidroid 2:4fd08b67958c 274 /**********************************************************
Davidroid 1:bc265521eb00 275 * @brief Return the current speed of the specified device
Davidroid 1:bc265521eb00 276 * @retval Speed in pps
Davidroid 1:bc265521eb00 277 **********************************************************/
Davidroid 2:4fd08b67958c 278 uint16_t STSPIN820::STSPIN820_GetCurrentSpeed(void)
Davidroid 1:bc265521eb00 279 {
Davidroid 1:bc265521eb00 280 return device_prm.speed;
Davidroid 1:bc265521eb00 281 }
Davidroid 1:bc265521eb00 282
Davidroid 2:4fd08b67958c 283 /**********************************************************
Davidroid 1:bc265521eb00 284 * @brief Return the decay mode of the specified device
Davidroid 1:bc265521eb00 285 * @retval Decay Mode State (SLOW or MIXED)
Davidroid 1:bc265521eb00 286 **********************************************************/
Davidroid 2:4fd08b67958c 287 motor_decay_mode_t STSPIN820::STSPIN820_GetDecayMode(void)
Davidroid 1:bc265521eb00 288 {
Davidroid 1:bc265521eb00 289 motor_decay_mode_t status;
Davidroid 2:4fd08b67958c 290 if (STSPIN820_GetDecayGpio() != 0)
Davidroid 1:bc265521eb00 291 {
Davidroid 1:bc265521eb00 292 status = SLOW_DECAY;
Davidroid 1:bc265521eb00 293 }
Davidroid 1:bc265521eb00 294 else
Davidroid 1:bc265521eb00 295 {
Davidroid 1:bc265521eb00 296 status = MIXED_DECAY;
Davidroid 1:bc265521eb00 297 }
Davidroid 1:bc265521eb00 298
Davidroid 1:bc265521eb00 299 return status;
Davidroid 1:bc265521eb00 300 }
Davidroid 1:bc265521eb00 301
Davidroid 2:4fd08b67958c 302 /**********************************************************
Davidroid 1:bc265521eb00 303 * @brief Return the deceleration of the specified device
Davidroid 1:bc265521eb00 304 * @retval Deceleration in pps^2
Davidroid 1:bc265521eb00 305 **********************************************************/
Davidroid 2:4fd08b67958c 306 uint16_t STSPIN820::STSPIN820_GetDeceleration(void)
Davidroid 1:bc265521eb00 307 {
Davidroid 1:bc265521eb00 308 return (device_prm.deceleration);
Davidroid 1:bc265521eb00 309 }
Davidroid 1:bc265521eb00 310
Davidroid 2:4fd08b67958c 311 /**********************************************************
Davidroid 1:bc265521eb00 312 * @brief Return the device state
Davidroid 1:bc265521eb00 313 * @retval State (ACCELERATING, DECELERATING, STEADY or INACTIVE)
Davidroid 1:bc265521eb00 314 **********************************************************/
Davidroid 2:4fd08b67958c 315 motor_state_t STSPIN820::STSPIN820_GetDeviceState(void)
Davidroid 1:bc265521eb00 316 {
Davidroid 1:bc265521eb00 317 return device_prm.motionState;
Davidroid 1:bc265521eb00 318 }
Davidroid 1:bc265521eb00 319
Davidroid 2:4fd08b67958c 320 /**********************************************************
Davidroid 1:bc265521eb00 321 * @brief Get the motor current direction
Davidroid 1:bc265521eb00 322 * @retval direction
Davidroid 1:bc265521eb00 323 **********************************************************/
Davidroid 2:4fd08b67958c 324 motor_direction_t STSPIN820::STSPIN820_GetDirection(void)
Davidroid 1:bc265521eb00 325 {
Davidroid 1:bc265521eb00 326 return device_prm.direction;
Davidroid 1:bc265521eb00 327 }
Davidroid 1:bc265521eb00 328
Davidroid 2:4fd08b67958c 329 /**********************************************************
Davidroid 1:bc265521eb00 330 * @brief Return the FW version of the library
Davidroid 1:bc265521eb00 331 * @retval Stspin220_FW_VERSION
Davidroid 1:bc265521eb00 332 **********************************************************/
Davidroid 1:bc265521eb00 333 uint32_t STSPIN820::STSPIN820_GetFwVersion(void)
Davidroid 1:bc265521eb00 334 {
Davidroid 1:bc265521eb00 335 return (STSPIN820_FW_VERSION);
Davidroid 1:bc265521eb00 336 }
Davidroid 1:bc265521eb00 337
Davidroid 2:4fd08b67958c 338 /**********************************************************
Davidroid 1:bc265521eb00 339 * @brief Return the mark position of the specified device
Davidroid 1:bc265521eb00 340 * @retval mark position value
Davidroid 1:bc265521eb00 341 **********************************************************/
Davidroid 2:4fd08b67958c 342 int32_t STSPIN820::STSPIN820_GetMark(void)
Davidroid 1:bc265521eb00 343 {
Davidroid 1:bc265521eb00 344 return device_prm.markPosition;
Davidroid 1:bc265521eb00 345 }
Davidroid 1:bc265521eb00 346
Davidroid 2:4fd08b67958c 347 /**********************************************************
Davidroid 1:bc265521eb00 348 * @brief Return the max speed of the specified device
Davidroid 1:bc265521eb00 349 * @retval maxSpeed in pps
Davidroid 1:bc265521eb00 350 **********************************************************/
Davidroid 2:4fd08b67958c 351 uint16_t STSPIN820::STSPIN820_GetMaxSpeed(void)
Davidroid 1:bc265521eb00 352 {
Davidroid 1:bc265521eb00 353 return (device_prm.maxSpeed);
Davidroid 1:bc265521eb00 354 }
Davidroid 1:bc265521eb00 355
Davidroid 2:4fd08b67958c 356 /**********************************************************
Davidroid 1:bc265521eb00 357 * @brief Return the min speed of the specified device
Davidroid 1:bc265521eb00 358 * @retval minSpeed in pps
Davidroid 1:bc265521eb00 359 **********************************************************/
Davidroid 2:4fd08b67958c 360 uint16_t STSPIN820::STSPIN820_GetMinSpeed(void)
Davidroid 1:bc265521eb00 361 {
Davidroid 1:bc265521eb00 362 return (device_prm.minSpeed);
Davidroid 1:bc265521eb00 363 }
Davidroid 1:bc265521eb00 364
Davidroid 2:4fd08b67958c 365 /**********************************************************
Davidroid 1:bc265521eb00 366 * @brief Returns the number of devices
Davidroid 1:bc265521eb00 367 * @retval number of devices
Davidroid 1:bc265521eb00 368 **********************************************************/
Davidroid 1:bc265521eb00 369 uint8_t STSPIN820::STSPIN820_GetNbDevices(void)
Davidroid 1:bc265521eb00 370 {
Davidroid 1:bc265521eb00 371 return (number_of_devices);
Davidroid 1:bc265521eb00 372 }
Davidroid 1:bc265521eb00 373
Davidroid 2:4fd08b67958c 374 /**********************************************************
Davidroid 1:bc265521eb00 375 * @brief Return the current position value of the specified device
Davidroid 1:bc265521eb00 376 * @retval current position value
Davidroid 1:bc265521eb00 377 **********************************************************/
Davidroid 2:4fd08b67958c 378 int32_t STSPIN820::STSPIN820_GetPosition(void)
Davidroid 1:bc265521eb00 379 {
Davidroid 1:bc265521eb00 380 return device_prm.currentPosition;
Davidroid 1:bc265521eb00 381 }
Davidroid 1:bc265521eb00 382
Davidroid 2:4fd08b67958c 383 /**********************************************************
Davidroid 1:bc265521eb00 384 * @brief Get the motor step mode
Davidroid 1:bc265521eb00 385 * @retval step mode
Davidroid 1:bc265521eb00 386 **********************************************************/
Davidroid 2:4fd08b67958c 387 motor_step_mode_t STSPIN820::STSPIN820_GetStepMode(void)
Davidroid 1:bc265521eb00 388 {
Davidroid 1:bc265521eb00 389 return device_prm.stepMode;
Davidroid 1:bc265521eb00 390 }
Davidroid 1:bc265521eb00 391
Davidroid 2:4fd08b67958c 392 /**********************************************************
Davidroid 1:bc265521eb00 393 * @brief Get the selected stop mode
Davidroid 1:bc265521eb00 394 * @retval the selected stop mode
Davidroid 1:bc265521eb00 395 **********************************************************/
Davidroid 2:4fd08b67958c 396 motor_stop_mode_t STSPIN820::STSPIN820_GetStopMode(void)
Davidroid 1:bc265521eb00 397 {
Davidroid 1:bc265521eb00 398 return device_prm.stopMode;
Davidroid 1:bc265521eb00 399 }
Davidroid 1:bc265521eb00 400
Davidroid 2:4fd08b67958c 401 /**********************************************************
Davidroid 1:bc265521eb00 402 * @brief Get the torque of the specified device
Davidroid 1:bc265521eb00 403 * @param[in] torqueMode torque mode
Davidroid 1:bc265521eb00 404 * @retval the torqueValue in % (from 0 to 100)
Davidroid 1:bc265521eb00 405 * @note
Davidroid 1:bc265521eb00 406 **********************************************************/
Davidroid 2:4fd08b67958c 407 uint8_t STSPIN820::STSPIN820_GetTorque(motor_torque_mode_t torqueMode)
Davidroid 1:bc265521eb00 408 {
Davidroid 1:bc265521eb00 409 uint8_t torqueValue = 0;
Davidroid 1:bc265521eb00 410 switch(torqueMode)
Davidroid 1:bc265521eb00 411 {
Davidroid 1:bc265521eb00 412 case ACC_TORQUE:
Davidroid 1:bc265521eb00 413 torqueValue = device_prm.accelTorque;
Davidroid 1:bc265521eb00 414 break;
Davidroid 1:bc265521eb00 415 case DEC_TORQUE:
Davidroid 1:bc265521eb00 416 torqueValue = device_prm.decelTorque;
Davidroid 1:bc265521eb00 417 break;
Davidroid 1:bc265521eb00 418 case RUN_TORQUE:
Davidroid 1:bc265521eb00 419 torqueValue = device_prm.runTorque;
Davidroid 1:bc265521eb00 420 break;
Davidroid 1:bc265521eb00 421 case HOLD_TORQUE:
Davidroid 1:bc265521eb00 422 torqueValue = device_prm.holdTorque;
Davidroid 1:bc265521eb00 423 break;
Davidroid 1:bc265521eb00 424 case CURRENT_TORQUE:
Davidroid 1:bc265521eb00 425 torqueValue = device_prm.currentTorque;
Davidroid 1:bc265521eb00 426 break;
Davidroid 1:bc265521eb00 427 default:
Davidroid 1:bc265521eb00 428 break;
Davidroid 1:bc265521eb00 429 }
Davidroid 1:bc265521eb00 430 return torqueValue;
Davidroid 1:bc265521eb00 431 }
Davidroid 1:bc265521eb00 432
Davidroid 2:4fd08b67958c 433 /**********************************************************
Davidroid 1:bc265521eb00 434 * @brief Get the torque boost feature status
Davidroid 1:bc265521eb00 435 * @retval TRUE if enabled, FALSE if disabled
Davidroid 1:bc265521eb00 436 **********************************************************/
Davidroid 2:4fd08b67958c 437 bool STSPIN820::STSPIN820_GetTorqueBoostEnable(void)
Davidroid 1:bc265521eb00 438 {
Davidroid 1:bc265521eb00 439 return device_prm.torqueBoostEnable;
Davidroid 1:bc265521eb00 440 }
Davidroid 1:bc265521eb00 441
Davidroid 2:4fd08b67958c 442 /**********************************************************
Davidroid 1:bc265521eb00 443 * @brief Get the torque boost threshold
Davidroid 2:4fd08b67958c 444 * @param[in] (from 0 to MAX_NUMBER_OF_DEVICES - 1)
Davidroid 1:bc265521eb00 445 * @retval the torque boost threshold above which the step mode is
Davidroid 1:bc265521eb00 446 * changed to full step
Davidroid 1:bc265521eb00 447 **********************************************************/
Davidroid 2:4fd08b67958c 448 uint16_t STSPIN820::STSPIN820_GetTorqueBoostThreshold(void)
Davidroid 1:bc265521eb00 449 {
Davidroid 1:bc265521eb00 450 return device_prm.torqueBoostSpeedThreshold;
Davidroid 1:bc265521eb00 451 }
Davidroid 1:bc265521eb00 452
Davidroid 2:4fd08b67958c 453 /**********************************************************
Davidroid 1:bc265521eb00 454 * @brief Request the motor to move to the home position (ABS_POSITION = 0)
Davidroid 1:bc265521eb00 455 * @retval None
Davidroid 1:bc265521eb00 456 **********************************************************/
Davidroid 2:4fd08b67958c 457 void STSPIN820::STSPIN820_GoHome(void)
Davidroid 1:bc265521eb00 458 {
Davidroid 2:4fd08b67958c 459 STSPIN820_GoTo(0);
Davidroid 1:bc265521eb00 460 }
Davidroid 1:bc265521eb00 461
Davidroid 2:4fd08b67958c 462 /**********************************************************
Davidroid 1:bc265521eb00 463 * @brief Request the motor to move to the mark position
Davidroid 1:bc265521eb00 464 * @retval None
Davidroid 1:bc265521eb00 465 **********************************************************/
Davidroid 2:4fd08b67958c 466 void STSPIN820::STSPIN820_GoMark(void)
Davidroid 1:bc265521eb00 467 {
Davidroid 2:4fd08b67958c 468 STSPIN820_GoTo(device_prm.markPosition);
Davidroid 1:bc265521eb00 469 }
Davidroid 1:bc265521eb00 470
Davidroid 2:4fd08b67958c 471 /**********************************************************
Davidroid 1:bc265521eb00 472 * @brief Request the motor to move to the specified position
Davidroid 1:bc265521eb00 473 * @param[in] targetPosition absolute position in steps
Davidroid 1:bc265521eb00 474 * @retval None
Davidroid 1:bc265521eb00 475 * @note The position is at the resolution corresponding to the
Davidroid 1:bc265521eb00 476 * selected step mode.
Davidroid 1:bc265521eb00 477 * STEP_MODE_FULL : Full step
Davidroid 1:bc265521eb00 478 * STEP_MODE_HALF : 1/2 step
Davidroid 1:bc265521eb00 479 * STEP_MODE_1_4 : 1/4 step
Davidroid 1:bc265521eb00 480 * STEP_MODE_1_8 : 1/8 step
Davidroid 1:bc265521eb00 481 * STEP_MODE_1_16 : 1/16 step
Davidroid 1:bc265521eb00 482 * STEP_MODE_1_32 : 1/32 step
Davidroid 1:bc265521eb00 483 * STEP_MODE_1_128 : 1/128 step
Davidroid 1:bc265521eb00 484 * STEP_MODE_1_256 : 1/256 step
Davidroid 1:bc265521eb00 485 * @note The 1/64 step mode is not allowed
Davidroid 1:bc265521eb00 486 **********************************************************/
Davidroid 2:4fd08b67958c 487 void STSPIN820::STSPIN820_GoTo(int32_t targetPosition)
Davidroid 1:bc265521eb00 488 {
Davidroid 1:bc265521eb00 489 motor_direction_t direction;
Davidroid 1:bc265521eb00 490
Davidroid 1:bc265521eb00 491 /* Exit from standby if needed */
Davidroid 1:bc265521eb00 492 if (device_prm.motionState == STANDBY)
Davidroid 1:bc265521eb00 493 {
Davidroid 2:4fd08b67958c 494 STSPIN820_ExitDeviceFromStandby();
Davidroid 1:bc265521eb00 495 }
Davidroid 1:bc265521eb00 496 /* Deactivate motor if needed */
Davidroid 1:bc265521eb00 497 else if (device_prm.motionState != INACTIVE)
Davidroid 1:bc265521eb00 498 {
Davidroid 2:4fd08b67958c 499 STSPIN820_HardHiZ();
Davidroid 1:bc265521eb00 500 }
Davidroid 1:bc265521eb00 501
Davidroid 1:bc265521eb00 502 if (targetPosition > device_prm.currentPosition)
Davidroid 1:bc265521eb00 503 {
Davidroid 1:bc265521eb00 504 device_prm.stepsToTake = targetPosition -\
Davidroid 1:bc265521eb00 505 device_prm.currentPosition;
Davidroid 1:bc265521eb00 506 if (device_prm.stepsToTake < (STSPIN820_POSITION_RANGE>>1))
Davidroid 1:bc265521eb00 507 {
Davidroid 1:bc265521eb00 508 direction = FORWARD;
Davidroid 1:bc265521eb00 509 }
Davidroid 1:bc265521eb00 510 else
Davidroid 1:bc265521eb00 511 {
Davidroid 1:bc265521eb00 512 direction = BACKWARD;
Davidroid 1:bc265521eb00 513 device_prm.stepsToTake = STSPIN820_POSITION_RANGE -\
Davidroid 1:bc265521eb00 514 device_prm.stepsToTake;
Davidroid 1:bc265521eb00 515 }
Davidroid 1:bc265521eb00 516 }
Davidroid 1:bc265521eb00 517 else
Davidroid 1:bc265521eb00 518 {
Davidroid 1:bc265521eb00 519 device_prm.stepsToTake = device_prm.currentPosition -\
Davidroid 1:bc265521eb00 520 targetPosition;
Davidroid 1:bc265521eb00 521 if (device_prm.stepsToTake < (STSPIN820_POSITION_RANGE>>1))
Davidroid 1:bc265521eb00 522 {
Davidroid 1:bc265521eb00 523 direction = BACKWARD;
Davidroid 1:bc265521eb00 524 }
Davidroid 1:bc265521eb00 525 else
Davidroid 1:bc265521eb00 526 {
Davidroid 1:bc265521eb00 527 direction = FORWARD;
Davidroid 1:bc265521eb00 528 device_prm.stepsToTake = STSPIN820_POSITION_RANGE -\
Davidroid 1:bc265521eb00 529 device_prm.stepsToTake;
Davidroid 1:bc265521eb00 530 }
Davidroid 1:bc265521eb00 531 }
Davidroid 1:bc265521eb00 532
Davidroid 1:bc265521eb00 533 if (device_prm.stepsToTake != 0)
Davidroid 1:bc265521eb00 534 {
Davidroid 1:bc265521eb00 535 device_prm.commandExecuted = MOVE_CMD;
Davidroid 1:bc265521eb00 536
Davidroid 1:bc265521eb00 537 /* Direction setup */
Davidroid 2:4fd08b67958c 538 STSPIN820_SetDirection(direction);
Davidroid 1:bc265521eb00 539
Davidroid 2:4fd08b67958c 540 STSPIN820_ComputeSpeedProfile(device_prm.stepsToTake);
Davidroid 1:bc265521eb00 541
Davidroid 1:bc265521eb00 542 /* Motor activation */
Davidroid 2:4fd08b67958c 543 STSPIN820_StartMovement();
Davidroid 1:bc265521eb00 544 }
Davidroid 1:bc265521eb00 545 }
Davidroid 1:bc265521eb00 546
Davidroid 2:4fd08b67958c 547 /**********************************************************
Davidroid 1:bc265521eb00 548 * @brief Move the motor to the absolute position
Davidroid 1:bc265521eb00 549 * @param[in] direction FORWARD or BACKWARD
Davidroid 1:bc265521eb00 550 * @param[in] targetPosition 32 bit signed value position
Davidroid 1:bc265521eb00 551 * @retval None
Davidroid 1:bc265521eb00 552 * @note The position is at the resolution corresponding to the
Davidroid 1:bc265521eb00 553 * selected step mode.
Davidroid 1:bc265521eb00 554 * STEP_MODE_FULL : step
Davidroid 1:bc265521eb00 555 * STEP_MODE_HALF : 1/2 step
Davidroid 1:bc265521eb00 556 * STEP_MODE_1_4 : 1/4 step
Davidroid 1:bc265521eb00 557 * STEP_MODE_1_8 : 1/8 step
Davidroid 1:bc265521eb00 558 * STEP_MODE_1_16 : 1/16 step
Davidroid 1:bc265521eb00 559 * STEP_MODE_1_32 : 1/32 step
Davidroid 1:bc265521eb00 560 * STEP_MODE_1_128 : 1/128 step
Davidroid 1:bc265521eb00 561 * STEP_MODE_1_256 : 1/256 step
Davidroid 1:bc265521eb00 562 * @note The 1/64 step mode is not allowed
Davidroid 1:bc265521eb00 563 **********************************************************/
Davidroid 2:4fd08b67958c 564 void STSPIN820::STSPIN820_GoToDir(motor_direction_t direction, int32_t targetPosition)
Davidroid 1:bc265521eb00 565 {
Davidroid 1:bc265521eb00 566 /* Exit from standby if needed */
Davidroid 1:bc265521eb00 567 if (device_prm.motionState == STANDBY)
Davidroid 1:bc265521eb00 568 {
Davidroid 2:4fd08b67958c 569 STSPIN820_ExitDeviceFromStandby();
Davidroid 1:bc265521eb00 570 }
Davidroid 1:bc265521eb00 571 /* Deactivate motor if needed */
Davidroid 1:bc265521eb00 572 else if (device_prm.motionState != INACTIVE)
Davidroid 1:bc265521eb00 573 {
Davidroid 2:4fd08b67958c 574 STSPIN820_HardHiZ();
Davidroid 1:bc265521eb00 575 }
Davidroid 1:bc265521eb00 576
Davidroid 1:bc265521eb00 577 if (direction != BACKWARD)
Davidroid 1:bc265521eb00 578 {
Davidroid 1:bc265521eb00 579 if (targetPosition > device_prm.currentPosition)
Davidroid 1:bc265521eb00 580 {
Davidroid 1:bc265521eb00 581 device_prm.stepsToTake = targetPosition -\
Davidroid 1:bc265521eb00 582 device_prm.currentPosition;
Davidroid 1:bc265521eb00 583 }
Davidroid 1:bc265521eb00 584 else
Davidroid 1:bc265521eb00 585 {
Davidroid 1:bc265521eb00 586 device_prm.stepsToTake = STSPIN820_POSITION_RANGE +\
Davidroid 1:bc265521eb00 587 (targetPosition -\
Davidroid 1:bc265521eb00 588 device_prm.currentPosition);
Davidroid 1:bc265521eb00 589 }
Davidroid 1:bc265521eb00 590 }
Davidroid 1:bc265521eb00 591 else
Davidroid 1:bc265521eb00 592 {
Davidroid 1:bc265521eb00 593 if (targetPosition > device_prm.currentPosition)
Davidroid 1:bc265521eb00 594 {
Davidroid 1:bc265521eb00 595 device_prm.stepsToTake = STSPIN820_POSITION_RANGE +\
Davidroid 1:bc265521eb00 596 (device_prm.currentPosition -\
Davidroid 1:bc265521eb00 597 targetPosition);
Davidroid 1:bc265521eb00 598 }
Davidroid 1:bc265521eb00 599 else
Davidroid 1:bc265521eb00 600 {
Davidroid 1:bc265521eb00 601 device_prm.stepsToTake = device_prm.currentPosition -\
Davidroid 1:bc265521eb00 602 targetPosition;
Davidroid 1:bc265521eb00 603 }
Davidroid 1:bc265521eb00 604 }
Davidroid 1:bc265521eb00 605
Davidroid 1:bc265521eb00 606 if (device_prm.stepsToTake != 0)
Davidroid 1:bc265521eb00 607 {
Davidroid 1:bc265521eb00 608 device_prm.commandExecuted = MOVE_CMD;
Davidroid 1:bc265521eb00 609
Davidroid 1:bc265521eb00 610 /* Direction setup */
Davidroid 2:4fd08b67958c 611 STSPIN820_SetDirection(direction);
Davidroid 1:bc265521eb00 612
Davidroid 2:4fd08b67958c 613 STSPIN820_ComputeSpeedProfile(device_prm.stepsToTake);
Davidroid 1:bc265521eb00 614
Davidroid 1:bc265521eb00 615 /* Motor activation */
Davidroid 2:4fd08b67958c 616 STSPIN820_StartMovement();
Davidroid 1:bc265521eb00 617 }
Davidroid 1:bc265521eb00 618 }
Davidroid 1:bc265521eb00 619
Davidroid 2:4fd08b67958c 620 /**********************************************************
Davidroid 1:bc265521eb00 621 * @brief Immediatly stop the motor and disable the power bridge
Davidroid 1:bc265521eb00 622 * @retval None
Davidroid 1:bc265521eb00 623 **********************************************************/
Davidroid 2:4fd08b67958c 624 void STSPIN820::STSPIN820_HardHiZ(void)
Davidroid 1:bc265521eb00 625 {
Davidroid 1:bc265521eb00 626 /* Set inactive state */
Davidroid 1:bc265521eb00 627 device_prm.motionState = INACTIVE;
Davidroid 1:bc265521eb00 628
Davidroid 1:bc265521eb00 629 /* Disable step clock */
Davidroid 2:4fd08b67958c 630 if (STSPIN820_TimStckStop(&toggle_odd) == 0)
Davidroid 1:bc265521eb00 631 {
Davidroid 1:bc265521eb00 632 STSPIN820_ErrorHandler(STSPIN820_ERROR_STEP_CLOCK);
Davidroid 1:bc265521eb00 633 }
Davidroid 1:bc265521eb00 634
Davidroid 1:bc265521eb00 635 /* Let the PWM REF and bridges enabled at least for DISABLE_DELAY time */
Davidroid 1:bc265521eb00 636 /* after the last step clock rising edge triggering the last step */
Davidroid 2:4fd08b67958c 637 STSPIN820_Delay(DISABLE_DELAY);
Davidroid 1:bc265521eb00 638
Davidroid 1:bc265521eb00 639 /* Set reference voltage to 0 */
Davidroid 2:4fd08b67958c 640 STSPIN820_SetTorque(CURRENT_TORQUE, 0);
Davidroid 1:bc265521eb00 641
Davidroid 1:bc265521eb00 642 /* Disable power bridges */
Davidroid 2:4fd08b67958c 643 STSPIN820_Disable_Power_Bridges();
Davidroid 1:bc265521eb00 644
Davidroid 1:bc265521eb00 645 /* Comeback to nominal step mode */
Davidroid 1:bc265521eb00 646 if (device_prm.stepModeLatched != device_prm.stepMode)
Davidroid 1:bc265521eb00 647 {
Davidroid 1:bc265521eb00 648 motor_step_mode_t StepMode = device_prm.stepModeLatched;
Davidroid 2:4fd08b67958c 649 STSPIN820_SetStepMode(StepMode);
Davidroid 1:bc265521eb00 650 device_prm.stepMode = device_prm.stepModeLatched;
Davidroid 1:bc265521eb00 651 }
Davidroid 1:bc265521eb00 652
Davidroid 1:bc265521eb00 653 device_prm.commandExecuted = NO_CMD;
Davidroid 1:bc265521eb00 654 device_prm.stepsToTake = 0;
Davidroid 1:bc265521eb00 655 device_prm.speed = 0;
Davidroid 1:bc265521eb00 656 }
Davidroid 1:bc265521eb00 657
Davidroid 2:4fd08b67958c 658 /**********************************************************
Davidroid 1:bc265521eb00 659 * @brief Immediatly stop the motor
Davidroid 1:bc265521eb00 660 * and either set holding torque when stop mode is HOLD_MODE,
Davidroid 1:bc265521eb00 661 * or call STSPIN820_HardHiz function when stop mode is HIZ_MODE,
Davidroid 1:bc265521eb00 662 * or call STSPIN820_PutDeviceInStandby function when stop mode is STANDBY_MODE
Davidroid 1:bc265521eb00 663 * @retval None
Davidroid 1:bc265521eb00 664 **********************************************************/
Davidroid 2:4fd08b67958c 665 void STSPIN820::STSPIN820_HardStop(void)
Davidroid 1:bc265521eb00 666 {
Davidroid 1:bc265521eb00 667 if (device_prm.stopMode == HOLD_MODE)
Davidroid 1:bc265521eb00 668 {
Davidroid 1:bc265521eb00 669 /* Set inactive state */
Davidroid 1:bc265521eb00 670 device_prm.motionState = INACTIVE;
Davidroid 1:bc265521eb00 671
Davidroid 1:bc265521eb00 672 /* Disable step clock */
Davidroid 2:4fd08b67958c 673 if (STSPIN820_TimStckStop(&toggle_odd) == 0)
Davidroid 1:bc265521eb00 674 {
Davidroid 1:bc265521eb00 675 STSPIN820_ErrorHandler(STSPIN820_ERROR_STEP_CLOCK);
Davidroid 1:bc265521eb00 676 }
Davidroid 1:bc265521eb00 677
Davidroid 1:bc265521eb00 678 /* Set holding torque */
Davidroid 2:4fd08b67958c 679 STSPIN820_ApplyTorque(HOLD_TORQUE);
Davidroid 1:bc265521eb00 680
Davidroid 1:bc265521eb00 681 /* Comeback to nominal step mode */
Davidroid 1:bc265521eb00 682 if (device_prm.stepModeLatched != device_prm.stepMode)
Davidroid 1:bc265521eb00 683 {
Davidroid 1:bc265521eb00 684 motor_step_mode_t StepMode = device_prm.stepModeLatched;
Davidroid 2:4fd08b67958c 685 STSPIN820_SetStepMode(StepMode);
Davidroid 1:bc265521eb00 686 device_prm.stepMode = device_prm.stepModeLatched;
Davidroid 1:bc265521eb00 687 }
Davidroid 1:bc265521eb00 688
Davidroid 1:bc265521eb00 689 device_prm.commandExecuted = NO_CMD;
Davidroid 1:bc265521eb00 690 device_prm.stepsToTake = 0;
Davidroid 1:bc265521eb00 691 device_prm.speed = 0;
Davidroid 1:bc265521eb00 692 }
Davidroid 1:bc265521eb00 693 else if (device_prm.stopMode == HIZ_MODE)
Davidroid 1:bc265521eb00 694 {
Davidroid 2:4fd08b67958c 695 STSPIN820_HardHiZ();
Davidroid 1:bc265521eb00 696 }
Davidroid 1:bc265521eb00 697 else if (device_prm.stopMode == STANDBY_MODE)
Davidroid 1:bc265521eb00 698 {
Davidroid 2:4fd08b67958c 699 STSPIN820_PutDeviceInStandby();
Davidroid 1:bc265521eb00 700 }
Davidroid 1:bc265521eb00 701 }
Davidroid 1:bc265521eb00 702
Davidroid 2:4fd08b67958c 703 /**********************************************************
Davidroid 1:bc265521eb00 704 * @brief Moves the motor of the specified number of steps
Davidroid 1:bc265521eb00 705 * @param[in] direction FORWARD or BACKWARD
Davidroid 1:bc265521eb00 706 * @param[in] stepCount Number of steps to perform
Davidroid 1:bc265521eb00 707 * @retval None
Davidroid 1:bc265521eb00 708 **********************************************************/
Davidroid 2:4fd08b67958c 709 void STSPIN820::STSPIN820_Move(motor_direction_t direction, uint32_t stepCount)
Davidroid 1:bc265521eb00 710 {
Davidroid 1:bc265521eb00 711 /* Exit from standby if needed */
Davidroid 1:bc265521eb00 712 if (device_prm.motionState == STANDBY)
Davidroid 1:bc265521eb00 713 {
Davidroid 2:4fd08b67958c 714 STSPIN820_ExitDeviceFromStandby();
Davidroid 1:bc265521eb00 715 }
Davidroid 1:bc265521eb00 716 /* Deactivate motor if needed */
Davidroid 1:bc265521eb00 717 else if (device_prm.motionState != INACTIVE)
Davidroid 1:bc265521eb00 718 {
Davidroid 2:4fd08b67958c 719 STSPIN820_HardHiZ();
Davidroid 1:bc265521eb00 720 }
Davidroid 1:bc265521eb00 721
Davidroid 1:bc265521eb00 722 if (stepCount != 0)
Davidroid 1:bc265521eb00 723 {
Davidroid 1:bc265521eb00 724 device_prm.stepsToTake = stepCount;
Davidroid 1:bc265521eb00 725 device_prm.commandExecuted = MOVE_CMD;
Davidroid 1:bc265521eb00 726
Davidroid 1:bc265521eb00 727 /* Direction setup */
Davidroid 2:4fd08b67958c 728 STSPIN820_SetDirection(direction);
Davidroid 1:bc265521eb00 729
Davidroid 2:4fd08b67958c 730 STSPIN820_ComputeSpeedProfile(stepCount);
Davidroid 1:bc265521eb00 731
Davidroid 1:bc265521eb00 732 /* Motor activation */
Davidroid 2:4fd08b67958c 733 STSPIN820_StartMovement();
Davidroid 1:bc265521eb00 734 }
Davidroid 1:bc265521eb00 735 }
Davidroid 1:bc265521eb00 736
Davidroid 2:4fd08b67958c 737 /**********************************************************
Davidroid 1:bc265521eb00 738 * @brief Put STSPIN820 device in standby (low power consumption)
Davidroid 1:bc265521eb00 739 * @retval None
Davidroid 1:bc265521eb00 740 **********************************************************/
Davidroid 2:4fd08b67958c 741 void STSPIN820::STSPIN820_PutDeviceInStandby(void)
Davidroid 1:bc265521eb00 742 {
Davidroid 1:bc265521eb00 743 /* Stop movement */
Davidroid 2:4fd08b67958c 744 STSPIN820_HardHiZ();
Davidroid 1:bc265521eb00 745
Davidroid 1:bc265521eb00 746 /* Enter standby */
Davidroid 2:4fd08b67958c 747 STSPIN820_Reset();
Davidroid 1:bc265521eb00 748
Davidroid 1:bc265521eb00 749 device_prm.motionState = STANDBY;
Davidroid 1:bc265521eb00 750 }
Davidroid 1:bc265521eb00 751
Davidroid 2:4fd08b67958c 752 /**********************************************************
Davidroid 1:bc265521eb00 753 * @brief Runs the motor. It will accelerate from the min
Davidroid 1:bc265521eb00 754 * speed up to the max speed by using the device acceleration.
Davidroid 1:bc265521eb00 755 * @param[in] direction FORWARD or BACKWARD
Davidroid 1:bc265521eb00 756 * @retval None
Davidroid 1:bc265521eb00 757 **********************************************************/
Davidroid 2:4fd08b67958c 758 void STSPIN820::STSPIN820_Run(motor_direction_t direction)
Davidroid 1:bc265521eb00 759 {
Davidroid 1:bc265521eb00 760 /* Exit from standby if needed */
Davidroid 1:bc265521eb00 761 if (device_prm.motionState == STANDBY)
Davidroid 1:bc265521eb00 762 {
Davidroid 2:4fd08b67958c 763 STSPIN820_ExitDeviceFromStandby();
Davidroid 1:bc265521eb00 764 }
Davidroid 1:bc265521eb00 765 /* Deactivate motor if needed */
Davidroid 1:bc265521eb00 766 else if (device_prm.motionState != INACTIVE)
Davidroid 1:bc265521eb00 767 {
Davidroid 2:4fd08b67958c 768 STSPIN820_HardHiZ();
Davidroid 1:bc265521eb00 769 }
Davidroid 1:bc265521eb00 770
Davidroid 1:bc265521eb00 771 /* Direction setup */
Davidroid 2:4fd08b67958c 772 STSPIN820_SetDirection(direction);
Davidroid 1:bc265521eb00 773 device_prm.commandExecuted = RUN_CMD;
Davidroid 1:bc265521eb00 774 /* Motor activation */
Davidroid 2:4fd08b67958c 775 STSPIN820_StartMovement();
Davidroid 1:bc265521eb00 776 }
Davidroid 1:bc265521eb00 777
Davidroid 2:4fd08b67958c 778 /**********************************************************
Davidroid 1:bc265521eb00 779 * @brief Changes the acceleration of the specified device
Davidroid 1:bc265521eb00 780 * @param[in] newAcc New acceleration to apply in pps^2
Davidroid 1:bc265521eb00 781 * @retval true if the command is successfully executed, else false
Davidroid 1:bc265521eb00 782 * @note The command is not performed if the device is executing
Davidroid 1:bc265521eb00 783 * a MOVE or GOTO command (but it can be used during a RUN command)
Davidroid 1:bc265521eb00 784 **********************************************************/
Davidroid 2:4fd08b67958c 785 bool STSPIN820::STSPIN820_SetAcceleration(uint16_t newAcc)
Davidroid 1:bc265521eb00 786 {
Davidroid 1:bc265521eb00 787 bool cmdExecuted = FALSE;
Davidroid 1:bc265521eb00 788 if ((newAcc != 0)&&
Davidroid 1:bc265521eb00 789 (((device_prm.motionState & INACTIVE) == INACTIVE)||
Davidroid 1:bc265521eb00 790 (device_prm.commandExecuted == RUN_CMD)))
Davidroid 1:bc265521eb00 791 {
Davidroid 1:bc265521eb00 792 device_prm.acceleration = newAcc;
Davidroid 1:bc265521eb00 793 cmdExecuted = TRUE;
Davidroid 1:bc265521eb00 794 }
Davidroid 1:bc265521eb00 795 return cmdExecuted;
Davidroid 1:bc265521eb00 796 }
Davidroid 1:bc265521eb00 797
Davidroid 2:4fd08b67958c 798 /**********************************************************
Davidroid 1:bc265521eb00 799 * @brief Specifies the decay mode
Davidroid 1:bc265521eb00 800 * @param[in] decay SLOW_DECAY or MIXED_DECAY
Davidroid 1:bc265521eb00 801 * @retval true if the command is successfully executed, else false
Davidroid 1:bc265521eb00 802 **********************************************************/
Davidroid 2:4fd08b67958c 803 void STSPIN820::STSPIN820_SetDecayMode(motor_decay_mode_t decay)
Davidroid 1:bc265521eb00 804 {
Davidroid 1:bc265521eb00 805 if (decay == SLOW_DECAY)
Davidroid 1:bc265521eb00 806 {
Davidroid 2:4fd08b67958c 807 STSPIN820_SetDecayGpio(1);
Davidroid 1:bc265521eb00 808 }
Davidroid 1:bc265521eb00 809 else if (decay == MIXED_DECAY)
Davidroid 1:bc265521eb00 810 {
Davidroid 2:4fd08b67958c 811 STSPIN820_SetDecayGpio(0);
Davidroid 1:bc265521eb00 812 }
Davidroid 1:bc265521eb00 813 }
Davidroid 1:bc265521eb00 814
Davidroid 2:4fd08b67958c 815 /**********************************************************
Davidroid 1:bc265521eb00 816 * @brief Changes the deceleration of the specified device
Davidroid 1:bc265521eb00 817 * @param[in] newDec New deceleration to apply in pps^2
Davidroid 1:bc265521eb00 818 * @retval true if the command is successfully executed, else false
Davidroid 1:bc265521eb00 819 * @note The command is not performed if the device is executing
Davidroid 1:bc265521eb00 820 * a MOVE or GOTO command (but it can be used during a RUN command)
Davidroid 1:bc265521eb00 821 **********************************************************/
Davidroid 2:4fd08b67958c 822 bool STSPIN820::STSPIN820_SetDeceleration(uint16_t newDec)
Davidroid 1:bc265521eb00 823 {
Davidroid 1:bc265521eb00 824 bool cmdExecuted = FALSE;
Davidroid 1:bc265521eb00 825 if ((newDec != 0)&&
Davidroid 1:bc265521eb00 826 (((device_prm.motionState & INACTIVE) == INACTIVE)||
Davidroid 1:bc265521eb00 827 (device_prm.commandExecuted == RUN_CMD)))
Davidroid 1:bc265521eb00 828 {
Davidroid 1:bc265521eb00 829 device_prm.deceleration = newDec;
Davidroid 1:bc265521eb00 830 cmdExecuted = TRUE;
Davidroid 1:bc265521eb00 831 }
Davidroid 1:bc265521eb00 832 return cmdExecuted;
Davidroid 1:bc265521eb00 833 }
Davidroid 1:bc265521eb00 834
Davidroid 2:4fd08b67958c 835 /**********************************************************
Davidroid 1:bc265521eb00 836 * @brief Specifies the direction
Davidroid 1:bc265521eb00 837 * @param[in] dir FORWARD or BACKWARD
Davidroid 1:bc265521eb00 838 * @note The direction change is applied if the device
Davidroid 1:bc265521eb00 839 * is in INACTIVE or STANDBY state or if the device is
Davidroid 1:bc265521eb00 840 * executing a run command
Davidroid 1:bc265521eb00 841 * @retval None
Davidroid 1:bc265521eb00 842 **********************************************************/
Davidroid 2:4fd08b67958c 843 void STSPIN820::STSPIN820_SetDirection(motor_direction_t dir)
Davidroid 1:bc265521eb00 844 {
Davidroid 1:bc265521eb00 845 if ((device_prm.motionState == INACTIVE)||\
Davidroid 1:bc265521eb00 846 (device_prm.motionState == STANDBY))
Davidroid 1:bc265521eb00 847 {
Davidroid 1:bc265521eb00 848 device_prm.direction = dir;
Davidroid 2:4fd08b67958c 849 STSPIN820_SetDirectionGpio(dir);
Davidroid 1:bc265521eb00 850 }
Davidroid 1:bc265521eb00 851 else if ((device_prm.commandExecuted&RUN_CMD)!=0)
Davidroid 1:bc265521eb00 852 {
Davidroid 2:4fd08b67958c 853 device_prm.commandExecuted = (device_command_t) (device_prm.commandExecuted | STSPIN820_DIR_CHANGE_BIT_MASK);
Davidroid 1:bc265521eb00 854 }
Davidroid 1:bc265521eb00 855 }
Davidroid 1:bc265521eb00 856
Davidroid 2:4fd08b67958c 857 /**********************************************************
Davidroid 1:bc265521eb00 858 * @brief Set current position to be the Home position
Davidroid 1:bc265521eb00 859 * (current position set to 0)
Davidroid 1:bc265521eb00 860 * @retval None
Davidroid 1:bc265521eb00 861 **********************************************************/
Davidroid 2:4fd08b67958c 862 void STSPIN820::STSPIN820_SetHome(void)
Davidroid 1:bc265521eb00 863 {
Davidroid 1:bc265521eb00 864 device_prm.currentPosition = 0;
Davidroid 1:bc265521eb00 865 }
Davidroid 1:bc265521eb00 866
Davidroid 2:4fd08b67958c 867 /**********************************************************
Davidroid 1:bc265521eb00 868 * @brief Set current position to be the Mark position
Davidroid 1:bc265521eb00 869 * @retval None
Davidroid 1:bc265521eb00 870 **********************************************************/
Davidroid 2:4fd08b67958c 871 void STSPIN820::STSPIN820_SetMark(void)
Davidroid 1:bc265521eb00 872 {
Davidroid 1:bc265521eb00 873 device_prm.markPosition = device_prm.currentPosition;
Davidroid 1:bc265521eb00 874 }
Davidroid 1:bc265521eb00 875
Davidroid 2:4fd08b67958c 876 /**********************************************************
Davidroid 1:bc265521eb00 877 * @brief Changes the max speed of the specified device
Davidroid 1:bc265521eb00 878 * @param[in] newMaxSpeed New max speed to apply in pps
Davidroid 1:bc265521eb00 879 * @retval true if the command is successfully executed, else false
Davidroid 1:bc265521eb00 880 * @note The command is not performed is the device is executing
Davidroid 1:bc265521eb00 881 * a MOVE or GOTO command (but it can be used during a RUN command).
Davidroid 1:bc265521eb00 882 **********************************************************/
Davidroid 2:4fd08b67958c 883 bool STSPIN820::STSPIN820_SetMaxSpeed(uint16_t newMaxSpeed)
Davidroid 1:bc265521eb00 884 {
Davidroid 1:bc265521eb00 885 bool cmdExecuted = FALSE;
Davidroid 1:bc265521eb00 886 if ((newMaxSpeed >= STSPIN820_MIN_STCK_FREQ)&&\
Davidroid 1:bc265521eb00 887 ((newMaxSpeed <= STSPIN820_MAX_STCK_FREQ)||\
Davidroid 1:bc265521eb00 888 ((device_prm.torqueBoostEnable != FALSE)&&\
Davidroid 2:4fd08b67958c 889 ((newMaxSpeed>>STSPIN820_GetStepMode())<= STSPIN820_MAX_STCK_FREQ)))&&\
Davidroid 1:bc265521eb00 890 (device_prm.minSpeed <= newMaxSpeed) &&\
Davidroid 1:bc265521eb00 891 (((device_prm.motionState & INACTIVE) == INACTIVE)||\
Davidroid 1:bc265521eb00 892 (device_prm.commandExecuted == RUN_CMD)))
Davidroid 1:bc265521eb00 893 {
Davidroid 1:bc265521eb00 894 device_prm.maxSpeed = newMaxSpeed;
Davidroid 1:bc265521eb00 895 cmdExecuted = TRUE;
Davidroid 1:bc265521eb00 896 }
Davidroid 1:bc265521eb00 897 return cmdExecuted;
Davidroid 1:bc265521eb00 898 }
Davidroid 1:bc265521eb00 899
Davidroid 2:4fd08b67958c 900 /**********************************************************
Davidroid 1:bc265521eb00 901 * @brief Changes the min speed of the specified device
Davidroid 1:bc265521eb00 902 * @param[in] newMinSpeed New min speed to apply in pps
Davidroid 1:bc265521eb00 903 * @retval true if the command is successfully executed, else false
Davidroid 1:bc265521eb00 904 * @note The command is not performed is the device is executing
Davidroid 1:bc265521eb00 905 * a MOVE or GOTO command (but it can be used during a RUN command).
Davidroid 1:bc265521eb00 906 **********************************************************/
Davidroid 2:4fd08b67958c 907 bool STSPIN820::STSPIN820_SetMinSpeed(uint16_t newMinSpeed)
Davidroid 1:bc265521eb00 908 {
Davidroid 1:bc265521eb00 909 bool cmdExecuted = FALSE;
Davidroid 1:bc265521eb00 910 if ((newMinSpeed >= STSPIN820_MIN_STCK_FREQ)&&
Davidroid 1:bc265521eb00 911 (newMinSpeed <= STSPIN820_MAX_STCK_FREQ) &&
Davidroid 1:bc265521eb00 912 (newMinSpeed <= device_prm.maxSpeed) &&
Davidroid 1:bc265521eb00 913 (((device_prm.motionState & INACTIVE) == INACTIVE)||
Davidroid 1:bc265521eb00 914 (device_prm.commandExecuted == RUN_CMD)))
Davidroid 1:bc265521eb00 915 {
Davidroid 1:bc265521eb00 916 device_prm.minSpeed = newMinSpeed;
Davidroid 1:bc265521eb00 917 cmdExecuted = TRUE;
Davidroid 1:bc265521eb00 918 }
Davidroid 1:bc265521eb00 919 return cmdExecuted;
Davidroid 1:bc265521eb00 920 }
Davidroid 1:bc265521eb00 921
Davidroid 2:4fd08b67958c 922 /**********************************************************
Davidroid 1:bc265521eb00 923 * @brief Sets the number of devices to be used
Davidroid 1:bc265521eb00 924 * @param[in] nbDevices (from 1 to MAX_NUMBER_OF_DEVICES)
Davidroid 1:bc265521eb00 925 * @retval TRUE if successfull, FALSE if failure, attempt to set a number of
Davidroid 1:bc265521eb00 926 * devices greater than MAX_NUMBER_OF_DEVICES
Davidroid 1:bc265521eb00 927 **********************************************************/
Davidroid 1:bc265521eb00 928 bool STSPIN820::STSPIN820_SetNbDevices(uint8_t nbDevices)
Davidroid 1:bc265521eb00 929 {
Davidroid 1:bc265521eb00 930 if (nbDevices <= MAX_NUMBER_OF_DEVICES)
Davidroid 1:bc265521eb00 931 {
Davidroid 1:bc265521eb00 932 number_of_devices = nbDevices;
Davidroid 1:bc265521eb00 933 return TRUE;
Davidroid 1:bc265521eb00 934 }
Davidroid 1:bc265521eb00 935 else
Davidroid 1:bc265521eb00 936 {
Davidroid 1:bc265521eb00 937 return FALSE;
Davidroid 1:bc265521eb00 938 }
Davidroid 1:bc265521eb00 939 }
Davidroid 1:bc265521eb00 940
Davidroid 2:4fd08b67958c 941 /**********************************************************
Davidroid 1:bc265521eb00 942 * @brief Set the stepping mode
Davidroid 1:bc265521eb00 943 * @param[in] stepMode from full step to 1/256 microstep
Davidroid 1:bc265521eb00 944 * as specified in enum motor_step_mode_t
Davidroid 1:bc265521eb00 945 * 1/64 microstep mode not supported by STSPIN820
Davidroid 1:bc265521eb00 946 * @retval true if the command is successfully executed, else false
Davidroid 1:bc265521eb00 947 **********************************************************/
Davidroid 2:4fd08b67958c 948 bool STSPIN820::STSPIN820_SetStepMode(motor_step_mode_t stepMode)
Davidroid 1:bc265521eb00 949 {
Davidroid 1:bc265521eb00 950 /* Store step mode */
Davidroid 1:bc265521eb00 951 device_prm.stepMode = stepMode;
Davidroid 1:bc265521eb00 952 device_prm.stepModeLatched = stepMode;
Davidroid 1:bc265521eb00 953
Davidroid 1:bc265521eb00 954 /* Set the mode pins to the levels corresponding to the selected step mode */
Davidroid 1:bc265521eb00 955 switch (stepMode)
Davidroid 1:bc265521eb00 956 {
Davidroid 1:bc265521eb00 957 case STEP_MODE_FULL:
Davidroid 2:4fd08b67958c 958 STSPIN820_SetFullStep();
Davidroid 1:bc265521eb00 959 break;
Davidroid 1:bc265521eb00 960 case STEP_MODE_HALF:
Davidroid 2:4fd08b67958c 961 STSPIN820_SetModePins(1, 0, 0);
Davidroid 1:bc265521eb00 962 break;
Davidroid 1:bc265521eb00 963 case STEP_MODE_1_4:
Davidroid 2:4fd08b67958c 964 STSPIN820_SetModePins(0, 1, 0);
Davidroid 1:bc265521eb00 965 break;
Davidroid 1:bc265521eb00 966 case STEP_MODE_1_8:
Davidroid 2:4fd08b67958c 967 STSPIN820_SetModePins(1, 1, 0);
Davidroid 1:bc265521eb00 968 break;
Davidroid 1:bc265521eb00 969 case STEP_MODE_1_16:
Davidroid 2:4fd08b67958c 970 STSPIN820_SetModePins(0, 0, 1);
Davidroid 1:bc265521eb00 971 break;
Davidroid 1:bc265521eb00 972 case STEP_MODE_1_32:
Davidroid 2:4fd08b67958c 973 STSPIN820_SetModePins(1, 0, 1);
Davidroid 1:bc265521eb00 974 break;
Davidroid 1:bc265521eb00 975 case STEP_MODE_1_128:
Davidroid 2:4fd08b67958c 976 STSPIN820_SetModePins(0, 1, 1);
Davidroid 1:bc265521eb00 977 break;
Davidroid 1:bc265521eb00 978 case STEP_MODE_1_256:
Davidroid 2:4fd08b67958c 979 STSPIN820_SetModePins(1, 1, 1);
Davidroid 1:bc265521eb00 980 break;
Davidroid 1:bc265521eb00 981 default:
Davidroid 1:bc265521eb00 982 return FALSE;
Davidroid 1:bc265521eb00 983 }
Davidroid 1:bc265521eb00 984
Davidroid 1:bc265521eb00 985 return TRUE;
Davidroid 1:bc265521eb00 986
Davidroid 1:bc265521eb00 987 }
Davidroid 1:bc265521eb00 988
Davidroid 2:4fd08b67958c 989 /**********************************************************
Davidroid 1:bc265521eb00 990 * @brief Select the mode to stop the motor.
Davidroid 1:bc265521eb00 991 * @param[in] stopMode HOLD_MODE to let power bridge enabled
Davidroid 1:bc265521eb00 992 * @retval None
Davidroid 1:bc265521eb00 993 **********************************************************/
Davidroid 2:4fd08b67958c 994 void STSPIN820::STSPIN820_SetStopMode(motor_stop_mode_t stopMode)
Davidroid 1:bc265521eb00 995 {
Davidroid 1:bc265521eb00 996 device_prm.stopMode = stopMode;
Davidroid 1:bc265521eb00 997 }
Davidroid 1:bc265521eb00 998
Davidroid 2:4fd08b67958c 999 /**********************************************************
Davidroid 1:bc265521eb00 1000 * @brief Set the torque of the specified device
Davidroid 1:bc265521eb00 1001 * @param[in] torqueMode Torque mode as specified in enum motor_torque_mode_t
Davidroid 1:bc265521eb00 1002 * @param[in] torqueValue in % (from 0 to 100)
Davidroid 1:bc265521eb00 1003 * @retval None
Davidroid 1:bc265521eb00 1004 * @note
Davidroid 1:bc265521eb00 1005 **********************************************************/
Davidroid 2:4fd08b67958c 1006 void STSPIN820::STSPIN820_SetTorque(motor_torque_mode_t torqueMode, uint8_t torqueValue)
Davidroid 1:bc265521eb00 1007 {
Davidroid 1:bc265521eb00 1008 device_prm.updateTorque = TRUE;
Davidroid 1:bc265521eb00 1009 if (torqueValue>100)
Davidroid 1:bc265521eb00 1010 {
Davidroid 1:bc265521eb00 1011 torqueValue = 100;
Davidroid 1:bc265521eb00 1012 }
Davidroid 1:bc265521eb00 1013 switch(torqueMode)
Davidroid 1:bc265521eb00 1014 {
Davidroid 1:bc265521eb00 1015 case ACC_TORQUE:
Davidroid 1:bc265521eb00 1016 device_prm.accelTorque = torqueValue;
Davidroid 1:bc265521eb00 1017 break;
Davidroid 1:bc265521eb00 1018 case DEC_TORQUE:
Davidroid 1:bc265521eb00 1019 device_prm.decelTorque = torqueValue;
Davidroid 1:bc265521eb00 1020 break;
Davidroid 1:bc265521eb00 1021 case RUN_TORQUE:
Davidroid 1:bc265521eb00 1022 device_prm.runTorque = torqueValue;
Davidroid 1:bc265521eb00 1023 break;
Davidroid 1:bc265521eb00 1024 case HOLD_TORQUE:
Davidroid 1:bc265521eb00 1025 device_prm.holdTorque = torqueValue;
Davidroid 1:bc265521eb00 1026 if (device_prm.motionState != INACTIVE)
Davidroid 1:bc265521eb00 1027 {
Davidroid 1:bc265521eb00 1028 break;
Davidroid 1:bc265521eb00 1029 }
Davidroid 1:bc265521eb00 1030 case CURRENT_TORQUE:
Davidroid 1:bc265521eb00 1031 device_prm.currentTorque = torqueValue;
Davidroid 2:4fd08b67958c 1032 STSPIN820_PwmRefSetFreqAndDutyCycle(device_prm.refPwmFreq,torqueValue);
Davidroid 1:bc265521eb00 1033 default:
Davidroid 1:bc265521eb00 1034 device_prm.updateTorque = FALSE;
Davidroid 1:bc265521eb00 1035 break; //ignore error
Davidroid 1:bc265521eb00 1036 }
Davidroid 1:bc265521eb00 1037 }
Davidroid 1:bc265521eb00 1038
Davidroid 2:4fd08b67958c 1039 /**********************************************************
Davidroid 1:bc265521eb00 1040 * @brief Enable or disable the torque boost feature
Davidroid 1:bc265521eb00 1041 * @param[in] enable true to enable torque boost, false to disable
Davidroid 1:bc265521eb00 1042 * @retval None
Davidroid 1:bc265521eb00 1043 **********************************************************/
Davidroid 2:4fd08b67958c 1044 void STSPIN820::STSPIN820_SetTorqueBoostEnable(bool enable)
Davidroid 1:bc265521eb00 1045 {
Davidroid 1:bc265521eb00 1046 device_prm.torqueBoostEnable = enable;
Davidroid 1:bc265521eb00 1047 }
Davidroid 1:bc265521eb00 1048
Davidroid 2:4fd08b67958c 1049 /**********************************************************
Davidroid 1:bc265521eb00 1050 * @brief Set the torque boost threshold
Davidroid 2:4fd08b67958c 1051 * @param[in] (from 0 to MAX_NUMBER_OF_DEVICES - 1)
Davidroid 1:bc265521eb00 1052 * @param[in] speedThreshold speed threshold above which the step mode is
Davidroid 1:bc265521eb00 1053 * changed to full step
Davidroid 1:bc265521eb00 1054 * @retval None
Davidroid 1:bc265521eb00 1055 **********************************************************/
Davidroid 2:4fd08b67958c 1056 void STSPIN820::STSPIN820_SetTorqueBoostThreshold(uint16_t speedThreshold)
Davidroid 1:bc265521eb00 1057 {
Davidroid 1:bc265521eb00 1058 device_prm.torqueBoostSpeedThreshold = speedThreshold;
Davidroid 1:bc265521eb00 1059 }
Davidroid 1:bc265521eb00 1060
Davidroid 2:4fd08b67958c 1061 /**********************************************************
Davidroid 1:bc265521eb00 1062 * @brief Stops the motor by using the device deceleration
Davidroid 1:bc265521eb00 1063 * @retval true if the command is successfully executed, else false
Davidroid 1:bc265521eb00 1064 * @note The command is not performed if the device is in INACTIVE,
Davidroid 1:bc265521eb00 1065 * STANDBYTOINACTIVE or STANDBY state.
Davidroid 1:bc265521eb00 1066 **********************************************************/
Davidroid 2:4fd08b67958c 1067 bool STSPIN820::STSPIN820_SoftStop(void)
Davidroid 1:bc265521eb00 1068 {
Davidroid 1:bc265521eb00 1069 bool cmdExecuted = FALSE;
Davidroid 1:bc265521eb00 1070 if ((device_prm.motionState & INACTIVE) != INACTIVE)
Davidroid 1:bc265521eb00 1071 {
Davidroid 2:4fd08b67958c 1072 device_prm.commandExecuted = (device_command_t) (device_prm.commandExecuted | STSPIN820_SOFT_STOP_BIT_MASK);
Davidroid 1:bc265521eb00 1073 cmdExecuted = TRUE;
Davidroid 1:bc265521eb00 1074 }
Davidroid 1:bc265521eb00 1075 return (cmdExecuted);
Davidroid 1:bc265521eb00 1076 }
Davidroid 1:bc265521eb00 1077
Davidroid 2:4fd08b67958c 1078 /**********************************************************
Davidroid 1:bc265521eb00 1079 * @brief Get the frequency of REF PWM of the specified device
Davidroid 1:bc265521eb00 1080 * @retval the frequency of REF PWM in Hz
Davidroid 1:bc265521eb00 1081 * @note
Davidroid 1:bc265521eb00 1082 **********************************************************/
Davidroid 2:4fd08b67958c 1083 uint32_t STSPIN820::STSPIN820_VrefPwmGetFreq(void)
Davidroid 1:bc265521eb00 1084 {
Davidroid 1:bc265521eb00 1085 return device_prm.refPwmFreq;
Davidroid 1:bc265521eb00 1086 }
Davidroid 1:bc265521eb00 1087
Davidroid 2:4fd08b67958c 1088 /**********************************************************
Davidroid 1:bc265521eb00 1089 * @brief Set the frequency of REF PWM of the specified device
Davidroid 1:bc265521eb00 1090 * @param[in] newFreq in Hz
Davidroid 1:bc265521eb00 1091 * @retval None
Davidroid 1:bc265521eb00 1092 * @note
Davidroid 1:bc265521eb00 1093 **********************************************************/
Davidroid 2:4fd08b67958c 1094 void STSPIN820::STSPIN820_VrefPwmSetFreq(uint32_t newFreq)
Davidroid 1:bc265521eb00 1095 {
Davidroid 1:bc265521eb00 1096 device_prm.refPwmFreq = newFreq;
Davidroid 2:4fd08b67958c 1097 STSPIN820_PwmRefSetFreqAndDutyCycle(newFreq,device_prm.currentTorque);
Davidroid 1:bc265521eb00 1098 }
Davidroid 1:bc265521eb00 1099
Davidroid 2:4fd08b67958c 1100 /**********************************************************
Davidroid 1:bc265521eb00 1101 * @brief Locks until the device state becomes Inactive
Davidroid 1:bc265521eb00 1102 * @retval None
Davidroid 1:bc265521eb00 1103 **********************************************************/
Davidroid 2:4fd08b67958c 1104 void STSPIN820::STSPIN820_WaitWhileActive(void)
Davidroid 1:bc265521eb00 1105 {
Davidroid 1:bc265521eb00 1106 /* Wait while motor is running */
Davidroid 2:4fd08b67958c 1107 while (((STSPIN820_GetDeviceState()&INACTIVE)!=INACTIVE)||\
Davidroid 2:4fd08b67958c 1108 (((STSPIN820_GetDeviceState()&INACTIVE)==INACTIVE)&&(toggle_odd!=0)));
Davidroid 1:bc265521eb00 1109 }
Davidroid 1:bc265521eb00 1110
Davidroid 2:4fd08b67958c 1111 /**********************************************************
Davidroid 1:bc265521eb00 1112 * @brief Updates the current speed of the device
Davidroid 1:bc265521eb00 1113 * @param[in] newSpeed in pps
Davidroid 1:bc265521eb00 1114 * @retval None
Davidroid 1:bc265521eb00 1115 **********************************************************/
Davidroid 2:4fd08b67958c 1116 void STSPIN820::STSPIN820_ApplySpeed(uint16_t newSpeed)
Davidroid 1:bc265521eb00 1117 {
Davidroid 1:bc265521eb00 1118 if (device_prm.torqueBoostEnable != FALSE)
Davidroid 1:bc265521eb00 1119 {
Davidroid 1:bc265521eb00 1120 if (device_prm.stepMode > STEP_MODE_1_256)
Davidroid 1:bc265521eb00 1121 {
Davidroid 1:bc265521eb00 1122 STSPIN820_ErrorHandler(STSPIN820_ERROR_APPLY_SPEED);
Davidroid 1:bc265521eb00 1123 }
Davidroid 1:bc265521eb00 1124 if (device_prm.stepMode != STEP_MODE_FULL)
Davidroid 1:bc265521eb00 1125 {
Davidroid 1:bc265521eb00 1126 if (((newSpeed>>device_prm.stepModeLatched)>\
Davidroid 1:bc265521eb00 1127 device_prm.torqueBoostSpeedThreshold)&&\
Davidroid 1:bc265521eb00 1128 (((device_prm.commandExecuted & STSPIN820_MOVE_BIT_MASK) != MOVE_CMD) ||\
Davidroid 1:bc265521eb00 1129 ((device_prm.stepsToTake-device_prm.relativePos)>=\
Davidroid 1:bc265521eb00 1130 (1<<device_prm.stepModeLatched))))
Davidroid 1:bc265521eb00 1131 {
Davidroid 1:bc265521eb00 1132 if ((device_prm.sequencerPosition & 0xFF) == 0x80)
Davidroid 1:bc265521eb00 1133 {
Davidroid 2:4fd08b67958c 1134 STSPIN820_SetFullStep();
Davidroid 2:4fd08b67958c 1135 device_prm.stepMode = (motor_step_mode_t) STEP_MODE_FULL;
Davidroid 1:bc265521eb00 1136 device_prm.accu >>= device_prm.stepModeLatched;
Davidroid 1:bc265521eb00 1137 newSpeed >>= device_prm.stepModeLatched;
Davidroid 1:bc265521eb00 1138 }
Davidroid 1:bc265521eb00 1139 }
Davidroid 1:bc265521eb00 1140 }
Davidroid 1:bc265521eb00 1141 else if (((newSpeed <= device_prm.torqueBoostSpeedThreshold) &&\
Davidroid 1:bc265521eb00 1142 (device_prm.stepModeLatched != STEP_MODE_FULL))||\
Davidroid 1:bc265521eb00 1143 (((device_prm.commandExecuted & STSPIN820_MOVE_BIT_MASK) == MOVE_CMD)&&\
Davidroid 1:bc265521eb00 1144 ((device_prm.stepsToTake-device_prm.relativePos)<=\
Davidroid 1:bc265521eb00 1145 (1<<device_prm.stepModeLatched))))
Davidroid 1:bc265521eb00 1146 {
Davidroid 2:4fd08b67958c 1147 STSPIN820_SetStepMode(device_prm.stepModeLatched);
Davidroid 1:bc265521eb00 1148 device_prm.stepMode = device_prm.stepModeLatched;
Davidroid 1:bc265521eb00 1149 device_prm.accu <<= device_prm.stepModeLatched;
Davidroid 1:bc265521eb00 1150 newSpeed <<= device_prm.stepModeLatched;
Davidroid 1:bc265521eb00 1151 }
Davidroid 1:bc265521eb00 1152 }
Davidroid 1:bc265521eb00 1153 else if (device_prm.stepMode != device_prm.stepModeLatched)
Davidroid 1:bc265521eb00 1154 {
Davidroid 1:bc265521eb00 1155 //torqueBoostEnable has just been disabled
Davidroid 2:4fd08b67958c 1156 STSPIN820_SetStepMode(device_prm.stepModeLatched);
Davidroid 1:bc265521eb00 1157 device_prm.stepMode = device_prm.stepModeLatched;
Davidroid 1:bc265521eb00 1158 device_prm.accu <<= device_prm.stepModeLatched;
Davidroid 1:bc265521eb00 1159 newSpeed <<= device_prm.stepModeLatched;
Davidroid 1:bc265521eb00 1160 }
Davidroid 1:bc265521eb00 1161
Davidroid 1:bc265521eb00 1162 if (newSpeed < STSPIN820_MIN_STCK_FREQ)
Davidroid 1:bc265521eb00 1163 {
Davidroid 1:bc265521eb00 1164 newSpeed = STSPIN820_MIN_STCK_FREQ;
Davidroid 1:bc265521eb00 1165 }
Davidroid 1:bc265521eb00 1166 if (newSpeed > STSPIN820_MAX_STCK_FREQ)
Davidroid 1:bc265521eb00 1167 {
Davidroid 1:bc265521eb00 1168 newSpeed = STSPIN820_MAX_STCK_FREQ;
Davidroid 1:bc265521eb00 1169 }
Davidroid 1:bc265521eb00 1170
Davidroid 1:bc265521eb00 1171 device_prm.speed = newSpeed;
Davidroid 2:4fd08b67958c 1172 STSPIN820_TimStckSetFreq(newSpeed);
Davidroid 1:bc265521eb00 1173
Davidroid 1:bc265521eb00 1174 }
Davidroid 1:bc265521eb00 1175
Davidroid 2:4fd08b67958c 1176 /**********************************************************
Davidroid 1:bc265521eb00 1177 * @brief Apply the set torque to the specified device
Davidroid 1:bc265521eb00 1178 * @param[in] torqueMode torque mode
Davidroid 1:bc265521eb00 1179 * @retval None
Davidroid 1:bc265521eb00 1180 * @note
Davidroid 1:bc265521eb00 1181 **********************************************************/
Davidroid 2:4fd08b67958c 1182 void STSPIN820::STSPIN820_ApplyTorque(motor_torque_mode_t torqueMode)
Davidroid 1:bc265521eb00 1183 {
Davidroid 1:bc265521eb00 1184 uint8_t torqueValue = 0;
Davidroid 1:bc265521eb00 1185 device_prm.updateTorque = FALSE;
Davidroid 1:bc265521eb00 1186 switch(torqueMode)
Davidroid 1:bc265521eb00 1187 {
Davidroid 1:bc265521eb00 1188 case ACC_TORQUE:
Davidroid 1:bc265521eb00 1189 device_prm.currentTorque = device_prm.accelTorque;
Davidroid 1:bc265521eb00 1190 break;
Davidroid 1:bc265521eb00 1191 case DEC_TORQUE:
Davidroid 1:bc265521eb00 1192 device_prm.currentTorque = device_prm.decelTorque;
Davidroid 1:bc265521eb00 1193 break;
Davidroid 1:bc265521eb00 1194 case RUN_TORQUE:
Davidroid 1:bc265521eb00 1195 device_prm.currentTorque = device_prm.runTorque;
Davidroid 1:bc265521eb00 1196 break;
Davidroid 1:bc265521eb00 1197 case HOLD_TORQUE:
Davidroid 1:bc265521eb00 1198 device_prm.currentTorque = device_prm.holdTorque;
Davidroid 1:bc265521eb00 1199 break;
Davidroid 1:bc265521eb00 1200 case CURRENT_TORQUE:
Davidroid 1:bc265521eb00 1201 break;
Davidroid 1:bc265521eb00 1202 default:
Davidroid 1:bc265521eb00 1203 return; //ignore error
Davidroid 1:bc265521eb00 1204 }
Davidroid 1:bc265521eb00 1205 torqueValue = device_prm.currentTorque;
Davidroid 2:4fd08b67958c 1206 STSPIN820_PwmRefSetFreqAndDutyCycle(device_prm.refPwmFreq,torqueValue);
Davidroid 1:bc265521eb00 1207 }
Davidroid 1:bc265521eb00 1208
Davidroid 2:4fd08b67958c 1209 /**********************************************************
Davidroid 1:bc265521eb00 1210 * @brief Computes the speed profile according to the number of steps to move
Davidroid 1:bc265521eb00 1211 * @param[in] nbSteps number of steps to perform
Davidroid 1:bc265521eb00 1212 * @retval None
Davidroid 1:bc265521eb00 1213 * @note Using the acceleration and deceleration of the device,
Davidroid 1:bc265521eb00 1214 * this function determines the duration in steps of the acceleration,
Davidroid 1:bc265521eb00 1215 * steady and deceleration phases.
Davidroid 1:bc265521eb00 1216 * If the total number of steps to perform is big enough, a trapezoidal move
Davidroid 1:bc265521eb00 1217 * is performed (i.e. there is a steady phase where the motor runs at the maximum
Davidroid 1:bc265521eb00 1218 * speed.
Davidroid 1:bc265521eb00 1219 * Else, a triangular move is performed (no steady phase: the maximum speed is never
Davidroid 1:bc265521eb00 1220 * reached.
Davidroid 1:bc265521eb00 1221 **********************************************************/
Davidroid 2:4fd08b67958c 1222 void STSPIN820::STSPIN820_ComputeSpeedProfile(uint32_t nbSteps)
Davidroid 1:bc265521eb00 1223 {
Davidroid 1:bc265521eb00 1224 uint32_t reqAccSteps;
Davidroid 1:bc265521eb00 1225 uint32_t reqDecSteps;
Davidroid 1:bc265521eb00 1226
Davidroid 1:bc265521eb00 1227 /* compute the number of steps to get the targeted speed */
Davidroid 1:bc265521eb00 1228 uint16_t minSpeed = device_prm.minSpeed;
Davidroid 1:bc265521eb00 1229 reqAccSteps = (device_prm.maxSpeed - minSpeed);
Davidroid 1:bc265521eb00 1230 reqAccSteps *= (device_prm.maxSpeed + minSpeed);
Davidroid 1:bc265521eb00 1231 reqDecSteps = reqAccSteps;
Davidroid 1:bc265521eb00 1232 reqAccSteps /= (uint32_t)device_prm.acceleration;
Davidroid 1:bc265521eb00 1233 reqAccSteps /= 2;
Davidroid 1:bc265521eb00 1234
Davidroid 1:bc265521eb00 1235 /* compute the number of steps to stop */
Davidroid 1:bc265521eb00 1236 reqDecSteps /= (uint32_t)device_prm.deceleration;
Davidroid 1:bc265521eb00 1237 reqDecSteps /= 2;
Davidroid 1:bc265521eb00 1238
Davidroid 1:bc265521eb00 1239 if(( reqAccSteps + reqDecSteps ) > nbSteps)
Davidroid 1:bc265521eb00 1240 {
Davidroid 1:bc265521eb00 1241 /* Triangular move */
Davidroid 1:bc265521eb00 1242 /* reqDecSteps = (Pos * Dec) /(Dec+Acc) */
Davidroid 1:bc265521eb00 1243 uint32_t dec = device_prm.deceleration;
Davidroid 1:bc265521eb00 1244 uint32_t acc = device_prm.acceleration;
Davidroid 1:bc265521eb00 1245
Davidroid 1:bc265521eb00 1246 reqDecSteps = ((uint32_t) dec * nbSteps) / (acc + dec);
Davidroid 1:bc265521eb00 1247 if (reqDecSteps > 1)
Davidroid 1:bc265521eb00 1248 {
Davidroid 1:bc265521eb00 1249 reqAccSteps = reqDecSteps - 1;
Davidroid 1:bc265521eb00 1250 if(reqAccSteps == 0)
Davidroid 1:bc265521eb00 1251 {
Davidroid 1:bc265521eb00 1252 reqAccSteps = 1;
Davidroid 1:bc265521eb00 1253 }
Davidroid 1:bc265521eb00 1254 }
Davidroid 1:bc265521eb00 1255 else
Davidroid 1:bc265521eb00 1256 {
Davidroid 1:bc265521eb00 1257 reqAccSteps = 0;
Davidroid 1:bc265521eb00 1258 }
Davidroid 1:bc265521eb00 1259 device_prm.endAccPos = reqAccSteps;
Davidroid 1:bc265521eb00 1260 device_prm.startDecPos = reqDecSteps;
Davidroid 1:bc265521eb00 1261 }
Davidroid 1:bc265521eb00 1262 else
Davidroid 1:bc265521eb00 1263 {
Davidroid 1:bc265521eb00 1264 /* Trapezoidal move */
Davidroid 1:bc265521eb00 1265 /* accelerating phase to endAccPos */
Davidroid 1:bc265521eb00 1266 /* steady phase from endAccPos to startDecPos */
Davidroid 1:bc265521eb00 1267 /* decelerating from startDecPos to stepsToTake*/
Davidroid 1:bc265521eb00 1268 device_prm.endAccPos = reqAccSteps;
Davidroid 1:bc265521eb00 1269 device_prm.startDecPos = nbSteps - reqDecSteps - 1;
Davidroid 1:bc265521eb00 1270 }
Davidroid 1:bc265521eb00 1271 }
Davidroid 1:bc265521eb00 1272
Davidroid 2:4fd08b67958c 1273 /**********************************************************
Davidroid 1:bc265521eb00 1274 * @brief Handlers of the flag interrupt which calls the user callback (if defined)
Davidroid 1:bc265521eb00 1275 * @retval None
Davidroid 1:bc265521eb00 1276 **********************************************************/
Davidroid 1:bc265521eb00 1277 void STSPIN820::STSPIN820_FlagInterruptHandler(void)
Davidroid 1:bc265521eb00 1278 {
Davidroid 1:bc265521eb00 1279 if (flag_interrupt_callback != 0)
Davidroid 1:bc265521eb00 1280 {
Davidroid 1:bc265521eb00 1281 flag_interrupt_callback();
Davidroid 1:bc265521eb00 1282 }
Davidroid 1:bc265521eb00 1283 }
Davidroid 1:bc265521eb00 1284
Davidroid 2:4fd08b67958c 1285 /**********************************************************
Davidroid 1:bc265521eb00 1286 * @brief Set the parameters of the device whose values are not defined in
Davidroid 1:bc265521eb00 1287 * STSPIN820_config.h
Davidroid 1:bc265521eb00 1288 * @retval None
Davidroid 1:bc265521eb00 1289 **********************************************************/
Davidroid 1:bc265521eb00 1290 void STSPIN820::STSPIN820_SetDeviceParamsOtherValues(void)
Davidroid 1:bc265521eb00 1291 {
Davidroid 1:bc265521eb00 1292 uint16_t tmp;
Davidroid 1:bc265521eb00 1293
Davidroid 1:bc265521eb00 1294 device_prm.accu = 0;
Davidroid 1:bc265521eb00 1295 device_prm.currentPosition = 0;
Davidroid 1:bc265521eb00 1296 device_prm.sequencerPosition = 0;
Davidroid 1:bc265521eb00 1297 device_prm.endAccPos = 0;
Davidroid 1:bc265521eb00 1298 device_prm.relativePos = 0;
Davidroid 1:bc265521eb00 1299 device_prm.startDecPos = 0;
Davidroid 1:bc265521eb00 1300 device_prm.stepsToTake = 0;
Davidroid 1:bc265521eb00 1301 device_prm.updateTorque = FALSE;
Davidroid 1:bc265521eb00 1302 device_prm.speed = 0;
Davidroid 1:bc265521eb00 1303 device_prm.commandExecuted = NO_CMD;
Davidroid 1:bc265521eb00 1304 device_prm.direction = FORWARD;
Davidroid 1:bc265521eb00 1305 tmp = device_prm.minSpeed;
Davidroid 1:bc265521eb00 1306 if (((device_prm.torqueBoostEnable != FALSE)&&\
Davidroid 1:bc265521eb00 1307 (device_prm.torqueBoostSpeedThreshold>STSPIN820_MAX_STCK_FREQ))||\
Davidroid 1:bc265521eb00 1308 (tmp>device_prm.maxSpeed))
Davidroid 1:bc265521eb00 1309 {
Davidroid 1:bc265521eb00 1310 STSPIN820_ErrorHandler(STSPIN820_ERROR_INIT);
Davidroid 1:bc265521eb00 1311 }
Davidroid 1:bc265521eb00 1312 }
Davidroid 1:bc265521eb00 1313
Davidroid 2:4fd08b67958c 1314 /**********************************************************
Davidroid 1:bc265521eb00 1315 * @brief Set the parameters of the device to values of initDevicePrm structure
Davidroid 1:bc265521eb00 1316 * @param pInitDevicePrm structure containing values to initialize the device
Davidroid 1:bc265521eb00 1317 * parameters
Davidroid 1:bc265521eb00 1318 * @retval None
Davidroid 1:bc265521eb00 1319 **********************************************************/
Davidroid 1:bc265521eb00 1320 void STSPIN820::STSPIN820_SetDeviceParamsToGivenValues(STSPIN820_init_t* pInitDevicePrm)
Davidroid 1:bc265521eb00 1321 {
Davidroid 2:4fd08b67958c 1322 int i = 100;
Davidroid 2:4fd08b67958c 1323 printf("%d\r\n", i++);
Davidroid 1:bc265521eb00 1324 device_prm.motionState = STANDBY;;
Davidroid 1:bc265521eb00 1325
Davidroid 2:4fd08b67958c 1326 if (STSPIN820_SetAcceleration(pInitDevicePrm->acceleration)==FALSE)
Davidroid 1:bc265521eb00 1327 {
Davidroid 1:bc265521eb00 1328 STSPIN820_ErrorHandler(STSPIN820_ERROR_SET_ACCELERATION);
Davidroid 1:bc265521eb00 1329 }
Davidroid 2:4fd08b67958c 1330 printf("%d\r\n", i++);
Davidroid 2:4fd08b67958c 1331 if (STSPIN820_SetDeceleration(pInitDevicePrm->deceleration)==FALSE)
Davidroid 1:bc265521eb00 1332 {
Davidroid 1:bc265521eb00 1333 STSPIN820_ErrorHandler(STSPIN820_ERROR_SET_DECELERATION);
Davidroid 1:bc265521eb00 1334 }
Davidroid 2:4fd08b67958c 1335 printf("%d\r\n", i++);
Davidroid 2:4fd08b67958c 1336 if (STSPIN820_SetMaxSpeed(pInitDevicePrm->maxSpeed)==FALSE)
Davidroid 1:bc265521eb00 1337 {
Davidroid 1:bc265521eb00 1338 STSPIN820_ErrorHandler(STSPIN820_ERROR_SET_MAX_SPEED);
Davidroid 1:bc265521eb00 1339 }
Davidroid 2:4fd08b67958c 1340 printf("%d\r\n", i++);
Davidroid 2:4fd08b67958c 1341 if (STSPIN820_SetMinSpeed(pInitDevicePrm->minSpeed)==FALSE)
Davidroid 1:bc265521eb00 1342 {
Davidroid 1:bc265521eb00 1343 STSPIN820_ErrorHandler(STSPIN820_ERROR_SET_MIN_SPEED);
Davidroid 1:bc265521eb00 1344 }
Davidroid 2:4fd08b67958c 1345 printf("%d\r\n", i++);
Davidroid 2:4fd08b67958c 1346 STSPIN820_VrefPwmSetFreq(pInitDevicePrm->vrefPwmFreq);
Davidroid 2:4fd08b67958c 1347 STSPIN820_SetTorque(ACC_TORQUE,pInitDevicePrm->accelTorque);
Davidroid 2:4fd08b67958c 1348 STSPIN820_SetTorque(DEC_TORQUE,pInitDevicePrm->decelTorque);
Davidroid 2:4fd08b67958c 1349 STSPIN820_SetTorque(RUN_TORQUE,pInitDevicePrm->runTorque);
Davidroid 2:4fd08b67958c 1350 STSPIN820_SetTorque(HOLD_TORQUE,pInitDevicePrm->holdTorque);
Davidroid 1:bc265521eb00 1351 device_prm.torqueBoostEnable = pInitDevicePrm->torqueBoostEnable;
Davidroid 1:bc265521eb00 1352 device_prm.torqueBoostSpeedThreshold = pInitDevicePrm->torqueBoostSpeedThreshold;
Davidroid 2:4fd08b67958c 1353 STSPIN820_SetStopMode(pInitDevicePrm->stopMode);
Davidroid 2:4fd08b67958c 1354 printf("%d\r\n", i++);
Davidroid 1:bc265521eb00 1355 STSPIN820_SetDeviceParamsOtherValues();
Davidroid 2:4fd08b67958c 1356 printf("%d\r\n", i++);
Davidroid 1:bc265521eb00 1357 /* Eventually deactivate motor */
Davidroid 1:bc265521eb00 1358 if ((device_prm.motionState != INACTIVE)&&\
Davidroid 1:bc265521eb00 1359 (device_prm.motionState != STANDBY))
Davidroid 1:bc265521eb00 1360 {
Davidroid 2:4fd08b67958c 1361 STSPIN820_HardHiZ();
Davidroid 1:bc265521eb00 1362 }
Davidroid 1:bc265521eb00 1363
Davidroid 1:bc265521eb00 1364 /* Enter standby */
Davidroid 2:4fd08b67958c 1365 STSPIN820_Reset();
Davidroid 1:bc265521eb00 1366
Davidroid 1:bc265521eb00 1367 /* Reset the microstepping sequencer position */
Davidroid 1:bc265521eb00 1368 device_prm.sequencerPosition = 0;
Davidroid 1:bc265521eb00 1369
Davidroid 1:bc265521eb00 1370 /* Reset current and mark positions */
Davidroid 1:bc265521eb00 1371 device_prm.currentPosition = 0;
Davidroid 1:bc265521eb00 1372 device_prm.markPosition = 0;
Davidroid 1:bc265521eb00 1373
Davidroid 1:bc265521eb00 1374 /* Set predefined step mode */
Davidroid 2:4fd08b67958c 1375 STSPIN820_SetStepMode(pInitDevicePrm->stepMode);
Davidroid 1:bc265521eb00 1376
Davidroid 1:bc265521eb00 1377 /* Wait */
Davidroid 2:4fd08b67958c 1378 STSPIN820_Delay(SELECT_STEP_MODE_DELAY);
Davidroid 1:bc265521eb00 1379
Davidroid 1:bc265521eb00 1380 /* Exit standby */
Davidroid 2:4fd08b67958c 1381 STSPIN820_ReleaseReset();
Davidroid 1:bc265521eb00 1382
Davidroid 1:bc265521eb00 1383 /* Let a delay after reset release*/
Davidroid 2:4fd08b67958c 1384 STSPIN820_Delay(AFTER_STANDBY_EXIT_DEAD_TIME);
Davidroid 1:bc265521eb00 1385
Davidroid 1:bc265521eb00 1386 }
Davidroid 1:bc265521eb00 1387
Davidroid 2:4fd08b67958c 1388 /**********************************************************
Davidroid 1:bc265521eb00 1389 * @brief Sets the parameters of the device to predefined values
Davidroid 1:bc265521eb00 1390 * from STSPIN820_config.h
Davidroid 1:bc265521eb00 1391 * @retval None
Davidroid 1:bc265521eb00 1392 **********************************************************/
Davidroid 1:bc265521eb00 1393 void STSPIN820::STSPIN820_SetDeviceParamsToPredefinedValues(void)
Davidroid 1:bc265521eb00 1394 {
Davidroid 1:bc265521eb00 1395 device_prm.motionState = STANDBY;
Davidroid 1:bc265521eb00 1396
Davidroid 2:4fd08b67958c 1397 if (STSPIN820_SetAcceleration(STSPIN820_CONF_PARAM_ACC)==FALSE)
Davidroid 1:bc265521eb00 1398 {
Davidroid 1:bc265521eb00 1399 STSPIN820_ErrorHandler(STSPIN820_ERROR_SET_ACCELERATION);
Davidroid 1:bc265521eb00 1400 }
Davidroid 2:4fd08b67958c 1401 if (STSPIN820_SetDeceleration(STSPIN820_CONF_PARAM_DEC)==FALSE)
Davidroid 1:bc265521eb00 1402 {
Davidroid 1:bc265521eb00 1403 STSPIN820_ErrorHandler(STSPIN820_ERROR_SET_DECELERATION);
Davidroid 1:bc265521eb00 1404 }
Davidroid 2:4fd08b67958c 1405 if (STSPIN820_SetMaxSpeed(STSPIN820_CONF_PARAM_RUNNING_SPEED)==FALSE)
Davidroid 1:bc265521eb00 1406 {
Davidroid 1:bc265521eb00 1407 STSPIN820_ErrorHandler(STSPIN820_ERROR_SET_MAX_SPEED);
Davidroid 1:bc265521eb00 1408 }
Davidroid 2:4fd08b67958c 1409 if (STSPIN820_SetMinSpeed(STSPIN820_CONF_PARAM_MIN_SPEED)==FALSE)
Davidroid 1:bc265521eb00 1410 {
Davidroid 1:bc265521eb00 1411 STSPIN820_ErrorHandler(STSPIN820_ERROR_SET_MIN_SPEED);
Davidroid 1:bc265521eb00 1412 }
Davidroid 1:bc265521eb00 1413
Davidroid 2:4fd08b67958c 1414 STSPIN820_VrefPwmSetFreq(STSPIN820_CONF_PARAM_REF_PWM_FREQUENCY);
Davidroid 2:4fd08b67958c 1415 STSPIN820_SetTorque(ACC_TORQUE,STSPIN820_CONF_PARAM_ACC_TORQUE);
Davidroid 2:4fd08b67958c 1416 STSPIN820_SetTorque(DEC_TORQUE,STSPIN820_CONF_PARAM_DEC_TORQUE);
Davidroid 2:4fd08b67958c 1417 STSPIN820_SetTorque(RUN_TORQUE,STSPIN820_CONF_PARAM_RUNNING_TORQUE);
Davidroid 2:4fd08b67958c 1418 STSPIN820_SetTorque(HOLD_TORQUE,STSPIN820_CONF_PARAM_HOLDING_TORQUE);
Davidroid 1:bc265521eb00 1419 device_prm.torqueBoostEnable = STSPIN820_CONF_PARAM_TORQUE_BOOST_EN;
Davidroid 1:bc265521eb00 1420 device_prm.torqueBoostSpeedThreshold = STSPIN820_CONF_PARAM_TORQUE_BOOST_TH;
Davidroid 2:4fd08b67958c 1421 STSPIN820_SetStopMode(STSPIN820_CONF_PARAM_AUTO_HIZ_STOP);
Davidroid 1:bc265521eb00 1422
Davidroid 1:bc265521eb00 1423 STSPIN820_SetDeviceParamsOtherValues();
Davidroid 1:bc265521eb00 1424
Davidroid 1:bc265521eb00 1425 /* Eventually deactivate motor */
Davidroid 1:bc265521eb00 1426 if ((device_prm.motionState != INACTIVE)&&\
Davidroid 1:bc265521eb00 1427 (device_prm.motionState != STANDBY))
Davidroid 1:bc265521eb00 1428 {
Davidroid 2:4fd08b67958c 1429 STSPIN820_HardHiZ();
Davidroid 1:bc265521eb00 1430 }
Davidroid 1:bc265521eb00 1431
Davidroid 1:bc265521eb00 1432 /* Enter standby */
Davidroid 2:4fd08b67958c 1433 STSPIN820_Reset();
Davidroid 1:bc265521eb00 1434
Davidroid 1:bc265521eb00 1435 /* Reset the microstepping sequencer position */
Davidroid 1:bc265521eb00 1436 device_prm.sequencerPosition = 0;
Davidroid 1:bc265521eb00 1437
Davidroid 1:bc265521eb00 1438 /* Reset current and mark positions */
Davidroid 1:bc265521eb00 1439 device_prm.currentPosition = 0;
Davidroid 1:bc265521eb00 1440 device_prm.markPosition = 0;
Davidroid 1:bc265521eb00 1441
Davidroid 1:bc265521eb00 1442 /* Set predefined step mode */
Davidroid 2:4fd08b67958c 1443 STSPIN820_SetStepMode((motor_step_mode_t) STSPIN820_CONF_PARAM_STEP_MODE);
Davidroid 1:bc265521eb00 1444
Davidroid 1:bc265521eb00 1445 /* Wait */
Davidroid 2:4fd08b67958c 1446 STSPIN820_Delay(SELECT_STEP_MODE_DELAY);
Davidroid 1:bc265521eb00 1447
Davidroid 1:bc265521eb00 1448 /* Exit standby */
Davidroid 2:4fd08b67958c 1449 STSPIN820_ReleaseReset();
Davidroid 1:bc265521eb00 1450
Davidroid 1:bc265521eb00 1451 /* Let a delay after reset release*/
Davidroid 2:4fd08b67958c 1452 STSPIN820_Delay(AFTER_STANDBY_EXIT_DEAD_TIME);
Davidroid 1:bc265521eb00 1453 }
Davidroid 1:bc265521eb00 1454
Davidroid 2:4fd08b67958c 1455 /**********************************************************
Davidroid 1:bc265521eb00 1456 * @brief Initialises the bridge parameters to start the movement
Davidroid 1:bc265521eb00 1457 * and enable the power bridge
Davidroid 1:bc265521eb00 1458 * @retval None
Davidroid 1:bc265521eb00 1459 **********************************************************/
Davidroid 2:4fd08b67958c 1460 void STSPIN820::STSPIN820_StartMovement(void)
Davidroid 1:bc265521eb00 1461 {
Davidroid 1:bc265521eb00 1462 /* Enable STSPIN820 powerstage */
Davidroid 2:4fd08b67958c 1463 STSPIN820_Enable();
Davidroid 1:bc265521eb00 1464 toggle_odd = 0;
Davidroid 1:bc265521eb00 1465 device_prm.accu = 0;
Davidroid 1:bc265521eb00 1466 device_prm.relativePos = 0;
Davidroid 1:bc265521eb00 1467 if ((device_prm.endAccPos == 0)&&\
Davidroid 1:bc265521eb00 1468 (device_prm.commandExecuted != RUN_CMD))
Davidroid 1:bc265521eb00 1469 {
Davidroid 1:bc265521eb00 1470 device_prm.motionState = DECELERATING;
Davidroid 2:4fd08b67958c 1471 STSPIN820_ApplyTorque(DEC_TORQUE);
Davidroid 1:bc265521eb00 1472 }
Davidroid 1:bc265521eb00 1473 else
Davidroid 1:bc265521eb00 1474 {
Davidroid 1:bc265521eb00 1475 device_prm.motionState = ACCELERATING;
Davidroid 2:4fd08b67958c 1476 STSPIN820_ApplyTorque(ACC_TORQUE);
Davidroid 1:bc265521eb00 1477 }
Davidroid 2:4fd08b67958c 1478 STSPIN820_PwmRefStart();
Davidroid 1:bc265521eb00 1479 /* Initialize the step clock timer */
Davidroid 2:4fd08b67958c 1480 STSPIN820_TimStckInit();
Davidroid 1:bc265521eb00 1481 /* Program the step clock */
Davidroid 2:4fd08b67958c 1482 STSPIN820_TimStckCompareInit();
Davidroid 2:4fd08b67958c 1483 STSPIN820_ApplySpeed(device_prm.minSpeed);
Davidroid 2:4fd08b67958c 1484 STSPIN820_TimStckStart();
Davidroid 1:bc265521eb00 1485 }
Davidroid 1:bc265521eb00 1486
Davidroid 2:4fd08b67958c 1487 /**********************************************************
Davidroid 1:bc265521eb00 1488 * @brief Handles the device state machine at each pulse
Davidroid 1:bc265521eb00 1489 * @retval None
Davidroid 1:bc265521eb00 1490 * @note Must only be called by the timer ISR
Davidroid 1:bc265521eb00 1491 **********************************************************/
Davidroid 2:4fd08b67958c 1492 void STSPIN820::STSPIN820_StepClockHandler(void)
Davidroid 1:bc265521eb00 1493 {
Davidroid 1:bc265521eb00 1494 uint32_t stepModeShift = device_prm.stepModeLatched - device_prm.stepMode;
Davidroid 1:bc265521eb00 1495 uint16_t tmp;
Davidroid 2:4fd08b67958c 1496
Davidroid 1:bc265521eb00 1497 if (device_prm.motionState == STANDBYTOINACTIVE)
Davidroid 1:bc265521eb00 1498 {
Davidroid 1:bc265521eb00 1499 if (toggle_odd != 0)
Davidroid 1:bc265521eb00 1500 {
Davidroid 1:bc265521eb00 1501 toggle_odd = 0;
Davidroid 1:bc265521eb00 1502 if (device_prm.sequencerPosition == 0)
Davidroid 1:bc265521eb00 1503 {
Davidroid 2:4fd08b67958c 1504 if (STSPIN820_TimStckStop(&toggle_odd) == 0)
Davidroid 1:bc265521eb00 1505 {
Davidroid 1:bc265521eb00 1506 STSPIN820_ErrorHandler(STSPIN820_ERROR_STEP_CLOCK);
Davidroid 1:bc265521eb00 1507 }
Davidroid 1:bc265521eb00 1508 return;
Davidroid 1:bc265521eb00 1509 }
Davidroid 1:bc265521eb00 1510 }
Davidroid 1:bc265521eb00 1511 else
Davidroid 1:bc265521eb00 1512 {
Davidroid 1:bc265521eb00 1513 toggle_odd = 1;
Davidroid 1:bc265521eb00 1514 tmp = (1 << (STEP_MODE_1_256-device_prm.stepMode));
Davidroid 1:bc265521eb00 1515 device_prm.sequencerPosition -= tmp;
Davidroid 1:bc265521eb00 1516 }
Davidroid 2:4fd08b67958c 1517 STSPIN820_TimStckSetFreq(STSPIN820_MAX_STCK_FREQ);
Davidroid 1:bc265521eb00 1518 return;
Davidroid 1:bc265521eb00 1519 }
Davidroid 1:bc265521eb00 1520
Davidroid 1:bc265521eb00 1521 if (toggle_odd == 0)
Davidroid 1:bc265521eb00 1522 {
Davidroid 1:bc265521eb00 1523 toggle_odd = 1;
Davidroid 1:bc265521eb00 1524 }
Davidroid 1:bc265521eb00 1525 else
Davidroid 1:bc265521eb00 1526 {
Davidroid 1:bc265521eb00 1527 toggle_odd = 0;
Davidroid 1:bc265521eb00 1528 /* Incrementation of the relative position */
Davidroid 1:bc265521eb00 1529 device_prm.relativePos += (1 << stepModeShift);
Davidroid 1:bc265521eb00 1530
Davidroid 1:bc265521eb00 1531 /* Incrementation of the current position */
Davidroid 1:bc265521eb00 1532 if (device_prm.direction != BACKWARD)
Davidroid 1:bc265521eb00 1533 {
Davidroid 1:bc265521eb00 1534 device_prm.currentPosition += (1 << stepModeShift);
Davidroid 1:bc265521eb00 1535 tmp = (1 << (STEP_MODE_1_256-device_prm.stepMode));
Davidroid 1:bc265521eb00 1536 device_prm.sequencerPosition += tmp;
Davidroid 1:bc265521eb00 1537 if (device_prm.sequencerPosition >= (SEQUENCER_MAX_VALUE+1))
Davidroid 1:bc265521eb00 1538 {
Davidroid 1:bc265521eb00 1539 device_prm.sequencerPosition -= (SEQUENCER_MAX_VALUE+1);
Davidroid 1:bc265521eb00 1540 }
Davidroid 1:bc265521eb00 1541 }
Davidroid 1:bc265521eb00 1542 else
Davidroid 1:bc265521eb00 1543 {
Davidroid 1:bc265521eb00 1544 device_prm.currentPosition -= (1 << stepModeShift);
Davidroid 1:bc265521eb00 1545 tmp = (1 << (STEP_MODE_1_256-device_prm.stepMode));
Davidroid 1:bc265521eb00 1546 device_prm.sequencerPosition -= tmp;
Davidroid 1:bc265521eb00 1547 if (device_prm.sequencerPosition < 0)
Davidroid 1:bc265521eb00 1548 {
Davidroid 1:bc265521eb00 1549 device_prm.sequencerPosition += (SEQUENCER_MAX_VALUE+1);
Davidroid 1:bc265521eb00 1550 }
Davidroid 1:bc265521eb00 1551 }
Davidroid 1:bc265521eb00 1552
Davidroid 1:bc265521eb00 1553 switch (device_prm.motionState)
Davidroid 1:bc265521eb00 1554 {
Davidroid 1:bc265521eb00 1555 case ACCELERATING:
Davidroid 1:bc265521eb00 1556 {
Davidroid 1:bc265521eb00 1557 uint32_t relPos = device_prm.relativePos;
Davidroid 1:bc265521eb00 1558 uint32_t endAccPos = device_prm.endAccPos;
Davidroid 1:bc265521eb00 1559 uint16_t speed = device_prm.speed;
Davidroid 1:bc265521eb00 1560 uint32_t acc = ((uint32_t)device_prm.acceleration << 16)>>stepModeShift;
Davidroid 1:bc265521eb00 1561
Davidroid 1:bc265521eb00 1562 if (((device_prm.commandExecuted&(STSPIN820_SOFT_STOP_BIT_MASK|STSPIN820_DIR_CHANGE_BIT_MASK))!=0)||\
Davidroid 1:bc265521eb00 1563 ((device_prm.commandExecuted==MOVE_CMD)&&(relPos>=device_prm.startDecPos)))
Davidroid 1:bc265521eb00 1564 {
Davidroid 1:bc265521eb00 1565 device_prm.motionState = DECELERATING;
Davidroid 1:bc265521eb00 1566 device_prm.accu = 0;
Davidroid 1:bc265521eb00 1567 /* Apply decelerating torque */
Davidroid 2:4fd08b67958c 1568 STSPIN820_ApplyTorque(DEC_TORQUE);
Davidroid 1:bc265521eb00 1569 }
Davidroid 1:bc265521eb00 1570 else if ((speed>=(device_prm.maxSpeed>>stepModeShift))||\
Davidroid 1:bc265521eb00 1571 ((device_prm.commandExecuted==MOVE_CMD)&&(relPos >= endAccPos)))
Davidroid 1:bc265521eb00 1572 {
Davidroid 1:bc265521eb00 1573 device_prm.motionState = STEADY;
Davidroid 1:bc265521eb00 1574 /* Apply running torque */
Davidroid 2:4fd08b67958c 1575 STSPIN820_ApplyTorque(RUN_TORQUE);
Davidroid 1:bc265521eb00 1576 }
Davidroid 1:bc265521eb00 1577 else
Davidroid 1:bc265521eb00 1578 {
Davidroid 1:bc265521eb00 1579 bool speedUpdated = FALSE;
Davidroid 1:bc265521eb00 1580 /* Go on accelerating */
Davidroid 1:bc265521eb00 1581 if (speed==0)
Davidroid 1:bc265521eb00 1582 {
Davidroid 1:bc265521eb00 1583 speed =1;
Davidroid 1:bc265521eb00 1584 }
Davidroid 1:bc265521eb00 1585 device_prm.accu += acc / speed;
Davidroid 1:bc265521eb00 1586 while (device_prm.accu>=(0X10000L))
Davidroid 1:bc265521eb00 1587 {
Davidroid 1:bc265521eb00 1588 device_prm.accu -= (0X10000L);
Davidroid 1:bc265521eb00 1589 speed +=1;
Davidroid 1:bc265521eb00 1590 speedUpdated = TRUE;
Davidroid 1:bc265521eb00 1591 }
Davidroid 1:bc265521eb00 1592
Davidroid 1:bc265521eb00 1593 if (speedUpdated)
Davidroid 1:bc265521eb00 1594 {
Davidroid 1:bc265521eb00 1595 if (speed>(device_prm.maxSpeed>>stepModeShift))
Davidroid 1:bc265521eb00 1596 {
Davidroid 1:bc265521eb00 1597 speed = device_prm.maxSpeed>>stepModeShift;
Davidroid 1:bc265521eb00 1598 }
Davidroid 1:bc265521eb00 1599 device_prm.speed = speed;
Davidroid 1:bc265521eb00 1600 }
Davidroid 1:bc265521eb00 1601
Davidroid 1:bc265521eb00 1602 if (device_prm.updateTorque!=FALSE)
Davidroid 1:bc265521eb00 1603 {
Davidroid 1:bc265521eb00 1604 /* Apply accelerating torque */
Davidroid 2:4fd08b67958c 1605 STSPIN820_ApplyTorque(ACC_TORQUE);
Davidroid 1:bc265521eb00 1606 }
Davidroid 1:bc265521eb00 1607 }
Davidroid 1:bc265521eb00 1608 break;
Davidroid 1:bc265521eb00 1609 }
Davidroid 1:bc265521eb00 1610 case STEADY:
Davidroid 1:bc265521eb00 1611 {
Davidroid 1:bc265521eb00 1612 uint16_t maxSpeed = device_prm.maxSpeed>>stepModeShift;
Davidroid 1:bc265521eb00 1613 uint32_t relativePos = device_prm.relativePos;
Davidroid 1:bc265521eb00 1614 if (device_prm.updateTorque!=FALSE)
Davidroid 1:bc265521eb00 1615 {
Davidroid 1:bc265521eb00 1616 /* Apply accelerating torque */
Davidroid 2:4fd08b67958c 1617 STSPIN820_ApplyTorque(RUN_TORQUE);
Davidroid 1:bc265521eb00 1618 }
Davidroid 1:bc265521eb00 1619 if (((device_prm.commandExecuted&(STSPIN820_SOFT_STOP_BIT_MASK|STSPIN820_DIR_CHANGE_BIT_MASK))!=0)||\
Davidroid 1:bc265521eb00 1620 ((device_prm.commandExecuted==MOVE_CMD)&&\
Davidroid 1:bc265521eb00 1621 (relativePos>=(device_prm.startDecPos)))||\
Davidroid 1:bc265521eb00 1622 ((device_prm.commandExecuted==RUN_CMD)&&\
Davidroid 1:bc265521eb00 1623 (device_prm.speed>maxSpeed)))
Davidroid 1:bc265521eb00 1624 {
Davidroid 1:bc265521eb00 1625 device_prm.motionState = DECELERATING;
Davidroid 1:bc265521eb00 1626 device_prm.accu = 0;
Davidroid 1:bc265521eb00 1627 /* Apply decelerating torque */
Davidroid 2:4fd08b67958c 1628 STSPIN820_ApplyTorque(DEC_TORQUE);
Davidroid 1:bc265521eb00 1629 }
Davidroid 1:bc265521eb00 1630 else if ((device_prm.commandExecuted==RUN_CMD)&&(device_prm.speed<maxSpeed))
Davidroid 1:bc265521eb00 1631 {
Davidroid 1:bc265521eb00 1632 device_prm.motionState = ACCELERATING;
Davidroid 1:bc265521eb00 1633 device_prm.accu = 0;
Davidroid 1:bc265521eb00 1634 /* Apply accelerating torque */
Davidroid 2:4fd08b67958c 1635 STSPIN820_ApplyTorque(ACC_TORQUE);
Davidroid 1:bc265521eb00 1636 }
Davidroid 1:bc265521eb00 1637 break;
Davidroid 1:bc265521eb00 1638 }
Davidroid 1:bc265521eb00 1639 case DECELERATING:
Davidroid 1:bc265521eb00 1640 {
Davidroid 1:bc265521eb00 1641 uint32_t relativePos = device_prm.relativePos;
Davidroid 1:bc265521eb00 1642 uint16_t speed = device_prm.speed;
Davidroid 1:bc265521eb00 1643 uint32_t dec = ((uint32_t)device_prm.deceleration << 16)>>stepModeShift;
Davidroid 1:bc265521eb00 1644 if ((((device_prm.commandExecuted&(STSPIN820_SOFT_STOP_BIT_MASK|STSPIN820_DIR_CHANGE_BIT_MASK))!=0)&&\
Davidroid 1:bc265521eb00 1645 (speed<=(device_prm.minSpeed>>stepModeShift)))||\
Davidroid 1:bc265521eb00 1646 ((device_prm.commandExecuted==MOVE_CMD)&&(relativePos>=device_prm.stepsToTake)))
Davidroid 1:bc265521eb00 1647 {
Davidroid 1:bc265521eb00 1648 /* Motion process complete */
Davidroid 1:bc265521eb00 1649 if ((device_prm.commandExecuted&STSPIN820_DIR_CHANGE_BIT_MASK)!=0)
Davidroid 1:bc265521eb00 1650 {
Davidroid 2:4fd08b67958c 1651 device_prm.commandExecuted = (device_command_t) (device_prm.commandExecuted & ~STSPIN820_DIR_CHANGE_BIT_MASK);
Davidroid 1:bc265521eb00 1652 if (device_prm.direction==BACKWARD)
Davidroid 1:bc265521eb00 1653 {
Davidroid 1:bc265521eb00 1654 device_prm.direction=FORWARD;
Davidroid 1:bc265521eb00 1655 }
Davidroid 1:bc265521eb00 1656 else device_prm.direction=BACKWARD;
Davidroid 2:4fd08b67958c 1657 STSPIN820_SetDirectionGpio(device_prm.direction);
Davidroid 1:bc265521eb00 1658 if ((device_prm.commandExecuted&STSPIN820_SOFT_STOP_BIT_MASK)==0)
Davidroid 1:bc265521eb00 1659 {
Davidroid 1:bc265521eb00 1660 device_prm.motionState = ACCELERATING;
Davidroid 1:bc265521eb00 1661 device_prm.accu = 0;
Davidroid 1:bc265521eb00 1662 /* Apply accelerating torque */
Davidroid 2:4fd08b67958c 1663 STSPIN820_ApplyTorque(ACC_TORQUE);
Davidroid 1:bc265521eb00 1664 break;
Davidroid 1:bc265521eb00 1665 }
Davidroid 1:bc265521eb00 1666 }
Davidroid 1:bc265521eb00 1667 if (device_prm.stopMode==HOLD_MODE)
Davidroid 1:bc265521eb00 1668 {
Davidroid 2:4fd08b67958c 1669 STSPIN820_HardStop();
Davidroid 1:bc265521eb00 1670 }
Davidroid 1:bc265521eb00 1671 else if (device_prm.stopMode==STANDBY_MODE)
Davidroid 1:bc265521eb00 1672 {
Davidroid 2:4fd08b67958c 1673 STSPIN820_PutDeviceInStandby();
Davidroid 1:bc265521eb00 1674 }
Davidroid 1:bc265521eb00 1675 else
Davidroid 1:bc265521eb00 1676 {
Davidroid 2:4fd08b67958c 1677 STSPIN820_HardHiZ();
Davidroid 1:bc265521eb00 1678 }
Davidroid 1:bc265521eb00 1679 }
Davidroid 1:bc265521eb00 1680 else if ((device_prm.commandExecuted==RUN_CMD)&&
Davidroid 1:bc265521eb00 1681 (speed<=(device_prm.maxSpeed>>stepModeShift)))
Davidroid 1:bc265521eb00 1682 {
Davidroid 1:bc265521eb00 1683 device_prm.motionState = STEADY;
Davidroid 1:bc265521eb00 1684 /* Apply running torque */
Davidroid 2:4fd08b67958c 1685 STSPIN820_ApplyTorque(RUN_TORQUE);
Davidroid 1:bc265521eb00 1686 }
Davidroid 1:bc265521eb00 1687 else
Davidroid 1:bc265521eb00 1688 {
Davidroid 1:bc265521eb00 1689 /* Go on decelerating */
Davidroid 1:bc265521eb00 1690 if (speed>(device_prm.minSpeed>>stepModeShift))
Davidroid 1:bc265521eb00 1691 {
Davidroid 1:bc265521eb00 1692 bool speedUpdated = FALSE;
Davidroid 1:bc265521eb00 1693 if (speed==0)
Davidroid 1:bc265521eb00 1694 {
Davidroid 1:bc265521eb00 1695 speed = 1;
Davidroid 1:bc265521eb00 1696 }
Davidroid 1:bc265521eb00 1697 device_prm.accu += dec / speed;
Davidroid 1:bc265521eb00 1698 while (device_prm.accu>=(0X10000L))
Davidroid 1:bc265521eb00 1699 {
Davidroid 1:bc265521eb00 1700 device_prm.accu -= (0X10000L);
Davidroid 1:bc265521eb00 1701 if (speed>1)
Davidroid 1:bc265521eb00 1702 {
Davidroid 1:bc265521eb00 1703 speed -=1;
Davidroid 1:bc265521eb00 1704 }
Davidroid 1:bc265521eb00 1705 speedUpdated = TRUE;
Davidroid 1:bc265521eb00 1706 }
Davidroid 1:bc265521eb00 1707
Davidroid 1:bc265521eb00 1708 if (speedUpdated)
Davidroid 1:bc265521eb00 1709 {
Davidroid 1:bc265521eb00 1710 if (speed<(device_prm.minSpeed>>stepModeShift))
Davidroid 1:bc265521eb00 1711 {
Davidroid 1:bc265521eb00 1712 speed = device_prm.minSpeed>>stepModeShift;
Davidroid 1:bc265521eb00 1713 }
Davidroid 1:bc265521eb00 1714 device_prm.speed = speed;
Davidroid 1:bc265521eb00 1715 }
Davidroid 1:bc265521eb00 1716
Davidroid 1:bc265521eb00 1717 if (device_prm.updateTorque!=FALSE)
Davidroid 1:bc265521eb00 1718 {
Davidroid 1:bc265521eb00 1719 /* Apply decelerating torque */
Davidroid 2:4fd08b67958c 1720 STSPIN820_ApplyTorque(DEC_TORQUE);
Davidroid 1:bc265521eb00 1721 }
Davidroid 1:bc265521eb00 1722 }
Davidroid 1:bc265521eb00 1723 }
Davidroid 1:bc265521eb00 1724 break;
Davidroid 1:bc265521eb00 1725 }
Davidroid 1:bc265521eb00 1726 default:
Davidroid 1:bc265521eb00 1727 {
Davidroid 1:bc265521eb00 1728 break;
Davidroid 1:bc265521eb00 1729 }
Davidroid 1:bc265521eb00 1730 }
Davidroid 1:bc265521eb00 1731 }
Davidroid 1:bc265521eb00 1732 if ((device_prm.motionState & INACTIVE) != INACTIVE)
Davidroid 1:bc265521eb00 1733 {
Davidroid 2:4fd08b67958c 1734 STSPIN820_ApplySpeed(device_prm.speed);
Davidroid 1:bc265521eb00 1735 }
Davidroid 1:bc265521eb00 1736 else
Davidroid 1:bc265521eb00 1737 {
Davidroid 2:4fd08b67958c 1738 if (STSPIN820_TimStckStop(&toggle_odd) == 0)
Davidroid 1:bc265521eb00 1739 {
Davidroid 1:bc265521eb00 1740 STSPIN820_ErrorHandler(STSPIN820_ERROR_STEP_CLOCK);
Davidroid 1:bc265521eb00 1741 }
Davidroid 1:bc265521eb00 1742 }
Davidroid 1:bc265521eb00 1743 }
Davidroid 2:4fd08b67958c 1744
Davidroid 1:bc265521eb00 1745 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/