Expansion SW library to control a bipolar stepper motor using X-NUCLEO-IHM05A1 expansion board based on L6208.

Dependencies:   ST_INTERFACES

Dependents:   HelloWorld_IHM05A1 TAU_ROTATING_PLATFORM_IHM05A1 Amaldi_13_Exercise_IHM05A1 Amaldi_13_Exercise_IHM05A1motore ... more

Fork of X-NUCLEO-IHM05A1 by ST Expansion SW Team

Motor Control Library

Library to handle the X-NUCLEO-IHM05A1 Motor Control Expansion Board based on the L6208 component.

It features the:

  • Read and write of device parameters
  • Configuration of GPIOs and IRQs (for enabling, direction, current decay and microstepping)
  • Control of position, speed, acceleration and deceleration
  • Command locking until the device completes movement
  • Handling of overcurrent and thermal alarms (flag interrupt handling)

The API allows to easily:

  • perform various positioning, moves and stops
  • get/set or monitor the motor positions
  • set home position and mark another position
  • get/set minimum and maximum speed
  • get current speed
  • get/set acceleration and deceleration
  • get/set the step mode (up to 1/16)

Board configuration

/media/uploads/nucleosam/mbed-x-nucleo-ihm05a1.png

Platform compatibility

Compatible platforms have been tested with the configurations provided by the HelloWorld_IHM05A1 example.

