Davide Aliprandi / X_NUCLEO_IHM03A1

Dependencies:   ST_INTERFACES X_NUCLEO_COMMON

Fork of X_NUCLEO_IHM03A1 by ST

Committer:
nucleosam
Date:
Thu Apr 07 16:11:47 2016 +0000
Revision:
1:8ce2a5d6fbf8
Parent:
0:00a3c3f5a8f0
Child:
2:06f3a5360a45
StepperMotor class modification and induced changes

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nucleosam 0:00a3c3f5a8f0 1 /**
nucleosam 0:00a3c3f5a8f0 2 ******************************************************************************
nucleosam 0:00a3c3f5a8f0 3 * @file powerstep01_class.cpp
nucleosam 0:00a3c3f5a8f0 4 * @author IPC Rennes
nucleosam 0:00a3c3f5a8f0 5 * @version V1.0.0
nucleosam 0:00a3c3f5a8f0 6 * @date March 18th, 2016
nucleosam 0:00a3c3f5a8f0 7 * @brief Powerstep01 motor driver (Microstepping controller with power MOSFETs)
nucleosam 0:00a3c3f5a8f0 8 * @note (C) COPYRIGHT 2016 STMicroelectronics
nucleosam 0:00a3c3f5a8f0 9 ******************************************************************************
nucleosam 0:00a3c3f5a8f0 10 * @attention
nucleosam 0:00a3c3f5a8f0 11 *
nucleosam 0:00a3c3f5a8f0 12 * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
nucleosam 0:00a3c3f5a8f0 13 *
nucleosam 0:00a3c3f5a8f0 14 * Redistribution and use in source and binary forms, with or without modification,
nucleosam 0:00a3c3f5a8f0 15 * are permitted provided that the following conditions are met:
nucleosam 0:00a3c3f5a8f0 16 * 1. Redistributions of source code must retain the above copyright notice,
nucleosam 0:00a3c3f5a8f0 17 * this list of conditions and the following disclaimer.
nucleosam 0:00a3c3f5a8f0 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
nucleosam 0:00a3c3f5a8f0 19 * this list of conditions and the following disclaimer in the documentation
nucleosam 0:00a3c3f5a8f0 20 * and/or other materials provided with the distribution.
nucleosam 0:00a3c3f5a8f0 21 * 3. Neither the name of STMicroelectronics nor the names of its contributors
nucleosam 0:00a3c3f5a8f0 22 * may be used to endorse or promote products derived from this software
nucleosam 0:00a3c3f5a8f0 23 * without specific prior written permission.
nucleosam 0:00a3c3f5a8f0 24 *
nucleosam 0:00a3c3f5a8f0 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
nucleosam 0:00a3c3f5a8f0 26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
nucleosam 0:00a3c3f5a8f0 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
nucleosam 0:00a3c3f5a8f0 28 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
nucleosam 0:00a3c3f5a8f0 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
nucleosam 0:00a3c3f5a8f0 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
nucleosam 0:00a3c3f5a8f0 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
nucleosam 0:00a3c3f5a8f0 32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
nucleosam 0:00a3c3f5a8f0 33 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
nucleosam 0:00a3c3f5a8f0 34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
nucleosam 0:00a3c3f5a8f0 35 *
nucleosam 0:00a3c3f5a8f0 36 ******************************************************************************
nucleosam 0:00a3c3f5a8f0 37 */
nucleosam 0:00a3c3f5a8f0 38
nucleosam 0:00a3c3f5a8f0 39 /* Includes ------------------------------------------------------------------*/
nucleosam 0:00a3c3f5a8f0 40 #include "powerstep01_class.h"
nucleosam 0:00a3c3f5a8f0 41
nucleosam 0:00a3c3f5a8f0 42 /* Definitions ---------------------------------------------------------------*/
nucleosam 0:00a3c3f5a8f0 43
nucleosam 0:00a3c3f5a8f0 44 /* Error of bad SPI transaction. */
nucleosam 1:8ce2a5d6fbf8 45 #define POWERSTEP01_ERROR_1 (POWERSTEP01_ERROR_BASE|0x0001)
nucleosam 0:00a3c3f5a8f0 46
nucleosam 0:00a3c3f5a8f0 47 /* Variables ----------------------------------------------------------------*/
nucleosam 0:00a3c3f5a8f0 48
nucleosam 0:00a3c3f5a8f0 49 /* Number of devices. */
nucleosam 0:00a3c3f5a8f0 50 uint8_t POWERSTEP01::numberOfDevices = 0;
nucleosam 0:00a3c3f5a8f0 51
nucleosam 0:00a3c3f5a8f0 52 /* ISR flags used to restart an interrupted SPI transfer when an error is reported. */
nucleosam 0:00a3c3f5a8f0 53 bool POWERSTEP01::spiPreemptionByIsr = FALSE;
nucleosam 0:00a3c3f5a8f0 54 bool POWERSTEP01::isrFlag = FALSE;
nucleosam 0:00a3c3f5a8f0 55
nucleosam 0:00a3c3f5a8f0 56 /* SPI Transmission for Daisy-Chain Configuration. */
nucleosam 0:00a3c3f5a8f0 57 uint8_t POWERSTEP01::spiTxBursts[POWERSTEP01_CMD_ARG_MAX_NB_BYTES][MAX_NUMBER_OF_DEVICES];
nucleosam 0:00a3c3f5a8f0 58 uint8_t POWERSTEP01::spiRxBursts[POWERSTEP01_CMD_ARG_MAX_NB_BYTES][MAX_NUMBER_OF_DEVICES];
nucleosam 0:00a3c3f5a8f0 59
nucleosam 0:00a3c3f5a8f0 60
nucleosam 0:00a3c3f5a8f0 61 /* Methods -------------------------------------------------------------------*/
nucleosam 0:00a3c3f5a8f0 62
nucleosam 0:00a3c3f5a8f0 63 /**********************************************************
nucleosam 0:00a3c3f5a8f0 64 * @brief Starts the Powerstep01 library
nucleosam 0:00a3c3f5a8f0 65 * @param[in] pInit pointer to the initialization data
nucleosam 0:00a3c3f5a8f0 66 * @retval COMPONENT_OK in case of success.
nucleosam 0:00a3c3f5a8f0 67 **********************************************************/
nucleosam 0:00a3c3f5a8f0 68 Status_t POWERSTEP01::Powerstep01_Init(void* pInit)
nucleosam 0:00a3c3f5a8f0 69 {
nucleosam 0:00a3c3f5a8f0 70
nucleosam 0:00a3c3f5a8f0 71 /* configure the step clock */
nucleosam 0:00a3c3f5a8f0 72 Powerstep01_Board_StepClockInit();
nucleosam 0:00a3c3f5a8f0 73
nucleosam 0:00a3c3f5a8f0 74 /* Standby-reset deactivation */
nucleosam 0:00a3c3f5a8f0 75 Powerstep01_Board_ReleaseReset();
nucleosam 0:00a3c3f5a8f0 76
nucleosam 0:00a3c3f5a8f0 77 /* Let a delay after reset */
nucleosam 0:00a3c3f5a8f0 78 Powerstep01_Board_Delay(1);
nucleosam 0:00a3c3f5a8f0 79
nucleosam 0:00a3c3f5a8f0 80 if (pInit == 0)
nucleosam 0:00a3c3f5a8f0 81 {
nucleosam 0:00a3c3f5a8f0 82 // Set all registers to their predefined values
nucleosam 0:00a3c3f5a8f0 83 // from powerstep01_target_config.h
nucleosam 0:00a3c3f5a8f0 84 Powerstep01_SetRegisterToPredefinedValues();
nucleosam 0:00a3c3f5a8f0 85 }
nucleosam 0:00a3c3f5a8f0 86 else
nucleosam 0:00a3c3f5a8f0 87 {
nucleosam 0:00a3c3f5a8f0 88 Powerstep01_SetDeviceParamsToGivenValues((powerstep01_Init_u_t*) pInit);
nucleosam 0:00a3c3f5a8f0 89 }
nucleosam 0:00a3c3f5a8f0 90
nucleosam 0:00a3c3f5a8f0 91 // Put the Powerstep01 in HiZ state
nucleosam 0:00a3c3f5a8f0 92 Powerstep01_CmdHardHiZ();
nucleosam 0:00a3c3f5a8f0 93
nucleosam 0:00a3c3f5a8f0 94 Powerstep01_FetchAndClearAllStatus();
nucleosam 0:00a3c3f5a8f0 95
nucleosam 0:00a3c3f5a8f0 96 return COMPONENT_OK;
nucleosam 0:00a3c3f5a8f0 97 }
nucleosam 0:00a3c3f5a8f0 98
nucleosam 0:00a3c3f5a8f0 99 /**********************************************************
nucleosam 0:00a3c3f5a8f0 100 * @brief Read id
nucleosam 0:00a3c3f5a8f0 101 * @param[in] id pointer to the identifier to be read.
nucleosam 0:00a3c3f5a8f0 102 * @retval COMPONENT_OK in case of success.
nucleosam 0:00a3c3f5a8f0 103 **********************************************************/
nucleosam 0:00a3c3f5a8f0 104 Status_t POWERSTEP01::Powerstep01_ReadID(uint8_t *id)
nucleosam 0:00a3c3f5a8f0 105 {
nucleosam 0:00a3c3f5a8f0 106 *id = deviceInstance;
nucleosam 0:00a3c3f5a8f0 107
nucleosam 0:00a3c3f5a8f0 108 return COMPONENT_OK;
nucleosam 0:00a3c3f5a8f0 109 }
nucleosam 0:00a3c3f5a8f0 110
nucleosam 0:00a3c3f5a8f0 111 /**********************************************************
nucleosam 0:00a3c3f5a8f0 112 * @brief Attaches a user callback to the error Handler.
nucleosam 0:00a3c3f5a8f0 113 * The call back will be then called each time the library
nucleosam 0:00a3c3f5a8f0 114 * detects an error
nucleosam 0:00a3c3f5a8f0 115 * @param[in] callback Name of the callback to attach
nucleosam 0:00a3c3f5a8f0 116 * to the error Hanlder
nucleosam 0:00a3c3f5a8f0 117 * @retval None
nucleosam 0:00a3c3f5a8f0 118 **********************************************************/
nucleosam 0:00a3c3f5a8f0 119 void POWERSTEP01::Powerstep01_AttachErrorHandler(void (*callback)(uint16_t error))
nucleosam 0:00a3c3f5a8f0 120 {
nucleosam 0:00a3c3f5a8f0 121 errorHandlerCallback = (void (*)(uint16_t error)) callback;
nucleosam 0:00a3c3f5a8f0 122 }
nucleosam 0:00a3c3f5a8f0 123
nucleosam 0:00a3c3f5a8f0 124 /**********************************************************
nucleosam 0:00a3c3f5a8f0 125 * @brief Issues the GetStatus command to the Powerstep01 device
nucleosam 0:00a3c3f5a8f0 126 * @retval Status Register value
nucleosam 0:00a3c3f5a8f0 127 * @note Once the GetStatus command is performed, the flags of the
nucleosam 0:00a3c3f5a8f0 128 * status register are reset.
nucleosam 0:00a3c3f5a8f0 129 * This is not the case when the status register is read with the
nucleosam 0:00a3c3f5a8f0 130 * GetParam command (via the functions Powerstep01_ReadStatusRegister
nucleosam 0:00a3c3f5a8f0 131 * or Powerstep01_CmdGetParam).
nucleosam 0:00a3c3f5a8f0 132 **********************************************************/
nucleosam 0:00a3c3f5a8f0 133 uint16_t POWERSTEP01::Powerstep01_CmdGetStatus(void)
nucleosam 0:00a3c3f5a8f0 134 {
nucleosam 0:00a3c3f5a8f0 135 uint16_t status = 0;
nucleosam 0:00a3c3f5a8f0 136 uint32_t loop;
nucleosam 0:00a3c3f5a8f0 137 uint8_t spiIndex = numberOfDevices - deviceInstance - 1;
nucleosam 0:00a3c3f5a8f0 138 bool itDisable = FALSE;
nucleosam 0:00a3c3f5a8f0 139
nucleosam 0:00a3c3f5a8f0 140 do
nucleosam 0:00a3c3f5a8f0 141 {
nucleosam 0:00a3c3f5a8f0 142 spiPreemptionByIsr = FALSE;
nucleosam 0:00a3c3f5a8f0 143 if (itDisable)
nucleosam 0:00a3c3f5a8f0 144 {
nucleosam 0:00a3c3f5a8f0 145 /* re-enable Powerstep01_Board_EnableIrq if disable in previous iteration */
nucleosam 0:00a3c3f5a8f0 146 Powerstep01_Board_EnableIrq();
nucleosam 0:00a3c3f5a8f0 147 itDisable = FALSE;
nucleosam 0:00a3c3f5a8f0 148 }
nucleosam 0:00a3c3f5a8f0 149 for (loop = 0; loop < numberOfDevices; loop++)
nucleosam 0:00a3c3f5a8f0 150 {
nucleosam 0:00a3c3f5a8f0 151 spiTxBursts[0][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 152 spiTxBursts[1][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 153 spiTxBursts[2][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 154 spiTxBursts[3][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 155 spiRxBursts[0][loop] = 0;
nucleosam 0:00a3c3f5a8f0 156 spiRxBursts[1][loop] = 0;
nucleosam 0:00a3c3f5a8f0 157 spiRxBursts[2][loop] = 0;
nucleosam 0:00a3c3f5a8f0 158 spiRxBursts[3][loop] = 0;
nucleosam 0:00a3c3f5a8f0 159 }
nucleosam 0:00a3c3f5a8f0 160 spiTxBursts[0][spiIndex] = POWERSTEP01_GET_STATUS;
nucleosam 0:00a3c3f5a8f0 161 /* Disable interruption before checking */
nucleosam 0:00a3c3f5a8f0 162 /* pre-emption by ISR and SPI transfers*/
nucleosam 0:00a3c3f5a8f0 163 Powerstep01_Board_DisableIrq();
nucleosam 0:00a3c3f5a8f0 164 itDisable = TRUE;
nucleosam 0:00a3c3f5a8f0 165 } while (spiPreemptionByIsr); // check pre-emption by ISR
nucleosam 0:00a3c3f5a8f0 166 for (loop = 0; loop < POWERSTEP01_CMD_ARG_NB_BYTES_GET_STATUS + POWERSTEP01_RSP_NB_BYTES_GET_STATUS; loop++)
nucleosam 0:00a3c3f5a8f0 167 {
nucleosam 0:00a3c3f5a8f0 168 Powerstep01_WriteBytes(&spiTxBursts[loop][0], &spiRxBursts[loop][0]);
nucleosam 0:00a3c3f5a8f0 169 }
nucleosam 0:00a3c3f5a8f0 170 status = (spiRxBursts[1][spiIndex] << 8) | (spiRxBursts[2][spiIndex]);
nucleosam 0:00a3c3f5a8f0 171 /* re-enable Powerstep01_Board_EnableIrq after SPI transfers*/
nucleosam 0:00a3c3f5a8f0 172 Powerstep01_Board_EnableIrq();
nucleosam 0:00a3c3f5a8f0 173
nucleosam 0:00a3c3f5a8f0 174 return (status);
nucleosam 0:00a3c3f5a8f0 175 }
nucleosam 0:00a3c3f5a8f0 176
nucleosam 0:00a3c3f5a8f0 177 /**********************************************************
nucleosam 0:00a3c3f5a8f0 178 * @brief Requests the motor to move to the home position (ABS_POSITION = 0)
nucleosam 0:00a3c3f5a8f0 179 * @retval None
nucleosam 0:00a3c3f5a8f0 180 **********************************************************/
nucleosam 0:00a3c3f5a8f0 181 void POWERSTEP01::Powerstep01_CmdGoHome(void)
nucleosam 0:00a3c3f5a8f0 182 {
nucleosam 0:00a3c3f5a8f0 183 Powerstep01_SendCommand(POWERSTEP01_GO_HOME, 0);
nucleosam 0:00a3c3f5a8f0 184 }
nucleosam 0:00a3c3f5a8f0 185
nucleosam 0:00a3c3f5a8f0 186 /**********************************************************
nucleosam 0:00a3c3f5a8f0 187 * @brief Requests the motor to move to the mark position
nucleosam 0:00a3c3f5a8f0 188 * @retval None
nucleosam 0:00a3c3f5a8f0 189 **********************************************************/
nucleosam 0:00a3c3f5a8f0 190 void POWERSTEP01::Powerstep01_CmdGoMark(void)
nucleosam 0:00a3c3f5a8f0 191 {
nucleosam 0:00a3c3f5a8f0 192 Powerstep01_SendCommand(POWERSTEP01_GO_MARK, 0);
nucleosam 0:00a3c3f5a8f0 193 }
nucleosam 0:00a3c3f5a8f0 194
nucleosam 0:00a3c3f5a8f0 195 /**********************************************************
nucleosam 0:00a3c3f5a8f0 196 * @brief Requests the motor to move to the specified position
nucleosam 0:00a3c3f5a8f0 197 * @param[in] targetPosition absolute position in steps
nucleosam 0:00a3c3f5a8f0 198 * @retval None
nucleosam 0:00a3c3f5a8f0 199 **********************************************************/
nucleosam 0:00a3c3f5a8f0 200 void POWERSTEP01::Powerstep01_CmdGoTo(int32_t targetPosition)
nucleosam 0:00a3c3f5a8f0 201 {
nucleosam 0:00a3c3f5a8f0 202 Powerstep01_SendCommand(POWERSTEP01_GO_TO, targetPosition);
nucleosam 0:00a3c3f5a8f0 203 }
nucleosam 0:00a3c3f5a8f0 204
nucleosam 0:00a3c3f5a8f0 205 /******************************************************//**
nucleosam 0:00a3c3f5a8f0 206 * @brief Issues PowerStep01 Go To Dir command
nucleosam 0:00a3c3f5a8f0 207 * @param[in] direction movement direction
nucleosam 0:00a3c3f5a8f0 208 * @param[in] abs_pos absolute position where requested to move
nucleosam 0:00a3c3f5a8f0 209 * @retval None
nucleosam 0:00a3c3f5a8f0 210 *********************************************************/
nucleosam 0:00a3c3f5a8f0 211 void POWERSTEP01::Powerstep01_CmdGoToDir(motorDir_t direction,
nucleosam 0:00a3c3f5a8f0 212 int32_t abs_pos)
nucleosam 0:00a3c3f5a8f0 213 {
nucleosam 0:00a3c3f5a8f0 214 Powerstep01_SendCommand((uint8_t)POWERSTEP01_GO_TO_DIR|
nucleosam 0:00a3c3f5a8f0 215 (uint8_t)direction, abs_pos);
nucleosam 0:00a3c3f5a8f0 216 }
nucleosam 0:00a3c3f5a8f0 217
nucleosam 0:00a3c3f5a8f0 218 /******************************************************//**
nucleosam 0:00a3c3f5a8f0 219 * @brief Issues PowerStep01 Go Until command
nucleosam 0:00a3c3f5a8f0 220 * @param[in] action ACTION_RESET or ACTION_COPY
nucleosam 0:00a3c3f5a8f0 221 * @param[in] direction movement direction
nucleosam 0:00a3c3f5a8f0 222 * @param[in] speed in steps/tick
nucleosam 0:00a3c3f5a8f0 223 * @retval None
nucleosam 0:00a3c3f5a8f0 224 *********************************************************/
nucleosam 0:00a3c3f5a8f0 225 void POWERSTEP01::Powerstep01_CmdGoUntil(motorAction_t action,
nucleosam 0:00a3c3f5a8f0 226 motorDir_t direction,
nucleosam 0:00a3c3f5a8f0 227 uint32_t speed)
nucleosam 0:00a3c3f5a8f0 228 {
nucleosam 0:00a3c3f5a8f0 229 Powerstep01_SendCommand(
nucleosam 0:00a3c3f5a8f0 230 (uint8_t)POWERSTEP01_GO_UNTIL|(uint8_t)action|(uint8_t)direction,
nucleosam 0:00a3c3f5a8f0 231 speed);
nucleosam 0:00a3c3f5a8f0 232 }
nucleosam 0:00a3c3f5a8f0 233
nucleosam 0:00a3c3f5a8f0 234 /**********************************************************
nucleosam 0:00a3c3f5a8f0 235 * @brief Immediatly stops the motor and disable the power bridge
nucleosam 0:00a3c3f5a8f0 236 * @retval None
nucleosam 0:00a3c3f5a8f0 237 * @note The HardHiZ command immediately disables the power bridges
nucleosam 0:00a3c3f5a8f0 238 * (high impedance state) and raises the HiZ flag.
nucleosam 0:00a3c3f5a8f0 239 * When the motor is stopped, a HardHiZ command forces the bridges
nucleosam 0:00a3c3f5a8f0 240 * to enter high impedance state.
nucleosam 0:00a3c3f5a8f0 241 * This command can be given anytime and is immediately executed.
nucleosam 0:00a3c3f5a8f0 242 *********************************************************/
nucleosam 0:00a3c3f5a8f0 243 void POWERSTEP01::Powerstep01_CmdHardHiZ(void)
nucleosam 0:00a3c3f5a8f0 244 {
nucleosam 0:00a3c3f5a8f0 245 Powerstep01_SendCommand(POWERSTEP01_HARD_HIZ, 0);
nucleosam 0:00a3c3f5a8f0 246 }
nucleosam 0:00a3c3f5a8f0 247
nucleosam 0:00a3c3f5a8f0 248 /**********************************************************
nucleosam 0:00a3c3f5a8f0 249 * @brief Immediatly stops the motor and disable the power bridge
nucleosam 0:00a3c3f5a8f0 250 * @retval None
nucleosam 0:00a3c3f5a8f0 251 * @note The HardStop command causes an immediate motor stop with
nucleosam 0:00a3c3f5a8f0 252 * infinite deceleration.
nucleosam 0:00a3c3f5a8f0 253 * When the motor is in high impedance state, a HardStop command
nucleosam 0:00a3c3f5a8f0 254 * forces the bridges to exit high impedance state; no motion is performed.
nucleosam 0:00a3c3f5a8f0 255 * This command can be given anytime and is immediately executed.
nucleosam 0:00a3c3f5a8f0 256 * This command keeps the BUSY flag low until the motor is stopped.
nucleosam 0:00a3c3f5a8f0 257 **********************************************************/
nucleosam 0:00a3c3f5a8f0 258 void POWERSTEP01::Powerstep01_CmdHardStop(void)
nucleosam 0:00a3c3f5a8f0 259 {
nucleosam 0:00a3c3f5a8f0 260 Powerstep01_SendCommand(POWERSTEP01_HARD_STOP, 0);
nucleosam 0:00a3c3f5a8f0 261 }
nucleosam 0:00a3c3f5a8f0 262
nucleosam 0:00a3c3f5a8f0 263 /**********************************************************
nucleosam 0:00a3c3f5a8f0 264 * @brief Moves the motor of the specified number of steps
nucleosam 0:00a3c3f5a8f0 265 * @param[in] direction FORWARD or BACKWARD
nucleosam 0:00a3c3f5a8f0 266 * @param[in] stepCount Number of steps to perform
nucleosam 0:00a3c3f5a8f0 267 * @retval None
nucleosam 0:00a3c3f5a8f0 268 **********************************************************/
nucleosam 0:00a3c3f5a8f0 269 void POWERSTEP01::Powerstep01_CmdMove(motorDir_t direction,
nucleosam 0:00a3c3f5a8f0 270 uint32_t stepCount)
nucleosam 0:00a3c3f5a8f0 271 {
nucleosam 0:00a3c3f5a8f0 272 Powerstep01_SendCommand((uint8_t)POWERSTEP01_MOVE|(uint8_t)direction,
nucleosam 0:00a3c3f5a8f0 273 stepCount);
nucleosam 0:00a3c3f5a8f0 274 }
nucleosam 0:00a3c3f5a8f0 275
nucleosam 0:00a3c3f5a8f0 276 /**********************************************************
nucleosam 0:00a3c3f5a8f0 277 * @brief Issues the Nop command to the Powerstep01 device
nucleosam 0:00a3c3f5a8f0 278 * @retval None
nucleosam 0:00a3c3f5a8f0 279 **********************************************************/
nucleosam 0:00a3c3f5a8f0 280 void POWERSTEP01::Powerstep01_CmdNop(void)
nucleosam 0:00a3c3f5a8f0 281 {
nucleosam 0:00a3c3f5a8f0 282 Powerstep01_SendCommand(POWERSTEP01_NOP, 0);
nucleosam 0:00a3c3f5a8f0 283 }
nucleosam 0:00a3c3f5a8f0 284
nucleosam 0:00a3c3f5a8f0 285 /******************************************************//**
nucleosam 0:00a3c3f5a8f0 286 * @brief Issues PowerStep01 Release SW command
nucleosam 0:00a3c3f5a8f0 287 * @param[in] action type of action to undertake when the SW
nucleosam 0:00a3c3f5a8f0 288 * input is forced high
nucleosam 0:00a3c3f5a8f0 289 * @param[in] direction movement direction
nucleosam 0:00a3c3f5a8f0 290 * @retval None
nucleosam 0:00a3c3f5a8f0 291 *********************************************************/
nucleosam 0:00a3c3f5a8f0 292 void POWERSTEP01::Powerstep01_CmdReleaseSw(motorAction_t action,
nucleosam 0:00a3c3f5a8f0 293 motorDir_t direction)
nucleosam 0:00a3c3f5a8f0 294 {
nucleosam 0:00a3c3f5a8f0 295 Powerstep01_SendCommand((uint8_t)POWERSTEP01_RELEASE_SW|
nucleosam 0:00a3c3f5a8f0 296 (uint8_t)action|
nucleosam 0:00a3c3f5a8f0 297 (uint8_t)direction,
nucleosam 0:00a3c3f5a8f0 298 0);
nucleosam 0:00a3c3f5a8f0 299 }
nucleosam 0:00a3c3f5a8f0 300
nucleosam 0:00a3c3f5a8f0 301 /******************************************************//**
nucleosam 0:00a3c3f5a8f0 302 * @brief Issues PowerStep01 Reset Device command
nucleosam 0:00a3c3f5a8f0 303 * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES-1 )
nucleosam 0:00a3c3f5a8f0 304 * @retval None
nucleosam 0:00a3c3f5a8f0 305 *********************************************************/
nucleosam 0:00a3c3f5a8f0 306 void POWERSTEP01::Powerstep01_CmdResetDevice(void)
nucleosam 0:00a3c3f5a8f0 307 {
nucleosam 0:00a3c3f5a8f0 308 Powerstep01_SendCommand(POWERSTEP01_RESET_DEVICE, 0);
nucleosam 0:00a3c3f5a8f0 309 }
nucleosam 0:00a3c3f5a8f0 310
nucleosam 0:00a3c3f5a8f0 311 /******************************************************//**
nucleosam 0:00a3c3f5a8f0 312 * @brief Issues PowerStep01 Reset Pos command
nucleosam 0:00a3c3f5a8f0 313 * @param[in] deviceId (from 0 to MAX_NUMBER_OF_DEVICES-1 )
nucleosam 0:00a3c3f5a8f0 314 * @retval None
nucleosam 0:00a3c3f5a8f0 315 *********************************************************/
nucleosam 0:00a3c3f5a8f0 316 void POWERSTEP01::Powerstep01_CmdResetPos(void)
nucleosam 0:00a3c3f5a8f0 317 {
nucleosam 0:00a3c3f5a8f0 318 Powerstep01_SendCommand(POWERSTEP01_RESET_POS, 0);
nucleosam 0:00a3c3f5a8f0 319 }
nucleosam 0:00a3c3f5a8f0 320
nucleosam 0:00a3c3f5a8f0 321 /**********************************************************
nucleosam 0:00a3c3f5a8f0 322 * @brief Runs the motor. It will accelerate from the min
nucleosam 0:00a3c3f5a8f0 323 * speed up to the max speed by using the device acceleration.
nucleosam 0:00a3c3f5a8f0 324 * @param[in] direction FORWARD or BACKWARD
nucleosam 0:00a3c3f5a8f0 325 * @param[in] speed in steps/s
nucleosam 0:00a3c3f5a8f0 326 * @retval None
nucleosam 0:00a3c3f5a8f0 327 **********************************************************/
nucleosam 0:00a3c3f5a8f0 328 void POWERSTEP01::Powerstep01_CmdRun(motorDir_t direction, uint32_t speed)
nucleosam 0:00a3c3f5a8f0 329 {
nucleosam 0:00a3c3f5a8f0 330 Powerstep01_SendCommand((uint8_t)POWERSTEP01_RUN|(uint8_t)direction, speed);
nucleosam 0:00a3c3f5a8f0 331 }
nucleosam 0:00a3c3f5a8f0 332
nucleosam 0:00a3c3f5a8f0 333 /**********************************************************
nucleosam 0:00a3c3f5a8f0 334 * @brief Stops the motor by using the device deceleration
nucleosam 0:00a3c3f5a8f0 335 * and disables the power bridges
nucleosam 0:00a3c3f5a8f0 336 * @retval None
nucleosam 0:00a3c3f5a8f0 337 * @note The SoftHiZ command disables the power bridges
nucleosam 0:00a3c3f5a8f0 338 * (high impedance state) after a deceleration to zero.
nucleosam 0:00a3c3f5a8f0 339 * The deceleration value used is the one stored in the DEC register.
nucleosam 0:00a3c3f5a8f0 340 * When bridges are disabled, the HiZ flag is raised.
nucleosam 0:00a3c3f5a8f0 341 * When the motor is stopped, a SoftHiZ command forces the bridges
nucleosam 0:00a3c3f5a8f0 342 * to enter high impedance state.
nucleosam 0:00a3c3f5a8f0 343 * This command can be given anytime and is immediately executed.
nucleosam 0:00a3c3f5a8f0 344 * This command keeps the BUSY flag low until the motor is stopped.
nucleosam 0:00a3c3f5a8f0 345 *********************************************************/
nucleosam 0:00a3c3f5a8f0 346 void POWERSTEP01::Powerstep01_CmdSoftHiZ(void)
nucleosam 0:00a3c3f5a8f0 347 {
nucleosam 0:00a3c3f5a8f0 348 Powerstep01_SendCommand(POWERSTEP01_SOFT_HIZ, 0);
nucleosam 0:00a3c3f5a8f0 349 }
nucleosam 0:00a3c3f5a8f0 350
nucleosam 0:00a3c3f5a8f0 351 /**********************************************************
nucleosam 0:00a3c3f5a8f0 352 * @brief Stops the motor by using the device deceleration
nucleosam 0:00a3c3f5a8f0 353 * @retval None
nucleosam 0:00a3c3f5a8f0 354 * @note The SoftStop command causes an immediate deceleration
nucleosam 0:00a3c3f5a8f0 355 * to zero speed and a consequent motor stop.
nucleosam 0:00a3c3f5a8f0 356 * The deceleration value used is the one stored in the DEC register.
nucleosam 0:00a3c3f5a8f0 357 * When the motor is in high impedance state, a SoftStop
nucleosam 0:00a3c3f5a8f0 358 * command forces the bridges to exit from high impedance state.
nucleosam 0:00a3c3f5a8f0 359 * No motion is performed.
nucleosam 0:00a3c3f5a8f0 360 * This command can be given anytime and is immediately executed.
nucleosam 0:00a3c3f5a8f0 361 * This command keeps the BUSY flag low until the motor is stopped.
nucleosam 0:00a3c3f5a8f0 362 **********************************************************/
nucleosam 0:00a3c3f5a8f0 363 void POWERSTEP01::Powerstep01_CmdSoftStop(void)
nucleosam 0:00a3c3f5a8f0 364 {
nucleosam 0:00a3c3f5a8f0 365 Powerstep01_SendCommand(POWERSTEP01_SOFT_STOP, 0);
nucleosam 0:00a3c3f5a8f0 366 }
nucleosam 0:00a3c3f5a8f0 367
nucleosam 0:00a3c3f5a8f0 368 /******************************************************//**
nucleosam 0:00a3c3f5a8f0 369 * @brief Issues PowerStep01 Step Clock command
nucleosam 0:00a3c3f5a8f0 370 * @param[in] direction Movement direction (FORWARD, BACKWARD)
nucleosam 0:00a3c3f5a8f0 371 * @retval None
nucleosam 0:00a3c3f5a8f0 372 *********************************************************/
nucleosam 0:00a3c3f5a8f0 373 void POWERSTEP01::Powerstep01_CmdStepClock(motorDir_t direction)
nucleosam 0:00a3c3f5a8f0 374 {
nucleosam 0:00a3c3f5a8f0 375 Powerstep01_SendCommand((uint8_t)POWERSTEP01_STEP_CLOCK|(uint8_t)direction,
nucleosam 0:00a3c3f5a8f0 376 0);
nucleosam 0:00a3c3f5a8f0 377 }
nucleosam 0:00a3c3f5a8f0 378
nucleosam 0:00a3c3f5a8f0 379 /**********************************************************
nucleosam 0:00a3c3f5a8f0 380 * @brief Error handler which calls the user callback (if defined)
nucleosam 0:00a3c3f5a8f0 381 * @param[in] error Number of the error
nucleosam 0:00a3c3f5a8f0 382 * @retval None
nucleosam 0:00a3c3f5a8f0 383 **********************************************************/
nucleosam 0:00a3c3f5a8f0 384 void POWERSTEP01::Powerstep01_ErrorHandler(uint16_t error)
nucleosam 0:00a3c3f5a8f0 385 {
nucleosam 0:00a3c3f5a8f0 386 if (errorHandlerCallback != 0)
nucleosam 0:00a3c3f5a8f0 387 {
nucleosam 0:00a3c3f5a8f0 388 (void) errorHandlerCallback(error);
nucleosam 0:00a3c3f5a8f0 389 }
nucleosam 0:00a3c3f5a8f0 390 else
nucleosam 0:00a3c3f5a8f0 391 {
nucleosam 0:00a3c3f5a8f0 392 /* Aborting the program. */
nucleosam 0:00a3c3f5a8f0 393 exit(EXIT_FAILURE);
nucleosam 0:00a3c3f5a8f0 394 }
nucleosam 0:00a3c3f5a8f0 395 }
nucleosam 0:00a3c3f5a8f0 396
nucleosam 0:00a3c3f5a8f0 397 /******************************************************//**
nucleosam 0:00a3c3f5a8f0 398 * @brief Fetch and clear status flags of all devices
nucleosam 0:00a3c3f5a8f0 399 * by issuing a GET_STATUS command simultaneously
nucleosam 0:00a3c3f5a8f0 400 * to all devices.
nucleosam 0:00a3c3f5a8f0 401 * Then, the fetched status of each device can be retrieved
nucleosam 0:00a3c3f5a8f0 402 * by using the Powerstep01_GetFetchedStatus function
nucleosam 0:00a3c3f5a8f0 403 * provided there is no other calls to functions which
nucleosam 0:00a3c3f5a8f0 404 * use the SPI in between.
nucleosam 0:00a3c3f5a8f0 405 * @retval None
nucleosam 0:00a3c3f5a8f0 406 *********************************************************/
nucleosam 0:00a3c3f5a8f0 407 void POWERSTEP01::Powerstep01_FetchAndClearAllStatus(void)
nucleosam 0:00a3c3f5a8f0 408 {
nucleosam 0:00a3c3f5a8f0 409 uint8_t loop;
nucleosam 0:00a3c3f5a8f0 410
nucleosam 0:00a3c3f5a8f0 411 for (loop = 0; loop < numberOfDevices; loop++)
nucleosam 0:00a3c3f5a8f0 412 {
nucleosam 0:00a3c3f5a8f0 413 spiTxBursts[0][loop] = POWERSTEP01_GET_STATUS;
nucleosam 0:00a3c3f5a8f0 414 spiTxBursts[1][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 415 spiTxBursts[2][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 416 spiTxBursts[3][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 417 spiRxBursts[0][loop] = 0;
nucleosam 0:00a3c3f5a8f0 418 spiRxBursts[1][loop] = 0;
nucleosam 0:00a3c3f5a8f0 419 spiRxBursts[2][loop] = 0;
nucleosam 0:00a3c3f5a8f0 420 spiRxBursts[3][loop] = 0;
nucleosam 0:00a3c3f5a8f0 421 }
nucleosam 0:00a3c3f5a8f0 422 for (loop = 0;
nucleosam 0:00a3c3f5a8f0 423 loop < POWERSTEP01_CMD_ARG_NB_BYTES_GET_STATUS +
nucleosam 0:00a3c3f5a8f0 424 POWERSTEP01_RSP_NB_BYTES_GET_STATUS;
nucleosam 0:00a3c3f5a8f0 425 loop++)
nucleosam 0:00a3c3f5a8f0 426 {
nucleosam 0:00a3c3f5a8f0 427 Powerstep01_WriteBytes(&spiTxBursts[loop][0], &spiRxBursts[loop][0]);
nucleosam 0:00a3c3f5a8f0 428 }
nucleosam 0:00a3c3f5a8f0 429 }
nucleosam 0:00a3c3f5a8f0 430
nucleosam 0:00a3c3f5a8f0 431 /******************************************************//**
nucleosam 0:00a3c3f5a8f0 432 * @brief Get the value of the STATUS register which was
nucleosam 0:00a3c3f5a8f0 433 * fetched by using Powerstep01_FetchAndClearAllStatus.
nucleosam 0:00a3c3f5a8f0 434 * The fetched values are available as long as there
nucleosam 0:00a3c3f5a8f0 435 * no other calls to functions which use the SPI.
nucleosam 0:00a3c3f5a8f0 436 * @retval Last fetched value of the STATUS register
nucleosam 0:00a3c3f5a8f0 437 *********************************************************/
nucleosam 0:00a3c3f5a8f0 438 uint16_t POWERSTEP01::Powerstep01_GetFetchedStatus(void)
nucleosam 0:00a3c3f5a8f0 439 {
nucleosam 0:00a3c3f5a8f0 440 uint16_t status = 0;
nucleosam 0:00a3c3f5a8f0 441 if (numberOfDevices > deviceInstance)
nucleosam 0:00a3c3f5a8f0 442 {
nucleosam 0:00a3c3f5a8f0 443 uint8_t spiIndex = numberOfDevices - deviceInstance - 1;
nucleosam 0:00a3c3f5a8f0 444 status = (spiRxBursts[1][spiIndex] << 8) | (spiRxBursts[2][spiIndex]);
nucleosam 0:00a3c3f5a8f0 445 }
nucleosam 0:00a3c3f5a8f0 446 return (status);
nucleosam 0:00a3c3f5a8f0 447 }
nucleosam 0:00a3c3f5a8f0 448
nucleosam 0:00a3c3f5a8f0 449 /**********************************************************
nucleosam 0:00a3c3f5a8f0 450 * @brief Returns the FW version of the library
nucleosam 0:00a3c3f5a8f0 451 * @retval POWERSTEP01_FW_VERSION
nucleosam 0:00a3c3f5a8f0 452 **********************************************************/
nucleosam 1:8ce2a5d6fbf8 453 uint32_t POWERSTEP01::Powerstep01_GetFwVersion(void)
nucleosam 0:00a3c3f5a8f0 454 {
nucleosam 0:00a3c3f5a8f0 455 return (POWERSTEP01_FW_VERSION);
nucleosam 0:00a3c3f5a8f0 456 }
nucleosam 0:00a3c3f5a8f0 457
nucleosam 0:00a3c3f5a8f0 458 /**********************************************************
nucleosam 0:00a3c3f5a8f0 459 * @brief Returns the mark position device
nucleosam 0:00a3c3f5a8f0 460 * @retval Mark register value converted in a 32b signed integer
nucleosam 0:00a3c3f5a8f0 461 **********************************************************/
nucleosam 0:00a3c3f5a8f0 462 int32_t POWERSTEP01::Powerstep01_GetMark(void)
nucleosam 0:00a3c3f5a8f0 463 {
nucleosam 0:00a3c3f5a8f0 464 return Powerstep01_ConvertPosition(Powerstep01_CmdGetParam(POWERSTEP01_MARK));
nucleosam 0:00a3c3f5a8f0 465 }
nucleosam 0:00a3c3f5a8f0 466
nucleosam 0:00a3c3f5a8f0 467 /**********************************************************
nucleosam 0:00a3c3f5a8f0 468 * @brief Returns the ABS_POSITION device
nucleosam 0:00a3c3f5a8f0 469 * @retval ABS_POSITION register value converted in a 32b signed integer
nucleosam 0:00a3c3f5a8f0 470 **********************************************************/
nucleosam 0:00a3c3f5a8f0 471 int32_t POWERSTEP01::Powerstep01_GetPosition(void)
nucleosam 0:00a3c3f5a8f0 472 {
nucleosam 0:00a3c3f5a8f0 473 return Powerstep01_ConvertPosition(
nucleosam 0:00a3c3f5a8f0 474 Powerstep01_CmdGetParam(POWERSTEP01_ABS_POS));
nucleosam 0:00a3c3f5a8f0 475 }
nucleosam 0:00a3c3f5a8f0 476
nucleosam 0:00a3c3f5a8f0 477 /**********************************************************
nucleosam 0:00a3c3f5a8f0 478 * @brief Checks if the device is busy
nucleosam 0:00a3c3f5a8f0 479 * by reading the Busy flag bit of its status Register
nucleosam 0:00a3c3f5a8f0 480 * This operation clears the status register
nucleosam 0:00a3c3f5a8f0 481 * @retval true if device is busy, false zero
nucleosam 0:00a3c3f5a8f0 482 *********************************************************/
nucleosam 0:00a3c3f5a8f0 483 bool POWERSTEP01::Powerstep01_IsDeviceBusy(void)
nucleosam 0:00a3c3f5a8f0 484 {
nucleosam 0:00a3c3f5a8f0 485 if(!(Powerstep01_CmdGetStatus() & POWERSTEP01_STATUS_BUSY))
nucleosam 0:00a3c3f5a8f0 486 {
nucleosam 0:00a3c3f5a8f0 487 return TRUE;
nucleosam 0:00a3c3f5a8f0 488 }
nucleosam 0:00a3c3f5a8f0 489 else
nucleosam 0:00a3c3f5a8f0 490 {
nucleosam 0:00a3c3f5a8f0 491 return FALSE;
nucleosam 0:00a3c3f5a8f0 492 }
nucleosam 0:00a3c3f5a8f0 493 }
nucleosam 0:00a3c3f5a8f0 494
nucleosam 0:00a3c3f5a8f0 495 /**********************************************************
nucleosam 0:00a3c3f5a8f0 496 * @brief Reads the Status Register value
nucleosam 0:00a3c3f5a8f0 497 * @retval Status register value
nucleosam 0:00a3c3f5a8f0 498 * @note The status register flags are not cleared
nucleosam 0:00a3c3f5a8f0 499 * at the difference with Powerstep01_CmdGetStatus()
nucleosam 0:00a3c3f5a8f0 500 **********************************************************/
nucleosam 0:00a3c3f5a8f0 501 uint16_t POWERSTEP01::Powerstep01_ReadStatusRegister(void)
nucleosam 0:00a3c3f5a8f0 502 {
nucleosam 0:00a3c3f5a8f0 503 return (Powerstep01_CmdGetParam(POWERSTEP01_STATUS));
nucleosam 0:00a3c3f5a8f0 504 }
nucleosam 0:00a3c3f5a8f0 505
nucleosam 0:00a3c3f5a8f0 506 /**********************************************************
nucleosam 0:00a3c3f5a8f0 507 * @brief Set the stepping mode
nucleosam 0:00a3c3f5a8f0 508 * @param[in] stepMode from full step to 1/128 microstep
nucleosam 0:00a3c3f5a8f0 509 * as specified in enum motorStepMode_t
nucleosam 0:00a3c3f5a8f0 510 * @retval None
nucleosam 0:00a3c3f5a8f0 511 **********************************************************/
nucleosam 1:8ce2a5d6fbf8 512 bool POWERSTEP01::Powerstep01_SelectStepMode(motorStepMode_t stepMode)
nucleosam 0:00a3c3f5a8f0 513 {
nucleosam 0:00a3c3f5a8f0 514 uint8_t stepModeRegister;
nucleosam 0:00a3c3f5a8f0 515 powerstep01_StepSel_t powerstep01StepMode;
nucleosam 0:00a3c3f5a8f0 516
nucleosam 0:00a3c3f5a8f0 517 switch (stepMode)
nucleosam 0:00a3c3f5a8f0 518 {
nucleosam 0:00a3c3f5a8f0 519 case STEP_MODE_FULL:
nucleosam 0:00a3c3f5a8f0 520 powerstep01StepMode = POWERSTEP01_STEP_SEL_1;
nucleosam 0:00a3c3f5a8f0 521 break;
nucleosam 0:00a3c3f5a8f0 522 case STEP_MODE_HALF:
nucleosam 0:00a3c3f5a8f0 523 powerstep01StepMode = POWERSTEP01_STEP_SEL_1_2;
nucleosam 0:00a3c3f5a8f0 524 break;
nucleosam 0:00a3c3f5a8f0 525 case STEP_MODE_1_4:
nucleosam 0:00a3c3f5a8f0 526 powerstep01StepMode = POWERSTEP01_STEP_SEL_1_4;
nucleosam 0:00a3c3f5a8f0 527 break;
nucleosam 0:00a3c3f5a8f0 528 case STEP_MODE_1_8:
nucleosam 0:00a3c3f5a8f0 529 powerstep01StepMode = POWERSTEP01_STEP_SEL_1_8;
nucleosam 0:00a3c3f5a8f0 530 break;
nucleosam 0:00a3c3f5a8f0 531 case STEP_MODE_1_16:
nucleosam 0:00a3c3f5a8f0 532 powerstep01StepMode = POWERSTEP01_STEP_SEL_1_16;
nucleosam 0:00a3c3f5a8f0 533 break;
nucleosam 0:00a3c3f5a8f0 534 case STEP_MODE_1_32:
nucleosam 0:00a3c3f5a8f0 535 powerstep01StepMode = POWERSTEP01_STEP_SEL_1_32;
nucleosam 0:00a3c3f5a8f0 536 break;
nucleosam 0:00a3c3f5a8f0 537 case STEP_MODE_1_64:
nucleosam 0:00a3c3f5a8f0 538 powerstep01StepMode = POWERSTEP01_STEP_SEL_1_64;
nucleosam 0:00a3c3f5a8f0 539 break;
nucleosam 0:00a3c3f5a8f0 540 case STEP_MODE_1_128:
nucleosam 1:8ce2a5d6fbf8 541 powerstep01StepMode = POWERSTEP01_STEP_SEL_1_128;
nucleosam 1:8ce2a5d6fbf8 542 break;
nucleosam 0:00a3c3f5a8f0 543 default:
nucleosam 1:8ce2a5d6fbf8 544 return false;
nucleosam 0:00a3c3f5a8f0 545 }
nucleosam 0:00a3c3f5a8f0 546
nucleosam 0:00a3c3f5a8f0 547 /* Set the powerstep01 in HiZ state */
nucleosam 0:00a3c3f5a8f0 548 Powerstep01_CmdHardHiZ();
nucleosam 0:00a3c3f5a8f0 549
nucleosam 0:00a3c3f5a8f0 550 /* Read Step mode register and clear STEP_SEL field */
nucleosam 0:00a3c3f5a8f0 551 stepModeRegister = (uint8_t)(0xF8 & Powerstep01_CmdGetParam(POWERSTEP01_STEP_MODE)) ;
nucleosam 0:00a3c3f5a8f0 552
nucleosam 0:00a3c3f5a8f0 553 /* Apply new step mode */
nucleosam 0:00a3c3f5a8f0 554 Powerstep01_CmdSetParam(POWERSTEP01_STEP_MODE, stepModeRegister | (uint8_t)powerstep01StepMode);
nucleosam 0:00a3c3f5a8f0 555
nucleosam 0:00a3c3f5a8f0 556 /* Reset abs pos register */
nucleosam 0:00a3c3f5a8f0 557 Powerstep01_CmdResetPos();
nucleosam 0:00a3c3f5a8f0 558
nucleosam 1:8ce2a5d6fbf8 559 return true;
nucleosam 0:00a3c3f5a8f0 560 }
nucleosam 0:00a3c3f5a8f0 561
nucleosam 0:00a3c3f5a8f0 562 /**********************************************************
nucleosam 0:00a3c3f5a8f0 563 * @brief Set current position to be the Home position (ABS pos set to 0)
nucleosam 0:00a3c3f5a8f0 564 * @retval None
nucleosam 0:00a3c3f5a8f0 565 **********************************************************/
nucleosam 0:00a3c3f5a8f0 566 void POWERSTEP01::Powerstep01_SetHome(void)
nucleosam 0:00a3c3f5a8f0 567 {
nucleosam 0:00a3c3f5a8f0 568 Powerstep01_CmdSetParam(POWERSTEP01_ABS_POS, 0);
nucleosam 0:00a3c3f5a8f0 569 }
nucleosam 0:00a3c3f5a8f0 570
nucleosam 0:00a3c3f5a8f0 571 /**********************************************************
nucleosam 0:00a3c3f5a8f0 572 * @brief Sets current position to be the Mark position
nucleosam 0:00a3c3f5a8f0 573 * @retval None
nucleosam 0:00a3c3f5a8f0 574 **********************************************************/
nucleosam 0:00a3c3f5a8f0 575 void POWERSTEP01::Powerstep01_SetMark(void)
nucleosam 0:00a3c3f5a8f0 576 {
nucleosam 0:00a3c3f5a8f0 577 Powerstep01_CmdSetParam(POWERSTEP01_MARK,
nucleosam 0:00a3c3f5a8f0 578 Powerstep01_CmdGetParam(POWERSTEP01_ABS_POS));
nucleosam 0:00a3c3f5a8f0 579 }
nucleosam 0:00a3c3f5a8f0 580
nucleosam 0:00a3c3f5a8f0 581 /**********************************************************
nucleosam 0:00a3c3f5a8f0 582 * @brief Locks until the device state becomes Inactive
nucleosam 0:00a3c3f5a8f0 583 * @retval None
nucleosam 0:00a3c3f5a8f0 584 **********************************************************/
nucleosam 0:00a3c3f5a8f0 585 void POWERSTEP01::Powerstep01_WaitWhileActive(void)
nucleosam 0:00a3c3f5a8f0 586 {
nucleosam 0:00a3c3f5a8f0 587 /* Wait while motor is running */
nucleosam 0:00a3c3f5a8f0 588 while (Powerstep01_IsDeviceBusy() != 0);
nucleosam 0:00a3c3f5a8f0 589 }
nucleosam 0:00a3c3f5a8f0 590
nucleosam 0:00a3c3f5a8f0 591 /**
nucleosam 0:00a3c3f5a8f0 592 * @brief To and from register parameter conversion functions
nucleosam 0:00a3c3f5a8f0 593 */
nucleosam 0:00a3c3f5a8f0 594
nucleosam 0:00a3c3f5a8f0 595 /**********************************************************
nucleosam 0:00a3c3f5a8f0 596 * @brief Converts the ABS_POSITION register value to a 32b signed integer
nucleosam 0:00a3c3f5a8f0 597 * @param[in] abs_position_reg value of the ABS_POSITION register
nucleosam 0:00a3c3f5a8f0 598 * @retval operation_result 32b signed integer corresponding to the absolute position
nucleosam 0:00a3c3f5a8f0 599 **********************************************************/
nucleosam 0:00a3c3f5a8f0 600 int32_t POWERSTEP01::Powerstep01_ConvertPosition(uint32_t abs_position_reg)
nucleosam 0:00a3c3f5a8f0 601 {
nucleosam 0:00a3c3f5a8f0 602 int32_t operation_result;
nucleosam 0:00a3c3f5a8f0 603
nucleosam 0:00a3c3f5a8f0 604 if (abs_position_reg & POWERSTEP01_ABS_POS_SIGN_BIT_MASK)
nucleosam 0:00a3c3f5a8f0 605 {
nucleosam 0:00a3c3f5a8f0 606 /* Negative register value */
nucleosam 0:00a3c3f5a8f0 607 abs_position_reg = ~abs_position_reg;
nucleosam 0:00a3c3f5a8f0 608 abs_position_reg += 1;
nucleosam 0:00a3c3f5a8f0 609
nucleosam 0:00a3c3f5a8f0 610 operation_result = (int32_t) (abs_position_reg & POWERSTEP01_ABS_POS_VALUE_MASK);
nucleosam 0:00a3c3f5a8f0 611 operation_result = -operation_result;
nucleosam 0:00a3c3f5a8f0 612 }
nucleosam 0:00a3c3f5a8f0 613 else
nucleosam 0:00a3c3f5a8f0 614 {
nucleosam 0:00a3c3f5a8f0 615 operation_result = (int32_t) abs_position_reg;
nucleosam 0:00a3c3f5a8f0 616 }
nucleosam 0:00a3c3f5a8f0 617 return operation_result;
nucleosam 0:00a3c3f5a8f0 618 }
nucleosam 0:00a3c3f5a8f0 619
nucleosam 0:00a3c3f5a8f0 620 /**
nucleosam 0:00a3c3f5a8f0 621 * @brief Functions to initialize the registers
nucleosam 0:00a3c3f5a8f0 622 */
nucleosam 0:00a3c3f5a8f0 623
nucleosam 0:00a3c3f5a8f0 624 /**********************************************************
nucleosam 0:00a3c3f5a8f0 625 * @brief Set the parameters of the device to values of initPrm structure
nucleosam 0:00a3c3f5a8f0 626 * @param[in] initPrm structure containing values to initialize the device
nucleosam 0:00a3c3f5a8f0 627 * parameters
nucleosam 0:00a3c3f5a8f0 628 * @retval None.
nucleosam 0:00a3c3f5a8f0 629 **********************************************************/
nucleosam 0:00a3c3f5a8f0 630 void POWERSTEP01::Powerstep01_SetDeviceParamsToGivenValues(
nucleosam 0:00a3c3f5a8f0 631 powerstep01_Init_u_t *initPrm)
nucleosam 0:00a3c3f5a8f0 632 {
nucleosam 0:00a3c3f5a8f0 633 Powerstep01_CmdSetParam(POWERSTEP01_ABS_POS, 0);
nucleosam 0:00a3c3f5a8f0 634 Powerstep01_CmdSetParam(POWERSTEP01_EL_POS, 0);
nucleosam 0:00a3c3f5a8f0 635 Powerstep01_CmdSetParam(POWERSTEP01_MARK, 0);
nucleosam 0:00a3c3f5a8f0 636 Powerstep01_CmdSetParam(POWERSTEP01_ACC,
nucleosam 0:00a3c3f5a8f0 637 AccDec_Steps_s2_to_RegVal(initPrm->cm.cp.acceleration));
nucleosam 0:00a3c3f5a8f0 638 Powerstep01_CmdSetParam(POWERSTEP01_DEC,
nucleosam 0:00a3c3f5a8f0 639 AccDec_Steps_s2_to_RegVal(initPrm->cm.cp.deceleration));
nucleosam 0:00a3c3f5a8f0 640 Powerstep01_CmdSetParam(POWERSTEP01_MAX_SPEED,
nucleosam 0:00a3c3f5a8f0 641 MaxSpd_Steps_s_to_RegVal(initPrm->cm.cp.maxSpeed));
nucleosam 0:00a3c3f5a8f0 642 Powerstep01_CmdSetParam(POWERSTEP01_MIN_SPEED,
nucleosam 0:00a3c3f5a8f0 643 initPrm->cm.cp.lowSpeedOptimization|
nucleosam 0:00a3c3f5a8f0 644 MaxSpd_Steps_s_to_RegVal(initPrm->cm.cp.minSpeed));
nucleosam 0:00a3c3f5a8f0 645 Powerstep01_CmdSetParam(POWERSTEP01_FS_SPD,
nucleosam 0:00a3c3f5a8f0 646 initPrm->cm.cp.boostMode|
nucleosam 0:00a3c3f5a8f0 647 FSSpd_Steps_s_to_RegVal(initPrm->cm.cp.fullStepSpeed));
nucleosam 0:00a3c3f5a8f0 648 Powerstep01_CmdSetParam(POWERSTEP01_OCD_TH,
nucleosam 0:00a3c3f5a8f0 649 StallOcd_Th_to_RegVal(initPrm->cm.cp.ocdThreshold));
nucleosam 0:00a3c3f5a8f0 650 Powerstep01_CmdSetParam(POWERSTEP01_STEP_MODE,
nucleosam 0:00a3c3f5a8f0 651 (uint8_t)initPrm->cm.cp.syncClockSelection|
nucleosam 0:00a3c3f5a8f0 652 (uint8_t)initPrm->cm.cp.cmVmSelection|
nucleosam 0:00a3c3f5a8f0 653 (uint8_t)(uint8_t)initPrm->cm.cp.stepMode);
nucleosam 0:00a3c3f5a8f0 654 Powerstep01_CmdSetParam(POWERSTEP01_ALARM_EN,
nucleosam 0:00a3c3f5a8f0 655 initPrm->cm.cp.alarmsSelection);
nucleosam 0:00a3c3f5a8f0 656 Powerstep01_CmdSetParam(POWERSTEP01_GATECFG1,
nucleosam 0:00a3c3f5a8f0 657 (uint16_t)initPrm->cm.cp.iGate|
nucleosam 0:00a3c3f5a8f0 658 (uint16_t)initPrm->cm.cp.tcc|
nucleosam 0:00a3c3f5a8f0 659 (uint16_t)initPrm->cm.cp.tBoost|
nucleosam 0:00a3c3f5a8f0 660 (uint16_t)initPrm->cm.cp.wdEn);
nucleosam 0:00a3c3f5a8f0 661 Powerstep01_CmdSetParam(POWERSTEP01_GATECFG2,
nucleosam 0:00a3c3f5a8f0 662 (uint16_t)initPrm->cm.cp.tBlank|
nucleosam 0:00a3c3f5a8f0 663 (uint16_t)initPrm->cm.cp.tdt);
nucleosam 0:00a3c3f5a8f0 664 if (initPrm->cm.cp.cmVmSelection == POWERSTEP01_CM_VM_VOLTAGE)
nucleosam 0:00a3c3f5a8f0 665 {
nucleosam 0:00a3c3f5a8f0 666 //Voltage mode
nucleosam 0:00a3c3f5a8f0 667 Powerstep01_CmdSetParam(POWERSTEP01_INT_SPD,
nucleosam 0:00a3c3f5a8f0 668 IntSpd_Steps_s_to_RegVal(
nucleosam 0:00a3c3f5a8f0 669 initPrm->vm.intersectSpeed));
nucleosam 0:00a3c3f5a8f0 670 Powerstep01_CmdSetParam(POWERSTEP01_K_THERM,
nucleosam 0:00a3c3f5a8f0 671 KTherm_Comp_to_RegVal(
nucleosam 0:00a3c3f5a8f0 672 initPrm->vm.thermalCompensationFactor));
nucleosam 0:00a3c3f5a8f0 673 Powerstep01_CmdSetParam(POWERSTEP01_STALL_TH,
nucleosam 0:00a3c3f5a8f0 674 StallOcd_Th_to_RegVal(
nucleosam 0:00a3c3f5a8f0 675 initPrm->vm.stallThreshold));
nucleosam 0:00a3c3f5a8f0 676 Powerstep01_CmdSetParam(POWERSTEP01_KVAL_HOLD,
nucleosam 0:00a3c3f5a8f0 677 Kval_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 678 initPrm->vm.kvalHold));
nucleosam 0:00a3c3f5a8f0 679 Powerstep01_CmdSetParam(POWERSTEP01_KVAL_RUN,
nucleosam 0:00a3c3f5a8f0 680 Kval_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 681 initPrm->vm.kvalRun));
nucleosam 0:00a3c3f5a8f0 682 Powerstep01_CmdSetParam(POWERSTEP01_KVAL_ACC,
nucleosam 0:00a3c3f5a8f0 683 Kval_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 684 initPrm->vm.kvalAcc));
nucleosam 0:00a3c3f5a8f0 685 Powerstep01_CmdSetParam(POWERSTEP01_KVAL_DEC,
nucleosam 0:00a3c3f5a8f0 686 Kval_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 687 initPrm->vm.kvalDec));
nucleosam 0:00a3c3f5a8f0 688 Powerstep01_CmdSetParam(POWERSTEP01_ST_SLP,
nucleosam 0:00a3c3f5a8f0 689 BEMFslope_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 690 initPrm->vm.startSlope));
nucleosam 0:00a3c3f5a8f0 691 Powerstep01_CmdSetParam(POWERSTEP01_FN_SLP_ACC,
nucleosam 0:00a3c3f5a8f0 692 BEMFslope_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 693 initPrm->vm.accelerationFinalSlope));
nucleosam 0:00a3c3f5a8f0 694 Powerstep01_CmdSetParam(POWERSTEP01_FN_SLP_DEC,
nucleosam 0:00a3c3f5a8f0 695 BEMFslope_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 696 initPrm->vm.decelerationFinalSlope));
nucleosam 0:00a3c3f5a8f0 697 Powerstep01_CmdSetParam(POWERSTEP01_CONFIG,
nucleosam 0:00a3c3f5a8f0 698 (uint16_t)initPrm->vm.oscClkSel|
nucleosam 0:00a3c3f5a8f0 699 (uint16_t)initPrm->vm.swMode |
nucleosam 0:00a3c3f5a8f0 700 (uint16_t)initPrm->vm.enVsComp|
nucleosam 0:00a3c3f5a8f0 701 (uint16_t)initPrm->vm.ocSd|
nucleosam 0:00a3c3f5a8f0 702 (uint16_t)initPrm->vm.uvloVal|
nucleosam 0:00a3c3f5a8f0 703 (uint16_t)initPrm->vm.vccVal|
nucleosam 0:00a3c3f5a8f0 704 (uint16_t)initPrm->vm.fPwmInt|
nucleosam 0:00a3c3f5a8f0 705 (uint16_t)initPrm->vm.fPwmDec);
nucleosam 0:00a3c3f5a8f0 706 }
nucleosam 0:00a3c3f5a8f0 707 else
nucleosam 0:00a3c3f5a8f0 708 {
nucleosam 0:00a3c3f5a8f0 709 // Current mode
nucleosam 0:00a3c3f5a8f0 710 Powerstep01_CmdSetParam(POWERSTEP01_TVAL_HOLD,
nucleosam 0:00a3c3f5a8f0 711 Tval_Current_to_RegVal(
nucleosam 0:00a3c3f5a8f0 712 initPrm->cm.tvalHold));
nucleosam 0:00a3c3f5a8f0 713 Powerstep01_CmdSetParam(POWERSTEP01_TVAL_RUN,
nucleosam 0:00a3c3f5a8f0 714 Tval_Current_to_RegVal(
nucleosam 0:00a3c3f5a8f0 715 initPrm->cm.tvalRun));
nucleosam 0:00a3c3f5a8f0 716 Powerstep01_CmdSetParam(POWERSTEP01_TVAL_ACC,
nucleosam 0:00a3c3f5a8f0 717 Tval_Current_to_RegVal(
nucleosam 0:00a3c3f5a8f0 718 initPrm->cm.tvalAcc));
nucleosam 0:00a3c3f5a8f0 719 Powerstep01_CmdSetParam(POWERSTEP01_TVAL_DEC,
nucleosam 0:00a3c3f5a8f0 720 Tval_Current_to_RegVal(
nucleosam 0:00a3c3f5a8f0 721 initPrm->cm.tvalDec));
nucleosam 0:00a3c3f5a8f0 722 Powerstep01_CmdSetParam(POWERSTEP01_T_FAST,
nucleosam 0:00a3c3f5a8f0 723 (uint8_t)initPrm->cm.toffFast|
nucleosam 0:00a3c3f5a8f0 724 (uint8_t)initPrm->cm.fastStep);
nucleosam 0:00a3c3f5a8f0 725 Powerstep01_CmdSetParam(POWERSTEP01_TON_MIN,
nucleosam 0:00a3c3f5a8f0 726 Tmin_Time_to_RegVal(
nucleosam 0:00a3c3f5a8f0 727 initPrm->cm.tonMin));
nucleosam 0:00a3c3f5a8f0 728 Powerstep01_CmdSetParam(POWERSTEP01_TOFF_MIN,
nucleosam 0:00a3c3f5a8f0 729 Tmin_Time_to_RegVal(
nucleosam 0:00a3c3f5a8f0 730 initPrm->cm.toffMin));
nucleosam 0:00a3c3f5a8f0 731 Powerstep01_CmdSetParam(POWERSTEP01_CONFIG,
nucleosam 0:00a3c3f5a8f0 732 (uint16_t)initPrm->cm.oscClkSel|
nucleosam 0:00a3c3f5a8f0 733 (uint16_t)initPrm->cm.swMode|
nucleosam 0:00a3c3f5a8f0 734 (uint16_t)initPrm->cm.tqReg|
nucleosam 0:00a3c3f5a8f0 735 (uint16_t)initPrm->cm.ocSd|
nucleosam 0:00a3c3f5a8f0 736 (uint16_t)initPrm->cm.uvloVal|
nucleosam 0:00a3c3f5a8f0 737 (uint16_t)initPrm->cm.vccVal|
nucleosam 0:00a3c3f5a8f0 738 (uint16_t)initPrm->cm.tsw|
nucleosam 0:00a3c3f5a8f0 739 (uint16_t)initPrm->cm.predEn);
nucleosam 0:00a3c3f5a8f0 740 }
nucleosam 0:00a3c3f5a8f0 741 }
nucleosam 0:00a3c3f5a8f0 742
nucleosam 0:00a3c3f5a8f0 743 /**********************************************************
nucleosam 0:00a3c3f5a8f0 744 * @brief Sets the registers of the Powerstep01 to their predefined values
nucleosam 0:00a3c3f5a8f0 745 * from powerstep01_target_config.h
nucleosam 0:00a3c3f5a8f0 746 * @retval None
nucleosam 0:00a3c3f5a8f0 747 **********************************************************/
nucleosam 0:00a3c3f5a8f0 748 void POWERSTEP01::Powerstep01_SetRegisterToPredefinedValues(void)
nucleosam 0:00a3c3f5a8f0 749 {
nucleosam 0:00a3c3f5a8f0 750 powerstep01_CmVm_t cmVm;
nucleosam 0:00a3c3f5a8f0 751
nucleosam 0:00a3c3f5a8f0 752 Powerstep01_CmdSetParam(
nucleosam 0:00a3c3f5a8f0 753 POWERSTEP01_ABS_POS,
nucleosam 0:00a3c3f5a8f0 754 0);
nucleosam 0:00a3c3f5a8f0 755 Powerstep01_CmdSetParam(
nucleosam 0:00a3c3f5a8f0 756 POWERSTEP01_EL_POS,
nucleosam 0:00a3c3f5a8f0 757 0);
nucleosam 0:00a3c3f5a8f0 758 Powerstep01_CmdSetParam(
nucleosam 0:00a3c3f5a8f0 759 POWERSTEP01_MARK,
nucleosam 0:00a3c3f5a8f0 760 0);
nucleosam 0:00a3c3f5a8f0 761 switch (deviceInstance)
nucleosam 0:00a3c3f5a8f0 762 {
nucleosam 0:00a3c3f5a8f0 763 case 0:
nucleosam 0:00a3c3f5a8f0 764 cmVm = POWERSTEP01_CONF_PARAM_CM_VM_DEVICE_0;
nucleosam 0:00a3c3f5a8f0 765 Powerstep01_CmdSetParam(POWERSTEP01_ACC,
nucleosam 0:00a3c3f5a8f0 766 AccDec_Steps_s2_to_RegVal(
nucleosam 0:00a3c3f5a8f0 767 POWERSTEP01_CONF_PARAM_ACC_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 768 Powerstep01_CmdSetParam(POWERSTEP01_DEC,
nucleosam 0:00a3c3f5a8f0 769 AccDec_Steps_s2_to_RegVal(
nucleosam 0:00a3c3f5a8f0 770 POWERSTEP01_CONF_PARAM_DEC_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 771 Powerstep01_CmdSetParam(POWERSTEP01_MAX_SPEED,
nucleosam 0:00a3c3f5a8f0 772 MaxSpd_Steps_s_to_RegVal(
nucleosam 0:00a3c3f5a8f0 773 POWERSTEP01_CONF_PARAM_MAX_SPEED_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 774 Powerstep01_CmdSetParam(POWERSTEP01_MIN_SPEED,
nucleosam 0:00a3c3f5a8f0 775 POWERSTEP01_CONF_PARAM_LSPD_BIT_DEVICE_0|
nucleosam 0:00a3c3f5a8f0 776 MinSpd_Steps_s_to_RegVal(
nucleosam 0:00a3c3f5a8f0 777 POWERSTEP01_CONF_PARAM_MIN_SPEED_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 778 Powerstep01_CmdSetParam(POWERSTEP01_FS_SPD,
nucleosam 0:00a3c3f5a8f0 779 POWERSTEP01_CONF_PARAM_BOOST_MODE_DEVICE_0|
nucleosam 0:00a3c3f5a8f0 780 FSSpd_Steps_s_to_RegVal(
nucleosam 0:00a3c3f5a8f0 781 POWERSTEP01_CONF_PARAM_FS_SPD_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 782 Powerstep01_CmdSetParam(POWERSTEP01_OCD_TH,
nucleosam 0:00a3c3f5a8f0 783 (uint8_t)POWERSTEP01_CONF_PARAM_OCD_TH_DEVICE_0);
nucleosam 0:00a3c3f5a8f0 784 Powerstep01_CmdSetParam(POWERSTEP01_STEP_MODE,
nucleosam 0:00a3c3f5a8f0 785 (uint8_t)POWERSTEP01_CONF_PARAM_SYNC_MODE_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 786 (uint8_t)POWERSTEP01_CONF_PARAM_CM_VM_DEVICE_0|
nucleosam 0:00a3c3f5a8f0 787 (uint8_t)POWERSTEP01_CONF_PARAM_STEP_MODE_DEVICE_0);
nucleosam 0:00a3c3f5a8f0 788 Powerstep01_CmdSetParam(POWERSTEP01_ALARM_EN,
nucleosam 0:00a3c3f5a8f0 789 POWERSTEP01_CONF_PARAM_ALARM_EN_DEVICE_0);
nucleosam 0:00a3c3f5a8f0 790 Powerstep01_CmdSetParam(POWERSTEP01_GATECFG1,
nucleosam 0:00a3c3f5a8f0 791 (uint16_t)POWERSTEP01_CONF_PARAM_IGATE_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 792 (uint16_t)POWERSTEP01_CONF_PARAM_TCC_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 793 (uint16_t)POWERSTEP01_CONF_PARAM_TBOOST_DEVICE_0|
nucleosam 0:00a3c3f5a8f0 794 (uint16_t)POWERSTEP01_CONF_PARAM_WD_EN_DEVICE_0);
nucleosam 0:00a3c3f5a8f0 795 Powerstep01_CmdSetParam(POWERSTEP01_GATECFG2,
nucleosam 0:00a3c3f5a8f0 796 (uint16_t)POWERSTEP01_CONF_PARAM_TBLANK_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 797 (uint16_t)POWERSTEP01_CONF_PARAM_TDT_DEVICE_0);
nucleosam 0:00a3c3f5a8f0 798 // Voltage mode
nucleosam 0:00a3c3f5a8f0 799 if (cmVm == POWERSTEP01_CM_VM_VOLTAGE)
nucleosam 0:00a3c3f5a8f0 800 {
nucleosam 0:00a3c3f5a8f0 801 Powerstep01_CmdSetParam(POWERSTEP01_INT_SPD,
nucleosam 0:00a3c3f5a8f0 802 IntSpd_Steps_s_to_RegVal(
nucleosam 0:00a3c3f5a8f0 803 POWERSTEP01_CONF_PARAM_INT_SPD_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 804 Powerstep01_CmdSetParam(POWERSTEP01_K_THERM,
nucleosam 0:00a3c3f5a8f0 805 KTherm_Comp_to_RegVal(
nucleosam 0:00a3c3f5a8f0 806 POWERSTEP01_CONF_PARAM_K_THERM_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 807 Powerstep01_CmdSetParam(POWERSTEP01_STALL_TH,
nucleosam 0:00a3c3f5a8f0 808 StallOcd_Th_to_RegVal(
nucleosam 0:00a3c3f5a8f0 809 POWERSTEP01_CONF_PARAM_STALL_TH_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 810 Powerstep01_CmdSetParam(POWERSTEP01_KVAL_HOLD,
nucleosam 0:00a3c3f5a8f0 811 Kval_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 812 POWERSTEP01_CONF_PARAM_KVAL_HOLD_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 813 Powerstep01_CmdSetParam(POWERSTEP01_KVAL_RUN,
nucleosam 0:00a3c3f5a8f0 814 Kval_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 815 POWERSTEP01_CONF_PARAM_KVAL_RUN_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 816 Powerstep01_CmdSetParam(POWERSTEP01_KVAL_ACC,
nucleosam 0:00a3c3f5a8f0 817 Kval_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 818 POWERSTEP01_CONF_PARAM_KVAL_ACC_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 819 Powerstep01_CmdSetParam(POWERSTEP01_KVAL_DEC,
nucleosam 0:00a3c3f5a8f0 820 Kval_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 821 POWERSTEP01_CONF_PARAM_KVAL_DEC_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 822 Powerstep01_CmdSetParam(POWERSTEP01_ST_SLP,
nucleosam 0:00a3c3f5a8f0 823 BEMFslope_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 824 POWERSTEP01_CONF_PARAM_ST_SLP_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 825 Powerstep01_CmdSetParam(POWERSTEP01_FN_SLP_ACC,
nucleosam 0:00a3c3f5a8f0 826 BEMFslope_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 827 POWERSTEP01_CONF_PARAM_FN_SLP_ACC_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 828 Powerstep01_CmdSetParam(POWERSTEP01_FN_SLP_DEC,
nucleosam 0:00a3c3f5a8f0 829 BEMFslope_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 830 POWERSTEP01_CONF_PARAM_FN_SLP_DEC_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 831 Powerstep01_CmdSetParam(POWERSTEP01_CONFIG,
nucleosam 0:00a3c3f5a8f0 832 (uint16_t)POWERSTEP01_CONF_PARAM_CLOCK_SETTING_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 833 (uint16_t)POWERSTEP01_CONF_PARAM_SW_MODE_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 834 (uint16_t)POWERSTEP01_CONF_PARAM_VS_COMP_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 835 (uint16_t)POWERSTEP01_CONF_PARAM_OC_SD_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 836 (uint16_t)POWERSTEP01_CONF_PARAM_UVLOVAL_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 837 (uint16_t)POWERSTEP01_CONF_PARAM_VCCVAL_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 838 (uint16_t)POWERSTEP01_CONF_PARAM_PWM_DIV_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 839 (uint16_t)POWERSTEP01_CONF_PARAM_PWM_MUL_DEVICE_0);
nucleosam 0:00a3c3f5a8f0 840 }
nucleosam 0:00a3c3f5a8f0 841 else
nucleosam 0:00a3c3f5a8f0 842 {
nucleosam 0:00a3c3f5a8f0 843 // Current mode
nucleosam 0:00a3c3f5a8f0 844 Powerstep01_CmdSetParam(POWERSTEP01_TVAL_HOLD,
nucleosam 0:00a3c3f5a8f0 845 Tval_Current_to_RegVal(
nucleosam 0:00a3c3f5a8f0 846 POWERSTEP01_CONF_PARAM_TVAL_HOLD_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 847 Powerstep01_CmdSetParam(POWERSTEP01_TVAL_RUN,
nucleosam 0:00a3c3f5a8f0 848 Tval_Current_to_RegVal(
nucleosam 0:00a3c3f5a8f0 849 POWERSTEP01_CONF_PARAM_TVAL_RUN_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 850 Powerstep01_CmdSetParam(POWERSTEP01_TVAL_ACC,
nucleosam 0:00a3c3f5a8f0 851 Tval_Current_to_RegVal(
nucleosam 0:00a3c3f5a8f0 852 POWERSTEP01_CONF_PARAM_TVAL_ACC_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 853 Powerstep01_CmdSetParam(POWERSTEP01_TVAL_DEC,
nucleosam 0:00a3c3f5a8f0 854 Tval_Current_to_RegVal(
nucleosam 0:00a3c3f5a8f0 855 POWERSTEP01_CONF_PARAM_TVAL_DEC_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 856 Powerstep01_CmdSetParam(POWERSTEP01_T_FAST,
nucleosam 0:00a3c3f5a8f0 857 (uint8_t)POWERSTEP01_CONF_PARAM_TOFF_FAST_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 858 (uint8_t)POWERSTEP01_CONF_PARAM_FAST_STEP_DEVICE_0);
nucleosam 0:00a3c3f5a8f0 859 Powerstep01_CmdSetParam(POWERSTEP01_TON_MIN,
nucleosam 0:00a3c3f5a8f0 860 Tmin_Time_to_RegVal(
nucleosam 0:00a3c3f5a8f0 861 POWERSTEP01_CONF_PARAM_TON_MIN_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 862 Powerstep01_CmdSetParam(POWERSTEP01_TOFF_MIN,
nucleosam 0:00a3c3f5a8f0 863 Tmin_Time_to_RegVal(
nucleosam 0:00a3c3f5a8f0 864 POWERSTEP01_CONF_PARAM_TOFF_MIN_DEVICE_0));
nucleosam 0:00a3c3f5a8f0 865 Powerstep01_CmdSetParam(POWERSTEP01_CONFIG,
nucleosam 0:00a3c3f5a8f0 866 (uint16_t)POWERSTEP01_CONF_PARAM_CLOCK_SETTING_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 867 (uint16_t)POWERSTEP01_CONF_PARAM_SW_MODE_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 868 (uint16_t)POWERSTEP01_CONF_PARAM_TQ_REG_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 869 (uint16_t)POWERSTEP01_CONF_PARAM_OC_SD_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 870 (uint16_t)POWERSTEP01_CONF_PARAM_UVLOVAL_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 871 (uint16_t)POWERSTEP01_CONF_PARAM_VCCVAL_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 872 (uint16_t)POWERSTEP01_CONF_PARAM_TSW_DEVICE_0 |
nucleosam 0:00a3c3f5a8f0 873 (uint16_t)POWERSTEP01_CONF_PARAM_PRED_DEVICE_0);
nucleosam 0:00a3c3f5a8f0 874 }
nucleosam 0:00a3c3f5a8f0 875 break;
nucleosam 0:00a3c3f5a8f0 876 #if (MAX_NUMBER_OF_DEVICES > 1)
nucleosam 0:00a3c3f5a8f0 877 case 1:
nucleosam 0:00a3c3f5a8f0 878 cmVm = POWERSTEP01_CONF_PARAM_CM_VM_DEVICE_1;
nucleosam 0:00a3c3f5a8f0 879 Powerstep01_CmdSetParam(POWERSTEP01_ACC,
nucleosam 0:00a3c3f5a8f0 880 AccDec_Steps_s2_to_RegVal(
nucleosam 0:00a3c3f5a8f0 881 POWERSTEP01_CONF_PARAM_ACC_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 882 Powerstep01_CmdSetParam(POWERSTEP01_DEC,
nucleosam 0:00a3c3f5a8f0 883 AccDec_Steps_s2_to_RegVal(
nucleosam 0:00a3c3f5a8f0 884 POWERSTEP01_CONF_PARAM_DEC_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 885 Powerstep01_CmdSetParam(POWERSTEP01_MAX_SPEED,
nucleosam 0:00a3c3f5a8f0 886 MaxSpd_Steps_s_to_RegVal(
nucleosam 0:00a3c3f5a8f0 887 POWERSTEP01_CONF_PARAM_MAX_SPEED_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 888 Powerstep01_CmdSetParam(POWERSTEP01_MIN_SPEED,
nucleosam 0:00a3c3f5a8f0 889 POWERSTEP01_CONF_PARAM_LSPD_BIT_DEVICE_1|
nucleosam 0:00a3c3f5a8f0 890 MinSpd_Steps_s_to_RegVal(
nucleosam 0:00a3c3f5a8f0 891 POWERSTEP01_CONF_PARAM_MIN_SPEED_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 892 Powerstep01_CmdSetParam(POWERSTEP01_FS_SPD,
nucleosam 0:00a3c3f5a8f0 893 POWERSTEP01_CONF_PARAM_BOOST_MODE_DEVICE_1|
nucleosam 0:00a3c3f5a8f0 894 FSSpd_Steps_s_to_RegVal(
nucleosam 0:00a3c3f5a8f0 895 POWERSTEP01_CONF_PARAM_FS_SPD_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 896 Powerstep01_CmdSetParam(POWERSTEP01_OCD_TH,
nucleosam 0:00a3c3f5a8f0 897 (uint8_t)POWERSTEP01_CONF_PARAM_OCD_TH_DEVICE_1);
nucleosam 0:00a3c3f5a8f0 898 Powerstep01_CmdSetParam(POWERSTEP01_STEP_MODE,
nucleosam 0:00a3c3f5a8f0 899 (uint8_t)POWERSTEP01_CONF_PARAM_SYNC_MODE_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 900 (uint8_t)POWERSTEP01_CONF_PARAM_CM_VM_DEVICE_1|
nucleosam 0:00a3c3f5a8f0 901 (uint8_t)POWERSTEP01_CONF_PARAM_STEP_MODE_DEVICE_1);
nucleosam 0:00a3c3f5a8f0 902 Powerstep01_CmdSetParam(POWERSTEP01_ALARM_EN,
nucleosam 0:00a3c3f5a8f0 903 POWERSTEP01_CONF_PARAM_ALARM_EN_DEVICE_1);
nucleosam 0:00a3c3f5a8f0 904 Powerstep01_CmdSetParam(POWERSTEP01_GATECFG1,
nucleosam 0:00a3c3f5a8f0 905 (uint16_t)POWERSTEP01_CONF_PARAM_IGATE_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 906 (uint16_t)POWERSTEP01_CONF_PARAM_TCC_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 907 (uint16_t)POWERSTEP01_CONF_PARAM_TBOOST_DEVICE_1|
nucleosam 0:00a3c3f5a8f0 908 (uint16_t)POWERSTEP01_CONF_PARAM_WD_EN_DEVICE_1);
nucleosam 0:00a3c3f5a8f0 909 Powerstep01_CmdSetParam(POWERSTEP01_GATECFG2,
nucleosam 0:00a3c3f5a8f0 910 (uint16_t)POWERSTEP01_CONF_PARAM_TBLANK_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 911 (uint16_t)POWERSTEP01_CONF_PARAM_TDT_DEVICE_1);
nucleosam 0:00a3c3f5a8f0 912 // Voltage mode
nucleosam 0:00a3c3f5a8f0 913 if (cmVm == POWERSTEP01_CM_VM_VOLTAGE)
nucleosam 0:00a3c3f5a8f0 914 {
nucleosam 0:00a3c3f5a8f0 915 Powerstep01_CmdSetParam(POWERSTEP01_INT_SPD,
nucleosam 0:00a3c3f5a8f0 916 IntSpd_Steps_s_to_RegVal(
nucleosam 0:00a3c3f5a8f0 917 POWERSTEP01_CONF_PARAM_INT_SPD_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 918 Powerstep01_CmdSetParam(POWERSTEP01_K_THERM,
nucleosam 0:00a3c3f5a8f0 919 KTherm_Comp_to_RegVal(
nucleosam 0:00a3c3f5a8f0 920 POWERSTEP01_CONF_PARAM_K_THERM_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 921 Powerstep01_CmdSetParam(POWERSTEP01_STALL_TH,
nucleosam 0:00a3c3f5a8f0 922 StallOcd_Th_to_RegVal(
nucleosam 0:00a3c3f5a8f0 923 POWERSTEP01_CONF_PARAM_STALL_TH_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 924 Powerstep01_CmdSetParam(POWERSTEP01_KVAL_HOLD,
nucleosam 0:00a3c3f5a8f0 925 Kval_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 926 POWERSTEP01_CONF_PARAM_KVAL_HOLD_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 927 Powerstep01_CmdSetParam(POWERSTEP01_KVAL_RUN,
nucleosam 0:00a3c3f5a8f0 928 Kval_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 929 POWERSTEP01_CONF_PARAM_KVAL_RUN_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 930 Powerstep01_CmdSetParam(POWERSTEP01_KVAL_ACC,
nucleosam 0:00a3c3f5a8f0 931 Kval_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 932 POWERSTEP01_CONF_PARAM_KVAL_ACC_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 933 Powerstep01_CmdSetParam(POWERSTEP01_KVAL_DEC,
nucleosam 0:00a3c3f5a8f0 934 Kval_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 935 POWERSTEP01_CONF_PARAM_KVAL_DEC_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 936 Powerstep01_CmdSetParam(POWERSTEP01_ST_SLP,
nucleosam 0:00a3c3f5a8f0 937 BEMFslope_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 938 POWERSTEP01_CONF_PARAM_ST_SLP_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 939 Powerstep01_CmdSetParam(POWERSTEP01_FN_SLP_ACC,
nucleosam 0:00a3c3f5a8f0 940 BEMFslope_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 941 POWERSTEP01_CONF_PARAM_FN_SLP_ACC_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 942 Powerstep01_CmdSetParam(POWERSTEP01_FN_SLP_DEC,
nucleosam 0:00a3c3f5a8f0 943 BEMFslope_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 944 POWERSTEP01_CONF_PARAM_FN_SLP_DEC_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 945 Powerstep01_CmdSetParam(POWERSTEP01_CONFIG,
nucleosam 0:00a3c3f5a8f0 946 (uint16_t)POWERSTEP01_CONF_PARAM_CLOCK_SETTING_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 947 (uint16_t)POWERSTEP01_CONF_PARAM_SW_MODE_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 948 (uint16_t)POWERSTEP01_CONF_PARAM_VS_COMP_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 949 (uint16_t)POWERSTEP01_CONF_PARAM_OC_SD_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 950 (uint16_t)POWERSTEP01_CONF_PARAM_UVLOVAL_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 951 (uint16_t)POWERSTEP01_CONF_PARAM_VCCVAL_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 952 (uint16_t)POWERSTEP01_CONF_PARAM_PWM_DIV_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 953 (uint16_t)POWERSTEP01_CONF_PARAM_PWM_MUL_DEVICE_1);
nucleosam 0:00a3c3f5a8f0 954 }
nucleosam 0:00a3c3f5a8f0 955 else
nucleosam 0:00a3c3f5a8f0 956 {
nucleosam 0:00a3c3f5a8f0 957 // Current mode
nucleosam 0:00a3c3f5a8f0 958 Powerstep01_CmdSetParam(POWERSTEP01_TVAL_HOLD,
nucleosam 0:00a3c3f5a8f0 959 Tval_Current_to_RegVal(
nucleosam 0:00a3c3f5a8f0 960 POWERSTEP01_CONF_PARAM_TVAL_HOLD_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 961 Powerstep01_CmdSetParam(POWERSTEP01_TVAL_RUN,
nucleosam 0:00a3c3f5a8f0 962 Tval_Current_to_RegVal(
nucleosam 0:00a3c3f5a8f0 963 POWERSTEP01_CONF_PARAM_TVAL_RUN_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 964 Powerstep01_CmdSetParam(POWERSTEP01_TVAL_ACC,
nucleosam 0:00a3c3f5a8f0 965 Tval_Current_to_RegVal(
nucleosam 0:00a3c3f5a8f0 966 POWERSTEP01_CONF_PARAM_TVAL_ACC_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 967 Powerstep01_CmdSetParam(POWERSTEP01_TVAL_DEC,
nucleosam 0:00a3c3f5a8f0 968 Tval_Current_to_RegVal(
nucleosam 0:00a3c3f5a8f0 969 POWERSTEP01_CONF_PARAM_TVAL_DEC_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 970 Powerstep01_CmdSetParam(POWERSTEP01_T_FAST,
nucleosam 0:00a3c3f5a8f0 971 (uint8_t)POWERSTEP01_CONF_PARAM_TOFF_FAST_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 972 (uint8_t)POWERSTEP01_CONF_PARAM_FAST_STEP_DEVICE_1);
nucleosam 0:00a3c3f5a8f0 973 Powerstep01_CmdSetParam(POWERSTEP01_TON_MIN,
nucleosam 0:00a3c3f5a8f0 974 Tmin_Time_to_RegVal(
nucleosam 0:00a3c3f5a8f0 975 POWERSTEP01_CONF_PARAM_TON_MIN_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 976 Powerstep01_CmdSetParam(POWERSTEP01_TOFF_MIN,
nucleosam 0:00a3c3f5a8f0 977 Tmin_Time_to_RegVal(
nucleosam 0:00a3c3f5a8f0 978 POWERSTEP01_CONF_PARAM_TOFF_MIN_DEVICE_1));
nucleosam 0:00a3c3f5a8f0 979 Powerstep01_CmdSetParam(POWERSTEP01_CONFIG,
nucleosam 0:00a3c3f5a8f0 980 (uint16_t)POWERSTEP01_CONF_PARAM_CLOCK_SETTING_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 981 (uint16_t)POWERSTEP01_CONF_PARAM_SW_MODE_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 982 (uint16_t)POWERSTEP01_CONF_PARAM_TQ_REG_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 983 (uint16_t)POWERSTEP01_CONF_PARAM_OC_SD_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 984 (uint16_t)POWERSTEP01_CONF_PARAM_UVLOVAL_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 985 (uint16_t)POWERSTEP01_CONF_PARAM_VCCVAL_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 986 (uint16_t)POWERSTEP01_CONF_PARAM_TSW_DEVICE_1 |
nucleosam 0:00a3c3f5a8f0 987 (uint16_t)POWERSTEP01_CONF_PARAM_PRED_DEVICE_1);
nucleosam 0:00a3c3f5a8f0 988 }
nucleosam 0:00a3c3f5a8f0 989 break;
nucleosam 0:00a3c3f5a8f0 990 #endif
nucleosam 0:00a3c3f5a8f0 991 #if (MAX_NUMBER_OF_DEVICES > 2)
nucleosam 0:00a3c3f5a8f0 992 case 2:
nucleosam 0:00a3c3f5a8f0 993 cmVm = POWERSTEP01_CONF_PARAM_CM_VM_DEVICE_2;
nucleosam 0:00a3c3f5a8f0 994 Powerstep01_CmdSetParam(POWERSTEP01_ACC,
nucleosam 0:00a3c3f5a8f0 995 AccDec_Steps_s2_to_RegVal(
nucleosam 0:00a3c3f5a8f0 996 POWERSTEP01_CONF_PARAM_ACC_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 997 Powerstep01_CmdSetParam(POWERSTEP01_DEC,
nucleosam 0:00a3c3f5a8f0 998 AccDec_Steps_s2_to_RegVal(
nucleosam 0:00a3c3f5a8f0 999 POWERSTEP01_CONF_PARAM_DEC_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1000 Powerstep01_CmdSetParam(POWERSTEP01_MAX_SPEED,
nucleosam 0:00a3c3f5a8f0 1001 MaxSpd_Steps_s_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1002 POWERSTEP01_CONF_PARAM_MAX_SPEED_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1003 Powerstep01_CmdSetParam(POWERSTEP01_MIN_SPEED,
nucleosam 0:00a3c3f5a8f0 1004 POWERSTEP01_CONF_PARAM_LSPD_BIT_DEVICE_2|
nucleosam 0:00a3c3f5a8f0 1005 MinSpd_Steps_s_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1006 POWERSTEP01_CONF_PARAM_MIN_SPEED_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1007 Powerstep01_CmdSetParam(POWERSTEP01_FS_SPD,
nucleosam 0:00a3c3f5a8f0 1008 POWERSTEP01_CONF_PARAM_BOOST_MODE_DEVICE_2|
nucleosam 0:00a3c3f5a8f0 1009 FSSpd_Steps_s_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1010 POWERSTEP01_CONF_PARAM_FS_SPD_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1011 Powerstep01_CmdSetParam(POWERSTEP01_OCD_TH,
nucleosam 0:00a3c3f5a8f0 1012 (uint8_t)POWERSTEP01_CONF_PARAM_OCD_TH_DEVICE_2);
nucleosam 0:00a3c3f5a8f0 1013 Powerstep01_CmdSetParam(POWERSTEP01_STEP_MODE,
nucleosam 0:00a3c3f5a8f0 1014 (uint8_t)POWERSTEP01_CONF_PARAM_SYNC_MODE_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1015 (uint8_t)POWERSTEP01_CONF_PARAM_CM_VM_DEVICE_2|
nucleosam 0:00a3c3f5a8f0 1016 (uint8_t)POWERSTEP01_CONF_PARAM_STEP_MODE_DEVICE_2);
nucleosam 0:00a3c3f5a8f0 1017 Powerstep01_CmdSetParam(POWERSTEP01_ALARM_EN,
nucleosam 0:00a3c3f5a8f0 1018 POWERSTEP01_CONF_PARAM_ALARM_EN_DEVICE_2);
nucleosam 0:00a3c3f5a8f0 1019 Powerstep01_CmdSetParam(POWERSTEP01_GATECFG1,
nucleosam 0:00a3c3f5a8f0 1020 (uint16_t)POWERSTEP01_CONF_PARAM_IGATE_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1021 (uint16_t)POWERSTEP01_CONF_PARAM_TCC_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1022 (uint16_t)POWERSTEP01_CONF_PARAM_TBOOST_DEVICE_2|
nucleosam 0:00a3c3f5a8f0 1023 (uint16_t)POWERSTEP01_CONF_PARAM_WD_EN_DEVICE_2);
nucleosam 0:00a3c3f5a8f0 1024 Powerstep01_CmdSetParam(POWERSTEP01_GATECFG2,
nucleosam 0:00a3c3f5a8f0 1025 (uint16_t)POWERSTEP01_CONF_PARAM_TBLANK_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1026 (uint16_t)POWERSTEP01_CONF_PARAM_TDT_DEVICE_2);
nucleosam 0:00a3c3f5a8f0 1027 // Voltage mode
nucleosam 0:00a3c3f5a8f0 1028 if (cmVm == POWERSTEP01_CM_VM_VOLTAGE)
nucleosam 0:00a3c3f5a8f0 1029 {
nucleosam 0:00a3c3f5a8f0 1030 Powerstep01_CmdSetParam(POWERSTEP01_INT_SPD,
nucleosam 0:00a3c3f5a8f0 1031 IntSpd_Steps_s_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1032 POWERSTEP01_CONF_PARAM_INT_SPD_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1033 Powerstep01_CmdSetParam(POWERSTEP01_K_THERM,
nucleosam 0:00a3c3f5a8f0 1034 KTherm_Comp_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1035 POWERSTEP01_CONF_PARAM_K_THERM_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1036 Powerstep01_CmdSetParam(POWERSTEP01_STALL_TH,
nucleosam 0:00a3c3f5a8f0 1037 StallOcd_Th_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1038 POWERSTEP01_CONF_PARAM_STALL_TH_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1039 Powerstep01_CmdSetParam(POWERSTEP01_KVAL_HOLD,
nucleosam 0:00a3c3f5a8f0 1040 Kval_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1041 POWERSTEP01_CONF_PARAM_KVAL_HOLD_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1042 Powerstep01_CmdSetParam(POWERSTEP01_KVAL_RUN,
nucleosam 0:00a3c3f5a8f0 1043 Kval_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1044 POWERSTEP01_CONF_PARAM_KVAL_RUN_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1045 Powerstep01_CmdSetParam(POWERSTEP01_KVAL_ACC,
nucleosam 0:00a3c3f5a8f0 1046 Kval_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1047 POWERSTEP01_CONF_PARAM_KVAL_ACC_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1048 Powerstep01_CmdSetParam(POWERSTEP01_KVAL_DEC,
nucleosam 0:00a3c3f5a8f0 1049 Kval_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1050 POWERSTEP01_CONF_PARAM_KVAL_DEC_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1051 Powerstep01_CmdSetParam(POWERSTEP01_ST_SLP,
nucleosam 0:00a3c3f5a8f0 1052 BEMFslope_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1053 POWERSTEP01_CONF_PARAM_ST_SLP_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1054 Powerstep01_CmdSetParam(POWERSTEP01_FN_SLP_ACC,
nucleosam 0:00a3c3f5a8f0 1055 BEMFslope_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1056 POWERSTEP01_CONF_PARAM_FN_SLP_ACC_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1057 Powerstep01_CmdSetParam(POWERSTEP01_FN_SLP_DEC,
nucleosam 0:00a3c3f5a8f0 1058 BEMFslope_Perc_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1059 POWERSTEP01_CONF_PARAM_FN_SLP_DEC_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1060 Powerstep01_CmdSetParam(POWERSTEP01_CONFIG,
nucleosam 0:00a3c3f5a8f0 1061 (uint16_t)POWERSTEP01_CONF_PARAM_CLOCK_SETTING_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1062 (uint16_t)POWERSTEP01_CONF_PARAM_SW_MODE_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1063 (uint16_t)POWERSTEP01_CONF_PARAM_VS_COMP_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1064 (uint16_t)POWERSTEP01_CONF_PARAM_OC_SD_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1065 (uint16_t)POWERSTEP01_CONF_PARAM_UVLOVAL_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1066 (uint16_t)POWERSTEP01_CONF_PARAM_VCCVAL_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1067 (uint16_t)POWERSTEP01_CONF_PARAM_PWM_DIV_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1068 (uint16_t)POWERSTEP01_CONF_PARAM_PWM_MUL_DEVICE_2);
nucleosam 0:00a3c3f5a8f0 1069 }
nucleosam 0:00a3c3f5a8f0 1070 else
nucleosam 0:00a3c3f5a8f0 1071 {
nucleosam 0:00a3c3f5a8f0 1072 // Current mode
nucleosam 0:00a3c3f5a8f0 1073 Powerstep01_CmdSetParam(POWERSTEP01_TVAL_HOLD,
nucleosam 0:00a3c3f5a8f0 1074 Tval_Current_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1075 POWERSTEP01_CONF_PARAM_TVAL_HOLD_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1076 Powerstep01_CmdSetParam(POWERSTEP01_TVAL_RUN,
nucleosam 0:00a3c3f5a8f0 1077 Tval_Current_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1078 POWERSTEP01_CONF_PARAM_TVAL_RUN_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1079 Powerstep01_CmdSetParam(POWERSTEP01_TVAL_ACC,
nucleosam 0:00a3c3f5a8f0 1080 Tval_Current_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1081 POWERSTEP01_CONF_PARAM_TVAL_ACC_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1082 Powerstep01_CmdSetParam(POWERSTEP01_TVAL_DEC,
nucleosam 0:00a3c3f5a8f0 1083 Tval_Current_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1084 POWERSTEP01_CONF_PARAM_TVAL_DEC_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1085 Powerstep01_CmdSetParam(POWERSTEP01_T_FAST,
nucleosam 0:00a3c3f5a8f0 1086 (uint8_t)POWERSTEP01_CONF_PARAM_TOFF_FAST_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1087 (uint8_t)POWERSTEP01_CONF_PARAM_FAST_STEP_DEVICE_2);
nucleosam 0:00a3c3f5a8f0 1088 Powerstep01_CmdSetParam(POWERSTEP01_TON_MIN,
nucleosam 0:00a3c3f5a8f0 1089 Tmin_Time_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1090 POWERSTEP01_CONF_PARAM_TON_MIN_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1091 Powerstep01_CmdSetParam(POWERSTEP01_TOFF_MIN,
nucleosam 0:00a3c3f5a8f0 1092 Tmin_Time_to_RegVal(
nucleosam 0:00a3c3f5a8f0 1093 POWERSTEP01_CONF_PARAM_TOFF_MIN_DEVICE_2));
nucleosam 0:00a3c3f5a8f0 1094 Powerstep01_CmdSetParam(POWERSTEP01_CONFIG,
nucleosam 0:00a3c3f5a8f0 1095 (uint16_t)POWERSTEP01_CONF_PARAM_CLOCK_SETTING_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1096 (uint16_t)POWERSTEP01_CONF_PARAM_SW_MODE_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1097 (uint16_t)POWERSTEP01_CONF_PARAM_TQ_REG_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1098 (uint16_t)POWERSTEP01_CONF_PARAM_OC_SD_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1099 (uint16_t)POWERSTEP01_CONF_PARAM_UVLOVAL_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1100 (uint16_t)POWERSTEP01_CONF_PARAM_VCCVAL_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1101 (uint16_t)POWERSTEP01_CONF_PARAM_TSW_DEVICE_2 |
nucleosam 0:00a3c3f5a8f0 1102 (uint16_t)POWERSTEP01_CONF_PARAM_PRED_DEVICE_2);
nucleosam 0:00a3c3f5a8f0 1103 }
nucleosam 0:00a3c3f5a8f0 1104 break;
nucleosam 0:00a3c3f5a8f0 1105 #endif
nucleosam 0:00a3c3f5a8f0 1106 default: ;
nucleosam 0:00a3c3f5a8f0 1107 }
nucleosam 0:00a3c3f5a8f0 1108 }
nucleosam 0:00a3c3f5a8f0 1109
nucleosam 0:00a3c3f5a8f0 1110 /**
nucleosam 0:00a3c3f5a8f0 1111 * @brief Functions to get and set parameters using digital or analog values
nucleosam 0:00a3c3f5a8f0 1112 */
nucleosam 0:00a3c3f5a8f0 1113
nucleosam 0:00a3c3f5a8f0 1114 /**********************************************************
nucleosam 0:00a3c3f5a8f0 1115 * @brief Issues the GetParam command to the Powerstep01 device
nucleosam 0:00a3c3f5a8f0 1116 * @param[in] parameter Register adress (POWERSTEP01_ABS_POS,
nucleosam 0:00a3c3f5a8f0 1117 * POWERSTEP01_MARK,...)
nucleosam 0:00a3c3f5a8f0 1118 * @retval Register value
nucleosam 0:00a3c3f5a8f0 1119 **********************************************************/
nucleosam 0:00a3c3f5a8f0 1120 uint32_t POWERSTEP01::Powerstep01_CmdGetParam(powerstep01_Registers_t param)
nucleosam 0:00a3c3f5a8f0 1121 {
nucleosam 0:00a3c3f5a8f0 1122
nucleosam 0:00a3c3f5a8f0 1123 uint32_t spiRxData;
nucleosam 0:00a3c3f5a8f0 1124 uint32_t loop;
nucleosam 0:00a3c3f5a8f0 1125 uint8_t maxArgumentNbBytes = 0;
nucleosam 0:00a3c3f5a8f0 1126 uint8_t spiIndex = numberOfDevices - deviceInstance - 1;
nucleosam 0:00a3c3f5a8f0 1127 bool itDisable = FALSE;
nucleosam 0:00a3c3f5a8f0 1128
nucleosam 0:00a3c3f5a8f0 1129 do
nucleosam 0:00a3c3f5a8f0 1130 {
nucleosam 0:00a3c3f5a8f0 1131 spiPreemptionByIsr = FALSE;
nucleosam 0:00a3c3f5a8f0 1132 if (itDisable)
nucleosam 0:00a3c3f5a8f0 1133 {
nucleosam 0:00a3c3f5a8f0 1134 /* re-enable Powerstep01_Board_EnableIrq if disable in previous iteration */
nucleosam 0:00a3c3f5a8f0 1135 Powerstep01_Board_EnableIrq();
nucleosam 0:00a3c3f5a8f0 1136 itDisable = FALSE;
nucleosam 0:00a3c3f5a8f0 1137 }
nucleosam 0:00a3c3f5a8f0 1138 for (loop = 0; loop < numberOfDevices; loop++)
nucleosam 0:00a3c3f5a8f0 1139 {
nucleosam 0:00a3c3f5a8f0 1140 spiTxBursts[0][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1141 spiTxBursts[1][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1142 spiTxBursts[2][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1143 spiTxBursts[3][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1144 spiRxBursts[0][loop] = 0;
nucleosam 0:00a3c3f5a8f0 1145 spiRxBursts[1][loop] = 0;
nucleosam 0:00a3c3f5a8f0 1146 spiRxBursts[2][loop] = 0;
nucleosam 0:00a3c3f5a8f0 1147 spiRxBursts[3][loop] = 0;
nucleosam 0:00a3c3f5a8f0 1148 }
nucleosam 0:00a3c3f5a8f0 1149 switch (param)
nucleosam 0:00a3c3f5a8f0 1150 {
nucleosam 0:00a3c3f5a8f0 1151 case POWERSTEP01_ABS_POS:
nucleosam 0:00a3c3f5a8f0 1152 case POWERSTEP01_MARK:
nucleosam 0:00a3c3f5a8f0 1153 case POWERSTEP01_SPEED:
nucleosam 0:00a3c3f5a8f0 1154 spiTxBursts[0][spiIndex] = ((uint8_t)POWERSTEP01_GET_PARAM )| (param);
nucleosam 0:00a3c3f5a8f0 1155 maxArgumentNbBytes = 3;
nucleosam 0:00a3c3f5a8f0 1156 break;
nucleosam 0:00a3c3f5a8f0 1157 case POWERSTEP01_EL_POS:
nucleosam 0:00a3c3f5a8f0 1158 case POWERSTEP01_ACC:
nucleosam 0:00a3c3f5a8f0 1159 case POWERSTEP01_DEC:
nucleosam 0:00a3c3f5a8f0 1160 case POWERSTEP01_MAX_SPEED:
nucleosam 0:00a3c3f5a8f0 1161 case POWERSTEP01_MIN_SPEED:
nucleosam 0:00a3c3f5a8f0 1162 case POWERSTEP01_FS_SPD:
nucleosam 0:00a3c3f5a8f0 1163 case POWERSTEP01_INT_SPD:
nucleosam 0:00a3c3f5a8f0 1164 case POWERSTEP01_CONFIG:
nucleosam 0:00a3c3f5a8f0 1165 case POWERSTEP01_GATECFG1:
nucleosam 0:00a3c3f5a8f0 1166 case POWERSTEP01_STATUS:
nucleosam 0:00a3c3f5a8f0 1167 spiTxBursts[1][spiIndex] = ((uint8_t)POWERSTEP01_GET_PARAM )| (param);
nucleosam 0:00a3c3f5a8f0 1168 maxArgumentNbBytes = 2;
nucleosam 0:00a3c3f5a8f0 1169 break;
nucleosam 0:00a3c3f5a8f0 1170 default:
nucleosam 0:00a3c3f5a8f0 1171 spiTxBursts[2][spiIndex] = ((uint8_t)POWERSTEP01_GET_PARAM )| (param);
nucleosam 0:00a3c3f5a8f0 1172 maxArgumentNbBytes = 1;
nucleosam 0:00a3c3f5a8f0 1173 }
nucleosam 0:00a3c3f5a8f0 1174 /* Disable interruption before checking */
nucleosam 0:00a3c3f5a8f0 1175 /* pre-emption by ISR and SPI transfers*/
nucleosam 0:00a3c3f5a8f0 1176 Powerstep01_Board_DisableIrq();
nucleosam 0:00a3c3f5a8f0 1177 itDisable = TRUE;
nucleosam 0:00a3c3f5a8f0 1178 } while (spiPreemptionByIsr); // check pre-emption by ISR
nucleosam 0:00a3c3f5a8f0 1179 for (loop = POWERSTEP01_CMD_ARG_MAX_NB_BYTES-1-maxArgumentNbBytes;
nucleosam 0:00a3c3f5a8f0 1180 loop < POWERSTEP01_CMD_ARG_MAX_NB_BYTES;
nucleosam 0:00a3c3f5a8f0 1181 loop++)
nucleosam 0:00a3c3f5a8f0 1182 {
nucleosam 0:00a3c3f5a8f0 1183 Powerstep01_WriteBytes(&spiTxBursts[loop][0],
nucleosam 0:00a3c3f5a8f0 1184 &spiRxBursts[loop][0]);
nucleosam 0:00a3c3f5a8f0 1185 }
nucleosam 0:00a3c3f5a8f0 1186 spiRxData = ((uint32_t)spiRxBursts[1][spiIndex] << 16)|
nucleosam 0:00a3c3f5a8f0 1187 (spiRxBursts[2][spiIndex] << 8) |
nucleosam 0:00a3c3f5a8f0 1188 (spiRxBursts[3][spiIndex]);
nucleosam 0:00a3c3f5a8f0 1189 /* re-enable Powerstep01_Board_EnableIrq after SPI transfers*/
nucleosam 0:00a3c3f5a8f0 1190 Powerstep01_Board_EnableIrq();
nucleosam 0:00a3c3f5a8f0 1191 return (spiRxData);
nucleosam 0:00a3c3f5a8f0 1192 }
nucleosam 0:00a3c3f5a8f0 1193
nucleosam 0:00a3c3f5a8f0 1194 /**********************************************************
nucleosam 0:00a3c3f5a8f0 1195 * @brief Issues the SetParam command to the PowerStep01 device
nucleosam 0:00a3c3f5a8f0 1196 * @param[in] parameter Register adress (POWERSTEP01_ABS_POS,
nucleosam 0:00a3c3f5a8f0 1197 * POWERSTEP01_MARK,...)
nucleosam 0:00a3c3f5a8f0 1198 * @param[in] value Value to set in the register
nucleosam 0:00a3c3f5a8f0 1199 * @retval None
nucleosam 0:00a3c3f5a8f0 1200 **********************************************************/
nucleosam 0:00a3c3f5a8f0 1201 void POWERSTEP01::Powerstep01_CmdSetParam(powerstep01_Registers_t param,
nucleosam 0:00a3c3f5a8f0 1202 uint32_t value)
nucleosam 0:00a3c3f5a8f0 1203 {
nucleosam 0:00a3c3f5a8f0 1204 uint32_t loop;
nucleosam 0:00a3c3f5a8f0 1205 uint8_t maxArgumentNbBytes = 0;
nucleosam 0:00a3c3f5a8f0 1206 uint8_t spiIndex = numberOfDevices - deviceInstance - 1;
nucleosam 0:00a3c3f5a8f0 1207 bool itDisable = FALSE;
nucleosam 0:00a3c3f5a8f0 1208
nucleosam 0:00a3c3f5a8f0 1209 do
nucleosam 0:00a3c3f5a8f0 1210 {
nucleosam 0:00a3c3f5a8f0 1211 spiPreemptionByIsr = FALSE;
nucleosam 0:00a3c3f5a8f0 1212 if (itDisable)
nucleosam 0:00a3c3f5a8f0 1213 {
nucleosam 0:00a3c3f5a8f0 1214 /* re-enable Powerstep01_Board_EnableIrq if disable in previous iteration */
nucleosam 0:00a3c3f5a8f0 1215 Powerstep01_Board_EnableIrq();
nucleosam 0:00a3c3f5a8f0 1216 itDisable = FALSE;
nucleosam 0:00a3c3f5a8f0 1217 }
nucleosam 0:00a3c3f5a8f0 1218 for (loop = 0;loop < numberOfDevices; loop++)
nucleosam 0:00a3c3f5a8f0 1219 {
nucleosam 0:00a3c3f5a8f0 1220 spiTxBursts[0][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1221 spiTxBursts[1][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1222 spiTxBursts[2][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1223 spiTxBursts[3][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1224 }
nucleosam 0:00a3c3f5a8f0 1225 switch (param)
nucleosam 0:00a3c3f5a8f0 1226 {
nucleosam 0:00a3c3f5a8f0 1227 case POWERSTEP01_ABS_POS: ;
nucleosam 0:00a3c3f5a8f0 1228 case POWERSTEP01_MARK:
nucleosam 0:00a3c3f5a8f0 1229 spiTxBursts[0][spiIndex] = ((uint8_t)POWERSTEP01_SET_PARAM )| (param);
nucleosam 0:00a3c3f5a8f0 1230 spiTxBursts[1][spiIndex] = (uint8_t)(value >> 16);
nucleosam 0:00a3c3f5a8f0 1231 spiTxBursts[2][spiIndex] = (uint8_t)(value >> 8);
nucleosam 0:00a3c3f5a8f0 1232 maxArgumentNbBytes = 3;
nucleosam 0:00a3c3f5a8f0 1233 break;
nucleosam 0:00a3c3f5a8f0 1234 case POWERSTEP01_EL_POS:
nucleosam 0:00a3c3f5a8f0 1235 case POWERSTEP01_ACC:
nucleosam 0:00a3c3f5a8f0 1236 case POWERSTEP01_DEC:
nucleosam 0:00a3c3f5a8f0 1237 case POWERSTEP01_MAX_SPEED:
nucleosam 0:00a3c3f5a8f0 1238 case POWERSTEP01_MIN_SPEED:
nucleosam 0:00a3c3f5a8f0 1239 case POWERSTEP01_FS_SPD:
nucleosam 0:00a3c3f5a8f0 1240 case POWERSTEP01_INT_SPD:
nucleosam 0:00a3c3f5a8f0 1241 case POWERSTEP01_CONFIG:
nucleosam 0:00a3c3f5a8f0 1242 case POWERSTEP01_GATECFG1:
nucleosam 0:00a3c3f5a8f0 1243 spiTxBursts[1][spiIndex] = ((uint8_t)POWERSTEP01_SET_PARAM )| (param);
nucleosam 0:00a3c3f5a8f0 1244 spiTxBursts[2][spiIndex] = (uint8_t)(value >> 8);
nucleosam 0:00a3c3f5a8f0 1245 maxArgumentNbBytes = 2;
nucleosam 0:00a3c3f5a8f0 1246 break;
nucleosam 0:00a3c3f5a8f0 1247 default:
nucleosam 0:00a3c3f5a8f0 1248 spiTxBursts[2][spiIndex] = ((uint8_t)POWERSTEP01_SET_PARAM )| (param);
nucleosam 0:00a3c3f5a8f0 1249 maxArgumentNbBytes = 1;
nucleosam 0:00a3c3f5a8f0 1250 }
nucleosam 0:00a3c3f5a8f0 1251 spiTxBursts[3][spiIndex] = (uint8_t)(value);
nucleosam 0:00a3c3f5a8f0 1252 /* Disable interruption before checking */
nucleosam 0:00a3c3f5a8f0 1253 /* pre-emption by ISR and SPI transfers*/
nucleosam 0:00a3c3f5a8f0 1254 Powerstep01_Board_DisableIrq();
nucleosam 0:00a3c3f5a8f0 1255 itDisable = TRUE;
nucleosam 0:00a3c3f5a8f0 1256 } while (spiPreemptionByIsr); // check pre-emption by ISR
nucleosam 0:00a3c3f5a8f0 1257 /* SPI transfer */
nucleosam 0:00a3c3f5a8f0 1258 for (loop = POWERSTEP01_CMD_ARG_MAX_NB_BYTES - 1 - maxArgumentNbBytes;
nucleosam 0:00a3c3f5a8f0 1259 loop < POWERSTEP01_CMD_ARG_MAX_NB_BYTES;
nucleosam 0:00a3c3f5a8f0 1260 loop++)
nucleosam 0:00a3c3f5a8f0 1261 {
nucleosam 0:00a3c3f5a8f0 1262 Powerstep01_WriteBytes(&spiTxBursts[loop][0],&spiRxBursts[loop][0]);
nucleosam 0:00a3c3f5a8f0 1263 }
nucleosam 0:00a3c3f5a8f0 1264 /* re-enable Powerstep01_Board_EnableIrq after SPI transfers*/
nucleosam 0:00a3c3f5a8f0 1265 Powerstep01_Board_EnableIrq();
nucleosam 0:00a3c3f5a8f0 1266 }
nucleosam 0:00a3c3f5a8f0 1267
nucleosam 0:00a3c3f5a8f0 1268 /**********************************************************
nucleosam 0:00a3c3f5a8f0 1269 * @brief Issues PowerStep01 Get Parameter command and convert the result to
nucleosam 0:00a3c3f5a8f0 1270 * float value
nucleosam 0:00a3c3f5a8f0 1271 * @param[in] param PowerStep01 register address
nucleosam 0:00a3c3f5a8f0 1272 * @retval The parameter's float value.
nucleosam 0:00a3c3f5a8f0 1273 *********************************************************/
nucleosam 0:00a3c3f5a8f0 1274 float POWERSTEP01::Powerstep01_GetAnalogValue(powerstep01_Registers_t param)
nucleosam 0:00a3c3f5a8f0 1275 {
nucleosam 0:00a3c3f5a8f0 1276 bool voltageMode = ((POWERSTEP01_CM_VM_CURRENT&Powerstep01_CmdGetParam(POWERSTEP01_STEP_MODE))==0);
nucleosam 0:00a3c3f5a8f0 1277 uint32_t registerValue = Powerstep01_CmdGetParam((powerstep01_Registers_t) param);
nucleosam 0:00a3c3f5a8f0 1278 float value;
nucleosam 0:00a3c3f5a8f0 1279 switch (param)
nucleosam 0:00a3c3f5a8f0 1280 {
nucleosam 0:00a3c3f5a8f0 1281 case POWERSTEP01_ABS_POS:
nucleosam 0:00a3c3f5a8f0 1282 case POWERSTEP01_MARK:
nucleosam 0:00a3c3f5a8f0 1283 value = (float) Powerstep01_ConvertPosition(registerValue);
nucleosam 0:00a3c3f5a8f0 1284 break;
nucleosam 0:00a3c3f5a8f0 1285 case POWERSTEP01_ACC:
nucleosam 0:00a3c3f5a8f0 1286 case POWERSTEP01_DEC:
nucleosam 0:00a3c3f5a8f0 1287 value = AccDec_RegVal_to_Steps_s2(registerValue);
nucleosam 0:00a3c3f5a8f0 1288 break;
nucleosam 0:00a3c3f5a8f0 1289 case POWERSTEP01_SPEED:
nucleosam 0:00a3c3f5a8f0 1290 value = Speed_RegVal_to_Steps_s(registerValue);
nucleosam 0:00a3c3f5a8f0 1291 break;
nucleosam 0:00a3c3f5a8f0 1292 case POWERSTEP01_MAX_SPEED:
nucleosam 0:00a3c3f5a8f0 1293 value = MaxSpd_RegVal_to_Steps_s(registerValue);
nucleosam 0:00a3c3f5a8f0 1294 break;
nucleosam 0:00a3c3f5a8f0 1295 case POWERSTEP01_MIN_SPEED:
nucleosam 0:00a3c3f5a8f0 1296 registerValue &= POWERSTEP01_MIN_SPEED_MASK;
nucleosam 0:00a3c3f5a8f0 1297 value = MinSpd_RegVal_to_Steps_s(registerValue);
nucleosam 0:00a3c3f5a8f0 1298 break;
nucleosam 0:00a3c3f5a8f0 1299 case POWERSTEP01_FS_SPD:
nucleosam 0:00a3c3f5a8f0 1300 registerValue &= POWERSTEP01_FS_SPD_MASK;
nucleosam 0:00a3c3f5a8f0 1301 value = FSSpd_RegVal_to_Steps_s(registerValue);
nucleosam 0:00a3c3f5a8f0 1302 break;
nucleosam 0:00a3c3f5a8f0 1303 case POWERSTEP01_INT_SPD:
nucleosam 0:00a3c3f5a8f0 1304 value = IntSpd_RegVal_to_Steps_s(registerValue);
nucleosam 0:00a3c3f5a8f0 1305 break;
nucleosam 0:00a3c3f5a8f0 1306 case POWERSTEP01_K_THERM:
nucleosam 0:00a3c3f5a8f0 1307 value = KTherm_RegVal_to_Comp(registerValue);
nucleosam 0:00a3c3f5a8f0 1308 break;
nucleosam 0:00a3c3f5a8f0 1309 case POWERSTEP01_OCD_TH:
nucleosam 0:00a3c3f5a8f0 1310 case POWERSTEP01_STALL_TH:
nucleosam 0:00a3c3f5a8f0 1311 value = StallOcd_RegVal_to_Th(registerValue);
nucleosam 0:00a3c3f5a8f0 1312 break;
nucleosam 0:00a3c3f5a8f0 1313 case POWERSTEP01_KVAL_HOLD: //POWERSTEP01_TVAL_HOLD
nucleosam 0:00a3c3f5a8f0 1314 case POWERSTEP01_KVAL_RUN: //POWERSTEP01_TVAL_RUN
nucleosam 0:00a3c3f5a8f0 1315 case POWERSTEP01_KVAL_ACC: //POWERSTEP01_TVAL_ACC
nucleosam 0:00a3c3f5a8f0 1316 case POWERSTEP01_KVAL_DEC: //POWERSTEP01_TVAL_DEC
nucleosam 0:00a3c3f5a8f0 1317 if (voltageMode!=FALSE) value = Kval_RegVal_to_Perc(registerValue);
nucleosam 0:00a3c3f5a8f0 1318 else value = Kval_RegVal_to_Perc(registerValue);
nucleosam 0:00a3c3f5a8f0 1319 break;
nucleosam 0:00a3c3f5a8f0 1320 case POWERSTEP01_ST_SLP:
nucleosam 0:00a3c3f5a8f0 1321 if (voltageMode==FALSE)
nucleosam 0:00a3c3f5a8f0 1322 {
nucleosam 0:00a3c3f5a8f0 1323 break;
nucleosam 0:00a3c3f5a8f0 1324 }
nucleosam 0:00a3c3f5a8f0 1325 case POWERSTEP01_FN_SLP_ACC: //POWERSTEP01_TON_MIN
nucleosam 0:00a3c3f5a8f0 1326 case POWERSTEP01_FN_SLP_DEC: //POWERSTEP01_TOFF_MIN
nucleosam 0:00a3c3f5a8f0 1327 if (voltageMode!=FALSE) value = BEMFslope_RegVal_to_Perc(registerValue);
nucleosam 0:00a3c3f5a8f0 1328 else value = Tmin_RegVal_to_Time(registerValue);
nucleosam 0:00a3c3f5a8f0 1329 break;
nucleosam 0:00a3c3f5a8f0 1330 default:
nucleosam 0:00a3c3f5a8f0 1331 value = (float) registerValue;
nucleosam 0:00a3c3f5a8f0 1332 }
nucleosam 0:00a3c3f5a8f0 1333 return value;
nucleosam 0:00a3c3f5a8f0 1334 }
nucleosam 0:00a3c3f5a8f0 1335
nucleosam 0:00a3c3f5a8f0 1336 /******************************************************//**
nucleosam 0:00a3c3f5a8f0 1337 * @brief Put commands in queue before synchronous sending
nucleosam 0:00a3c3f5a8f0 1338 * done by calling Powerstep01_SendQueuedCommands.
nucleosam 0:00a3c3f5a8f0 1339 * Any call to functions that use the SPI between the calls of
nucleosam 0:00a3c3f5a8f0 1340 * Powerstep01_QueueCommands and Powerstep01_SendQueuedCommands
nucleosam 0:00a3c3f5a8f0 1341 * will corrupt the queue.
nucleosam 0:00a3c3f5a8f0 1342 * A command for each device of the daisy chain must be
nucleosam 0:00a3c3f5a8f0 1343 * specified before calling Powerstep01_SendQueuedCommands.
nucleosam 0:00a3c3f5a8f0 1344 * @param[in] command Command to queue (all Powerstep01 commmands
nucleosam 0:00a3c3f5a8f0 1345 * except POWERSTEP01_SET_PARAM, POWERSTEP01_GET_PARAM,
nucleosam 0:00a3c3f5a8f0 1346 * POWERSTEP01_GET_STATUS)
nucleosam 0:00a3c3f5a8f0 1347 * @param[in] value argument of the command to queue
nucleosam 0:00a3c3f5a8f0 1348 * @retval None
nucleosam 0:00a3c3f5a8f0 1349 *********************************************************/
nucleosam 0:00a3c3f5a8f0 1350 void POWERSTEP01::Powerstep01_QueueCommands(uint8_t command, int32_t value)
nucleosam 0:00a3c3f5a8f0 1351 {
nucleosam 0:00a3c3f5a8f0 1352 if (numberOfDevices > deviceInstance)
nucleosam 0:00a3c3f5a8f0 1353 {
nucleosam 0:00a3c3f5a8f0 1354 uint8_t spiIndex = numberOfDevices - deviceInstance - 1;
nucleosam 0:00a3c3f5a8f0 1355
nucleosam 0:00a3c3f5a8f0 1356 switch (command & DAISY_CHAIN_COMMAND_MASK)
nucleosam 0:00a3c3f5a8f0 1357 {
nucleosam 0:00a3c3f5a8f0 1358 case POWERSTEP01_RUN: ;
nucleosam 0:00a3c3f5a8f0 1359 case POWERSTEP01_MOVE: ;
nucleosam 0:00a3c3f5a8f0 1360 case POWERSTEP01_GO_TO: ;
nucleosam 0:00a3c3f5a8f0 1361 case POWERSTEP01_GO_TO_DIR: ;
nucleosam 0:00a3c3f5a8f0 1362 case POWERSTEP01_GO_UNTIL: ;
nucleosam 0:00a3c3f5a8f0 1363 case POWERSTEP01_GO_UNTIL_ACT_CPY:
nucleosam 0:00a3c3f5a8f0 1364 spiTxBursts[0][spiIndex] = command;
nucleosam 0:00a3c3f5a8f0 1365 spiTxBursts[1][spiIndex] = (uint8_t)(value >> 16);
nucleosam 0:00a3c3f5a8f0 1366 spiTxBursts[2][spiIndex] = (uint8_t)(value >> 8);
nucleosam 0:00a3c3f5a8f0 1367 spiTxBursts[3][spiIndex] = (uint8_t)(value);
nucleosam 0:00a3c3f5a8f0 1368 break;
nucleosam 0:00a3c3f5a8f0 1369 default:
nucleosam 0:00a3c3f5a8f0 1370 spiTxBursts[0][spiIndex] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1371 spiTxBursts[1][spiIndex] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1372 spiTxBursts[2][spiIndex] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1373 spiTxBursts[3][spiIndex] = command;
nucleosam 0:00a3c3f5a8f0 1374 }
nucleosam 0:00a3c3f5a8f0 1375 }
nucleosam 0:00a3c3f5a8f0 1376 }
nucleosam 0:00a3c3f5a8f0 1377
nucleosam 0:00a3c3f5a8f0 1378 /**********************************************************
nucleosam 0:00a3c3f5a8f0 1379 * @brief Sends a command to the device via the SPI
nucleosam 0:00a3c3f5a8f0 1380 * @param[in] command Command to send (all Powerstep01 commmands
nucleosam 0:00a3c3f5a8f0 1381 * except POWERSTEP01_SET_PARAM, POWERSTEP01_GET_PARAM,
nucleosam 0:00a3c3f5a8f0 1382 * POWERSTEP01_GET_STATUS)
nucleosam 0:00a3c3f5a8f0 1383 * @param[in] value arguments to send on 32 bits
nucleosam 0:00a3c3f5a8f0 1384 * @retval None
nucleosam 0:00a3c3f5a8f0 1385 **********************************************************/
nucleosam 0:00a3c3f5a8f0 1386 void POWERSTEP01::Powerstep01_SendCommand(uint8_t command, uint32_t value)
nucleosam 0:00a3c3f5a8f0 1387 {
nucleosam 0:00a3c3f5a8f0 1388 uint32_t loop;
nucleosam 0:00a3c3f5a8f0 1389 uint8_t maxArgumentNbBytes = 0;
nucleosam 0:00a3c3f5a8f0 1390 bool itDisable = FALSE;
nucleosam 0:00a3c3f5a8f0 1391 uint8_t spiIndex = numberOfDevices - deviceInstance - 1;
nucleosam 0:00a3c3f5a8f0 1392
nucleosam 0:00a3c3f5a8f0 1393 do
nucleosam 0:00a3c3f5a8f0 1394 {
nucleosam 0:00a3c3f5a8f0 1395 spiPreemptionByIsr = FALSE;
nucleosam 0:00a3c3f5a8f0 1396 if (itDisable)
nucleosam 0:00a3c3f5a8f0 1397 {
nucleosam 0:00a3c3f5a8f0 1398 /* re-enable Powerstep01_Board_EnableIrq if disable in previous iteration */
nucleosam 0:00a3c3f5a8f0 1399 Powerstep01_Board_EnableIrq();
nucleosam 0:00a3c3f5a8f0 1400 itDisable = FALSE;
nucleosam 0:00a3c3f5a8f0 1401 }
nucleosam 0:00a3c3f5a8f0 1402 for (loop = 0; loop < numberOfDevices; loop++)
nucleosam 0:00a3c3f5a8f0 1403 {
nucleosam 0:00a3c3f5a8f0 1404 spiTxBursts[0][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1405 spiTxBursts[1][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1406 spiTxBursts[2][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1407 spiTxBursts[3][loop] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1408 }
nucleosam 0:00a3c3f5a8f0 1409 switch (command & DAISY_CHAIN_COMMAND_MASK)
nucleosam 0:00a3c3f5a8f0 1410 {
nucleosam 0:00a3c3f5a8f0 1411 case POWERSTEP01_GO_TO:
nucleosam 0:00a3c3f5a8f0 1412 case POWERSTEP01_GO_TO_DIR:
nucleosam 0:00a3c3f5a8f0 1413 value = value & POWERSTEP01_ABS_POS_VALUE_MASK;
nucleosam 0:00a3c3f5a8f0 1414 case POWERSTEP01_RUN:
nucleosam 0:00a3c3f5a8f0 1415 case POWERSTEP01_MOVE:
nucleosam 0:00a3c3f5a8f0 1416 case POWERSTEP01_GO_UNTIL:
nucleosam 0:00a3c3f5a8f0 1417 case POWERSTEP01_GO_UNTIL_ACT_CPY:
nucleosam 0:00a3c3f5a8f0 1418 spiTxBursts[0][spiIndex] = command;
nucleosam 0:00a3c3f5a8f0 1419 spiTxBursts[1][spiIndex] = (uint8_t)(value >> 16);
nucleosam 0:00a3c3f5a8f0 1420 spiTxBursts[2][spiIndex] = (uint8_t)(value >> 8);
nucleosam 0:00a3c3f5a8f0 1421 spiTxBursts[3][spiIndex] = (uint8_t)(value);
nucleosam 0:00a3c3f5a8f0 1422 maxArgumentNbBytes = 3;
nucleosam 0:00a3c3f5a8f0 1423 break;
nucleosam 0:00a3c3f5a8f0 1424 default:
nucleosam 0:00a3c3f5a8f0 1425 spiTxBursts[0][spiIndex] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1426 spiTxBursts[1][spiIndex] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1427 spiTxBursts[2][spiIndex] = POWERSTEP01_NOP;
nucleosam 0:00a3c3f5a8f0 1428 spiTxBursts[3][spiIndex] = command;
nucleosam 0:00a3c3f5a8f0 1429 }
nucleosam 0:00a3c3f5a8f0 1430 /* Disable interruption before checking */
nucleosam 0:00a3c3f5a8f0 1431 /* pre-emption by ISR and SPI transfers*/
nucleosam 0:00a3c3f5a8f0 1432 Powerstep01_Board_DisableIrq();
nucleosam 0:00a3c3f5a8f0 1433 itDisable = TRUE;
nucleosam 0:00a3c3f5a8f0 1434 } while (spiPreemptionByIsr); // check pre-emption by ISR
nucleosam 0:00a3c3f5a8f0 1435 for (loop = POWERSTEP01_CMD_ARG_MAX_NB_BYTES - 1 - maxArgumentNbBytes;
nucleosam 0:00a3c3f5a8f0 1436 loop < POWERSTEP01_CMD_ARG_MAX_NB_BYTES;
nucleosam 0:00a3c3f5a8f0 1437 loop++)
nucleosam 0:00a3c3f5a8f0 1438 {
nucleosam 0:00a3c3f5a8f0 1439 Powerstep01_WriteBytes(&spiTxBursts[loop][0], &spiRxBursts[loop][0]);
nucleosam 0:00a3c3f5a8f0 1440 }
nucleosam 0:00a3c3f5a8f0 1441 /* re-enable Powerstep01_Board_EnableIrq after SPI transfers*/
nucleosam 0:00a3c3f5a8f0 1442 Powerstep01_Board_EnableIrq();
nucleosam 0:00a3c3f5a8f0 1443 }
nucleosam 0:00a3c3f5a8f0 1444
nucleosam 0:00a3c3f5a8f0 1445 /******************************************************//**
nucleosam 0:00a3c3f5a8f0 1446 * @brief Sends commands stored previously in the queue by
nucleosam 0:00a3c3f5a8f0 1447 * Powerstep01_QueueCommands
nucleosam 0:00a3c3f5a8f0 1448 * @retval None
nucleosam 0:00a3c3f5a8f0 1449 *********************************************************/
nucleosam 0:00a3c3f5a8f0 1450 void POWERSTEP01::Powerstep01_SendQueuedCommands(void)
nucleosam 0:00a3c3f5a8f0 1451 {
nucleosam 0:00a3c3f5a8f0 1452 uint8_t loop;
nucleosam 0:00a3c3f5a8f0 1453
nucleosam 0:00a3c3f5a8f0 1454 for (loop = 0;
nucleosam 0:00a3c3f5a8f0 1455 loop < POWERSTEP01_CMD_ARG_MAX_NB_BYTES;
nucleosam 0:00a3c3f5a8f0 1456 loop++)
nucleosam 0:00a3c3f5a8f0 1457 {
nucleosam 0:00a3c3f5a8f0 1458 Powerstep01_WriteBytes(&spiTxBursts[loop][0], &spiRxBursts[loop][0]);
nucleosam 0:00a3c3f5a8f0 1459 }
nucleosam 0:00a3c3f5a8f0 1460 }
nucleosam 0:00a3c3f5a8f0 1461
nucleosam 0:00a3c3f5a8f0 1462 /**********************************************************
nucleosam 0:00a3c3f5a8f0 1463 * @brief Issues the SetParam command to the PowerStep01
nucleosam 0:00a3c3f5a8f0 1464 * @param[in] param PowerStep01 Register address
nucleosam 0:00a3c3f5a8f0 1465 * @param[in] value Float value to convert and set into the register
nucleosam 0:00a3c3f5a8f0 1466 * @retval TRUE if param is valid, FALSE otherwise
nucleosam 0:00a3c3f5a8f0 1467 *********************************************************/
nucleosam 0:00a3c3f5a8f0 1468 bool POWERSTEP01::Powerstep01_SetAnalogValue(powerstep01_Registers_t param, float value)
nucleosam 0:00a3c3f5a8f0 1469 {
nucleosam 0:00a3c3f5a8f0 1470 uint32_t registerValue;
nucleosam 0:00a3c3f5a8f0 1471 bool result = TRUE;
nucleosam 0:00a3c3f5a8f0 1472 bool voltageMode = ((POWERSTEP01_CM_VM_CURRENT&Powerstep01_CmdGetParam(POWERSTEP01_STEP_MODE))==0);
nucleosam 0:00a3c3f5a8f0 1473 if ((value < 0)&&((param != POWERSTEP01_ABS_POS)&&(param != POWERSTEP01_MARK)))
nucleosam 0:00a3c3f5a8f0 1474 {
nucleosam 0:00a3c3f5a8f0 1475 result = FALSE;
nucleosam 0:00a3c3f5a8f0 1476 }
nucleosam 0:00a3c3f5a8f0 1477 switch (param)
nucleosam 0:00a3c3f5a8f0 1478 {
nucleosam 0:00a3c3f5a8f0 1479 case POWERSTEP01_EL_POS:
nucleosam 0:00a3c3f5a8f0 1480 if ((value > (POWERSTEP01_ELPOS_STEP_MASK|POWERSTEP01_ELPOS_MICROSTEP_MASK))||
nucleosam 0:00a3c3f5a8f0 1481 ((value!=0)&&(value < (1<<(7-(POWERSTEP01_STEP_MODE_STEP_SEL&Powerstep01_CmdGetParam(POWERSTEP01_STEP_MODE))))))) result = FALSE;
nucleosam 0:00a3c3f5a8f0 1482 else registerValue = ((uint32_t) value)&(POWERSTEP01_ELPOS_STEP_MASK|POWERSTEP01_ELPOS_MICROSTEP_MASK);
nucleosam 0:00a3c3f5a8f0 1483 break;
nucleosam 0:00a3c3f5a8f0 1484 case POWERSTEP01_ABS_POS:
nucleosam 0:00a3c3f5a8f0 1485 case POWERSTEP01_MARK:
nucleosam 0:00a3c3f5a8f0 1486 if (value < 0)
nucleosam 0:00a3c3f5a8f0 1487 {
nucleosam 0:00a3c3f5a8f0 1488 value=-value;
nucleosam 0:00a3c3f5a8f0 1489 if (((uint32_t)value)<=(POWERSTEP01_MAX_POSITION+1))
nucleosam 0:00a3c3f5a8f0 1490 registerValue = (POWERSTEP01_ABS_POS_VALUE_MASK+1-(uint32_t)value)&POWERSTEP01_ABS_POS_VALUE_MASK;
nucleosam 0:00a3c3f5a8f0 1491 else result = FALSE;
nucleosam 0:00a3c3f5a8f0 1492 }
nucleosam 0:00a3c3f5a8f0 1493 else
nucleosam 0:00a3c3f5a8f0 1494 {
nucleosam 0:00a3c3f5a8f0 1495 if (((uint32_t)value)<=POWERSTEP01_MAX_POSITION)
nucleosam 0:00a3c3f5a8f0 1496 registerValue = ((uint32_t) value)&POWERSTEP01_ABS_POS_VALUE_MASK;
nucleosam 0:00a3c3f5a8f0 1497 else result = FALSE;
nucleosam 0:00a3c3f5a8f0 1498 }
nucleosam 0:00a3c3f5a8f0 1499 break;
nucleosam 0:00a3c3f5a8f0 1500 case POWERSTEP01_ACC:
nucleosam 0:00a3c3f5a8f0 1501 case POWERSTEP01_DEC:
nucleosam 0:00a3c3f5a8f0 1502 if (value > POWERSTEP01_ACC_DEC_MAX_VALUE) result = FALSE;
nucleosam 0:00a3c3f5a8f0 1503 else registerValue = AccDec_Steps_s2_to_RegVal(value);
nucleosam 0:00a3c3f5a8f0 1504 break;
nucleosam 0:00a3c3f5a8f0 1505 case POWERSTEP01_MAX_SPEED:
nucleosam 0:00a3c3f5a8f0 1506 if (value > POWERSTEP01_MAX_SPEED_MAX_VALUE) result = FALSE;
nucleosam 0:00a3c3f5a8f0 1507 else registerValue = MaxSpd_Steps_s_to_RegVal(value);
nucleosam 0:00a3c3f5a8f0 1508 break;
nucleosam 0:00a3c3f5a8f0 1509 case POWERSTEP01_MIN_SPEED:
nucleosam 0:00a3c3f5a8f0 1510 if (value > POWERSTEP01_MIN_SPEED_MAX_VALUE) result = FALSE;
nucleosam 0:00a3c3f5a8f0 1511 else registerValue = (POWERSTEP01_LSPD_OPT&Powerstep01_CmdGetParam(param))|MinSpd_Steps_s_to_RegVal(value);
nucleosam 0:00a3c3f5a8f0 1512 break;
nucleosam 0:00a3c3f5a8f0 1513 case POWERSTEP01_FS_SPD:
nucleosam 0:00a3c3f5a8f0 1514 if (value > POWERSTEP01_FS_SPD_MAX_VALUE) result = FALSE;
nucleosam 0:00a3c3f5a8f0 1515 else registerValue = (POWERSTEP01_BOOST_MODE&Powerstep01_CmdGetParam(param))|FSSpd_Steps_s_to_RegVal(value);
nucleosam 0:00a3c3f5a8f0 1516 break;
nucleosam 0:00a3c3f5a8f0 1517 case POWERSTEP01_INT_SPD:
nucleosam 0:00a3c3f5a8f0 1518 if (value > POWERSTEP01_INT_SPD_MAX_VALUE) result = FALSE;
nucleosam 0:00a3c3f5a8f0 1519 else registerValue = IntSpd_Steps_s_to_RegVal(value);
nucleosam 0:00a3c3f5a8f0 1520 break;
nucleosam 0:00a3c3f5a8f0 1521 case POWERSTEP01_K_THERM:
nucleosam 0:00a3c3f5a8f0 1522 if ((value < POWERSTEP01_K_THERM_MIN_VALUE)||
nucleosam 0:00a3c3f5a8f0 1523 (value > POWERSTEP01_K_THERM_MAX_VALUE)) result = FALSE;
nucleosam 0:00a3c3f5a8f0 1524 else registerValue = KTherm_Comp_to_RegVal(value);
nucleosam 0:00a3c3f5a8f0 1525 break;
nucleosam 0:00a3c3f5a8f0 1526 case POWERSTEP01_OCD_TH:
nucleosam 0:00a3c3f5a8f0 1527 case POWERSTEP01_STALL_TH:
nucleosam 0:00a3c3f5a8f0 1528 if (value > POWERSTEP01_STALL_OCD_TH_MAX_VALUE) result = FALSE;
nucleosam 0:00a3c3f5a8f0 1529 else registerValue = StallOcd_Th_to_RegVal(value);
nucleosam 0:00a3c3f5a8f0 1530 break;
nucleosam 0:00a3c3f5a8f0 1531 case POWERSTEP01_KVAL_HOLD: //POWERSTEP01_TVAL_HOLD
nucleosam 0:00a3c3f5a8f0 1532 case POWERSTEP01_KVAL_RUN: //POWERSTEP01_TVAL_RUN
nucleosam 0:00a3c3f5a8f0 1533 case POWERSTEP01_KVAL_ACC: //POWERSTEP01_TVAL_ACC
nucleosam 0:00a3c3f5a8f0 1534 case POWERSTEP01_KVAL_DEC: //POWERSTEP01_TVAL_DEC
nucleosam 0:00a3c3f5a8f0 1535 if (voltageMode==FALSE)
nucleosam 0:00a3c3f5a8f0 1536 {
nucleosam 0:00a3c3f5a8f0 1537 if (value > POWERSTEP01_TVAL_MAX_VALUE) result = FALSE;
nucleosam 0:00a3c3f5a8f0 1538 else registerValue = Tval_Current_to_RegVal(value);
nucleosam 0:00a3c3f5a8f0 1539 }
nucleosam 0:00a3c3f5a8f0 1540 else
nucleosam 0:00a3c3f5a8f0 1541 {
nucleosam 0:00a3c3f5a8f0 1542 if (value > POWERSTEP01_KVAL_MAX_VALUE) result = FALSE;
nucleosam 0:00a3c3f5a8f0 1543 else registerValue = Kval_Perc_to_RegVal(value);
nucleosam 0:00a3c3f5a8f0 1544 }
nucleosam 0:00a3c3f5a8f0 1545 break;
nucleosam 0:00a3c3f5a8f0 1546 case POWERSTEP01_ST_SLP:
nucleosam 0:00a3c3f5a8f0 1547 if (voltageMode==FALSE)
nucleosam 0:00a3c3f5a8f0 1548 {
nucleosam 0:00a3c3f5a8f0 1549 result = FALSE;
nucleosam 0:00a3c3f5a8f0 1550 break;
nucleosam 0:00a3c3f5a8f0 1551 }
nucleosam 0:00a3c3f5a8f0 1552 case POWERSTEP01_FN_SLP_ACC: //POWERSTEP01_TON_MIN
nucleosam 0:00a3c3f5a8f0 1553 case POWERSTEP01_FN_SLP_DEC: //POWERSTEP01_TOFF_MIN
nucleosam 0:00a3c3f5a8f0 1554 if (voltageMode==FALSE)
nucleosam 0:00a3c3f5a8f0 1555 {
nucleosam 0:00a3c3f5a8f0 1556 if (value>POWERSTEP01_TOFF_TON_MIN_MAX_VALUE) result = FALSE;
nucleosam 0:00a3c3f5a8f0 1557 else registerValue = Tmin_Time_to_RegVal(value);
nucleosam 0:00a3c3f5a8f0 1558 }
nucleosam 0:00a3c3f5a8f0 1559 else
nucleosam 0:00a3c3f5a8f0 1560 {
nucleosam 0:00a3c3f5a8f0 1561 if (value > POWERSTEP01_SLP_MAX_VALUE) result = FALSE;
nucleosam 0:00a3c3f5a8f0 1562 else registerValue = BEMFslope_Perc_to_RegVal(value);
nucleosam 0:00a3c3f5a8f0 1563 }
nucleosam 0:00a3c3f5a8f0 1564 break;
nucleosam 0:00a3c3f5a8f0 1565 default:
nucleosam 0:00a3c3f5a8f0 1566 result = FALSE;
nucleosam 0:00a3c3f5a8f0 1567 }
nucleosam 0:00a3c3f5a8f0 1568 if (result!=FALSE)
nucleosam 0:00a3c3f5a8f0 1569 {
nucleosam 0:00a3c3f5a8f0 1570 Powerstep01_CmdSetParam(param, registerValue);
nucleosam 0:00a3c3f5a8f0 1571 }
nucleosam 0:00a3c3f5a8f0 1572 return result;
nucleosam 0:00a3c3f5a8f0 1573 }
nucleosam 0:00a3c3f5a8f0 1574
nucleosam 0:00a3c3f5a8f0 1575 /**********************************************************
nucleosam 0:00a3c3f5a8f0 1576 * @brief Write and receive a byte via SPI
nucleosam 0:00a3c3f5a8f0 1577 * @param[in] pByteToTransmit pointer to the byte to transmit
nucleosam 0:00a3c3f5a8f0 1578 * @param[in] pReceivedByte pointer to the received byte
nucleosam 0:00a3c3f5a8f0 1579 * @retval None
nucleosam 0:00a3c3f5a8f0 1580 *********************************************************/
nucleosam 0:00a3c3f5a8f0 1581 void POWERSTEP01::Powerstep01_WriteBytes(uint8_t *pByteToTransmit, uint8_t *pReceivedByte)
nucleosam 0:00a3c3f5a8f0 1582 {
nucleosam 0:00a3c3f5a8f0 1583 if (Powerstep01_Board_SpiWriteBytes(pByteToTransmit, pReceivedByte) != 0)
nucleosam 0:00a3c3f5a8f0 1584 {
nucleosam 0:00a3c3f5a8f0 1585 Powerstep01_ErrorHandler(POWERSTEP01_ERROR_1);
nucleosam 0:00a3c3f5a8f0 1586 }
nucleosam 0:00a3c3f5a8f0 1587 if (isrFlag)
nucleosam 0:00a3c3f5a8f0 1588 {
nucleosam 0:00a3c3f5a8f0 1589 spiPreemptionByIsr = TRUE;
nucleosam 0:00a3c3f5a8f0 1590 }
nucleosam 0:00a3c3f5a8f0 1591 }
nucleosam 0:00a3c3f5a8f0 1592
nucleosam 0:00a3c3f5a8f0 1593 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/