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 Mar 24 13:29:46 2017 +0000
Revision:
4:0b52159554b5
Parent:
Components/l6208/L6208.cpp@3:63a8d672fe5e
Child:
6:c73faac7197f
Typos corrected.

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