Committer:
Davidroid
Date:
Fri Jul 28 13:06:36 2017 +0000
Revision:
6:c73faac7197f
Parent:
4:0b52159554b5
Aligning to ARM mbed coding style.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
davide.aliprandi@st.com 3:63a8d672fe5e 1 /**
davide.aliprandi@st.com 3:63a8d672fe5e 2 ******************************************************************************
davide.aliprandi@st.com 3:63a8d672fe5e 3 * @file L6208.cpp
davide.aliprandi@st.com 3:63a8d672fe5e 4 * @author IPC Rennes
davide.aliprandi@st.com 3:63a8d672fe5e 5 * @version V1.1.0
davide.aliprandi@st.com 3:63a8d672fe5e 6 * @date February 11th, 2016
davide.aliprandi@st.com 3:63a8d672fe5e 7 * @brief L6208 product related routines
davide.aliprandi@st.com 3:63a8d672fe5e 8 * @note (C) COPYRIGHT 2016 STMicroelectronics
davide.aliprandi@st.com 3:63a8d672fe5e 9 ******************************************************************************
davide.aliprandi@st.com 3:63a8d672fe5e 10 * @attention
davide.aliprandi@st.com 3:63a8d672fe5e 11 *
davide.aliprandi@st.com 3:63a8d672fe5e 12 * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
davide.aliprandi@st.com 3:63a8d672fe5e 13 *
davide.aliprandi@st.com 3:63a8d672fe5e 14 * Redistribution and use in source and binary forms, with or without modification,
davide.aliprandi@st.com 3:63a8d672fe5e 15 * are permitted provided that the following conditions are met:
davide.aliprandi@st.com 3:63a8d672fe5e 16 * 1. Redistributions of source code must retain the above copyright notice,
davide.aliprandi@st.com 3:63a8d672fe5e 17 * this list of conditions and the following disclaimer.
davide.aliprandi@st.com 3:63a8d672fe5e 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
davide.aliprandi@st.com 3:63a8d672fe5e 19 * this list of conditions and the following disclaimer in the documentation
davide.aliprandi@st.com 3:63a8d672fe5e 20 * and/or other materials provided with the distribution.
davide.aliprandi@st.com 3:63a8d672fe5e 21 * 3. Neither the name of STMicroelectronics nor the names of its contributors
davide.aliprandi@st.com 3:63a8d672fe5e 22 * may be used to endorse or promote products derived from this software
davide.aliprandi@st.com 3:63a8d672fe5e 23 * without specific prior written permission.
davide.aliprandi@st.com 3:63a8d672fe5e 24 *
davide.aliprandi@st.com 3:63a8d672fe5e 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
davide.aliprandi@st.com 3:63a8d672fe5e 26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
davide.aliprandi@st.com 3:63a8d672fe5e 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
davide.aliprandi@st.com 3:63a8d672fe5e 28 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
davide.aliprandi@st.com 3:63a8d672fe5e 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
davide.aliprandi@st.com 3:63a8d672fe5e 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
davide.aliprandi@st.com 3:63a8d672fe5e 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
davide.aliprandi@st.com 3:63a8d672fe5e 32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
davide.aliprandi@st.com 3:63a8d672fe5e 33 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
davide.aliprandi@st.com 3:63a8d672fe5e 34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
davide.aliprandi@st.com 3:63a8d672fe5e 35 *
davide.aliprandi@st.com 3:63a8d672fe5e 36 ******************************************************************************
davide.aliprandi@st.com 3:63a8d672fe5e 37 */
davide.aliprandi@st.com 3:63a8d672fe5e 38
davide.aliprandi@st.com 3:63a8d672fe5e 39 /* Includes ------------------------------------------------------------------*/
davide.aliprandi@st.com 3:63a8d672fe5e 40 #include "L6208.h"
davide.aliprandi@st.com 3:63a8d672fe5e 41
davide.aliprandi@st.com 3:63a8d672fe5e 42 /* Definitions ---------------------------------------------------------------*/
davide.aliprandi@st.com 3:63a8d672fe5e 43 /// Bridge A
davide.aliprandi@st.com 3:63a8d672fe5e 44 #define BRIDGE_A (0)
davide.aliprandi@st.com 3:63a8d672fe5e 45 /// Bridge B
davide.aliprandi@st.com 3:63a8d672fe5e 46 #define BRIDGE_B (1)
davide.aliprandi@st.com 3:63a8d672fe5e 47
davide.aliprandi@st.com 3:63a8d672fe5e 48 /// Bitmaps for system flags
davide.aliprandi@st.com 3:63a8d672fe5e 49 #define EN_A_set 0x00000001 ///< EN_A pin status
davide.aliprandi@st.com 3:63a8d672fe5e 50 #define HiZstop 0x00000002 ///< motor has to be left in HiZ after stopping
davide.aliprandi@st.com 3:63a8d672fe5e 51 #define busy 0x00000004 ///< stepper position command executing flag
davide.aliprandi@st.com 3:63a8d672fe5e 52 #define running 0x00000008 ///< running motor flag
davide.aliprandi@st.com 3:63a8d672fe5e 53 #define velocitymode 0x00000010 ///< velocity controlled stepper motor
davide.aliprandi@st.com 3:63a8d672fe5e 54 #define positionmode 0x00000020 ///< position controlled stepper motor
davide.aliprandi@st.com 3:63a8d672fe5e 55 #define fullstep 0x00000040 ///< full step mode controlled
davide.aliprandi@st.com 3:63a8d672fe5e 56 #define halfstep 0x00000080 ///< half step mode controlled
davide.aliprandi@st.com 3:63a8d672fe5e 57 #define microstep 0x00000100 ///< micro step mode controlled
davide.aliprandi@st.com 3:63a8d672fe5e 58 #define forward 0x00000200 ///< forward running motor
davide.aliprandi@st.com 3:63a8d672fe5e 59 #define dir2change 0x00000400 ///< direction has to be changed while the motor is running
davide.aliprandi@st.com 3:63a8d672fe5e 60 #define fastdecaymode 0x00000800 ///< decay mode is fast
davide.aliprandi@st.com 3:63a8d672fe5e 61 #define wavestep 0x00001000 ///< wave step mode controlled
davide.aliprandi@st.com 3:63a8d672fe5e 62
davide.aliprandi@st.com 3:63a8d672fe5e 63 /* Variables ----------------------------------------------------------------*/
davide.aliprandi@st.com 3:63a8d672fe5e 64 /* Number of devices. */
davide.aliprandi@st.com 3:63a8d672fe5e 65 uint8_t L6208::numberOfDevices = 0;
davide.aliprandi@st.com 3:63a8d672fe5e 66
davide.aliprandi@st.com 3:63a8d672fe5e 67 /// RefMicroTable values are 2^L6208_SINE_WAVEFORM_POWER_OF_TWO_MAX_VALUE*|sin(n/16*PI/2)|
davide.aliprandi@st.com 3:63a8d672fe5e 68 /// where n is the index in the table
davide.aliprandi@st.com 3:63a8d672fe5e 69 const uint16_t L6208::RefMicroTable[L6208_USTEPS_PER_QUARTER_PERIOD*3] =
davide.aliprandi@st.com 3:63a8d672fe5e 70 {
davide.aliprandi@st.com 3:63a8d672fe5e 71 0,3212,6393,9512,12540,15447,18205,20788,23170,25330,27246,28899,30274,31357,32138,32610,
davide.aliprandi@st.com 3:63a8d672fe5e 72 32768,32610,32138,31357,30274,28899,27246,25330,23170,20788,18205,15447,12540,9512,6393,3212,
davide.aliprandi@st.com 3:63a8d672fe5e 73 0,3212,6393,9512,12540,15447,18205,20788,23170,25330,27246,28899,30274,31357,32138,32610
davide.aliprandi@st.com 3:63a8d672fe5e 74 };
davide.aliprandi@st.com 3:63a8d672fe5e 75
davide.aliprandi@st.com 3:63a8d672fe5e 76 /* Methods -------------------------------------------------------------------*/
davide.aliprandi@st.com 3:63a8d672fe5e 77 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 78 * @brief Start the L6208 library
davide.aliprandi@st.com 3:63a8d672fe5e 79 * @param[in] pInit pointer to the initialization data
davide.aliprandi@st.com 3:63a8d672fe5e 80 * @retval COMPONENT_OK in case of success.
davide.aliprandi@st.com 3:63a8d672fe5e 81 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 82 status_t L6208::L6208_Init(void* pInit)
davide.aliprandi@st.com 3:63a8d672fe5e 83 {
davide.aliprandi@st.com 3:63a8d672fe5e 84 if (pInit == NULL)
davide.aliprandi@st.com 3:63a8d672fe5e 85 {
davide.aliprandi@st.com 3:63a8d672fe5e 86 /* Set context variables to the predefined values from l6208_target_config.h */
davide.aliprandi@st.com 3:63a8d672fe5e 87 /* Set GPIO according to these values */
davide.aliprandi@st.com 3:63a8d672fe5e 88 L6208_SetDeviceParamsToPredefinedValues();
davide.aliprandi@st.com 3:63a8d672fe5e 89 }
davide.aliprandi@st.com 3:63a8d672fe5e 90 else
davide.aliprandi@st.com 3:63a8d672fe5e 91 {
davide.aliprandi@st.com 3:63a8d672fe5e 92 L6208_SetDeviceParamsToGivenValues((l6208_init_t*) pInit);
davide.aliprandi@st.com 3:63a8d672fe5e 93 }
davide.aliprandi@st.com 3:63a8d672fe5e 94
davide.aliprandi@st.com 3:63a8d672fe5e 95 /* Initialise the PWMs */
davide.aliprandi@st.com 3:63a8d672fe5e 96 L6208_Board_VrefPwmInit(BRIDGE_A, devicePrm.vrefPwmPeriod);
davide.aliprandi@st.com 3:63a8d672fe5e 97 L6208_Board_VrefPwmInit(BRIDGE_B, devicePrm.vrefPwmPeriod);
davide.aliprandi@st.com 3:63a8d672fe5e 98
davide.aliprandi@st.com 3:63a8d672fe5e 99 /* Initialise the tick */
davide.aliprandi@st.com 3:63a8d672fe5e 100 L6208_Board_TickInit();
davide.aliprandi@st.com 3:63a8d672fe5e 101
davide.aliprandi@st.com 3:63a8d672fe5e 102 /* Reset L6208 */
davide.aliprandi@st.com 3:63a8d672fe5e 103 L6208_ResetDevice();
davide.aliprandi@st.com 3:63a8d672fe5e 104
davide.aliprandi@st.com 3:63a8d672fe5e 105 /* Align motor mechanical position to driver position */
davide.aliprandi@st.com 3:63a8d672fe5e 106 L6208_Board_VrefPwmStart(BRIDGE_A, devicePrm.vrefPwmPeriod);
davide.aliprandi@st.com 3:63a8d672fe5e 107 L6208_Board_VrefPwmStart(BRIDGE_B, devicePrm.vrefPwmPeriod);
davide.aliprandi@st.com 3:63a8d672fe5e 108 //L6208_Enable();
davide.aliprandi@st.com 3:63a8d672fe5e 109
davide.aliprandi@st.com 3:63a8d672fe5e 110 return COMPONENT_OK;
davide.aliprandi@st.com 3:63a8d672fe5e 111 }
davide.aliprandi@st.com 3:63a8d672fe5e 112
davide.aliprandi@st.com 3:63a8d672fe5e 113 /**********************************************************
davide.aliprandi@st.com 3:63a8d672fe5e 114 * @brief Read id
davide.aliprandi@st.com 3:63a8d672fe5e 115 * @param id pointer to the identifier to be read.
davide.aliprandi@st.com 3:63a8d672fe5e 116 * @retval COMPONENT_OK in case of success.
davide.aliprandi@st.com 3:63a8d672fe5e 117 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 118 status_t L6208::L6208_ReadID(uint8_t *id)
davide.aliprandi@st.com 3:63a8d672fe5e 119 {
davide.aliprandi@st.com 3:63a8d672fe5e 120 *id = deviceInstance;
davide.aliprandi@st.com 3:63a8d672fe5e 121
davide.aliprandi@st.com 3:63a8d672fe5e 122 return COMPONENT_OK;
davide.aliprandi@st.com 3:63a8d672fe5e 123 }
davide.aliprandi@st.com 3:63a8d672fe5e 124
davide.aliprandi@st.com 3:63a8d672fe5e 125 /**********************************************************
davide.aliprandi@st.com 3:63a8d672fe5e 126 * @brief Attaches a user callback to the error Handler.
davide.aliprandi@st.com 3:63a8d672fe5e 127 * The call back will be then called each time the library
davide.aliprandi@st.com 3:63a8d672fe5e 128 * detects an error
davide.aliprandi@st.com 3:63a8d672fe5e 129 * @param[in] callback Name of the callback to attach
davide.aliprandi@st.com 3:63a8d672fe5e 130 * to the error Hanlder
davide.aliprandi@st.com 3:63a8d672fe5e 131 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 132 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 133 void L6208::L6208_AttachErrorHandler(void (*callback)(uint16_t error))
davide.aliprandi@st.com 3:63a8d672fe5e 134 {
davide.aliprandi@st.com 3:63a8d672fe5e 135 errorHandlerCallback = (void (*)(uint16_t error)) callback;
davide.aliprandi@st.com 3:63a8d672fe5e 136 }
davide.aliprandi@st.com 3:63a8d672fe5e 137
davide.aliprandi@st.com 3:63a8d672fe5e 138 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 139 * @brief Disable the power bridges (leave the output bridges HiZ)
davide.aliprandi@st.com 3:63a8d672fe5e 140 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 141 **********************************************************/
Davidroid 4:0b52159554b5 142 void L6208::L6208_Disable(void)
davide.aliprandi@st.com 3:63a8d672fe5e 143 {
davide.aliprandi@st.com 3:63a8d672fe5e 144 L6208_Board_Disable();
davide.aliprandi@st.com 3:63a8d672fe5e 145 L6208_ClearSysFlag(EN_A_set);
davide.aliprandi@st.com 3:63a8d672fe5e 146 }
davide.aliprandi@st.com 3:63a8d672fe5e 147
davide.aliprandi@st.com 3:63a8d672fe5e 148 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 149 * @brief Error handler which calls the user callback (if defined)
davide.aliprandi@st.com 3:63a8d672fe5e 150 * @param[in] error Number of the error
davide.aliprandi@st.com 3:63a8d672fe5e 151 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 152 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 153 void L6208::L6208_ErrorHandler(uint16_t error)
davide.aliprandi@st.com 3:63a8d672fe5e 154 {
davide.aliprandi@st.com 3:63a8d672fe5e 155 if (errorHandlerCallback != 0)
davide.aliprandi@st.com 3:63a8d672fe5e 156 {
davide.aliprandi@st.com 3:63a8d672fe5e 157 errorHandlerCallback(error);
davide.aliprandi@st.com 3:63a8d672fe5e 158 }
davide.aliprandi@st.com 3:63a8d672fe5e 159 else
davide.aliprandi@st.com 3:63a8d672fe5e 160 {
davide.aliprandi@st.com 3:63a8d672fe5e 161 while(1)
davide.aliprandi@st.com 3:63a8d672fe5e 162 {
davide.aliprandi@st.com 3:63a8d672fe5e 163 /* Infinite loop */
davide.aliprandi@st.com 3:63a8d672fe5e 164 }
davide.aliprandi@st.com 3:63a8d672fe5e 165 }
davide.aliprandi@st.com 3:63a8d672fe5e 166 }
davide.aliprandi@st.com 3:63a8d672fe5e 167
davide.aliprandi@st.com 3:63a8d672fe5e 168 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 169 * @brief Enable the power bridges
davide.aliprandi@st.com 3:63a8d672fe5e 170 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 171 **********************************************************/
Davidroid 4:0b52159554b5 172 void L6208::L6208_Enable(void)
davide.aliprandi@st.com 3:63a8d672fe5e 173 {
davide.aliprandi@st.com 3:63a8d672fe5e 174 L6208_Board_Enable();
davide.aliprandi@st.com 3:63a8d672fe5e 175 L6208_SetSysFlag(EN_A_set);
davide.aliprandi@st.com 3:63a8d672fe5e 176 }
davide.aliprandi@st.com 3:63a8d672fe5e 177
davide.aliprandi@st.com 3:63a8d672fe5e 178 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 179 * @brief Get the stepper acceleration rate
davide.aliprandi@st.com 3:63a8d672fe5e 180 * in step/s^2 for full, half and wave modes
davide.aliprandi@st.com 3:63a8d672fe5e 181 * in microsteps/s^2 for microstep modes
davide.aliprandi@st.com 3:63a8d672fe5e 182 * @retval the stepper acceleration rate in step/s^2 or microstep/s^2
davide.aliprandi@st.com 3:63a8d672fe5e 183 * @note
davide.aliprandi@st.com 3:63a8d672fe5e 184 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 185 uint16_t L6208::L6208_GetAcceleration(void)
davide.aliprandi@st.com 3:63a8d672fe5e 186 {
davide.aliprandi@st.com 3:63a8d672fe5e 187 return devicePrm.accelerationSps2;
davide.aliprandi@st.com 3:63a8d672fe5e 188 }
davide.aliprandi@st.com 3:63a8d672fe5e 189
davide.aliprandi@st.com 3:63a8d672fe5e 190 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 191 * @brief Get the current speed
davide.aliprandi@st.com 3:63a8d672fe5e 192 * in step/s for full, half and wave modes
davide.aliprandi@st.com 3:63a8d672fe5e 193 * in microsteps/s for microstep modes
davide.aliprandi@st.com 3:63a8d672fe5e 194 * @retval return the current speed in step/s or microstep/s
davide.aliprandi@st.com 3:63a8d672fe5e 195 * @note
davide.aliprandi@st.com 3:63a8d672fe5e 196 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 197 uint16_t L6208::L6208_GetCurrentSpeed(void)
davide.aliprandi@st.com 3:63a8d672fe5e 198 {
davide.aliprandi@st.com 3:63a8d672fe5e 199 uint64_t tmp64 = (uint64_t) devicePrm.speedSpt * L6208_Board_TickGetFreq();
davide.aliprandi@st.com 3:63a8d672fe5e 200
davide.aliprandi@st.com 3:63a8d672fe5e 201 devicePrm.speedSps = (uint16_t)(tmp64 >> 23);
davide.aliprandi@st.com 3:63a8d672fe5e 202 if (devicePrm.speedSps & 0x1)
davide.aliprandi@st.com 3:63a8d672fe5e 203 {
davide.aliprandi@st.com 3:63a8d672fe5e 204 devicePrm.speedSps = (devicePrm.speedSps >> 1) + 1;
davide.aliprandi@st.com 3:63a8d672fe5e 205 }
davide.aliprandi@st.com 3:63a8d672fe5e 206 else
davide.aliprandi@st.com 3:63a8d672fe5e 207 {
davide.aliprandi@st.com 3:63a8d672fe5e 208 devicePrm.speedSps = devicePrm.speedSps >> 1;
davide.aliprandi@st.com 3:63a8d672fe5e 209 }
davide.aliprandi@st.com 3:63a8d672fe5e 210 return devicePrm.speedSps;
davide.aliprandi@st.com 3:63a8d672fe5e 211 }
davide.aliprandi@st.com 3:63a8d672fe5e 212
davide.aliprandi@st.com 3:63a8d672fe5e 213 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 214 * @brief Get the motor decay mode
davide.aliprandi@st.com 3:63a8d672fe5e 215 * @retval decay mode
davide.aliprandi@st.com 3:63a8d672fe5e 216 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 217 motorDecayMode_t L6208::L6208_get_decay_mode(void)
davide.aliprandi@st.com 3:63a8d672fe5e 218 {
Davidroid 6:c73faac7197f 219 if (L6208_IsSysFlag(fastdecaymode))
Davidroid 6:c73faac7197f 220 {
Davidroid 6:c73faac7197f 221 return (FAST_DECAY);
Davidroid 6:c73faac7197f 222 }
Davidroid 6:c73faac7197f 223 else
Davidroid 6:c73faac7197f 224 {
Davidroid 6:c73faac7197f 225 return (SLOW_DECAY);
Davidroid 6:c73faac7197f 226 }
davide.aliprandi@st.com 3:63a8d672fe5e 227 }
davide.aliprandi@st.com 3:63a8d672fe5e 228
davide.aliprandi@st.com 3:63a8d672fe5e 229 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 230 * @brief Get the stepper deceleration rate
davide.aliprandi@st.com 3:63a8d672fe5e 231 * in step/s^2 for full, half and wave modes
davide.aliprandi@st.com 3:63a8d672fe5e 232 * in microsteps/s^2 for microstep modes
davide.aliprandi@st.com 3:63a8d672fe5e 233 * @retval the stepper deceleration rate in step/s^2 or microstep/s^2
davide.aliprandi@st.com 3:63a8d672fe5e 234 * @note
davide.aliprandi@st.com 3:63a8d672fe5e 235 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 236 uint16_t L6208::L6208_GetDeceleration(void)
davide.aliprandi@st.com 3:63a8d672fe5e 237 {
davide.aliprandi@st.com 3:63a8d672fe5e 238 return devicePrm.decelerationSps2;
davide.aliprandi@st.com 3:63a8d672fe5e 239 }
davide.aliprandi@st.com 3:63a8d672fe5e 240
davide.aliprandi@st.com 3:63a8d672fe5e 241 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 242 * @brief Get the motor current direction
davide.aliprandi@st.com 3:63a8d672fe5e 243 * @retval direction
davide.aliprandi@st.com 3:63a8d672fe5e 244 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 245 motorDir_t L6208::L6208_GetDirection(void)
davide.aliprandi@st.com 3:63a8d672fe5e 246 {
davide.aliprandi@st.com 3:63a8d672fe5e 247 if (L6208_IsSysFlag(forward))
davide.aliprandi@st.com 3:63a8d672fe5e 248 {
davide.aliprandi@st.com 3:63a8d672fe5e 249 return FORWARD;
davide.aliprandi@st.com 3:63a8d672fe5e 250 }
davide.aliprandi@st.com 3:63a8d672fe5e 251 else
davide.aliprandi@st.com 3:63a8d672fe5e 252 {
davide.aliprandi@st.com 3:63a8d672fe5e 253 return BACKWARD;
davide.aliprandi@st.com 3:63a8d672fe5e 254 }
davide.aliprandi@st.com 3:63a8d672fe5e 255 }
davide.aliprandi@st.com 3:63a8d672fe5e 256
davide.aliprandi@st.com 3:63a8d672fe5e 257 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 258 * @brief Return the FW version.
davide.aliprandi@st.com 3:63a8d672fe5e 259 * @retval FW version
davide.aliprandi@st.com 3:63a8d672fe5e 260 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 261 uint32_t L6208::L6208_GetFwVersion(void)
davide.aliprandi@st.com 3:63a8d672fe5e 262 {
davide.aliprandi@st.com 3:63a8d672fe5e 263 return L6208_FW_VERSION;
davide.aliprandi@st.com 3:63a8d672fe5e 264 }
davide.aliprandi@st.com 3:63a8d672fe5e 265
davide.aliprandi@st.com 3:63a8d672fe5e 266 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 267 * @brief Get the mark position (32b signed)
davide.aliprandi@st.com 3:63a8d672fe5e 268 * @retval mark position
davide.aliprandi@st.com 3:63a8d672fe5e 269 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 270 int32_t L6208::L6208_GetMark(void)
davide.aliprandi@st.com 3:63a8d672fe5e 271 {
davide.aliprandi@st.com 3:63a8d672fe5e 272 return devicePrm.markPos;
davide.aliprandi@st.com 3:63a8d672fe5e 273 }
davide.aliprandi@st.com 3:63a8d672fe5e 274
davide.aliprandi@st.com 3:63a8d672fe5e 275 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 276 * @brief Get the max speed
davide.aliprandi@st.com 3:63a8d672fe5e 277 * in step/s for full, half and wave modes
davide.aliprandi@st.com 3:63a8d672fe5e 278 * in microsteps/s for microstep modes
davide.aliprandi@st.com 3:63a8d672fe5e 279 * @retval return the max speed in step/s or microstep/s
davide.aliprandi@st.com 3:63a8d672fe5e 280 * @note
davide.aliprandi@st.com 3:63a8d672fe5e 281 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 282 uint16_t L6208::L6208_GetMaxSpeed(void)
davide.aliprandi@st.com 3:63a8d672fe5e 283 {
davide.aliprandi@st.com 3:63a8d672fe5e 284 return devicePrm.maxSpeedSps;
davide.aliprandi@st.com 3:63a8d672fe5e 285 }
davide.aliprandi@st.com 3:63a8d672fe5e 286
davide.aliprandi@st.com 3:63a8d672fe5e 287 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 288 * @brief Get the min speed
davide.aliprandi@st.com 3:63a8d672fe5e 289 * in step/s for full, half and wave modes
davide.aliprandi@st.com 3:63a8d672fe5e 290 * in microsteps/s for microstep modes
davide.aliprandi@st.com 3:63a8d672fe5e 291 * @retval return the min speed in step/s or microstep/s
davide.aliprandi@st.com 3:63a8d672fe5e 292 * @note
davide.aliprandi@st.com 3:63a8d672fe5e 293 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 294 uint16_t L6208::L6208_GetMinSpeed(void)
davide.aliprandi@st.com 3:63a8d672fe5e 295 {
davide.aliprandi@st.com 3:63a8d672fe5e 296 return devicePrm.minSpeedSps;
davide.aliprandi@st.com 3:63a8d672fe5e 297 }
davide.aliprandi@st.com 3:63a8d672fe5e 298
davide.aliprandi@st.com 3:63a8d672fe5e 299 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 300 * @brief Get the stepper state machine index
davide.aliprandi@st.com 3:63a8d672fe5e 301 * @retval one of the stepper state machine index in the motorState_t enum
davide.aliprandi@st.com 3:63a8d672fe5e 302 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 303 motorState_t L6208::L6208_GetMotionState(void)
davide.aliprandi@st.com 3:63a8d672fe5e 304 {
davide.aliprandi@st.com 3:63a8d672fe5e 305 // gets the new stepper state machine index
davide.aliprandi@st.com 3:63a8d672fe5e 306 return devicePrm.motionState;
davide.aliprandi@st.com 3:63a8d672fe5e 307 }
davide.aliprandi@st.com 3:63a8d672fe5e 308
davide.aliprandi@st.com 3:63a8d672fe5e 309 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 310 * @brief Get the current position (32b signed)
davide.aliprandi@st.com 3:63a8d672fe5e 311 * @retval current absoulte position
davide.aliprandi@st.com 3:63a8d672fe5e 312 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 313 int32_t L6208::L6208_GetPosition(void)
davide.aliprandi@st.com 3:63a8d672fe5e 314 {
davide.aliprandi@st.com 3:63a8d672fe5e 315 return devicePrm.absolutePos;
davide.aliprandi@st.com 3:63a8d672fe5e 316 }
davide.aliprandi@st.com 3:63a8d672fe5e 317
davide.aliprandi@st.com 3:63a8d672fe5e 318 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 319 * @brief Get the motor step mode
davide.aliprandi@st.com 3:63a8d672fe5e 320 * @retval step mode
davide.aliprandi@st.com 3:63a8d672fe5e 321 **********************************************************/
Davidroid 4:0b52159554b5 322 motorStepMode_t L6208::L6208_GetStepMode(void)
davide.aliprandi@st.com 3:63a8d672fe5e 323 {
davide.aliprandi@st.com 3:63a8d672fe5e 324 return devicePrm.stepMode;
davide.aliprandi@st.com 3:63a8d672fe5e 325 }
davide.aliprandi@st.com 3:63a8d672fe5e 326
davide.aliprandi@st.com 3:63a8d672fe5e 327 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 328 * @brief Get the selected stop mode
davide.aliprandi@st.com 3:63a8d672fe5e 329 * @retval the selected stop mode
davide.aliprandi@st.com 3:63a8d672fe5e 330 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 331 motorStopMode_t L6208::L6208_GetStopMode(void)
davide.aliprandi@st.com 3:63a8d672fe5e 332 {
davide.aliprandi@st.com 3:63a8d672fe5e 333 if (L6208_IsSysFlag(HiZstop) == FALSE)
davide.aliprandi@st.com 3:63a8d672fe5e 334 {
davide.aliprandi@st.com 3:63a8d672fe5e 335 return (HOLD_MODE);
davide.aliprandi@st.com 3:63a8d672fe5e 336 }
davide.aliprandi@st.com 3:63a8d672fe5e 337 else
davide.aliprandi@st.com 3:63a8d672fe5e 338 {
davide.aliprandi@st.com 3:63a8d672fe5e 339 return (HIZ_MODE);
davide.aliprandi@st.com 3:63a8d672fe5e 340 }
davide.aliprandi@st.com 3:63a8d672fe5e 341 }
davide.aliprandi@st.com 3:63a8d672fe5e 342
davide.aliprandi@st.com 3:63a8d672fe5e 343 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 344 * @brief Go to the home position
davide.aliprandi@st.com 3:63a8d672fe5e 345 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 346 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 347 void L6208::L6208_GoHome(void)
davide.aliprandi@st.com 3:63a8d672fe5e 348 {
davide.aliprandi@st.com 3:63a8d672fe5e 349 L6208_GoTo(0);
davide.aliprandi@st.com 3:63a8d672fe5e 350 }
davide.aliprandi@st.com 3:63a8d672fe5e 351
davide.aliprandi@st.com 3:63a8d672fe5e 352 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 353 * @brief Go to the Mark position
davide.aliprandi@st.com 3:63a8d672fe5e 354 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 355 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 356 void L6208::L6208_GoMark(void)
davide.aliprandi@st.com 3:63a8d672fe5e 357 {
davide.aliprandi@st.com 3:63a8d672fe5e 358 L6208_GoTo(devicePrm.markPos);
davide.aliprandi@st.com 3:63a8d672fe5e 359 }
davide.aliprandi@st.com 3:63a8d672fe5e 360
davide.aliprandi@st.com 3:63a8d672fe5e 361 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 362 * @brief move the motor to the absolute position using the shortest path
davide.aliprandi@st.com 3:63a8d672fe5e 363 * @param[in] abs_pos 32 bit signed value position
davide.aliprandi@st.com 3:63a8d672fe5e 364 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 365 * @note The position is at the resolution corresponding to the
davide.aliprandi@st.com 3:63a8d672fe5e 366 * selected step mode.
davide.aliprandi@st.com 3:63a8d672fe5e 367 * STEP_MODE_FULL or STEP_MODE_WAVE : step
davide.aliprandi@st.com 3:63a8d672fe5e 368 * STEP_MODE_HALF : 1/2 step
davide.aliprandi@st.com 3:63a8d672fe5e 369 * STEP_MODE_1_4 : 1/4 step
davide.aliprandi@st.com 3:63a8d672fe5e 370 * STEP_MODE_1_8 : 1/8 step
davide.aliprandi@st.com 3:63a8d672fe5e 371 * STEP_MODE_1_16 : 1/16 step
davide.aliprandi@st.com 3:63a8d672fe5e 372 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 373 void L6208::L6208_GoTo(int32_t abs_pos)
davide.aliprandi@st.com 3:63a8d672fe5e 374 {
davide.aliprandi@st.com 3:63a8d672fe5e 375 uint32_t steps = 0;
davide.aliprandi@st.com 3:63a8d672fe5e 376
davide.aliprandi@st.com 3:63a8d672fe5e 377 if(L6208_IsSysFlag(running))
davide.aliprandi@st.com 3:63a8d672fe5e 378 {
davide.aliprandi@st.com 3:63a8d672fe5e 379 L6208_HardStop();
davide.aliprandi@st.com 3:63a8d672fe5e 380 }
davide.aliprandi@st.com 3:63a8d672fe5e 381
davide.aliprandi@st.com 3:63a8d672fe5e 382 if (abs_pos > devicePrm.absolutePos)
davide.aliprandi@st.com 3:63a8d672fe5e 383 {
davide.aliprandi@st.com 3:63a8d672fe5e 384 steps = abs_pos - devicePrm.absolutePos;
davide.aliprandi@st.com 3:63a8d672fe5e 385 if (steps < (L6208_POSITION_RANGE>>1))
davide.aliprandi@st.com 3:63a8d672fe5e 386 {
davide.aliprandi@st.com 3:63a8d672fe5e 387 L6208_Move(FORWARD, steps);
davide.aliprandi@st.com 3:63a8d672fe5e 388 }
davide.aliprandi@st.com 3:63a8d672fe5e 389 else
davide.aliprandi@st.com 3:63a8d672fe5e 390 {
davide.aliprandi@st.com 3:63a8d672fe5e 391 L6208_Move(BACKWARD, (L6208_POSITION_RANGE - steps));
davide.aliprandi@st.com 3:63a8d672fe5e 392 }
davide.aliprandi@st.com 3:63a8d672fe5e 393 }
davide.aliprandi@st.com 3:63a8d672fe5e 394 else
davide.aliprandi@st.com 3:63a8d672fe5e 395 {
davide.aliprandi@st.com 3:63a8d672fe5e 396 steps = devicePrm.absolutePos - abs_pos;
davide.aliprandi@st.com 3:63a8d672fe5e 397 if (steps < (L6208_POSITION_RANGE>>1))
davide.aliprandi@st.com 3:63a8d672fe5e 398 {
davide.aliprandi@st.com 3:63a8d672fe5e 399 L6208_Move(BACKWARD, steps);
davide.aliprandi@st.com 3:63a8d672fe5e 400 }
davide.aliprandi@st.com 3:63a8d672fe5e 401 else
davide.aliprandi@st.com 3:63a8d672fe5e 402 {
davide.aliprandi@st.com 3:63a8d672fe5e 403 L6208_Move(FORWARD, (L6208_POSITION_RANGE - steps));
davide.aliprandi@st.com 3:63a8d672fe5e 404 }
davide.aliprandi@st.com 3:63a8d672fe5e 405 }
davide.aliprandi@st.com 3:63a8d672fe5e 406 }
davide.aliprandi@st.com 3:63a8d672fe5e 407
davide.aliprandi@st.com 3:63a8d672fe5e 408 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 409 * @brief move the motor to the absolute position
davide.aliprandi@st.com 3:63a8d672fe5e 410 * @param[in] direction FORWARD or BACKWARD
davide.aliprandi@st.com 3:63a8d672fe5e 411 * @param[in] abs_pos 32 bit signed value position
davide.aliprandi@st.com 3:63a8d672fe5e 412 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 413 * @note The position is at the resolution corresponding to the
davide.aliprandi@st.com 3:63a8d672fe5e 414 * selected step mode.
davide.aliprandi@st.com 3:63a8d672fe5e 415 * STEP_MODE_FULL or STEP_MODE_WAVE : step
davide.aliprandi@st.com 3:63a8d672fe5e 416 * STEP_MODE_HALF : 1/2 step
davide.aliprandi@st.com 3:63a8d672fe5e 417 * STEP_MODE_1_4 : 1/4 step
davide.aliprandi@st.com 3:63a8d672fe5e 418 * STEP_MODE_1_8 : 1/8 step
davide.aliprandi@st.com 3:63a8d672fe5e 419 * STEP_MODE_1_16 : 1/16 step
davide.aliprandi@st.com 3:63a8d672fe5e 420 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 421 void L6208::L6208_GoToDir(motorDir_t direction, int32_t abs_pos)
davide.aliprandi@st.com 3:63a8d672fe5e 422 {
davide.aliprandi@st.com 3:63a8d672fe5e 423 uint32_t steps = 0;
davide.aliprandi@st.com 3:63a8d672fe5e 424
davide.aliprandi@st.com 3:63a8d672fe5e 425 if(L6208_IsSysFlag(running))
davide.aliprandi@st.com 3:63a8d672fe5e 426 {
davide.aliprandi@st.com 3:63a8d672fe5e 427 L6208_HardStop();
davide.aliprandi@st.com 3:63a8d672fe5e 428 }
davide.aliprandi@st.com 3:63a8d672fe5e 429
davide.aliprandi@st.com 3:63a8d672fe5e 430 if (direction != BACKWARD)
davide.aliprandi@st.com 3:63a8d672fe5e 431 {
davide.aliprandi@st.com 3:63a8d672fe5e 432 if (abs_pos > devicePrm.absolutePos)
davide.aliprandi@st.com 3:63a8d672fe5e 433 {
davide.aliprandi@st.com 3:63a8d672fe5e 434 steps = abs_pos - devicePrm.absolutePos;
davide.aliprandi@st.com 3:63a8d672fe5e 435 }
davide.aliprandi@st.com 3:63a8d672fe5e 436 else
davide.aliprandi@st.com 3:63a8d672fe5e 437 {
davide.aliprandi@st.com 3:63a8d672fe5e 438 steps = L6208_POSITION_RANGE + (abs_pos - devicePrm.absolutePos);
davide.aliprandi@st.com 3:63a8d672fe5e 439 }
davide.aliprandi@st.com 3:63a8d672fe5e 440 }
davide.aliprandi@st.com 3:63a8d672fe5e 441 else
davide.aliprandi@st.com 3:63a8d672fe5e 442 {
davide.aliprandi@st.com 3:63a8d672fe5e 443 if (abs_pos > devicePrm.absolutePos)
davide.aliprandi@st.com 3:63a8d672fe5e 444 {
davide.aliprandi@st.com 3:63a8d672fe5e 445 steps = L6208_POSITION_RANGE + (devicePrm.absolutePos - abs_pos);
davide.aliprandi@st.com 3:63a8d672fe5e 446 }
davide.aliprandi@st.com 3:63a8d672fe5e 447 else
davide.aliprandi@st.com 3:63a8d672fe5e 448 {
davide.aliprandi@st.com 3:63a8d672fe5e 449 steps = devicePrm.absolutePos - abs_pos;
davide.aliprandi@st.com 3:63a8d672fe5e 450 }
davide.aliprandi@st.com 3:63a8d672fe5e 451 }
davide.aliprandi@st.com 3:63a8d672fe5e 452 L6208_Move(direction, steps);
davide.aliprandi@st.com 3:63a8d672fe5e 453 }
davide.aliprandi@st.com 3:63a8d672fe5e 454
davide.aliprandi@st.com 3:63a8d672fe5e 455 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 456 * @brief Immediately stop the motor and disables the power bridges
davide.aliprandi@st.com 3:63a8d672fe5e 457 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 458 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 459 void L6208::L6208_HardHiZ(void)
davide.aliprandi@st.com 3:63a8d672fe5e 460 {
davide.aliprandi@st.com 3:63a8d672fe5e 461 /* Disables power stage */
davide.aliprandi@st.com 3:63a8d672fe5e 462 L6208_Disable();
davide.aliprandi@st.com 3:63a8d672fe5e 463
davide.aliprandi@st.com 3:63a8d672fe5e 464 /* Sets inactive state */
davide.aliprandi@st.com 3:63a8d672fe5e 465 L6208_SetMotionState(INACTIVE);
davide.aliprandi@st.com 3:63a8d672fe5e 466
davide.aliprandi@st.com 3:63a8d672fe5e 467 /* Clears the running motor and the position */
davide.aliprandi@st.com 3:63a8d672fe5e 468 L6208_ClearSysFlag(running);
davide.aliprandi@st.com 3:63a8d672fe5e 469
davide.aliprandi@st.com 3:63a8d672fe5e 470 /* Disables PWMs */
davide.aliprandi@st.com 3:63a8d672fe5e 471 L6208_Board_VrefPwmStop(BRIDGE_A);
davide.aliprandi@st.com 3:63a8d672fe5e 472 L6208_Board_VrefPwmStop(BRIDGE_B);
davide.aliprandi@st.com 3:63a8d672fe5e 473
davide.aliprandi@st.com 3:63a8d672fe5e 474 /* Disables tick timer */
davide.aliprandi@st.com 3:63a8d672fe5e 475 L6208_Board_TickStop();
davide.aliprandi@st.com 3:63a8d672fe5e 476 }
davide.aliprandi@st.com 3:63a8d672fe5e 477
davide.aliprandi@st.com 3:63a8d672fe5e 478 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 479 * @brief Immediately stop the motor and keeps holding torque
davide.aliprandi@st.com 3:63a8d672fe5e 480 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 481 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 482 void L6208::L6208_HardStop(void)
davide.aliprandi@st.com 3:63a8d672fe5e 483 {
davide.aliprandi@st.com 3:63a8d672fe5e 484 /* Sets inactive state */
davide.aliprandi@st.com 3:63a8d672fe5e 485 L6208_SetMotionState(INACTIVE);
davide.aliprandi@st.com 3:63a8d672fe5e 486
davide.aliprandi@st.com 3:63a8d672fe5e 487 /* Clears the running motor and the position */
davide.aliprandi@st.com 3:63a8d672fe5e 488 L6208_ClearSysFlag(running);
davide.aliprandi@st.com 3:63a8d672fe5e 489 L6208_VectorCalc(devicePrm.holdTorque);
davide.aliprandi@st.com 3:63a8d672fe5e 490
davide.aliprandi@st.com 3:63a8d672fe5e 491 /* Disables tick timer */
davide.aliprandi@st.com 3:63a8d672fe5e 492 L6208_Board_TickStop();
davide.aliprandi@st.com 3:63a8d672fe5e 493 }
davide.aliprandi@st.com 3:63a8d672fe5e 494
davide.aliprandi@st.com 3:63a8d672fe5e 495 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 496 * @brief move the motor by the specified number of steps
davide.aliprandi@st.com 3:63a8d672fe5e 497 * in the specified direction
davide.aliprandi@st.com 3:63a8d672fe5e 498 * @param[in] direction FORWARD or BACKWARD
davide.aliprandi@st.com 3:63a8d672fe5e 499 * @param[in] stepCount 32 bit unsigned step count
davide.aliprandi@st.com 3:63a8d672fe5e 500 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 501 * @note The step count resolution is corresponding to the
davide.aliprandi@st.com 3:63a8d672fe5e 502 * selected step mode.
davide.aliprandi@st.com 3:63a8d672fe5e 503 * STEP_MODE_FULL or STEP_MODE_WAVE : step
davide.aliprandi@st.com 3:63a8d672fe5e 504 * STEP_MODE_HALF : 1/2 step
davide.aliprandi@st.com 3:63a8d672fe5e 505 * STEP_MODE_1_4 : 1/4 step
davide.aliprandi@st.com 3:63a8d672fe5e 506 * STEP_MODE_1_8 : 1/8 step
davide.aliprandi@st.com 3:63a8d672fe5e 507 * STEP_MODE_1_16 : 1/16 step
davide.aliprandi@st.com 3:63a8d672fe5e 508 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 509 void L6208::L6208_Move(motorDir_t direction, uint32_t stepCount)
davide.aliprandi@st.com 3:63a8d672fe5e 510 {
davide.aliprandi@st.com 3:63a8d672fe5e 511 if(L6208_IsSysFlag(running))
davide.aliprandi@st.com 3:63a8d672fe5e 512 {
davide.aliprandi@st.com 3:63a8d672fe5e 513 L6208_HardStop();
davide.aliprandi@st.com 3:63a8d672fe5e 514 }
davide.aliprandi@st.com 3:63a8d672fe5e 515
davide.aliprandi@st.com 3:63a8d672fe5e 516 /* clear the velocity driving mode flag */
davide.aliprandi@st.com 3:63a8d672fe5e 517 L6208_ClearSysFlag(velocitymode);
davide.aliprandi@st.com 3:63a8d672fe5e 518
davide.aliprandi@st.com 3:63a8d672fe5e 519 /* Set the indexing driving mode flag */
davide.aliprandi@st.com 3:63a8d672fe5e 520 /* and the user command executing flag */
davide.aliprandi@st.com 3:63a8d672fe5e 521 L6208_SetSysFlag(positionmode);
davide.aliprandi@st.com 3:63a8d672fe5e 522
davide.aliprandi@st.com 3:63a8d672fe5e 523 /* store relative number of steps to move */
davide.aliprandi@st.com 3:63a8d672fe5e 524 devicePrm.positionTarget = stepCount;
davide.aliprandi@st.com 3:63a8d672fe5e 525
davide.aliprandi@st.com 3:63a8d672fe5e 526 L6208_SetDirection(direction);
davide.aliprandi@st.com 3:63a8d672fe5e 527
davide.aliprandi@st.com 3:63a8d672fe5e 528 /* Motor activation */
davide.aliprandi@st.com 3:63a8d672fe5e 529 L6208_StartMovement();
davide.aliprandi@st.com 3:63a8d672fe5e 530 }
davide.aliprandi@st.com 3:63a8d672fe5e 531
davide.aliprandi@st.com 3:63a8d672fe5e 532 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 533 * @brief Release the L6208 reset (Reset pin set to high level)
davide.aliprandi@st.com 3:63a8d672fe5e 534 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 535 **********************************************************/
Davidroid 4:0b52159554b5 536 void L6208::L6208_ReleaseReset(void)
davide.aliprandi@st.com 3:63a8d672fe5e 537 {
davide.aliprandi@st.com 3:63a8d672fe5e 538 L6208_Board_ReleaseReset();
davide.aliprandi@st.com 3:63a8d672fe5e 539 }
davide.aliprandi@st.com 3:63a8d672fe5e 540
davide.aliprandi@st.com 3:63a8d672fe5e 541 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 542 * @brief Reset the L6208 (Reset pin set to low level)
davide.aliprandi@st.com 3:63a8d672fe5e 543 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 544 **********************************************************/
Davidroid 4:0b52159554b5 545 void L6208::L6208_Reset(void)
davide.aliprandi@st.com 3:63a8d672fe5e 546 {
davide.aliprandi@st.com 3:63a8d672fe5e 547 L6208_Board_Reset();
davide.aliprandi@st.com 3:63a8d672fe5e 548 }
davide.aliprandi@st.com 3:63a8d672fe5e 549
davide.aliprandi@st.com 3:63a8d672fe5e 550
davide.aliprandi@st.com 3:63a8d672fe5e 551 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 552 * @brief Call L6208_SetStepMode with current step mode,
davide.aliprandi@st.com 3:63a8d672fe5e 553 * the L6208_SetStepMode function along with setting the step mode resets
davide.aliprandi@st.com 3:63a8d672fe5e 554 * the L6208 device
davide.aliprandi@st.com 3:63a8d672fe5e 555 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 556 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 557 void L6208::L6208_ResetDevice(void)
davide.aliprandi@st.com 3:63a8d672fe5e 558 {
Davidroid 4:0b52159554b5 559 L6208_SetStepMode(L6208_GetStepMode());
davide.aliprandi@st.com 3:63a8d672fe5e 560 }
davide.aliprandi@st.com 3:63a8d672fe5e 561
davide.aliprandi@st.com 3:63a8d672fe5e 562 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 563 * @brief run the motor in the specified direction
davide.aliprandi@st.com 3:63a8d672fe5e 564 * according to the speed profile defined by the minimum speed,
davide.aliprandi@st.com 3:63a8d672fe5e 565 * maximum speed, and acceleration parameters.
davide.aliprandi@st.com 3:63a8d672fe5e 566 * The device accelerates from the minimum speed up to the maximum
davide.aliprandi@st.com 3:63a8d672fe5e 567 * speed by using the device acceleration.
davide.aliprandi@st.com 3:63a8d672fe5e 568 * @param[in] direction FORWARD or BACKWARD
davide.aliprandi@st.com 3:63a8d672fe5e 569 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 570 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 571 void L6208::L6208_Run(motorDir_t direction)
davide.aliprandi@st.com 3:63a8d672fe5e 572 {
davide.aliprandi@st.com 3:63a8d672fe5e 573 if(L6208_IsSysFlag(running))
davide.aliprandi@st.com 3:63a8d672fe5e 574 {
davide.aliprandi@st.com 3:63a8d672fe5e 575 L6208_HardStop();
davide.aliprandi@st.com 3:63a8d672fe5e 576 }
davide.aliprandi@st.com 3:63a8d672fe5e 577 L6208_SetDirection(direction);
davide.aliprandi@st.com 3:63a8d672fe5e 578 /* Clear the indexing driving mode flag */
davide.aliprandi@st.com 3:63a8d672fe5e 579 L6208_ClearSysFlag(positionmode);
davide.aliprandi@st.com 3:63a8d672fe5e 580 /* Set the velocity driving mode flag */
davide.aliprandi@st.com 3:63a8d672fe5e 581 L6208_SetSysFlag(velocitymode);
davide.aliprandi@st.com 3:63a8d672fe5e 582 /* Motor activation */
davide.aliprandi@st.com 3:63a8d672fe5e 583 L6208_StartMovement();
davide.aliprandi@st.com 3:63a8d672fe5e 584 }
davide.aliprandi@st.com 3:63a8d672fe5e 585
davide.aliprandi@st.com 3:63a8d672fe5e 586 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 587 * @brief Set the stepper acceleration rate
davide.aliprandi@st.com 3:63a8d672fe5e 588 * in step/s^2 and step/tick^2 for full, half and wave modes
davide.aliprandi@st.com 3:63a8d672fe5e 589 * in microsteps/s^2 and microsteps/tick^2 for microstep modes
davide.aliprandi@st.com 3:63a8d672fe5e 590 * @param[in] newAcc new acceleration rate in step/s^2 or microstep/s^2
davide.aliprandi@st.com 3:63a8d672fe5e 591 * @retval TRUE
davide.aliprandi@st.com 3:63a8d672fe5e 592 * @note
davide.aliprandi@st.com 3:63a8d672fe5e 593 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 594 bool L6208::L6208_SetAcceleration(uint16_t newAcc)
davide.aliprandi@st.com 3:63a8d672fe5e 595 {
davide.aliprandi@st.com 3:63a8d672fe5e 596 uint16_t newAccSpt2 = L6208_ConvertAcceDecelRateValue(newAcc);
davide.aliprandi@st.com 3:63a8d672fe5e 597 if (newAccSpt2)
davide.aliprandi@st.com 3:63a8d672fe5e 598 {
davide.aliprandi@st.com 3:63a8d672fe5e 599 devicePrm.accelerationSps2 = newAcc;
davide.aliprandi@st.com 3:63a8d672fe5e 600 devicePrm.accelerationSpt2 = newAccSpt2;
davide.aliprandi@st.com 3:63a8d672fe5e 601 }
davide.aliprandi@st.com 3:63a8d672fe5e 602 else
davide.aliprandi@st.com 3:63a8d672fe5e 603 {
davide.aliprandi@st.com 3:63a8d672fe5e 604 L6208_ErrorHandler(L6208_ERROR_SET_ACCELERATION);
davide.aliprandi@st.com 3:63a8d672fe5e 605 }
davide.aliprandi@st.com 3:63a8d672fe5e 606 return TRUE;
davide.aliprandi@st.com 3:63a8d672fe5e 607 }
davide.aliprandi@st.com 3:63a8d672fe5e 608
davide.aliprandi@st.com 3:63a8d672fe5e 609 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 610 * @brief Select the motor decay mode
davide.aliprandi@st.com 3:63a8d672fe5e 611 * @param[in] decayMode (SLOW_DECAY or FAST_DECAY)
davide.aliprandi@st.com 3:63a8d672fe5e 612 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 613 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 614 void L6208::L6208_SetDecayMode(motorDecayMode_t decayMode)
davide.aliprandi@st.com 3:63a8d672fe5e 615 {
davide.aliprandi@st.com 3:63a8d672fe5e 616 if ((decayMode & L6208_FAST_DECAY_MODE_MASK) == L6208_FAST_DECAY_MODE_MASK)
davide.aliprandi@st.com 3:63a8d672fe5e 617 {
davide.aliprandi@st.com 3:63a8d672fe5e 618 L6208_Board_CONTROL_PIN_Set();
davide.aliprandi@st.com 3:63a8d672fe5e 619 L6208_SetSysFlag(fastdecaymode);
davide.aliprandi@st.com 3:63a8d672fe5e 620 }
davide.aliprandi@st.com 3:63a8d672fe5e 621 else
davide.aliprandi@st.com 3:63a8d672fe5e 622 {
davide.aliprandi@st.com 3:63a8d672fe5e 623 L6208_Board_CONTROL_PIN_Reset();
davide.aliprandi@st.com 3:63a8d672fe5e 624 L6208_ClearSysFlag(fastdecaymode);
davide.aliprandi@st.com 3:63a8d672fe5e 625 }
davide.aliprandi@st.com 3:63a8d672fe5e 626 }
davide.aliprandi@st.com 3:63a8d672fe5e 627
davide.aliprandi@st.com 3:63a8d672fe5e 628 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 629 * @brief Set the stepper deceleration rate
davide.aliprandi@st.com 3:63a8d672fe5e 630 * in step/s^2 and step/tick^2 for full, half and wave modes
davide.aliprandi@st.com 3:63a8d672fe5e 631 * in microsteps/s^2 and microsteps/tick^2 for microstep modes
davide.aliprandi@st.com 3:63a8d672fe5e 632 * @param[in] newDec new deceleration rate in step/s^2 or microstep/s^2
davide.aliprandi@st.com 3:63a8d672fe5e 633 * @retval TRUE
davide.aliprandi@st.com 3:63a8d672fe5e 634 * @note
davide.aliprandi@st.com 3:63a8d672fe5e 635 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 636 bool L6208::L6208_SetDeceleration(uint16_t newDec)
davide.aliprandi@st.com 3:63a8d672fe5e 637 {
davide.aliprandi@st.com 3:63a8d672fe5e 638 uint16_t newDecSpt2 = L6208_ConvertAcceDecelRateValue(newDec);
davide.aliprandi@st.com 3:63a8d672fe5e 639 if (newDecSpt2)
davide.aliprandi@st.com 3:63a8d672fe5e 640 {
davide.aliprandi@st.com 3:63a8d672fe5e 641 devicePrm.decelerationSps2 = newDec;
davide.aliprandi@st.com 3:63a8d672fe5e 642 devicePrm.decelerationSpt2 = newDecSpt2;
davide.aliprandi@st.com 3:63a8d672fe5e 643 }
davide.aliprandi@st.com 3:63a8d672fe5e 644 else
davide.aliprandi@st.com 3:63a8d672fe5e 645 {
davide.aliprandi@st.com 3:63a8d672fe5e 646 L6208_ErrorHandler(L6208_ERROR_SET_DECELERATION);
davide.aliprandi@st.com 3:63a8d672fe5e 647 }
davide.aliprandi@st.com 3:63a8d672fe5e 648 return TRUE;
davide.aliprandi@st.com 3:63a8d672fe5e 649 }
davide.aliprandi@st.com 3:63a8d672fe5e 650
davide.aliprandi@st.com 3:63a8d672fe5e 651 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 652 * @brief Specify the direction
davide.aliprandi@st.com 3:63a8d672fe5e 653 * @param[in] dir FORWARD or BACKWARD
davide.aliprandi@st.com 3:63a8d672fe5e 654 * @note In velocity mode a direction change forces the device to stop and
davide.aliprandi@st.com 3:63a8d672fe5e 655 * then run in the new direction. In position mode, if the device is
davide.aliprandi@st.com 3:63a8d672fe5e 656 * running, a direction change will generate an error.
davide.aliprandi@st.com 3:63a8d672fe5e 657 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 658 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 659 void L6208::L6208_SetDirection(motorDir_t dir)
davide.aliprandi@st.com 3:63a8d672fe5e 660 {
davide.aliprandi@st.com 3:63a8d672fe5e 661 L6208_ClearSysFlag(dir2change);
davide.aliprandi@st.com 3:63a8d672fe5e 662 if (dir == FORWARD)
davide.aliprandi@st.com 3:63a8d672fe5e 663 {
davide.aliprandi@st.com 3:63a8d672fe5e 664 if (!L6208_IsSysFlag(forward))
davide.aliprandi@st.com 3:63a8d672fe5e 665 {
davide.aliprandi@st.com 3:63a8d672fe5e 666 if (L6208_IsSysFlag(running))
davide.aliprandi@st.com 3:63a8d672fe5e 667 {
davide.aliprandi@st.com 3:63a8d672fe5e 668 /* motor is running */
davide.aliprandi@st.com 3:63a8d672fe5e 669 if (L6208_IsSysFlag(positionmode))
davide.aliprandi@st.com 3:63a8d672fe5e 670 {
davide.aliprandi@st.com 3:63a8d672fe5e 671 L6208_ErrorHandler(L6208_ERROR_SET_DIRECTION);
davide.aliprandi@st.com 3:63a8d672fe5e 672 }
davide.aliprandi@st.com 3:63a8d672fe5e 673 else
davide.aliprandi@st.com 3:63a8d672fe5e 674 {
davide.aliprandi@st.com 3:63a8d672fe5e 675 /* set the rotation direction to change flag */
davide.aliprandi@st.com 3:63a8d672fe5e 676 L6208_SetSysFlag(dir2change);
davide.aliprandi@st.com 3:63a8d672fe5e 677 }
davide.aliprandi@st.com 3:63a8d672fe5e 678 }
davide.aliprandi@st.com 3:63a8d672fe5e 679 else /* the motor is stopped, cw direction selected */
davide.aliprandi@st.com 3:63a8d672fe5e 680 {
davide.aliprandi@st.com 3:63a8d672fe5e 681 L6208_SetSysFlag(forward);
davide.aliprandi@st.com 3:63a8d672fe5e 682 L6208_Board_DIR_PIN_Set();
davide.aliprandi@st.com 3:63a8d672fe5e 683 }
davide.aliprandi@st.com 3:63a8d672fe5e 684 }
davide.aliprandi@st.com 3:63a8d672fe5e 685 }
davide.aliprandi@st.com 3:63a8d672fe5e 686 else
davide.aliprandi@st.com 3:63a8d672fe5e 687 {
davide.aliprandi@st.com 3:63a8d672fe5e 688 if (L6208_IsSysFlag(forward))
davide.aliprandi@st.com 3:63a8d672fe5e 689 {
davide.aliprandi@st.com 3:63a8d672fe5e 690 if (L6208_IsSysFlag(running))
davide.aliprandi@st.com 3:63a8d672fe5e 691 {
davide.aliprandi@st.com 3:63a8d672fe5e 692 /* motor is running */
davide.aliprandi@st.com 3:63a8d672fe5e 693 if (L6208_IsSysFlag(positionmode))
davide.aliprandi@st.com 3:63a8d672fe5e 694 {
davide.aliprandi@st.com 3:63a8d672fe5e 695 L6208_ErrorHandler(L6208_ERROR_SET_DIRECTION);
davide.aliprandi@st.com 3:63a8d672fe5e 696 }
davide.aliprandi@st.com 3:63a8d672fe5e 697 else
davide.aliprandi@st.com 3:63a8d672fe5e 698 {
davide.aliprandi@st.com 3:63a8d672fe5e 699 /* set the rotation direction to change flag */
davide.aliprandi@st.com 3:63a8d672fe5e 700 L6208_SetSysFlag(dir2change);
davide.aliprandi@st.com 3:63a8d672fe5e 701 }
davide.aliprandi@st.com 3:63a8d672fe5e 702 }
davide.aliprandi@st.com 3:63a8d672fe5e 703 else /* the motor is stopped, ccw direction selected */
davide.aliprandi@st.com 3:63a8d672fe5e 704 {
davide.aliprandi@st.com 3:63a8d672fe5e 705 L6208_ClearSysFlag(forward);
davide.aliprandi@st.com 3:63a8d672fe5e 706 L6208_Board_DIR_PIN_Reset();
davide.aliprandi@st.com 3:63a8d672fe5e 707 }
davide.aliprandi@st.com 3:63a8d672fe5e 708 }
davide.aliprandi@st.com 3:63a8d672fe5e 709 }
davide.aliprandi@st.com 3:63a8d672fe5e 710 if(L6208_IsSysFlag(dir2change))
davide.aliprandi@st.com 3:63a8d672fe5e 711 {
davide.aliprandi@st.com 3:63a8d672fe5e 712 L6208_VectorCalc(devicePrm.decelTorque);
davide.aliprandi@st.com 3:63a8d672fe5e 713 L6208_SetMotionState(DECELERATINGTOSTOP);
davide.aliprandi@st.com 3:63a8d672fe5e 714 }
davide.aliprandi@st.com 3:63a8d672fe5e 715 }
davide.aliprandi@st.com 3:63a8d672fe5e 716
davide.aliprandi@st.com 3:63a8d672fe5e 717 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 718 * @brief Set current position to be the home position
davide.aliprandi@st.com 3:63a8d672fe5e 719 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 720 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 721 void L6208::L6208_SetHome(void)
davide.aliprandi@st.com 3:63a8d672fe5e 722 {
davide.aliprandi@st.com 3:63a8d672fe5e 723 if (!L6208_IsSysFlag(running))
davide.aliprandi@st.com 3:63a8d672fe5e 724 {
davide.aliprandi@st.com 3:63a8d672fe5e 725 devicePrm.absolutePos = 0;
davide.aliprandi@st.com 3:63a8d672fe5e 726 }
davide.aliprandi@st.com 3:63a8d672fe5e 727 else
davide.aliprandi@st.com 3:63a8d672fe5e 728 {
davide.aliprandi@st.com 3:63a8d672fe5e 729 L6208_ErrorHandler(L6208_ERROR_SET_HOME);
davide.aliprandi@st.com 3:63a8d672fe5e 730 }
davide.aliprandi@st.com 3:63a8d672fe5e 731 }
davide.aliprandi@st.com 3:63a8d672fe5e 732
davide.aliprandi@st.com 3:63a8d672fe5e 733 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 734 * @brief Set current position to be the mark position
davide.aliprandi@st.com 3:63a8d672fe5e 735 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 736 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 737 void L6208::L6208_SetMark(void)
davide.aliprandi@st.com 3:63a8d672fe5e 738 {
davide.aliprandi@st.com 3:63a8d672fe5e 739 devicePrm.markPos = devicePrm.absolutePos;
davide.aliprandi@st.com 3:63a8d672fe5e 740 }
davide.aliprandi@st.com 3:63a8d672fe5e 741
davide.aliprandi@st.com 3:63a8d672fe5e 742 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 743 * @brief Set the user selected maximum speed
davide.aliprandi@st.com 3:63a8d672fe5e 744 * in step/s and step/tick for full, half and wave modes
davide.aliprandi@st.com 3:63a8d672fe5e 745 * in microsteps/s and microsteps/tick for microstep modes
davide.aliprandi@st.com 3:63a8d672fe5e 746 * @param[in] newSpeed speed value (step/s or microstep/s)
davide.aliprandi@st.com 3:63a8d672fe5e 747 * @retval TRUE
davide.aliprandi@st.com 3:63a8d672fe5e 748 * @note One microstep is 1/16 step
davide.aliprandi@st.com 3:63a8d672fe5e 749 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 750 bool L6208::L6208_SetMaxSpeed(uint16_t newSpeed)
davide.aliprandi@st.com 3:63a8d672fe5e 751 {
davide.aliprandi@st.com 3:63a8d672fe5e 752 if (L6208_SetSpeed(newSpeed, &devicePrm.maxSpeedSpt))
davide.aliprandi@st.com 3:63a8d672fe5e 753 {
davide.aliprandi@st.com 3:63a8d672fe5e 754 devicePrm.maxSpeedSps = newSpeed;
davide.aliprandi@st.com 3:63a8d672fe5e 755 }
davide.aliprandi@st.com 3:63a8d672fe5e 756 else
davide.aliprandi@st.com 3:63a8d672fe5e 757 {
davide.aliprandi@st.com 3:63a8d672fe5e 758 L6208_ErrorHandler(L6208_ERROR_SET_MAX_SPEED);
davide.aliprandi@st.com 3:63a8d672fe5e 759 }
davide.aliprandi@st.com 3:63a8d672fe5e 760 return TRUE;
davide.aliprandi@st.com 3:63a8d672fe5e 761 }
davide.aliprandi@st.com 3:63a8d672fe5e 762
davide.aliprandi@st.com 3:63a8d672fe5e 763 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 764 * @brief Set the user selected minimum speed
davide.aliprandi@st.com 3:63a8d672fe5e 765 * in step/s and step/tick for full, half and wave modes
davide.aliprandi@st.com 3:63a8d672fe5e 766 * in microsteps/s and microsteps/tick for microstep modes
davide.aliprandi@st.com 3:63a8d672fe5e 767 * @param[in] newSpeed speed value (step/s or microstep/s)
davide.aliprandi@st.com 3:63a8d672fe5e 768 * @retval TRUE
davide.aliprandi@st.com 3:63a8d672fe5e 769 * @note One microstep is 1/16 step
davide.aliprandi@st.com 3:63a8d672fe5e 770 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 771 bool L6208::L6208_SetMinSpeed(uint16_t newSpeed)
davide.aliprandi@st.com 3:63a8d672fe5e 772 {
davide.aliprandi@st.com 3:63a8d672fe5e 773 if (L6208_SetSpeed(newSpeed, &devicePrm.minSpeedSpt))
davide.aliprandi@st.com 3:63a8d672fe5e 774 {
davide.aliprandi@st.com 3:63a8d672fe5e 775 devicePrm.minSpeedSps = newSpeed;
davide.aliprandi@st.com 3:63a8d672fe5e 776 }
davide.aliprandi@st.com 3:63a8d672fe5e 777 else
davide.aliprandi@st.com 3:63a8d672fe5e 778 {
davide.aliprandi@st.com 3:63a8d672fe5e 779 L6208_ErrorHandler(L6208_ERROR_SET_MIN_SPEED);
davide.aliprandi@st.com 3:63a8d672fe5e 780 }
davide.aliprandi@st.com 3:63a8d672fe5e 781 return TRUE;
davide.aliprandi@st.com 3:63a8d672fe5e 782 }
davide.aliprandi@st.com 3:63a8d672fe5e 783
davide.aliprandi@st.com 3:63a8d672fe5e 784 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 785 * @brief Set the step mode
davide.aliprandi@st.com 3:63a8d672fe5e 786 * @param[in] stepMode
davide.aliprandi@st.com 3:63a8d672fe5e 787 * @retval true if the command is successfully executed, else false
davide.aliprandi@st.com 3:63a8d672fe5e 788 * @note Every time the step mode is changed, the step state machine is reset
davide.aliprandi@st.com 3:63a8d672fe5e 789 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 790 bool L6208::L6208_SetStepMode(motorStepMode_t stepMode)
davide.aliprandi@st.com 3:63a8d672fe5e 791 {
davide.aliprandi@st.com 3:63a8d672fe5e 792 devicePrm.stepMode = stepMode;
davide.aliprandi@st.com 3:63a8d672fe5e 793 L6208_ClearSysFlag(fullstep | halfstep | microstep | wavestep);
davide.aliprandi@st.com 3:63a8d672fe5e 794 switch (stepMode)
davide.aliprandi@st.com 3:63a8d672fe5e 795 {
davide.aliprandi@st.com 3:63a8d672fe5e 796 case STEP_MODE_HALF:
davide.aliprandi@st.com 3:63a8d672fe5e 797 /* Set the Half/Full pin low and Reset and the set the Half/Full pin high*/
davide.aliprandi@st.com 3:63a8d672fe5e 798 L6208_Board_HALF_FULL_PIN_Reset();
davide.aliprandi@st.com 3:63a8d672fe5e 799 L6208_Board_Reset();
davide.aliprandi@st.com 3:63a8d672fe5e 800 L6208_Board_HALF_FULL_PIN_Set();
davide.aliprandi@st.com 3:63a8d672fe5e 801 /* Set system flag */
davide.aliprandi@st.com 3:63a8d672fe5e 802 L6208_SetSysFlag(halfstep);
davide.aliprandi@st.com 3:63a8d672fe5e 803 break;
davide.aliprandi@st.com 3:63a8d672fe5e 804 case STEP_MODE_FULL:
davide.aliprandi@st.com 3:63a8d672fe5e 805 /* Set the Half/Full pin low and Reset */
davide.aliprandi@st.com 3:63a8d672fe5e 806 L6208_Board_HALF_FULL_PIN_Reset();
davide.aliprandi@st.com 3:63a8d672fe5e 807 L6208_Board_Reset();
davide.aliprandi@st.com 3:63a8d672fe5e 808 /* Set system flag */
davide.aliprandi@st.com 3:63a8d672fe5e 809 L6208_SetSysFlag(fullstep);
davide.aliprandi@st.com 3:63a8d672fe5e 810 break;
davide.aliprandi@st.com 3:63a8d672fe5e 811 case STEP_MODE_WAVE:
davide.aliprandi@st.com 3:63a8d672fe5e 812 /* Set the Half/Full pin low and Reset and the set the Half/Full pin high*/
davide.aliprandi@st.com 3:63a8d672fe5e 813 L6208_Board_CLOCK_PIN_Reset();
davide.aliprandi@st.com 3:63a8d672fe5e 814 L6208_Board_HALF_FULL_PIN_Reset();
davide.aliprandi@st.com 3:63a8d672fe5e 815 L6208_Board_Reset();
davide.aliprandi@st.com 3:63a8d672fe5e 816 L6208_Board_CLOCK_PIN_Set();
davide.aliprandi@st.com 3:63a8d672fe5e 817 L6208_Board_HALF_FULL_PIN_Set();
davide.aliprandi@st.com 3:63a8d672fe5e 818 L6208_Board_Delay(2);
davide.aliprandi@st.com 3:63a8d672fe5e 819 L6208_Board_CLOCK_PIN_Reset();
davide.aliprandi@st.com 3:63a8d672fe5e 820 L6208_Board_Delay(2);
davide.aliprandi@st.com 3:63a8d672fe5e 821 L6208_Board_HALF_FULL_PIN_Reset();
davide.aliprandi@st.com 3:63a8d672fe5e 822 /* Set system flag */
davide.aliprandi@st.com 3:63a8d672fe5e 823 L6208_SetSysFlag(wavestep);
davide.aliprandi@st.com 3:63a8d672fe5e 824 break;
davide.aliprandi@st.com 3:63a8d672fe5e 825 case STEP_MODE_1_4:
davide.aliprandi@st.com 3:63a8d672fe5e 826 /* Set the Half/Full pin low and Reset */
davide.aliprandi@st.com 3:63a8d672fe5e 827 L6208_Board_HALF_FULL_PIN_Reset();
davide.aliprandi@st.com 3:63a8d672fe5e 828 L6208_Board_Reset();
davide.aliprandi@st.com 3:63a8d672fe5e 829 /* Set system flag */
davide.aliprandi@st.com 3:63a8d672fe5e 830 L6208_SetSysFlag(microstep);
davide.aliprandi@st.com 3:63a8d672fe5e 831 devicePrm.uStepInc = 4;
davide.aliprandi@st.com 3:63a8d672fe5e 832 break;
davide.aliprandi@st.com 3:63a8d672fe5e 833 case STEP_MODE_1_8:
davide.aliprandi@st.com 3:63a8d672fe5e 834 /* Set the Half/Full pin low and Reset */
davide.aliprandi@st.com 3:63a8d672fe5e 835 L6208_Board_HALF_FULL_PIN_Reset();
davide.aliprandi@st.com 3:63a8d672fe5e 836 L6208_Board_Reset();
davide.aliprandi@st.com 3:63a8d672fe5e 837 /* Set system flag */
davide.aliprandi@st.com 3:63a8d672fe5e 838 L6208_SetSysFlag(microstep);
davide.aliprandi@st.com 3:63a8d672fe5e 839 devicePrm.uStepInc = 2;
davide.aliprandi@st.com 3:63a8d672fe5e 840 break;
davide.aliprandi@st.com 3:63a8d672fe5e 841 case STEP_MODE_1_16:
davide.aliprandi@st.com 3:63a8d672fe5e 842 /* Set the Half/Full pin low and Reset */
davide.aliprandi@st.com 3:63a8d672fe5e 843 L6208_Board_HALF_FULL_PIN_Reset();
davide.aliprandi@st.com 3:63a8d672fe5e 844 L6208_Board_Reset();
davide.aliprandi@st.com 3:63a8d672fe5e 845 /* Set system flag */
davide.aliprandi@st.com 3:63a8d672fe5e 846 L6208_SetSysFlag(microstep);
davide.aliprandi@st.com 3:63a8d672fe5e 847 devicePrm.uStepInc = 1;
davide.aliprandi@st.com 3:63a8d672fe5e 848 break;
davide.aliprandi@st.com 3:63a8d672fe5e 849 default:
davide.aliprandi@st.com 3:63a8d672fe5e 850 return FALSE;
davide.aliprandi@st.com 3:63a8d672fe5e 851 }
davide.aliprandi@st.com 3:63a8d672fe5e 852 L6208_Board_Delay(2);
davide.aliprandi@st.com 3:63a8d672fe5e 853 L6208_Board_ReleaseReset();
davide.aliprandi@st.com 3:63a8d672fe5e 854 L6208_ResetSteps();
davide.aliprandi@st.com 3:63a8d672fe5e 855 return TRUE;
davide.aliprandi@st.com 3:63a8d672fe5e 856 }
davide.aliprandi@st.com 3:63a8d672fe5e 857
davide.aliprandi@st.com 3:63a8d672fe5e 858 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 859 * @brief Select the mode to stop the motor. When the motor
davide.aliprandi@st.com 3:63a8d672fe5e 860 * is stopped, if autoHiZ is TRUE, the power bridges are disabled
davide.aliprandi@st.com 3:63a8d672fe5e 861 * if autoHiZ is FALSE, the power bridges are kept enabled.
davide.aliprandi@st.com 3:63a8d672fe5e 862 * @param[in] stopMode HOLD_MODE to let power bridge enabled
davide.aliprandi@st.com 3:63a8d672fe5e 863 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 864 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 865 void L6208::L6208_SetStopMode(motorStopMode_t stopMode)
davide.aliprandi@st.com 3:63a8d672fe5e 866 {
davide.aliprandi@st.com 3:63a8d672fe5e 867 if (stopMode == HOLD_MODE)
davide.aliprandi@st.com 3:63a8d672fe5e 868 {
davide.aliprandi@st.com 3:63a8d672fe5e 869 L6208_ClearSysFlag(HiZstop);
davide.aliprandi@st.com 3:63a8d672fe5e 870 }
davide.aliprandi@st.com 3:63a8d672fe5e 871 else
davide.aliprandi@st.com 3:63a8d672fe5e 872 {
davide.aliprandi@st.com 3:63a8d672fe5e 873 L6208_SetSysFlag(HiZstop);
davide.aliprandi@st.com 3:63a8d672fe5e 874 }
davide.aliprandi@st.com 3:63a8d672fe5e 875 }
davide.aliprandi@st.com 3:63a8d672fe5e 876
davide.aliprandi@st.com 3:63a8d672fe5e 877 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 878 * @brief Stop the motor by using the device deceleration and set deceleration torque
davide.aliprandi@st.com 3:63a8d672fe5e 879 * @retval true if the command is successfully executed, else false
davide.aliprandi@st.com 3:63a8d672fe5e 880 * @note .
davide.aliprandi@st.com 3:63a8d672fe5e 881 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 882 bool L6208::L6208_SoftStop(void)
davide.aliprandi@st.com 3:63a8d672fe5e 883 {
davide.aliprandi@st.com 3:63a8d672fe5e 884 L6208_VectorCalc(devicePrm.decelTorque);
davide.aliprandi@st.com 3:63a8d672fe5e 885 L6208_SetMotionState(DECELERATINGTOSTOP);
davide.aliprandi@st.com 3:63a8d672fe5e 886 return TRUE;
davide.aliprandi@st.com 3:63a8d672fe5e 887 }
davide.aliprandi@st.com 3:63a8d672fe5e 888
davide.aliprandi@st.com 3:63a8d672fe5e 889 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 890 * @brief Handle the device state machine at each tick timer pulse end.
davide.aliprandi@st.com 3:63a8d672fe5e 891 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 892 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 893 void L6208::L6208_TickHandler(void)
davide.aliprandi@st.com 3:63a8d672fe5e 894 {
davide.aliprandi@st.com 3:63a8d672fe5e 895 uint32_t locMaxSpeedSpt = devicePrm.maxSpeedSpt;
davide.aliprandi@st.com 3:63a8d672fe5e 896 uint32_t locMinSpeedSpt = devicePrm.minSpeedSpt;
davide.aliprandi@st.com 3:63a8d672fe5e 897
davide.aliprandi@st.com 3:63a8d672fe5e 898 /* Update state, target speed, acceleration and deceleration rates */
davide.aliprandi@st.com 3:63a8d672fe5e 899 L6208_Board_CLOCK_PIN_Reset();
davide.aliprandi@st.com 3:63a8d672fe5e 900
davide.aliprandi@st.com 3:63a8d672fe5e 901 switch(L6208_GetMotionState())
davide.aliprandi@st.com 3:63a8d672fe5e 902 {
davide.aliprandi@st.com 3:63a8d672fe5e 903 /* ============ Velocity control mode states ======================== */
davide.aliprandi@st.com 3:63a8d672fe5e 904 case ACCELERATING:
davide.aliprandi@st.com 3:63a8d672fe5e 905 /* velocity mode: acceleration phase */
davide.aliprandi@st.com 3:63a8d672fe5e 906 /* Increase Speed and update position */
davide.aliprandi@st.com 3:63a8d672fe5e 907 L6208_DoAccel();
davide.aliprandi@st.com 3:63a8d672fe5e 908 if(locMaxSpeedSpt < devicePrm.speedSpt)
davide.aliprandi@st.com 3:63a8d672fe5e 909 {
davide.aliprandi@st.com 3:63a8d672fe5e 910 /*Target speed reached */
davide.aliprandi@st.com 3:63a8d672fe5e 911 devicePrm.speedSpt = locMaxSpeedSpt;
davide.aliprandi@st.com 3:63a8d672fe5e 912 L6208_VectorCalc(devicePrm.runTorque);
davide.aliprandi@st.com 3:63a8d672fe5e 913 L6208_SetMotionState(STEADY);
davide.aliprandi@st.com 3:63a8d672fe5e 914 }
davide.aliprandi@st.com 3:63a8d672fe5e 915 break;
davide.aliprandi@st.com 3:63a8d672fe5e 916 case STEADY:
davide.aliprandi@st.com 3:63a8d672fe5e 917 /* velocity mode: constant speed phase */
davide.aliprandi@st.com 3:63a8d672fe5e 918 /* Update position */
davide.aliprandi@st.com 3:63a8d672fe5e 919 L6208_DoRun();
davide.aliprandi@st.com 3:63a8d672fe5e 920 if(locMaxSpeedSpt != devicePrm.speedSpt)
davide.aliprandi@st.com 3:63a8d672fe5e 921 {
davide.aliprandi@st.com 3:63a8d672fe5e 922 /* targeted speed has changed */
davide.aliprandi@st.com 3:63a8d672fe5e 923 if(locMaxSpeedSpt< devicePrm.speedSpt)
davide.aliprandi@st.com 3:63a8d672fe5e 924 {
davide.aliprandi@st.com 3:63a8d672fe5e 925 /* Slow down the motor */
davide.aliprandi@st.com 3:63a8d672fe5e 926 L6208_VectorCalc(devicePrm.decelTorque);
davide.aliprandi@st.com 3:63a8d672fe5e 927 L6208_SetMotionState(DECELERATING);
davide.aliprandi@st.com 3:63a8d672fe5e 928 }
davide.aliprandi@st.com 3:63a8d672fe5e 929 else
davide.aliprandi@st.com 3:63a8d672fe5e 930 {
davide.aliprandi@st.com 3:63a8d672fe5e 931 /* speed up the motor */
davide.aliprandi@st.com 3:63a8d672fe5e 932 L6208_VectorCalc(devicePrm.accelTorque);
davide.aliprandi@st.com 3:63a8d672fe5e 933 L6208_SetMotionState(ACCELERATING);
davide.aliprandi@st.com 3:63a8d672fe5e 934 }
davide.aliprandi@st.com 3:63a8d672fe5e 935 }
davide.aliprandi@st.com 3:63a8d672fe5e 936 break;
davide.aliprandi@st.com 3:63a8d672fe5e 937 case DECELERATING:
davide.aliprandi@st.com 3:63a8d672fe5e 938 /* velocity mode: running motor deceleration phase */
davide.aliprandi@st.com 3:63a8d672fe5e 939 /* Decrease Speed and update position */
davide.aliprandi@st.com 3:63a8d672fe5e 940 L6208_DoDecel();
davide.aliprandi@st.com 3:63a8d672fe5e 941 if(locMaxSpeedSpt > devicePrm.speedSpt)
davide.aliprandi@st.com 3:63a8d672fe5e 942 {
davide.aliprandi@st.com 3:63a8d672fe5e 943 /*Target speed reached but motor has still to be run*/
davide.aliprandi@st.com 3:63a8d672fe5e 944 devicePrm.speedSpt = locMaxSpeedSpt;
davide.aliprandi@st.com 3:63a8d672fe5e 945 L6208_VectorCalc(devicePrm.runTorque);
davide.aliprandi@st.com 3:63a8d672fe5e 946 L6208_SetMotionState(STEADY);
davide.aliprandi@st.com 3:63a8d672fe5e 947 }
davide.aliprandi@st.com 3:63a8d672fe5e 948 break;
davide.aliprandi@st.com 3:63a8d672fe5e 949 case DECELERATINGTOSTOP:
davide.aliprandi@st.com 3:63a8d672fe5e 950 /* velocity mode: decelerate to stopped phase */
davide.aliprandi@st.com 3:63a8d672fe5e 951 /* Decrease current speed */
davide.aliprandi@st.com 3:63a8d672fe5e 952 L6208_DoDecel();
davide.aliprandi@st.com 3:63a8d672fe5e 953 if(devicePrm.speedSpt == locMinSpeedSpt)
davide.aliprandi@st.com 3:63a8d672fe5e 954 {
davide.aliprandi@st.com 3:63a8d672fe5e 955 if (L6208_IsSysFlag(dir2change))
davide.aliprandi@st.com 3:63a8d672fe5e 956 {
davide.aliprandi@st.com 3:63a8d672fe5e 957 L6208_ClearSysFlag(running);
davide.aliprandi@st.com 3:63a8d672fe5e 958 /* Change direction */
davide.aliprandi@st.com 3:63a8d672fe5e 959 if (L6208_IsSysFlag(forward))
davide.aliprandi@st.com 3:63a8d672fe5e 960 {
davide.aliprandi@st.com 3:63a8d672fe5e 961 /* switch to reverse rotation */
davide.aliprandi@st.com 3:63a8d672fe5e 962 L6208_SetDirection(BACKWARD);
davide.aliprandi@st.com 3:63a8d672fe5e 963 }
davide.aliprandi@st.com 3:63a8d672fe5e 964 else
davide.aliprandi@st.com 3:63a8d672fe5e 965 {
davide.aliprandi@st.com 3:63a8d672fe5e 966 /* switch to forward rotation */
davide.aliprandi@st.com 3:63a8d672fe5e 967 L6208_SetDirection(FORWARD);
davide.aliprandi@st.com 3:63a8d672fe5e 968 }
davide.aliprandi@st.com 3:63a8d672fe5e 969 L6208_SetSysFlag(running);
davide.aliprandi@st.com 3:63a8d672fe5e 970 L6208_SetMotionState(ACCELERATING);
davide.aliprandi@st.com 3:63a8d672fe5e 971 /* Set VRefA and VRefB to the selected acceleration torque */
davide.aliprandi@st.com 3:63a8d672fe5e 972 L6208_VectorCalc(devicePrm.accelTorque);
davide.aliprandi@st.com 3:63a8d672fe5e 973 }
davide.aliprandi@st.com 3:63a8d672fe5e 974 else
davide.aliprandi@st.com 3:63a8d672fe5e 975 {
davide.aliprandi@st.com 3:63a8d672fe5e 976 if (L6208_IsSysFlag(HiZstop))
davide.aliprandi@st.com 3:63a8d672fe5e 977 {
davide.aliprandi@st.com 3:63a8d672fe5e 978 L6208_HardHiZ();
davide.aliprandi@st.com 3:63a8d672fe5e 979 }
davide.aliprandi@st.com 3:63a8d672fe5e 980 else
davide.aliprandi@st.com 3:63a8d672fe5e 981 {
davide.aliprandi@st.com 3:63a8d672fe5e 982 L6208_HardStop();
davide.aliprandi@st.com 3:63a8d672fe5e 983 }
davide.aliprandi@st.com 3:63a8d672fe5e 984 }
davide.aliprandi@st.com 3:63a8d672fe5e 985 }
davide.aliprandi@st.com 3:63a8d672fe5e 986 break;
davide.aliprandi@st.com 3:63a8d672fe5e 987
davide.aliprandi@st.com 3:63a8d672fe5e 988 /* ============ Position (indexed) control mode states ======================== */
davide.aliprandi@st.com 3:63a8d672fe5e 989
davide.aliprandi@st.com 3:63a8d672fe5e 990 case INDEX_ACCEL:
davide.aliprandi@st.com 3:63a8d672fe5e 991 /* position mode: acceleration state*/
davide.aliprandi@st.com 3:63a8d672fe5e 992
davide.aliprandi@st.com 3:63a8d672fe5e 993 /* Increase Speed and update position */
davide.aliprandi@st.com 3:63a8d672fe5e 994 L6208_DoAccel();
davide.aliprandi@st.com 3:63a8d672fe5e 995
davide.aliprandi@st.com 3:63a8d672fe5e 996 if(devicePrm.positionTarget1 <= devicePrm.step)
davide.aliprandi@st.com 3:63a8d672fe5e 997 {
davide.aliprandi@st.com 3:63a8d672fe5e 998 /* End of acceleration phase */
davide.aliprandi@st.com 3:63a8d672fe5e 999 L6208_VectorCalc(devicePrm.runTorque);
davide.aliprandi@st.com 3:63a8d672fe5e 1000 L6208_SetMotionState(INDEX_RUN);
davide.aliprandi@st.com 3:63a8d672fe5e 1001 }
davide.aliprandi@st.com 3:63a8d672fe5e 1002 break;
davide.aliprandi@st.com 3:63a8d672fe5e 1003
davide.aliprandi@st.com 3:63a8d672fe5e 1004 case INDEX_RUN:
davide.aliprandi@st.com 3:63a8d672fe5e 1005 /* position mode: constant speed phase */
davide.aliprandi@st.com 3:63a8d672fe5e 1006
davide.aliprandi@st.com 3:63a8d672fe5e 1007 /* Update position */
davide.aliprandi@st.com 3:63a8d672fe5e 1008 L6208_DoRun();
davide.aliprandi@st.com 3:63a8d672fe5e 1009
davide.aliprandi@st.com 3:63a8d672fe5e 1010 if(devicePrm.positionTarget2 <= devicePrm.step)
davide.aliprandi@st.com 3:63a8d672fe5e 1011 {
davide.aliprandi@st.com 3:63a8d672fe5e 1012 /* reach position targeted for constant speed */
davide.aliprandi@st.com 3:63a8d672fe5e 1013 L6208_VectorCalc(devicePrm.decelTorque);
davide.aliprandi@st.com 3:63a8d672fe5e 1014 L6208_SetMotionState(INDEX_DECEL);
davide.aliprandi@st.com 3:63a8d672fe5e 1015 }
davide.aliprandi@st.com 3:63a8d672fe5e 1016 break;
davide.aliprandi@st.com 3:63a8d672fe5e 1017
davide.aliprandi@st.com 3:63a8d672fe5e 1018 case INDEX_DECEL:
davide.aliprandi@st.com 3:63a8d672fe5e 1019 /* position mode: deceleration phase */
davide.aliprandi@st.com 3:63a8d672fe5e 1020
davide.aliprandi@st.com 3:63a8d672fe5e 1021 /* Decrease Speed and update position */
davide.aliprandi@st.com 3:63a8d672fe5e 1022 L6208_DoDecel();
davide.aliprandi@st.com 3:63a8d672fe5e 1023
davide.aliprandi@st.com 3:63a8d672fe5e 1024 if(devicePrm.positionTarget3 <= devicePrm.step)
davide.aliprandi@st.com 3:63a8d672fe5e 1025 {
davide.aliprandi@st.com 3:63a8d672fe5e 1026 /* reach position targeted for deceleration phase */
davide.aliprandi@st.com 3:63a8d672fe5e 1027 /* the motor terminated its run */
davide.aliprandi@st.com 3:63a8d672fe5e 1028 /* the torque will be the deceleration one */
davide.aliprandi@st.com 3:63a8d672fe5e 1029 devicePrm.step = devicePrm.positionTarget3;
davide.aliprandi@st.com 3:63a8d672fe5e 1030 L6208_SetMotionState(INDEX_DWELL);
davide.aliprandi@st.com 3:63a8d672fe5e 1031 }
davide.aliprandi@st.com 3:63a8d672fe5e 1032 break;
davide.aliprandi@st.com 3:63a8d672fe5e 1033
davide.aliprandi@st.com 3:63a8d672fe5e 1034 case INDEX_DWELL:
davide.aliprandi@st.com 3:63a8d672fe5e 1035 /* position mode: dwelling state */
davide.aliprandi@st.com 3:63a8d672fe5e 1036 if(devicePrm.dwellCounter > 0)
davide.aliprandi@st.com 3:63a8d672fe5e 1037 {
davide.aliprandi@st.com 3:63a8d672fe5e 1038 /* decrease the dwelling wait tick counter */
davide.aliprandi@st.com 3:63a8d672fe5e 1039 devicePrm.dwellCounter--;
davide.aliprandi@st.com 3:63a8d672fe5e 1040 }
davide.aliprandi@st.com 3:63a8d672fe5e 1041 if(devicePrm.dwellCounter == 0)
davide.aliprandi@st.com 3:63a8d672fe5e 1042 {
davide.aliprandi@st.com 3:63a8d672fe5e 1043 /* dwelling wait time is elapsed */
davide.aliprandi@st.com 3:63a8d672fe5e 1044 /* so stop the motor */
davide.aliprandi@st.com 3:63a8d672fe5e 1045 if (L6208_IsSysFlag(HiZstop))
davide.aliprandi@st.com 3:63a8d672fe5e 1046 {
davide.aliprandi@st.com 3:63a8d672fe5e 1047 L6208_HardHiZ();
davide.aliprandi@st.com 3:63a8d672fe5e 1048 }
davide.aliprandi@st.com 3:63a8d672fe5e 1049 else
davide.aliprandi@st.com 3:63a8d672fe5e 1050 {
davide.aliprandi@st.com 3:63a8d672fe5e 1051 L6208_HardStop();
davide.aliprandi@st.com 3:63a8d672fe5e 1052 }
davide.aliprandi@st.com 3:63a8d672fe5e 1053 }
davide.aliprandi@st.com 3:63a8d672fe5e 1054 break;
davide.aliprandi@st.com 3:63a8d672fe5e 1055
davide.aliprandi@st.com 3:63a8d672fe5e 1056 /* ============ stopped state ======================== */
davide.aliprandi@st.com 3:63a8d672fe5e 1057 case INACTIVE:
davide.aliprandi@st.com 3:63a8d672fe5e 1058 {
davide.aliprandi@st.com 3:63a8d672fe5e 1059 if(L6208_IsSysFlag(running))
davide.aliprandi@st.com 3:63a8d672fe5e 1060 {
davide.aliprandi@st.com 3:63a8d672fe5e 1061 /* clear the user move command executing */
davide.aliprandi@st.com 3:63a8d672fe5e 1062 /* and the motor running flags */
davide.aliprandi@st.com 3:63a8d672fe5e 1063 L6208_ClearSysFlag(running);
davide.aliprandi@st.com 3:63a8d672fe5e 1064 }
davide.aliprandi@st.com 3:63a8d672fe5e 1065 break;
davide.aliprandi@st.com 3:63a8d672fe5e 1066 }
davide.aliprandi@st.com 3:63a8d672fe5e 1067 default:
davide.aliprandi@st.com 3:63a8d672fe5e 1068 break;
davide.aliprandi@st.com 3:63a8d672fe5e 1069 } /* switch(L6208_GetMotionState()) */
davide.aliprandi@st.com 3:63a8d672fe5e 1070 if(L6208_GetMotionState() != INACTIVE)
davide.aliprandi@st.com 3:63a8d672fe5e 1071 {
davide.aliprandi@st.com 3:63a8d672fe5e 1072 if (L6208_IsSysFlag(microstep))
davide.aliprandi@st.com 3:63a8d672fe5e 1073 {
davide.aliprandi@st.com 3:63a8d672fe5e 1074 /* Microstep handling */
davide.aliprandi@st.com 3:63a8d672fe5e 1075 switch(devicePrm.uStepInc)
davide.aliprandi@st.com 3:63a8d672fe5e 1076 {
davide.aliprandi@st.com 3:63a8d672fe5e 1077 default:
davide.aliprandi@st.com 3:63a8d672fe5e 1078 case 1:
davide.aliprandi@st.com 3:63a8d672fe5e 1079 /* 1 microstep increment */
davide.aliprandi@st.com 3:63a8d672fe5e 1080 devicePrm.lsbTicks = (uint8_t)(devicePrm.ticks>>16);
davide.aliprandi@st.com 3:63a8d672fe5e 1081 break;
davide.aliprandi@st.com 3:63a8d672fe5e 1082
davide.aliprandi@st.com 3:63a8d672fe5e 1083 case 2:
davide.aliprandi@st.com 3:63a8d672fe5e 1084 /* 2 microsteps increment */
davide.aliprandi@st.com 3:63a8d672fe5e 1085 devicePrm.lsbTicks = (uint8_t)(devicePrm.ticks>>17);
davide.aliprandi@st.com 3:63a8d672fe5e 1086 break;
davide.aliprandi@st.com 3:63a8d672fe5e 1087
davide.aliprandi@st.com 3:63a8d672fe5e 1088 case 4:
davide.aliprandi@st.com 3:63a8d672fe5e 1089 /* 4 microsteps increment */
davide.aliprandi@st.com 3:63a8d672fe5e 1090 devicePrm.lsbTicks = (uint8_t)(devicePrm.ticks>>18);
davide.aliprandi@st.com 3:63a8d672fe5e 1091 break;
davide.aliprandi@st.com 3:63a8d672fe5e 1092 }
davide.aliprandi@st.com 3:63a8d672fe5e 1093 devicePrm.lsbTicks &= 0x01;
davide.aliprandi@st.com 3:63a8d672fe5e 1094 if(devicePrm.lsbOldUSteppingTicks != devicePrm.lsbTicks)
davide.aliprandi@st.com 3:63a8d672fe5e 1095 {
davide.aliprandi@st.com 3:63a8d672fe5e 1096 /* waveform sample to update */
davide.aliprandi@st.com 3:63a8d672fe5e 1097 devicePrm.lsbOldUSteppingTicks = devicePrm.lsbTicks;
davide.aliprandi@st.com 3:63a8d672fe5e 1098 devicePrm.step++;
davide.aliprandi@st.com 3:63a8d672fe5e 1099 if(L6208_IsSysFlag(forward))
davide.aliprandi@st.com 3:63a8d672fe5e 1100 {
davide.aliprandi@st.com 3:63a8d672fe5e 1101 /* the motor is going forward */
davide.aliprandi@st.com 3:63a8d672fe5e 1102 devicePrm.absolutePos++;
davide.aliprandi@st.com 3:63a8d672fe5e 1103 /* Reset the absolute motor position in step/microsteps */
davide.aliprandi@st.com 3:63a8d672fe5e 1104 /* Get next microstep sample */
davide.aliprandi@st.com 3:63a8d672fe5e 1105 devicePrm.uStepSample += devicePrm.uStepInc;
davide.aliprandi@st.com 3:63a8d672fe5e 1106 if(devicePrm.uStepSample > 31)
davide.aliprandi@st.com 3:63a8d672fe5e 1107 {
davide.aliprandi@st.com 3:63a8d672fe5e 1108 devicePrm.uStepSample = 0;
davide.aliprandi@st.com 3:63a8d672fe5e 1109 }
davide.aliprandi@st.com 3:63a8d672fe5e 1110 }
davide.aliprandi@st.com 3:63a8d672fe5e 1111 else
davide.aliprandi@st.com 3:63a8d672fe5e 1112 {
davide.aliprandi@st.com 3:63a8d672fe5e 1113 /* the motor is going backward */
davide.aliprandi@st.com 3:63a8d672fe5e 1114 devicePrm.absolutePos--;
davide.aliprandi@st.com 3:63a8d672fe5e 1115 if(devicePrm.uStepSample >= devicePrm.uStepInc)
davide.aliprandi@st.com 3:63a8d672fe5e 1116 {
davide.aliprandi@st.com 3:63a8d672fe5e 1117 /* Get previous microstep sample */
davide.aliprandi@st.com 3:63a8d672fe5e 1118 devicePrm.uStepSample -= devicePrm.uStepInc;
davide.aliprandi@st.com 3:63a8d672fe5e 1119 }
davide.aliprandi@st.com 3:63a8d672fe5e 1120 else
davide.aliprandi@st.com 3:63a8d672fe5e 1121 {
davide.aliprandi@st.com 3:63a8d672fe5e 1122 devicePrm.uStepSample = 32 - devicePrm.uStepInc;
davide.aliprandi@st.com 3:63a8d672fe5e 1123 }
davide.aliprandi@st.com 3:63a8d672fe5e 1124 }
davide.aliprandi@st.com 3:63a8d672fe5e 1125 /* set the PWM to update VRefs */
davide.aliprandi@st.com 3:63a8d672fe5e 1126 L6208_VrefPwmComputePulseWidth(BRIDGE_A, pMicroTable2[devicePrm.uStepSample], FALSE);
davide.aliprandi@st.com 3:63a8d672fe5e 1127 L6208_VrefPwmComputePulseWidth(BRIDGE_B, microTable1[devicePrm.uStepSample], FALSE);
davide.aliprandi@st.com 3:63a8d672fe5e 1128 if(devicePrm.uStepsample2update > 0)
davide.aliprandi@st.com 3:63a8d672fe5e 1129 {
davide.aliprandi@st.com 3:63a8d672fe5e 1130 /* the waveform samples table has been recalculated
davide.aliprandi@st.com 3:63a8d672fe5e 1131 so update the waveform scanning table */
davide.aliprandi@st.com 3:63a8d672fe5e 1132 L6208_UpdateScanWaveformTable();
davide.aliprandi@st.com 3:63a8d672fe5e 1133 devicePrm.uStepsample2update = 0;
davide.aliprandi@st.com 3:63a8d672fe5e 1134 }
davide.aliprandi@st.com 3:63a8d672fe5e 1135 }
davide.aliprandi@st.com 3:63a8d672fe5e 1136 /* Microstep: use the bit4 toggling as step clock */
davide.aliprandi@st.com 3:63a8d672fe5e 1137 /* this bit is used because there are 16 microstep samples per quarter period */
davide.aliprandi@st.com 3:63a8d672fe5e 1138 devicePrm.lsbTicks = (uint8_t)((devicePrm.uStepSample>>4) & 0x01);
davide.aliprandi@st.com 3:63a8d672fe5e 1139 if(devicePrm.lsbOldTicks != devicePrm.lsbTicks)
davide.aliprandi@st.com 3:63a8d672fe5e 1140 {
davide.aliprandi@st.com 3:63a8d672fe5e 1141 /* the selected bit status changed ==> get the next motor step
davide.aliprandi@st.com 3:63a8d672fe5e 1142 save the current masked motor tick position for step setting scope ... */
davide.aliprandi@st.com 3:63a8d672fe5e 1143 devicePrm.lsbOldTicks = devicePrm.lsbTicks;
davide.aliprandi@st.com 3:63a8d672fe5e 1144 L6208_Board_CLOCK_PIN_Set();
davide.aliprandi@st.com 3:63a8d672fe5e 1145 }
davide.aliprandi@st.com 3:63a8d672fe5e 1146 }
davide.aliprandi@st.com 3:63a8d672fe5e 1147 else
davide.aliprandi@st.com 3:63a8d672fe5e 1148 {
davide.aliprandi@st.com 3:63a8d672fe5e 1149 /* Full and half step handling code */
davide.aliprandi@st.com 3:63a8d672fe5e 1150 if(!L6208_IsSysFlag(halfstep))
davide.aliprandi@st.com 3:63a8d672fe5e 1151 {
davide.aliprandi@st.com 3:63a8d672fe5e 1152 /* Full step: use the bit 16 toggling as step clock */
davide.aliprandi@st.com 3:63a8d672fe5e 1153 devicePrm.lsbTicks = (uint8_t)((devicePrm.ticks>>16) & 0x00000001);
davide.aliprandi@st.com 3:63a8d672fe5e 1154 }
davide.aliprandi@st.com 3:63a8d672fe5e 1155 else
davide.aliprandi@st.com 3:63a8d672fe5e 1156 {
davide.aliprandi@st.com 3:63a8d672fe5e 1157 /* half step: use the bit 15 toggling as step clock */
davide.aliprandi@st.com 3:63a8d672fe5e 1158 devicePrm.lsbTicks = (uint8_t)((devicePrm.ticks>>15) & 0x00000001);
davide.aliprandi@st.com 3:63a8d672fe5e 1159 }
davide.aliprandi@st.com 3:63a8d672fe5e 1160 if(devicePrm.lsbOldTicks != devicePrm.lsbTicks)
davide.aliprandi@st.com 3:63a8d672fe5e 1161 {
davide.aliprandi@st.com 3:63a8d672fe5e 1162 /* the selected bit status changed ==> get the next motor step */
davide.aliprandi@st.com 3:63a8d672fe5e 1163 devicePrm.step++;
davide.aliprandi@st.com 3:63a8d672fe5e 1164 if(L6208_IsSysFlag(forward))
davide.aliprandi@st.com 3:63a8d672fe5e 1165 {
davide.aliprandi@st.com 3:63a8d672fe5e 1166 /* the motor is going forward */
davide.aliprandi@st.com 3:63a8d672fe5e 1167 devicePrm.absolutePos++;
davide.aliprandi@st.com 3:63a8d672fe5e 1168 }
davide.aliprandi@st.com 3:63a8d672fe5e 1169 else
davide.aliprandi@st.com 3:63a8d672fe5e 1170 {
davide.aliprandi@st.com 3:63a8d672fe5e 1171 /* the motor is going backward */
davide.aliprandi@st.com 3:63a8d672fe5e 1172 devicePrm.absolutePos--;
davide.aliprandi@st.com 3:63a8d672fe5e 1173 }
davide.aliprandi@st.com 3:63a8d672fe5e 1174 /* save the current masked motor tick position for step setting scope ... */
davide.aliprandi@st.com 3:63a8d672fe5e 1175 devicePrm.lsbOldTicks = devicePrm.lsbTicks;
davide.aliprandi@st.com 3:63a8d672fe5e 1176 L6208_Board_CLOCK_PIN_Set();
davide.aliprandi@st.com 3:63a8d672fe5e 1177 }
davide.aliprandi@st.com 3:63a8d672fe5e 1178 }
davide.aliprandi@st.com 3:63a8d672fe5e 1179 }
davide.aliprandi@st.com 3:63a8d672fe5e 1180 L6208_UstepWaveformHandling();
davide.aliprandi@st.com 3:63a8d672fe5e 1181 L6208_VrefPwmUpdatePulseWidth();
davide.aliprandi@st.com 3:63a8d672fe5e 1182 }
davide.aliprandi@st.com 3:63a8d672fe5e 1183
davide.aliprandi@st.com 3:63a8d672fe5e 1184 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 1185 * @brief Get the frequency of VREFA and VREFB PWM
davide.aliprandi@st.com 3:63a8d672fe5e 1186 * @retval the frequency of VREFA and VREFB PWM in Hz
davide.aliprandi@st.com 3:63a8d672fe5e 1187 * @note
davide.aliprandi@st.com 3:63a8d672fe5e 1188 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 1189 uint32_t L6208::L6208_VrefPwmGetFreq(void)
davide.aliprandi@st.com 3:63a8d672fe5e 1190 {
davide.aliprandi@st.com 3:63a8d672fe5e 1191 return devicePrm.vrefPwmFreq;
davide.aliprandi@st.com 3:63a8d672fe5e 1192 }
davide.aliprandi@st.com 3:63a8d672fe5e 1193
davide.aliprandi@st.com 3:63a8d672fe5e 1194 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 1195 * @brief Set the frequency of the VREFA and VREFB PWM
davide.aliprandi@st.com 3:63a8d672fe5e 1196 * @param[in] newFreq in Hz
davide.aliprandi@st.com 3:63a8d672fe5e 1197 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 1198 * @note
davide.aliprandi@st.com 3:63a8d672fe5e 1199 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 1200 void L6208::L6208_VrefPwmSetFreq(uint32_t newFreq)
davide.aliprandi@st.com 3:63a8d672fe5e 1201 {
davide.aliprandi@st.com 3:63a8d672fe5e 1202 devicePrm.vrefPwmFreq = newFreq;
davide.aliprandi@st.com 3:63a8d672fe5e 1203 /* Compute the pwm period in 1/256th of a microsecond */
davide.aliprandi@st.com 3:63a8d672fe5e 1204 devicePrm.vrefPwmPeriod = (uint16_t)((1000000<<8)/newFreq);
davide.aliprandi@st.com 3:63a8d672fe5e 1205 /* Re-Initialise the PWMs -----------------------------------------------------*/
davide.aliprandi@st.com 3:63a8d672fe5e 1206 L6208_Board_VrefPwmInit(BRIDGE_A, devicePrm.vrefPwmPeriod);
davide.aliprandi@st.com 3:63a8d672fe5e 1207 L6208_Board_VrefPwmInit(BRIDGE_B, devicePrm.vrefPwmPeriod);
davide.aliprandi@st.com 3:63a8d672fe5e 1208 /* Recompute the waveform samples according to the new PWM frequency */
davide.aliprandi@st.com 3:63a8d672fe5e 1209 L6208_ScaleWaveformTable();
davide.aliprandi@st.com 3:63a8d672fe5e 1210 /* Update the waveform scanning table */
davide.aliprandi@st.com 3:63a8d672fe5e 1211 L6208_UpdateScanWaveformTable();
davide.aliprandi@st.com 3:63a8d672fe5e 1212 if (L6208_IsSysFlag(running))
davide.aliprandi@st.com 3:63a8d672fe5e 1213 {
davide.aliprandi@st.com 3:63a8d672fe5e 1214 L6208_Board_VrefPwmStart(BRIDGE_A, devicePrm.vrefPwmPeriod);
davide.aliprandi@st.com 3:63a8d672fe5e 1215 L6208_Board_VrefPwmStart(BRIDGE_B, devicePrm.vrefPwmPeriod);
davide.aliprandi@st.com 3:63a8d672fe5e 1216 }
davide.aliprandi@st.com 3:63a8d672fe5e 1217 }
davide.aliprandi@st.com 3:63a8d672fe5e 1218
davide.aliprandi@st.com 3:63a8d672fe5e 1219 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 1220 * @brief Lock while motor is running
davide.aliprandi@st.com 3:63a8d672fe5e 1221 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 1222 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 1223 void L6208::L6208_WaitWhileActive(void)
davide.aliprandi@st.com 3:63a8d672fe5e 1224 {
davide.aliprandi@st.com 3:63a8d672fe5e 1225 /* Wait while motor is running */
davide.aliprandi@st.com 3:63a8d672fe5e 1226 while (L6208_IsSysFlag(running));
davide.aliprandi@st.com 3:63a8d672fe5e 1227 }
davide.aliprandi@st.com 3:63a8d672fe5e 1228
davide.aliprandi@st.com 3:63a8d672fe5e 1229 /* ------------------------------------------------------------------------- */
davide.aliprandi@st.com 3:63a8d672fe5e 1230 /* Private functions ------------------------------------------------------- */
davide.aliprandi@st.com 3:63a8d672fe5e 1231 /* ------------------------------------------------------------------------- */
davide.aliprandi@st.com 3:63a8d672fe5e 1232 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 1233 * @brief Clear the bit/s of flags according to the specified mask
davide.aliprandi@st.com 3:63a8d672fe5e 1234 * @param[in] mask flag bit mask
davide.aliprandi@st.com 3:63a8d672fe5e 1235 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 1236 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 1237 inline void L6208::L6208_ClearSysFlag(uint32_t mask)
davide.aliprandi@st.com 3:63a8d672fe5e 1238 {
davide.aliprandi@st.com 3:63a8d672fe5e 1239 devicePrm.flags &= ~mask;
davide.aliprandi@st.com 3:63a8d672fe5e 1240 }
davide.aliprandi@st.com 3:63a8d672fe5e 1241
davide.aliprandi@st.com 3:63a8d672fe5e 1242 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 1243 * @brief Compute the number of steps at the end of the accereration/deceleration phase
davide.aliprandi@st.com 3:63a8d672fe5e 1244 * P = position in steps at the end of the acceleration/deceleration phase
davide.aliprandi@st.com 3:63a8d672fe5e 1245 * T = acceleration/deceleration time in seconds
davide.aliprandi@st.com 3:63a8d672fe5e 1246 * A = acceleration/deceleration rate in steps per second per second (steps/sec^2)
davide.aliprandi@st.com 3:63a8d672fe5e 1247 * V = peak velocity during acceleration/deceleration phase
davide.aliprandi@st.com 3:63a8d672fe5e 1248 * V1 = average velocity during acceleration/deceleration phase
davide.aliprandi@st.com 3:63a8d672fe5e 1249 * T = V/A
davide.aliprandi@st.com 3:63a8d672fe5e 1250 * V1 = V/2
davide.aliprandi@st.com 3:63a8d672fe5e 1251 * P = V1*T
davide.aliprandi@st.com 3:63a8d672fe5e 1252 * P = V^2/2A
davide.aliprandi@st.com 3:63a8d672fe5e 1253 * @param accOrDecRate acceleration/deceleration rate in steps per second per second (steps/sec^2)
davide.aliprandi@st.com 3:63a8d672fe5e 1254 * @retval end position or 0xFFFFFFFF on error
davide.aliprandi@st.com 3:63a8d672fe5e 1255 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 1256 uint32_t L6208::L6208_ComputeNbAccOrDecSteps(uint16_t accOrDecRate)
davide.aliprandi@st.com 3:63a8d672fe5e 1257 {
davide.aliprandi@st.com 3:63a8d672fe5e 1258 uint32_t nbAccOrDecSteps;
davide.aliprandi@st.com 3:63a8d672fe5e 1259 uint32_t locMaxSpeedSps = (uint32_t)devicePrm.maxSpeedSps;
davide.aliprandi@st.com 3:63a8d672fe5e 1260
davide.aliprandi@st.com 3:63a8d672fe5e 1261 if (L6208_IsSysFlag(microstep))
davide.aliprandi@st.com 3:63a8d672fe5e 1262 {
davide.aliprandi@st.com 3:63a8d672fe5e 1263 switch(devicePrm.uStepInc)
davide.aliprandi@st.com 3:63a8d672fe5e 1264 {
davide.aliprandi@st.com 3:63a8d672fe5e 1265 case 1:
davide.aliprandi@st.com 3:63a8d672fe5e 1266 locMaxSpeedSps = (uint32_t)devicePrm.maxSpeedSps;
davide.aliprandi@st.com 3:63a8d672fe5e 1267 break;
davide.aliprandi@st.com 3:63a8d672fe5e 1268 case 2:
davide.aliprandi@st.com 3:63a8d672fe5e 1269 locMaxSpeedSps = ((uint32_t)devicePrm.maxSpeedSps)>>1;
davide.aliprandi@st.com 3:63a8d672fe5e 1270 accOrDecRate >>= 1;
davide.aliprandi@st.com 3:63a8d672fe5e 1271 break;
davide.aliprandi@st.com 3:63a8d672fe5e 1272 case 4:
davide.aliprandi@st.com 3:63a8d672fe5e 1273 locMaxSpeedSps = ((uint32_t)devicePrm.maxSpeedSps)>>2;
davide.aliprandi@st.com 3:63a8d672fe5e 1274 accOrDecRate >>= 2;
davide.aliprandi@st.com 3:63a8d672fe5e 1275 break;
davide.aliprandi@st.com 3:63a8d672fe5e 1276 default:
davide.aliprandi@st.com 3:63a8d672fe5e 1277 break;
davide.aliprandi@st.com 3:63a8d672fe5e 1278 }
davide.aliprandi@st.com 3:63a8d672fe5e 1279 }
davide.aliprandi@st.com 3:63a8d672fe5e 1280 else if (L6208_IsSysFlag(halfstep))
davide.aliprandi@st.com 3:63a8d672fe5e 1281 {
davide.aliprandi@st.com 3:63a8d672fe5e 1282 locMaxSpeedSps = ((uint32_t)devicePrm.maxSpeedSps)<<1;
davide.aliprandi@st.com 3:63a8d672fe5e 1283 accOrDecRate <<= 1;
davide.aliprandi@st.com 3:63a8d672fe5e 1284 }
davide.aliprandi@st.com 3:63a8d672fe5e 1285
davide.aliprandi@st.com 3:63a8d672fe5e 1286 if(accOrDecRate == 0)
davide.aliprandi@st.com 3:63a8d672fe5e 1287 {
davide.aliprandi@st.com 3:63a8d672fe5e 1288 /* division by 0 error */
davide.aliprandi@st.com 3:63a8d672fe5e 1289 return 0xFFFFFFFF;
davide.aliprandi@st.com 3:63a8d672fe5e 1290 }
davide.aliprandi@st.com 3:63a8d672fe5e 1291 nbAccOrDecSteps = locMaxSpeedSps * locMaxSpeedSps;
davide.aliprandi@st.com 3:63a8d672fe5e 1292 nbAccOrDecSteps /= (uint32_t)accOrDecRate;
davide.aliprandi@st.com 3:63a8d672fe5e 1293 nbAccOrDecSteps /= 2;
davide.aliprandi@st.com 3:63a8d672fe5e 1294
davide.aliprandi@st.com 3:63a8d672fe5e 1295 return nbAccOrDecSteps;
davide.aliprandi@st.com 3:63a8d672fe5e 1296 }
davide.aliprandi@st.com 3:63a8d672fe5e 1297
davide.aliprandi@st.com 3:63a8d672fe5e 1298 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 1299 * @brief Compute the acceleration/deceleration speed increment value
davide.aliprandi@st.com 3:63a8d672fe5e 1300 * @param[in] newAccOrDecRate acceleration or deceleration value (steps/s^2) greater or equal than 24
davide.aliprandi@st.com 3:63a8d672fe5e 1301 * @retval the speed (step/tick) increment value
davide.aliprandi@st.com 3:63a8d672fe5e 1302 * LSB = 2^-24 step/tick^2 or 2^-20 microstep/tick^2
davide.aliprandi@st.com 3:63a8d672fe5e 1303 * @note return 0 if the rate is too low or if the tick frequency is too small
davide.aliprandi@st.com 3:63a8d672fe5e 1304 * or if the device is running in position mode
davide.aliprandi@st.com 3:63a8d672fe5e 1305 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 1306 uint16_t L6208::L6208_ConvertAcceDecelRateValue(uint16_t newAccOrDecRate)
davide.aliprandi@st.com 3:63a8d672fe5e 1307 {
davide.aliprandi@st.com 3:63a8d672fe5e 1308 uint64_t tmp64;
davide.aliprandi@st.com 3:63a8d672fe5e 1309 uint32_t tmp32;
davide.aliprandi@st.com 3:63a8d672fe5e 1310
davide.aliprandi@st.com 3:63a8d672fe5e 1311 if (((L6208_IsSysFlag(running))&&(L6208_IsSysFlag(positionmode)))||\
davide.aliprandi@st.com 3:63a8d672fe5e 1312 (newAccOrDecRate < L6208_MIN_ACC_DEC_RATE))
davide.aliprandi@st.com 3:63a8d672fe5e 1313 {
davide.aliprandi@st.com 3:63a8d672fe5e 1314 return 0;
davide.aliprandi@st.com 3:63a8d672fe5e 1315 }
davide.aliprandi@st.com 3:63a8d672fe5e 1316 /* Compute (tick frequency)^2 */
davide.aliprandi@st.com 3:63a8d672fe5e 1317 tmp32 = (uint32_t)L6208_Board_TickGetFreq();
davide.aliprandi@st.com 3:63a8d672fe5e 1318 tmp32 *= tmp32;
davide.aliprandi@st.com 3:63a8d672fe5e 1319 /* Return 0 if the (tick frequency)^2 is too small */
davide.aliprandi@st.com 3:63a8d672fe5e 1320 if ( tmp32 < (uint32_t)newAccOrDecRate )
davide.aliprandi@st.com 3:63a8d672fe5e 1321 {
davide.aliprandi@st.com 3:63a8d672fe5e 1322 return 0;
davide.aliprandi@st.com 3:63a8d672fe5e 1323 }
davide.aliprandi@st.com 3:63a8d672fe5e 1324 /* Compute the decimal number of microstep or step per tick^2 */
davide.aliprandi@st.com 3:63a8d672fe5e 1325 /* Decimal part is on 32 bits */
davide.aliprandi@st.com 3:63a8d672fe5e 1326 tmp64 = (uint64_t)newAccOrDecRate << 32;
davide.aliprandi@st.com 3:63a8d672fe5e 1327 tmp64 /= ((uint64_t)tmp32);
davide.aliprandi@st.com 3:63a8d672fe5e 1328
davide.aliprandi@st.com 3:63a8d672fe5e 1329 return (uint16_t)((tmp64 & 0x00000000FFFFFFFF)>>8);
davide.aliprandi@st.com 3:63a8d672fe5e 1330 }
davide.aliprandi@st.com 3:63a8d672fe5e 1331
davide.aliprandi@st.com 3:63a8d672fe5e 1332 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 1333 * @brief Compute next position and speed according to the acceleration rate
davide.aliprandi@st.com 3:63a8d672fe5e 1334 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 1335 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 1336 void L6208::L6208_DoAccel(void)
davide.aliprandi@st.com 3:63a8d672fe5e 1337 {
davide.aliprandi@st.com 3:63a8d672fe5e 1338 /* Increase speed by acceleration rate */
davide.aliprandi@st.com 3:63a8d672fe5e 1339 uint32_t locAccelerationSpt2 = (uint32_t)devicePrm.accelerationSpt2;
davide.aliprandi@st.com 3:63a8d672fe5e 1340 uint32_t locMinSpeedSpt = devicePrm.minSpeedSpt;
davide.aliprandi@st.com 3:63a8d672fe5e 1341 if ((devicePrm.speedSpt + locAccelerationSpt2) < locMinSpeedSpt)
davide.aliprandi@st.com 3:63a8d672fe5e 1342 {
davide.aliprandi@st.com 3:63a8d672fe5e 1343 devicePrm.speedSpt = locMinSpeedSpt;
davide.aliprandi@st.com 3:63a8d672fe5e 1344 }
davide.aliprandi@st.com 3:63a8d672fe5e 1345 else
davide.aliprandi@st.com 3:63a8d672fe5e 1346 {
davide.aliprandi@st.com 3:63a8d672fe5e 1347 devicePrm.speedSpt += locAccelerationSpt2;
davide.aliprandi@st.com 3:63a8d672fe5e 1348 }
davide.aliprandi@st.com 3:63a8d672fe5e 1349 /* Compute next position */
davide.aliprandi@st.com 3:63a8d672fe5e 1350 L6208_DoRun();
davide.aliprandi@st.com 3:63a8d672fe5e 1351 }
davide.aliprandi@st.com 3:63a8d672fe5e 1352
davide.aliprandi@st.com 3:63a8d672fe5e 1353 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 1354 * @brief Compute next position and speed according to the deceleration rate
davide.aliprandi@st.com 3:63a8d672fe5e 1355 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 1356 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 1357 void L6208::L6208_DoDecel(void)
davide.aliprandi@st.com 3:63a8d672fe5e 1358 {
davide.aliprandi@st.com 3:63a8d672fe5e 1359 /* Decrease current speed by deceleration rate */
davide.aliprandi@st.com 3:63a8d672fe5e 1360 uint32_t locDecelerationSpt2 = (uint32_t)devicePrm.decelerationSpt2;
davide.aliprandi@st.com 3:63a8d672fe5e 1361 uint32_t locMinSpeedSpt = devicePrm.minSpeedSpt;
davide.aliprandi@st.com 3:63a8d672fe5e 1362 if((devicePrm.speedSpt - locMinSpeedSpt) > (uint32_t)locDecelerationSpt2)
davide.aliprandi@st.com 3:63a8d672fe5e 1363 {
davide.aliprandi@st.com 3:63a8d672fe5e 1364 devicePrm.speedSpt -= (uint32_t)locDecelerationSpt2;
davide.aliprandi@st.com 3:63a8d672fe5e 1365 }
davide.aliprandi@st.com 3:63a8d672fe5e 1366 else
davide.aliprandi@st.com 3:63a8d672fe5e 1367 {
davide.aliprandi@st.com 3:63a8d672fe5e 1368 /* Set minimum speed */
davide.aliprandi@st.com 3:63a8d672fe5e 1369 devicePrm.speedSpt = locMinSpeedSpt;
davide.aliprandi@st.com 3:63a8d672fe5e 1370 }
davide.aliprandi@st.com 3:63a8d672fe5e 1371 /* Compute next position */
davide.aliprandi@st.com 3:63a8d672fe5e 1372 L6208_DoRun();
davide.aliprandi@st.com 3:63a8d672fe5e 1373 }
davide.aliprandi@st.com 3:63a8d672fe5e 1374
davide.aliprandi@st.com 3:63a8d672fe5e 1375 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 1376 * @brief Compute next position by adding current speed
davide.aliprandi@st.com 3:63a8d672fe5e 1377 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 1378 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 1379 void L6208::L6208_DoRun(void)
davide.aliprandi@st.com 3:63a8d672fe5e 1380 {
davide.aliprandi@st.com 3:63a8d672fe5e 1381 devicePrm.ticks += (devicePrm.speedSpt >> 8) & 0x0000FFFF;
davide.aliprandi@st.com 3:63a8d672fe5e 1382 }
davide.aliprandi@st.com 3:63a8d672fe5e 1383
davide.aliprandi@st.com 3:63a8d672fe5e 1384 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 1385 * @brief Get number of samples to rescale
davide.aliprandi@st.com 3:63a8d672fe5e 1386 * @retval uStepsample2scale the number of micro stepping waveform samples to rescale
davide.aliprandi@st.com 3:63a8d672fe5e 1387 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 1388 uint8_t L6208::L6208_GetMicrostepSample2Scale(void)
davide.aliprandi@st.com 3:63a8d672fe5e 1389 {
davide.aliprandi@st.com 3:63a8d672fe5e 1390 return devicePrm.uStepsample2scale;
davide.aliprandi@st.com 3:63a8d672fe5e 1391 }
davide.aliprandi@st.com 3:63a8d672fe5e 1392
davide.aliprandi@st.com 3:63a8d672fe5e 1393 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 1394 * @brief Initialize the system for position mode motor moving command
davide.aliprandi@st.com 3:63a8d672fe5e 1395 * P = total move distance in steps
davide.aliprandi@st.com 3:63a8d672fe5e 1396 * P1 = steps required to accel from 0 to V
davide.aliprandi@st.com 3:63a8d672fe5e 1397 * P2 = steps required to decel from V to 0
davide.aliprandi@st.com 3:63a8d672fe5e 1398 * V = peak velocity in steps per second (steps/sec)
davide.aliprandi@st.com 3:63a8d672fe5e 1399 * V1 = average velocity during accel or decel*
davide.aliprandi@st.com 3:63a8d672fe5e 1400 * A = required accel rate in steps per second per second (steps/sec2)
davide.aliprandi@st.com 3:63a8d672fe5e 1401 * D = required decel rate in steps per second per second (steps/sec2)
davide.aliprandi@st.com 3:63a8d672fe5e 1402 * T1 = acceleration time in seconds
davide.aliprandi@st.com 3:63a8d672fe5e 1403 * T2 = deceleration time in seconds*
davide.aliprandi@st.com 3:63a8d672fe5e 1404 *
davide.aliprandi@st.com 3:63a8d672fe5e 1405 * 1) T1 = V / A
davide.aliprandi@st.com 3:63a8d672fe5e 1406 * 2) V1 = V / 2
davide.aliprandi@st.com 3:63a8d672fe5e 1407 * 3) P1 = V1 T1
davide.aliprandi@st.com 3:63a8d672fe5e 1408 * Substituting 1 and 2 into 3 yields:
davide.aliprandi@st.com 3:63a8d672fe5e 1409 * 4) P1 = V2 / 2A
davide.aliprandi@st.com 3:63a8d672fe5e 1410 * In the same manner we have:
davide.aliprandi@st.com 3:63a8d672fe5e 1411 * 5) P2 = V2 / 2D
davide.aliprandi@st.com 3:63a8d672fe5e 1412 *
davide.aliprandi@st.com 3:63a8d672fe5e 1413 * P1 = PD/(D+A)
davide.aliprandi@st.com 3:63a8d672fe5e 1414 *
davide.aliprandi@st.com 3:63a8d672fe5e 1415 * \sa Application Note: AN2044
davide.aliprandi@st.com 3:63a8d672fe5e 1416 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 1417 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 1418 void L6208::L6208_Indexmodeinit(void)
davide.aliprandi@st.com 3:63a8d672fe5e 1419 {
davide.aliprandi@st.com 3:63a8d672fe5e 1420 uint32_t tmpVal0;
davide.aliprandi@st.com 3:63a8d672fe5e 1421 uint32_t tmpVal1;
davide.aliprandi@st.com 3:63a8d672fe5e 1422 uint32_t locAccelSteps;
davide.aliprandi@st.com 3:63a8d672fe5e 1423 uint32_t locDecSteps;
davide.aliprandi@st.com 3:63a8d672fe5e 1424
davide.aliprandi@st.com 3:63a8d672fe5e 1425 /* calculate the number of steps to get the running speed */
davide.aliprandi@st.com 3:63a8d672fe5e 1426 locAccelSteps = L6208_ComputeNbAccOrDecSteps(devicePrm.accelerationSps2);
davide.aliprandi@st.com 3:63a8d672fe5e 1427 /* calculate the number of steps to get the motor stopped */
davide.aliprandi@st.com 3:63a8d672fe5e 1428 locDecSteps = L6208_ComputeNbAccOrDecSteps(devicePrm.decelerationSps2);
davide.aliprandi@st.com 3:63a8d672fe5e 1429 if(( locAccelSteps + locDecSteps ) > devicePrm.positionTarget)
davide.aliprandi@st.com 3:63a8d672fe5e 1430 {
davide.aliprandi@st.com 3:63a8d672fe5e 1431 /* Triangular move needed */
davide.aliprandi@st.com 3:63a8d672fe5e 1432 /* accelsteps = P1 = PD/(D+A) */
davide.aliprandi@st.com 3:63a8d672fe5e 1433 tmpVal0 = devicePrm.positionTarget * devicePrm.decelerationSps2;
davide.aliprandi@st.com 3:63a8d672fe5e 1434 tmpVal1 = (uint32_t)devicePrm.decelerationSps2;
davide.aliprandi@st.com 3:63a8d672fe5e 1435 tmpVal1 += (uint32_t)devicePrm.accelerationSps2;
davide.aliprandi@st.com 3:63a8d672fe5e 1436 locAccelSteps = tmpVal0 / tmpVal1;
davide.aliprandi@st.com 3:63a8d672fe5e 1437 devicePrm.positionTarget1 = locAccelSteps;
davide.aliprandi@st.com 3:63a8d672fe5e 1438 devicePrm.positionTarget2 = devicePrm.positionTarget1 + 1;
davide.aliprandi@st.com 3:63a8d672fe5e 1439 devicePrm.positionTarget3 = devicePrm.positionTarget;
davide.aliprandi@st.com 3:63a8d672fe5e 1440 if(devicePrm.positionTarget1 == 0)
davide.aliprandi@st.com 3:63a8d672fe5e 1441 {
davide.aliprandi@st.com 3:63a8d672fe5e 1442 devicePrm.positionTarget1 = 1;
davide.aliprandi@st.com 3:63a8d672fe5e 1443 }
davide.aliprandi@st.com 3:63a8d672fe5e 1444 }
davide.aliprandi@st.com 3:63a8d672fe5e 1445 else
davide.aliprandi@st.com 3:63a8d672fe5e 1446 {
davide.aliprandi@st.com 3:63a8d672fe5e 1447 /* trapezoidal move needed */
davide.aliprandi@st.com 3:63a8d672fe5e 1448 /* P1 = V^2/2A */
davide.aliprandi@st.com 3:63a8d672fe5e 1449 /* P2 = P - V^2/2D */
davide.aliprandi@st.com 3:63a8d672fe5e 1450 devicePrm.positionTarget1 = locAccelSteps;
davide.aliprandi@st.com 3:63a8d672fe5e 1451 devicePrm.positionTarget2 = devicePrm.positionTarget - locDecSteps;
davide.aliprandi@st.com 3:63a8d672fe5e 1452 devicePrm.positionTarget3 = devicePrm.positionTarget;
davide.aliprandi@st.com 3:63a8d672fe5e 1453 }
davide.aliprandi@st.com 3:63a8d672fe5e 1454 L6208_SetMotionState(INDEX_ACCEL);
davide.aliprandi@st.com 3:63a8d672fe5e 1455 }
davide.aliprandi@st.com 3:63a8d672fe5e 1456
davide.aliprandi@st.com 3:63a8d672fe5e 1457 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 1458 * @brief Check the bit/s of flags according to the specified mask
davide.aliprandi@st.com 3:63a8d672fe5e 1459 * @param[in] mask flag bit mask
davide.aliprandi@st.com 3:63a8d672fe5e 1460 * @retval TRUE if the bit of the mask are set
davide.aliprandi@st.com 3:63a8d672fe5e 1461 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 1462 inline bool L6208::L6208_IsSysFlag(uint32_t mask)
davide.aliprandi@st.com 3:63a8d672fe5e 1463 {
davide.aliprandi@st.com 3:63a8d672fe5e 1464 return (bool)((devicePrm.flags & mask) == mask);
davide.aliprandi@st.com 3:63a8d672fe5e 1465 }
davide.aliprandi@st.com 3:63a8d672fe5e 1466
davide.aliprandi@st.com 3:63a8d672fe5e 1467 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 1468 * @brief Stepper driver device step state reset subroutine
davide.aliprandi@st.com 3:63a8d672fe5e 1469 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 1470 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 1471 void L6208::L6208_ResetSteps(void)
davide.aliprandi@st.com 3:63a8d672fe5e 1472 {
davide.aliprandi@st.com 3:63a8d672fe5e 1473 devicePrm.speedSpt = 0; // reset the current speed value
davide.aliprandi@st.com 3:63a8d672fe5e 1474 devicePrm.ticks = 0; // reset the current ticks counter value
davide.aliprandi@st.com 3:63a8d672fe5e 1475 devicePrm.step = 0; // reset the current step counter value
davide.aliprandi@st.com 3:63a8d672fe5e 1476 devicePrm.lsbOldTicks = 0; // reset copy of the previous position (tick)
davide.aliprandi@st.com 3:63a8d672fe5e 1477 devicePrm.lsbOldUSteppingTicks = 0; // reset copy of the previous position (tick) ( micro stepping )
davide.aliprandi@st.com 3:63a8d672fe5e 1478 devicePrm.lsbTicks = 0; // reset copy of the current position (tick)
davide.aliprandi@st.com 3:63a8d672fe5e 1479 devicePrm.absolutePos = 0; // reset the absolute motor position in step/microsteps
davide.aliprandi@st.com 3:63a8d672fe5e 1480 devicePrm.uStepSample = 0; // reset the microstepping waveform sample index
davide.aliprandi@st.com 3:63a8d672fe5e 1481 }
davide.aliprandi@st.com 3:63a8d672fe5e 1482
davide.aliprandi@st.com 3:63a8d672fe5e 1483 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 1484 * @brief Compute the specified micro stepping waveform sample with the
davide.aliprandi@st.com 3:63a8d672fe5e 1485 * current selected torque and pwm period
davide.aliprandi@st.com 3:63a8d672fe5e 1486 * @param[in] sampleIndex sample Index
davide.aliprandi@st.com 3:63a8d672fe5e 1487 * @retval scaled sample value
davide.aliprandi@st.com 3:63a8d672fe5e 1488 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 1489 uint32_t L6208::L6208_ScaleWaveformSample(uint8_t sampleIndex)
davide.aliprandi@st.com 3:63a8d672fe5e 1490 {
davide.aliprandi@st.com 3:63a8d672fe5e 1491 uint32_t sample;
davide.aliprandi@st.com 3:63a8d672fe5e 1492
davide.aliprandi@st.com 3:63a8d672fe5e 1493 sample = (uint32_t)RefMicroTable[sampleIndex];
davide.aliprandi@st.com 3:63a8d672fe5e 1494 sample *= devicePrm.vrefPwmPeriod;
davide.aliprandi@st.com 3:63a8d672fe5e 1495 sample >>= (uint32_t)L6208_SINE_WAVEFORM_POWER_OF_TWO_MAX_VALUE;
davide.aliprandi@st.com 3:63a8d672fe5e 1496
davide.aliprandi@st.com 3:63a8d672fe5e 1497 sample *= (uint32_t)devicePrm.curTorqueScaler; // torque val (%)
davide.aliprandi@st.com 3:63a8d672fe5e 1498 sample /= (uint32_t)100;
davide.aliprandi@st.com 3:63a8d672fe5e 1499
davide.aliprandi@st.com 3:63a8d672fe5e 1500 return sample;
davide.aliprandi@st.com 3:63a8d672fe5e 1501 }
davide.aliprandi@st.com 3:63a8d672fe5e 1502
davide.aliprandi@st.com 3:63a8d672fe5e 1503 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 1504 * @brief Compute the micro stepping waveform sample table samples with the
davide.aliprandi@st.com 3:63a8d672fe5e 1505 * current selected torque and pwm period
davide.aliprandi@st.com 3:63a8d672fe5e 1506 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 1507 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 1508 void L6208::L6208_ScaleWaveformTable(void)
davide.aliprandi@st.com 3:63a8d672fe5e 1509 {
davide.aliprandi@st.com 3:63a8d672fe5e 1510 uint8_t index;
davide.aliprandi@st.com 3:63a8d672fe5e 1511 for(index=0; index<=L6208_USTEPS_PER_QUARTER_PERIOD; index++)
davide.aliprandi@st.com 3:63a8d672fe5e 1512 {
davide.aliprandi@st.com 3:63a8d672fe5e 1513 /* Calculate the scaled sample and save its value into the waveform to update table */
davide.aliprandi@st.com 3:63a8d672fe5e 1514 updatedMicroTable[index] = (uint16_t)L6208_ScaleWaveformSample(index);
davide.aliprandi@st.com 3:63a8d672fe5e 1515 }
davide.aliprandi@st.com 3:63a8d672fe5e 1516 }
davide.aliprandi@st.com 3:63a8d672fe5e 1517
davide.aliprandi@st.com 3:63a8d672fe5e 1518 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 1519 * @brief Set the parameters of the device to values of the structure pointed
davide.aliprandi@st.com 3:63a8d672fe5e 1520 * by pInitDevicePrm. Set GPIO according to these values.
davide.aliprandi@st.com 3:63a8d672fe5e 1521 * @param pInitDevicePrm pointer onto the structure containing values to
davide.aliprandi@st.com 3:63a8d672fe5e 1522 * initialize the device parameters.
davide.aliprandi@st.com 3:63a8d672fe5e 1523 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 1524 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 1525 void L6208::L6208_SetDeviceParamsToGivenValues(l6208_init_t* pInitDevicePrm)
davide.aliprandi@st.com 3:63a8d672fe5e 1526 {
davide.aliprandi@st.com 3:63a8d672fe5e 1527 memset(&devicePrm, 0, sizeof(devicePrm));
davide.aliprandi@st.com 3:63a8d672fe5e 1528 L6208_SetAcceleration(pInitDevicePrm->accelerationSps2);
davide.aliprandi@st.com 3:63a8d672fe5e 1529 L6208_SetDeceleration(pInitDevicePrm->decelerationSps2);
davide.aliprandi@st.com 3:63a8d672fe5e 1530 L6208_SetMaxSpeed(pInitDevicePrm->maxSpeedSps);
davide.aliprandi@st.com 3:63a8d672fe5e 1531 L6208_SetMinSpeed(L6208_MIN_SPEED);
davide.aliprandi@st.com 3:63a8d672fe5e 1532 devicePrm.accelTorque = pInitDevicePrm->accelTorque;
davide.aliprandi@st.com 3:63a8d672fe5e 1533 devicePrm.decelTorque = pInitDevicePrm->decelTorque;
davide.aliprandi@st.com 3:63a8d672fe5e 1534 devicePrm.runTorque = pInitDevicePrm->runTorque;
davide.aliprandi@st.com 3:63a8d672fe5e 1535 devicePrm.holdTorque = pInitDevicePrm->holdTorque;
davide.aliprandi@st.com 3:63a8d672fe5e 1536 /* Only once acceleration, deceleration, min speed and max speed have been */
davide.aliprandi@st.com 3:63a8d672fe5e 1537 /* initialized, set the step mode */
davide.aliprandi@st.com 3:63a8d672fe5e 1538 devicePrm.stepMode = pInitDevicePrm->stepMode;
davide.aliprandi@st.com 3:63a8d672fe5e 1539 L6208_SetDecayMode(pInitDevicePrm->decayMode);
davide.aliprandi@st.com 3:63a8d672fe5e 1540 devicePrm.moveDwellTime = pInitDevicePrm->moveDwellTime;
Davidroid 6:c73faac7197f 1541 if (L6208_CONF_PARAM_AUTO_HIZ_STOP)
Davidroid 6:c73faac7197f 1542 {
Davidroid 6:c73faac7197f 1543 L6208_SetSysFlag(pInitDevicePrm->autoHiZstop);
Davidroid 6:c73faac7197f 1544 }
davide.aliprandi@st.com 3:63a8d672fe5e 1545 devicePrm.vrefPwmFreq = pInitDevicePrm->vrefPwmFreq;
davide.aliprandi@st.com 3:63a8d672fe5e 1546 devicePrm.vrefPwmPeriod = (uint16_t)((1000000<<8)/pInitDevicePrm->vrefPwmFreq);
davide.aliprandi@st.com 3:63a8d672fe5e 1547 /* Initialize current stepper state machine index */
davide.aliprandi@st.com 3:63a8d672fe5e 1548 L6208_SetMotionState(INACTIVE);
davide.aliprandi@st.com 3:63a8d672fe5e 1549 }
davide.aliprandi@st.com 3:63a8d672fe5e 1550
davide.aliprandi@st.com 3:63a8d672fe5e 1551 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 1552 * @brief Set the parameters of the device to predefined values
davide.aliprandi@st.com 3:63a8d672fe5e 1553 * Set GPIO according to these values
davide.aliprandi@st.com 3:63a8d672fe5e 1554 * from l6208_target_config.h
davide.aliprandi@st.com 3:63a8d672fe5e 1555 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 1556 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 1557 void L6208::L6208_SetDeviceParamsToPredefinedValues(void)
davide.aliprandi@st.com 3:63a8d672fe5e 1558 {
davide.aliprandi@st.com 3:63a8d672fe5e 1559 memset(&devicePrm, 0, sizeof(devicePrm));
davide.aliprandi@st.com 3:63a8d672fe5e 1560 L6208_SetAcceleration(L6208_CONF_PARAM_ACC_RATE);
davide.aliprandi@st.com 3:63a8d672fe5e 1561 L6208_SetDeceleration(L6208_CONF_PARAM_DEC_RATE);
davide.aliprandi@st.com 3:63a8d672fe5e 1562 L6208_SetMaxSpeed(L6208_CONF_PARAM_RUNNING_SPEED);
davide.aliprandi@st.com 3:63a8d672fe5e 1563 L6208_SetMinSpeed(L6208_MIN_SPEED);
davide.aliprandi@st.com 3:63a8d672fe5e 1564 devicePrm.accelTorque = L6208_CONF_PARAM_ACC_CURRENT;
davide.aliprandi@st.com 3:63a8d672fe5e 1565 devicePrm.decelTorque = L6208_CONF_PARAM_DEC_CURRENT;
davide.aliprandi@st.com 3:63a8d672fe5e 1566 devicePrm.runTorque = L6208_CONF_PARAM_RUNNING_CURRENT;
davide.aliprandi@st.com 3:63a8d672fe5e 1567 devicePrm.holdTorque = L6208_CONF_PARAM_HOLDING_CURRENT;
davide.aliprandi@st.com 3:63a8d672fe5e 1568 /* Only once acceleration, deceleration, min speed and max speed have been */
davide.aliprandi@st.com 3:63a8d672fe5e 1569 /* initialized, set the step mode */
davide.aliprandi@st.com 3:63a8d672fe5e 1570 devicePrm.stepMode = (motorStepMode_t) L6208_CONF_PARAM_STEP_MODE;
davide.aliprandi@st.com 3:63a8d672fe5e 1571 L6208_SetDecayMode(L6208_CONF_PARAM_DECAY_MODE);
davide.aliprandi@st.com 3:63a8d672fe5e 1572 devicePrm.moveDwellTime = L6208_CONF_PARAM_DWELL_TIME;
Davidroid 6:c73faac7197f 1573 if (L6208_CONF_PARAM_AUTO_HIZ_STOP)
Davidroid 6:c73faac7197f 1574 {
Davidroid 6:c73faac7197f 1575 L6208_SetSysFlag(HiZstop);
Davidroid 6:c73faac7197f 1576 }
davide.aliprandi@st.com 3:63a8d672fe5e 1577 devicePrm.vrefPwmFreq = L6208_CONF_VREF_PWM_FREQUENCY;
davide.aliprandi@st.com 3:63a8d672fe5e 1578 devicePrm.vrefPwmPeriod = (uint16_t)((1000000<<8)/L6208_CONF_VREF_PWM_FREQUENCY);
davide.aliprandi@st.com 3:63a8d672fe5e 1579 /* Initialize current stepper state machine index */
davide.aliprandi@st.com 3:63a8d672fe5e 1580 L6208_SetMotionState(INACTIVE);
davide.aliprandi@st.com 3:63a8d672fe5e 1581 }
davide.aliprandi@st.com 3:63a8d672fe5e 1582
davide.aliprandi@st.com 3:63a8d672fe5e 1583 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 1584 * @brief Set the number of micro stepping waveform samples to rescale
davide.aliprandi@st.com 3:63a8d672fe5e 1585 * @param[in] value number of micro stepping waveform samples
davide.aliprandi@st.com 3:63a8d672fe5e 1586 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 1587 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 1588 void L6208::L6208_SetMicrostepSample2Scale(uint8_t value)
davide.aliprandi@st.com 3:63a8d672fe5e 1589 {
davide.aliprandi@st.com 3:63a8d672fe5e 1590 if(value > L6208_USTEPS_PER_QUARTER_PERIOD)
davide.aliprandi@st.com 3:63a8d672fe5e 1591 {
davide.aliprandi@st.com 3:63a8d672fe5e 1592 value = L6208_USTEPS_PER_QUARTER_PERIOD; // clamp to maximum number of samples per period/4
davide.aliprandi@st.com 3:63a8d672fe5e 1593 }
davide.aliprandi@st.com 3:63a8d672fe5e 1594 devicePrm.uStepsample2scale = value;
davide.aliprandi@st.com 3:63a8d672fe5e 1595 }
davide.aliprandi@st.com 3:63a8d672fe5e 1596
davide.aliprandi@st.com 3:63a8d672fe5e 1597 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 1598 * @brief Set the number of micro stepping waveform samples to update into scanning
davide.aliprandi@st.com 3:63a8d672fe5e 1599 * @param[in] value number of micro stepping waveform samples
davide.aliprandi@st.com 3:63a8d672fe5e 1600 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 1601 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 1602 void L6208::L6208_SetMicrostepSample2Update(uint8_t value)
davide.aliprandi@st.com 3:63a8d672fe5e 1603 {
davide.aliprandi@st.com 3:63a8d672fe5e 1604 // clamp to maximum number of samples per period/4
davide.aliprandi@st.com 3:63a8d672fe5e 1605 if(value > L6208_USTEPS_PER_QUARTER_PERIOD)
davide.aliprandi@st.com 3:63a8d672fe5e 1606 {
davide.aliprandi@st.com 3:63a8d672fe5e 1607 value = L6208_USTEPS_PER_QUARTER_PERIOD;
davide.aliprandi@st.com 3:63a8d672fe5e 1608 }
davide.aliprandi@st.com 3:63a8d672fe5e 1609 // copy the stepper acceleration rate
davide.aliprandi@st.com 3:63a8d672fe5e 1610 devicePrm.uStepsample2update = value;
davide.aliprandi@st.com 3:63a8d672fe5e 1611 }
davide.aliprandi@st.com 3:63a8d672fe5e 1612
davide.aliprandi@st.com 3:63a8d672fe5e 1613 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 1614 * @brief Set the stepper state machine index
davide.aliprandi@st.com 3:63a8d672fe5e 1615 * @param[in] newMotionState
davide.aliprandi@st.com 3:63a8d672fe5e 1616 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 1617 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 1618 void L6208::L6208_SetMotionState(motorState_t newMotionState)
davide.aliprandi@st.com 3:63a8d672fe5e 1619 {
davide.aliprandi@st.com 3:63a8d672fe5e 1620 // sets the new stepper state machine index
davide.aliprandi@st.com 3:63a8d672fe5e 1621 devicePrm.motionState = newMotionState;
davide.aliprandi@st.com 3:63a8d672fe5e 1622 }
davide.aliprandi@st.com 3:63a8d672fe5e 1623
davide.aliprandi@st.com 3:63a8d672fe5e 1624 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 1625 * @brief Set the user selected speed in step/tick
davide.aliprandi@st.com 3:63a8d672fe5e 1626 * @param[in] newSpeed speed value (step/s)
davide.aliprandi@st.com 3:63a8d672fe5e 1627 * @param[in] pSpeed pointer to the selected speed field
davide.aliprandi@st.com 3:63a8d672fe5e 1628 * @retval return FALSE if the speed is too low or too high
davide.aliprandi@st.com 3:63a8d672fe5e 1629 * or if the device is running in position mode, else TRUE
davide.aliprandi@st.com 3:63a8d672fe5e 1630 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 1631 bool L6208::L6208_SetSpeed(uint16_t newSpeed, uint32_t volatile *pSpeed)
davide.aliprandi@st.com 3:63a8d672fe5e 1632 {
davide.aliprandi@st.com 3:63a8d672fe5e 1633 uint64_t tmp64;
davide.aliprandi@st.com 3:63a8d672fe5e 1634 uint32_t tmp32;
davide.aliprandi@st.com 3:63a8d672fe5e 1635
davide.aliprandi@st.com 3:63a8d672fe5e 1636 if (((L6208_IsSysFlag(running))&&(L6208_IsSysFlag(positionmode)))||\
davide.aliprandi@st.com 3:63a8d672fe5e 1637 (newSpeed < L6208_MIN_SPEED))
davide.aliprandi@st.com 3:63a8d672fe5e 1638 {
davide.aliprandi@st.com 3:63a8d672fe5e 1639 return FALSE;
davide.aliprandi@st.com 3:63a8d672fe5e 1640 }
davide.aliprandi@st.com 3:63a8d672fe5e 1641 tmp32 = (uint32_t)L6208_Board_TickGetFreq();
davide.aliprandi@st.com 3:63a8d672fe5e 1642 if (tmp32 < newSpeed)
davide.aliprandi@st.com 3:63a8d672fe5e 1643 {
davide.aliprandi@st.com 3:63a8d672fe5e 1644 return FALSE;
davide.aliprandi@st.com 3:63a8d672fe5e 1645 }
davide.aliprandi@st.com 3:63a8d672fe5e 1646 /* Compute the decimal number of microstep or step per tick */
davide.aliprandi@st.com 3:63a8d672fe5e 1647 /* Decimal part is on 32 bits */
davide.aliprandi@st.com 3:63a8d672fe5e 1648 tmp64 = (uint64_t)newSpeed << 32;
davide.aliprandi@st.com 3:63a8d672fe5e 1649 tmp64 /= ((uint64_t)tmp32);
davide.aliprandi@st.com 3:63a8d672fe5e 1650 /* set the running constant speed value (step/tick) */
davide.aliprandi@st.com 3:63a8d672fe5e 1651 *pSpeed = (uint32_t)((tmp64 & 0x00000000FFFFFFFF)>>8);
davide.aliprandi@st.com 3:63a8d672fe5e 1652
davide.aliprandi@st.com 3:63a8d672fe5e 1653 return TRUE;
davide.aliprandi@st.com 3:63a8d672fe5e 1654 }
davide.aliprandi@st.com 3:63a8d672fe5e 1655
davide.aliprandi@st.com 3:63a8d672fe5e 1656 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 1657 * @brief Set the bit/s of flags according to the specified mask
davide.aliprandi@st.com 3:63a8d672fe5e 1658 * @param[in] mask flag bit mask
davide.aliprandi@st.com 3:63a8d672fe5e 1659 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 1660 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 1661 inline void L6208::L6208_SetSysFlag(uint32_t mask)
davide.aliprandi@st.com 3:63a8d672fe5e 1662 {
davide.aliprandi@st.com 3:63a8d672fe5e 1663 devicePrm.flags |= mask;
davide.aliprandi@st.com 3:63a8d672fe5e 1664 }
davide.aliprandi@st.com 3:63a8d672fe5e 1665
davide.aliprandi@st.com 3:63a8d672fe5e 1666 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 1667 * @brief Stepper motor start command
davide.aliprandi@st.com 3:63a8d672fe5e 1668 * @retval true on correct command execution
davide.aliprandi@st.com 3:63a8d672fe5e 1669 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 1670 bool L6208::L6208_StartMovement(void)
davide.aliprandi@st.com 3:63a8d672fe5e 1671 {
davide.aliprandi@st.com 3:63a8d672fe5e 1672 uint32_t tmp;
davide.aliprandi@st.com 3:63a8d672fe5e 1673 if (L6208_IsSysFlag(running))
davide.aliprandi@st.com 3:63a8d672fe5e 1674 {
davide.aliprandi@st.com 3:63a8d672fe5e 1675 /* Motor is already running ==> quit */
davide.aliprandi@st.com 3:63a8d672fe5e 1676 return FALSE;
davide.aliprandi@st.com 3:63a8d672fe5e 1677 }
davide.aliprandi@st.com 3:63a8d672fe5e 1678 if (!L6208_IsSysFlag(positionmode))
davide.aliprandi@st.com 3:63a8d672fe5e 1679 {
davide.aliprandi@st.com 3:63a8d672fe5e 1680 /* Set the VREFA and VREFB to the selected acc. torque */
davide.aliprandi@st.com 3:63a8d672fe5e 1681 L6208_VectorCalc(devicePrm.accelTorque);
davide.aliprandi@st.com 3:63a8d672fe5e 1682
davide.aliprandi@st.com 3:63a8d672fe5e 1683 /* If the speed control mode is selected */
davide.aliprandi@st.com 3:63a8d672fe5e 1684 /* setup the motor acceleration for velocity mode driving */
davide.aliprandi@st.com 3:63a8d672fe5e 1685 L6208_SetMotionState(ACCELERATING);
davide.aliprandi@st.com 3:63a8d672fe5e 1686 }
davide.aliprandi@st.com 3:63a8d672fe5e 1687 else
davide.aliprandi@st.com 3:63a8d672fe5e 1688 {
davide.aliprandi@st.com 3:63a8d672fe5e 1689 /* if position control mode is selected, reset the current step counter */
davide.aliprandi@st.com 3:63a8d672fe5e 1690 devicePrm.step = 0;
davide.aliprandi@st.com 3:63a8d672fe5e 1691 if(devicePrm.uStepSample > 31)
davide.aliprandi@st.com 3:63a8d672fe5e 1692 {
davide.aliprandi@st.com 3:63a8d672fe5e 1693 /* check the micro stepping waveform sample index */
davide.aliprandi@st.com 3:63a8d672fe5e 1694 devicePrm.uStepSample = 0;
davide.aliprandi@st.com 3:63a8d672fe5e 1695 }
davide.aliprandi@st.com 3:63a8d672fe5e 1696 /* Set the position dwelling wait time */
davide.aliprandi@st.com 3:63a8d672fe5e 1697 /* compute number of ticks per millisecond */
davide.aliprandi@st.com 3:63a8d672fe5e 1698 tmp = (uint32_t)L6208_Board_TickGetFreq() / 1000;
davide.aliprandi@st.com 3:63a8d672fe5e 1699 /* Compute the dwelling time in ticks => dwellCounter (ticks) */
davide.aliprandi@st.com 3:63a8d672fe5e 1700 devicePrm.dwellCounter = tmp * (uint32_t)devicePrm.moveDwellTime;
davide.aliprandi@st.com 3:63a8d672fe5e 1701 if (devicePrm.positionTarget == 0)
davide.aliprandi@st.com 3:63a8d672fe5e 1702 {
davide.aliprandi@st.com 3:63a8d672fe5e 1703 /* if the position to go is 0 (no move) */
davide.aliprandi@st.com 3:63a8d672fe5e 1704 /* Set the deceleration torque */
davide.aliprandi@st.com 3:63a8d672fe5e 1705 L6208_VectorCalc(devicePrm.decelTorque);
davide.aliprandi@st.com 3:63a8d672fe5e 1706 /* Set the dwelling delay state index */
davide.aliprandi@st.com 3:63a8d672fe5e 1707 L6208_SetMotionState(INDEX_DWELL);
davide.aliprandi@st.com 3:63a8d672fe5e 1708 }
davide.aliprandi@st.com 3:63a8d672fe5e 1709 else
davide.aliprandi@st.com 3:63a8d672fe5e 1710 {
davide.aliprandi@st.com 3:63a8d672fe5e 1711 /* Set the VREFA and VREFB to the selected acc. torque */
davide.aliprandi@st.com 3:63a8d672fe5e 1712 L6208_VectorCalc(devicePrm.accelTorque);
davide.aliprandi@st.com 3:63a8d672fe5e 1713 /* go to the selected position */
davide.aliprandi@st.com 3:63a8d672fe5e 1714 L6208_Indexmodeinit();
davide.aliprandi@st.com 3:63a8d672fe5e 1715 L6208_SetMotionState(INDEX_ACCEL);
davide.aliprandi@st.com 3:63a8d672fe5e 1716 }
davide.aliprandi@st.com 3:63a8d672fe5e 1717 }
davide.aliprandi@st.com 3:63a8d672fe5e 1718 /* Sets the motor running flag */
davide.aliprandi@st.com 3:63a8d672fe5e 1719 L6208_SetSysFlag(running);
davide.aliprandi@st.com 3:63a8d672fe5e 1720 /* Start the VREFA and VREFB PWMs */
davide.aliprandi@st.com 3:63a8d672fe5e 1721 L6208_Board_VrefPwmStart(BRIDGE_A, devicePrm.vrefPwmPeriod);
davide.aliprandi@st.com 3:63a8d672fe5e 1722 L6208_Board_VrefPwmStart(BRIDGE_B, devicePrm.vrefPwmPeriod);
davide.aliprandi@st.com 3:63a8d672fe5e 1723 if (!(L6208_IsSysFlag(EN_A_set)))
davide.aliprandi@st.com 3:63a8d672fe5e 1724 {
davide.aliprandi@st.com 3:63a8d672fe5e 1725 /* Enable power bridges */
davide.aliprandi@st.com 3:63a8d672fe5e 1726 L6208_Enable();
davide.aliprandi@st.com 3:63a8d672fe5e 1727 }
davide.aliprandi@st.com 3:63a8d672fe5e 1728 /* Start the tick */
davide.aliprandi@st.com 3:63a8d672fe5e 1729 L6208_Board_TickStart(L6208::tickFreq);
davide.aliprandi@st.com 3:63a8d672fe5e 1730
davide.aliprandi@st.com 3:63a8d672fe5e 1731 return TRUE;
davide.aliprandi@st.com 3:63a8d672fe5e 1732 }
davide.aliprandi@st.com 3:63a8d672fe5e 1733
davide.aliprandi@st.com 3:63a8d672fe5e 1734 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 1735 * @brief Update the micro stepping waveform samples table with the
davide.aliprandi@st.com 3:63a8d672fe5e 1736 * values previously scaled with current selected torque and tick period
davide.aliprandi@st.com 3:63a8d672fe5e 1737 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 1738 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 1739 void L6208::L6208_UpdateScanWaveformTable(void)
davide.aliprandi@st.com 3:63a8d672fe5e 1740 {
davide.aliprandi@st.com 3:63a8d672fe5e 1741 uint8_t index;
davide.aliprandi@st.com 3:63a8d672fe5e 1742
davide.aliprandi@st.com 3:63a8d672fe5e 1743 for(index=0; index<=L6208_USTEPS_PER_QUARTER_PERIOD; index++)
davide.aliprandi@st.com 3:63a8d672fe5e 1744 {
davide.aliprandi@st.com 3:63a8d672fe5e 1745 microTable1[index] = updatedMicroTable[index];
davide.aliprandi@st.com 3:63a8d672fe5e 1746 microTable1[L6208_USTEPS_PER_QUARTER_PERIOD*2 - index] = microTable1[index];
davide.aliprandi@st.com 3:63a8d672fe5e 1747 microTable1[index + L6208_USTEPS_PER_QUARTER_PERIOD*2] = updatedMicroTable[index];
davide.aliprandi@st.com 3:63a8d672fe5e 1748 }
davide.aliprandi@st.com 3:63a8d672fe5e 1749 /* clear the number of samples to update */
davide.aliprandi@st.com 3:63a8d672fe5e 1750 L6208_SetMicrostepSample2Update(0);
davide.aliprandi@st.com 3:63a8d672fe5e 1751 }
davide.aliprandi@st.com 3:63a8d672fe5e 1752
davide.aliprandi@st.com 3:63a8d672fe5e 1753 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 1754 * @brief Check if there are waveform samples to rescale and if so, perform the rescaling
davide.aliprandi@st.com 3:63a8d672fe5e 1755 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 1756 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 1757 void L6208::L6208_UstepWaveformHandling(void)
davide.aliprandi@st.com 3:63a8d672fe5e 1758 {
davide.aliprandi@st.com 3:63a8d672fe5e 1759 /* micro stepper waveform samples rescaling ... and updating */
davide.aliprandi@st.com 3:63a8d672fe5e 1760 uint8_t nbSamplesToRescale = L6208_GetMicrostepSample2Scale();
davide.aliprandi@st.com 3:63a8d672fe5e 1761 if(nbSamplesToRescale > 0)
davide.aliprandi@st.com 3:63a8d672fe5e 1762 {
davide.aliprandi@st.com 3:63a8d672fe5e 1763 /* Current torque value has been changed, so recalculate the waveform table */
davide.aliprandi@st.com 3:63a8d672fe5e 1764 L6208_ScaleWaveformTable();
davide.aliprandi@st.com 3:63a8d672fe5e 1765
davide.aliprandi@st.com 3:63a8d672fe5e 1766 /* Set the number of samples to update */
davide.aliprandi@st.com 3:63a8d672fe5e 1767 L6208_SetMicrostepSample2Update(L6208_USTEPS_PER_QUARTER_PERIOD);
davide.aliprandi@st.com 3:63a8d672fe5e 1768
davide.aliprandi@st.com 3:63a8d672fe5e 1769 /* Reset the number of samples to rescaled afer rescaling */
davide.aliprandi@st.com 3:63a8d672fe5e 1770 L6208_SetMicrostepSample2Scale(0);
davide.aliprandi@st.com 3:63a8d672fe5e 1771 }
davide.aliprandi@st.com 3:63a8d672fe5e 1772 }
davide.aliprandi@st.com 3:63a8d672fe5e 1773
davide.aliprandi@st.com 3:63a8d672fe5e 1774 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 1775 * @brief Set the current torque value (Vref)
davide.aliprandi@st.com 3:63a8d672fe5e 1776 * @param[in] newTorque Selected torque value
davide.aliprandi@st.com 3:63a8d672fe5e 1777 * @retval always TRUE
davide.aliprandi@st.com 3:63a8d672fe5e 1778 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 1779 bool L6208::L6208_VectorCalc(uint8_t newTorque)
davide.aliprandi@st.com 3:63a8d672fe5e 1780 {
davide.aliprandi@st.com 3:63a8d672fe5e 1781 /* save current selected torque value */
davide.aliprandi@st.com 3:63a8d672fe5e 1782 devicePrm.curTorqueScaler = (uint16_t)newTorque;
davide.aliprandi@st.com 3:63a8d672fe5e 1783
davide.aliprandi@st.com 3:63a8d672fe5e 1784 if(!L6208_IsSysFlag(microstep))
davide.aliprandi@st.com 3:63a8d672fe5e 1785 {
davide.aliprandi@st.com 3:63a8d672fe5e 1786 /* full/half step mode or the motor is not running */
davide.aliprandi@st.com 3:63a8d672fe5e 1787 /* set the PWM duty cycle according to the current torque value (%). */
davide.aliprandi@st.com 3:63a8d672fe5e 1788 /* The TON value will be calculated inside the TIMx_PWM_duty_setup f(). */
davide.aliprandi@st.com 3:63a8d672fe5e 1789 L6208_VrefPwmComputePulseWidth(BRIDGE_A, devicePrm.curTorqueScaler, TRUE);
davide.aliprandi@st.com 3:63a8d672fe5e 1790 L6208_VrefPwmComputePulseWidth(BRIDGE_B, devicePrm.curTorqueScaler, TRUE);
davide.aliprandi@st.com 3:63a8d672fe5e 1791 devicePrm.vRefAVal = devicePrm.curTorqueScaler; // save current VREFA value
davide.aliprandi@st.com 3:63a8d672fe5e 1792 devicePrm.vRefBVal = devicePrm.curTorqueScaler; // save current VREFB value
davide.aliprandi@st.com 3:63a8d672fe5e 1793 }
davide.aliprandi@st.com 3:63a8d672fe5e 1794 else
davide.aliprandi@st.com 3:63a8d672fe5e 1795 {
davide.aliprandi@st.com 3:63a8d672fe5e 1796 /* microstep mode */
davide.aliprandi@st.com 3:63a8d672fe5e 1797 if(L6208_IsSysFlag(running))
davide.aliprandi@st.com 3:63a8d672fe5e 1798 {
davide.aliprandi@st.com 3:63a8d672fe5e 1799 /* set the number of waveform sample to rescale according current selected */
davide.aliprandi@st.com 3:63a8d672fe5e 1800 /* torque value */
davide.aliprandi@st.com 3:63a8d672fe5e 1801 L6208_SetMicrostepSample2Scale(L6208_USTEPS_PER_QUARTER_PERIOD);
davide.aliprandi@st.com 3:63a8d672fe5e 1802 }
davide.aliprandi@st.com 3:63a8d672fe5e 1803 else
davide.aliprandi@st.com 3:63a8d672fe5e 1804 {
davide.aliprandi@st.com 3:63a8d672fe5e 1805 /* micro stepping mode motor stopped */
davide.aliprandi@st.com 3:63a8d672fe5e 1806 L6208_ScaleWaveformTable();
davide.aliprandi@st.com 3:63a8d672fe5e 1807 L6208_UpdateScanWaveformTable();
davide.aliprandi@st.com 3:63a8d672fe5e 1808 /* Set the VREF timer PWM TON to update VREFA and VREFB */
davide.aliprandi@st.com 3:63a8d672fe5e 1809 L6208_VrefPwmComputePulseWidth(BRIDGE_A, pMicroTable2[devicePrm.uStepSample], FALSE);
davide.aliprandi@st.com 3:63a8d672fe5e 1810 L6208_VrefPwmComputePulseWidth(BRIDGE_B, microTable1[devicePrm.uStepSample], FALSE);
davide.aliprandi@st.com 3:63a8d672fe5e 1811 }
davide.aliprandi@st.com 3:63a8d672fe5e 1812 }
davide.aliprandi@st.com 3:63a8d672fe5e 1813 return TRUE;
davide.aliprandi@st.com 3:63a8d672fe5e 1814 }
davide.aliprandi@st.com 3:63a8d672fe5e 1815
davide.aliprandi@st.com 3:63a8d672fe5e 1816 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 1817 * @brief Compute the pulse width of VREFA or VREFB PWM
davide.aliprandi@st.com 3:63a8d672fe5e 1818 * @param[in] bridgeId
davide.aliprandi@st.com 3:63a8d672fe5e 1819 * 0 for BRIDGE_A
davide.aliprandi@st.com 3:63a8d672fe5e 1820 * 1 for BRIDGE_B
davide.aliprandi@st.com 3:63a8d672fe5e 1821 * @param[in] value pulse length in 1/256th of microsecond
davide.aliprandi@st.com 3:63a8d672fe5e 1822 * or PWM duty cycle: 0 - 100 %
davide.aliprandi@st.com 3:63a8d672fe5e 1823 * @param[in] valueIsPwmDutyCycle must be TRUE if value is a PWM duty cycle
davide.aliprandi@st.com 3:63a8d672fe5e 1824 * @retval FALSE if wrong timer handle is used, else TRUE
davide.aliprandi@st.com 3:63a8d672fe5e 1825 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 1826 bool L6208::L6208_VrefPwmComputePulseWidth(uint8_t bridgeId, uint16_t value, bool valueIsPwmDutyCycle)
davide.aliprandi@st.com 3:63a8d672fe5e 1827 {
davide.aliprandi@st.com 3:63a8d672fe5e 1828 if(valueIsPwmDutyCycle)
davide.aliprandi@st.com 3:63a8d672fe5e 1829 {
Davidroid 6:c73faac7197f 1830 if (value > 100)
Davidroid 6:c73faac7197f 1831 {
Davidroid 6:c73faac7197f 1832 value = 100;
Davidroid 6:c73faac7197f 1833 }
davide.aliprandi@st.com 3:63a8d672fe5e 1834 value = (uint16_t)(((uint32_t)devicePrm.vrefPwmPeriod * (uint32_t)value) / 100);
davide.aliprandi@st.com 3:63a8d672fe5e 1835 }
davide.aliprandi@st.com 3:63a8d672fe5e 1836 if (bridgeId == 0)
davide.aliprandi@st.com 3:63a8d672fe5e 1837 {
davide.aliprandi@st.com 3:63a8d672fe5e 1838 devicePrm.vrefPwmPulseWidthTargetA = value;
davide.aliprandi@st.com 3:63a8d672fe5e 1839 devicePrm.vrefPwmPulseWidthToBeGeneratedA = 0;
davide.aliprandi@st.com 3:63a8d672fe5e 1840 }
davide.aliprandi@st.com 3:63a8d672fe5e 1841 else if (bridgeId == 1)
davide.aliprandi@st.com 3:63a8d672fe5e 1842 {
davide.aliprandi@st.com 3:63a8d672fe5e 1843 devicePrm.vrefPwmPulseWidthTargetB = value;
davide.aliprandi@st.com 3:63a8d672fe5e 1844 devicePrm.vrefPwmPulseWidthToBeGeneratedB = 0;
davide.aliprandi@st.com 3:63a8d672fe5e 1845 }
davide.aliprandi@st.com 3:63a8d672fe5e 1846 else
davide.aliprandi@st.com 3:63a8d672fe5e 1847 {
davide.aliprandi@st.com 3:63a8d672fe5e 1848 return FALSE;
davide.aliprandi@st.com 3:63a8d672fe5e 1849 }
davide.aliprandi@st.com 3:63a8d672fe5e 1850 return TRUE;
davide.aliprandi@st.com 3:63a8d672fe5e 1851 }
davide.aliprandi@st.com 3:63a8d672fe5e 1852
davide.aliprandi@st.com 3:63a8d672fe5e 1853 /******************************************************//**
davide.aliprandi@st.com 3:63a8d672fe5e 1854 * @brief Update the pulse width of VREFA or VREFB PWM
davide.aliprandi@st.com 3:63a8d672fe5e 1855 * @param None
davide.aliprandi@st.com 3:63a8d672fe5e 1856 * @retval None
davide.aliprandi@st.com 3:63a8d672fe5e 1857 **********************************************************/
davide.aliprandi@st.com 3:63a8d672fe5e 1858 void L6208::L6208_VrefPwmUpdatePulseWidth(void)
davide.aliprandi@st.com 3:63a8d672fe5e 1859 {
davide.aliprandi@st.com 3:63a8d672fe5e 1860 uint16_t pulseWidthUs;
davide.aliprandi@st.com 3:63a8d672fe5e 1861
davide.aliprandi@st.com 3:63a8d672fe5e 1862 devicePrm.vrefPwmPulseWidthToBeGeneratedA += devicePrm.vrefPwmPulseWidthTargetA;
davide.aliprandi@st.com 3:63a8d672fe5e 1863 pulseWidthUs = devicePrm.vrefPwmPulseWidthToBeGeneratedA>>8;
davide.aliprandi@st.com 3:63a8d672fe5e 1864 if (pulseWidthUs!=0)
davide.aliprandi@st.com 3:63a8d672fe5e 1865 {
davide.aliprandi@st.com 3:63a8d672fe5e 1866 L6208_Board_VrefPwmSetPulseWidthA(pulseWidthUs);
davide.aliprandi@st.com 3:63a8d672fe5e 1867 devicePrm.vrefPwmPulseWidthToBeGeneratedA -= (pulseWidthUs<<8);
davide.aliprandi@st.com 3:63a8d672fe5e 1868 }
davide.aliprandi@st.com 3:63a8d672fe5e 1869 else
davide.aliprandi@st.com 3:63a8d672fe5e 1870 {
davide.aliprandi@st.com 3:63a8d672fe5e 1871 L6208_Board_VrefPwmSetPulseWidthA(0);
davide.aliprandi@st.com 3:63a8d672fe5e 1872 }
davide.aliprandi@st.com 3:63a8d672fe5e 1873
davide.aliprandi@st.com 3:63a8d672fe5e 1874 devicePrm.vrefPwmPulseWidthToBeGeneratedB += devicePrm.vrefPwmPulseWidthTargetB;
davide.aliprandi@st.com 3:63a8d672fe5e 1875 pulseWidthUs = devicePrm.vrefPwmPulseWidthToBeGeneratedB>>8;
davide.aliprandi@st.com 3:63a8d672fe5e 1876 if (pulseWidthUs!=0)
davide.aliprandi@st.com 3:63a8d672fe5e 1877 {
davide.aliprandi@st.com 3:63a8d672fe5e 1878 L6208_Board_VrefPwmSetPulseWidthB(pulseWidthUs);
davide.aliprandi@st.com 3:63a8d672fe5e 1879 devicePrm.vrefPwmPulseWidthToBeGeneratedB -= (pulseWidthUs<<8);
davide.aliprandi@st.com 3:63a8d672fe5e 1880 }
davide.aliprandi@st.com 3:63a8d672fe5e 1881 else
davide.aliprandi@st.com 3:63a8d672fe5e 1882 {
davide.aliprandi@st.com 3:63a8d672fe5e 1883 L6208_Board_VrefPwmSetPulseWidthB(0);
davide.aliprandi@st.com 3:63a8d672fe5e 1884 }
davide.aliprandi@st.com 3:63a8d672fe5e 1885 }
davide.aliprandi@st.com 3:63a8d672fe5e 1886
davide.aliprandi@st.com 3:63a8d672fe5e 1887 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/