Motion control example for 1 motor.

Dependencies:   X_NUCLEO_IHM03A1 mbed

Fork of IHM03A1_ExampleFor1Motor by ST Expansion SW Team

This application provides an example of usage of the X-NUCLEO-IHM03A1 High Power Stepper Motor Control Expansion Board.

It shows how to use one stepper motor connected to the board by:

  • moving the rotor a specific number of steps or to a specific position, with a given speed value, direction of rotation;
  • monitoring the motor status;
  • handling an interrupt triggered by the motor driver;
  • getting and setting a motor driver parameter.
  • etc.

For the hardware configuration of the expansion board, please refer to the X_NUCLEO_IHM03A1 home web page.

Committer:
nucleosam
Date:
Tue Apr 05 15:40:30 2016 +0000
Revision:
0:cd62cd5b2c77
Child:
1:6b179be4937e
Motion control example for 1 motor: initial version.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nucleosam 0:cd62cd5b2c77 1 /**
nucleosam 0:cd62cd5b2c77 2 ******************************************************************************
nucleosam 0:cd62cd5b2c77 3 * @file main.cpp
nucleosam 0:cd62cd5b2c77 4 * @author IPC Rennes
nucleosam 0:cd62cd5b2c77 5 * @version V1.0.0
nucleosam 0:cd62cd5b2c77 6 * @date March 18th, 2016
nucleosam 0:cd62cd5b2c77 7 * @brief mbed test application for the STMicroelectronics X-NUCLEO-IHM03A1
nucleosam 0:cd62cd5b2c77 8 * Motor Control Expansion Board: control of 1 motor.
nucleosam 0:cd62cd5b2c77 9 ******************************************************************************
nucleosam 0:cd62cd5b2c77 10 * @attention
nucleosam 0:cd62cd5b2c77 11 *
nucleosam 0:cd62cd5b2c77 12 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
nucleosam 0:cd62cd5b2c77 13 *
nucleosam 0:cd62cd5b2c77 14 * Redistribution and use in source and binary forms, with or without modification,
nucleosam 0:cd62cd5b2c77 15 * are permitted provided that the following conditions are met:
nucleosam 0:cd62cd5b2c77 16 * 1. Redistributions of source code must retain the above copyright notice,
nucleosam 0:cd62cd5b2c77 17 * this list of conditions and the following disclaimer.
nucleosam 0:cd62cd5b2c77 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
nucleosam 0:cd62cd5b2c77 19 * this list of conditions and the following disclaimer in the documentation
nucleosam 0:cd62cd5b2c77 20 * and/or other materials provided with the distribution.
nucleosam 0:cd62cd5b2c77 21 * 3. Neither the name of STMicroelectronics nor the names of its contributors
nucleosam 0:cd62cd5b2c77 22 * may be used to endorse or promote products derived from this software
nucleosam 0:cd62cd5b2c77 23 * without specific prior written permission.
nucleosam 0:cd62cd5b2c77 24 *
nucleosam 0:cd62cd5b2c77 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
nucleosam 0:cd62cd5b2c77 26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
nucleosam 0:cd62cd5b2c77 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
nucleosam 0:cd62cd5b2c77 28 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
nucleosam 0:cd62cd5b2c77 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
nucleosam 0:cd62cd5b2c77 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
nucleosam 0:cd62cd5b2c77 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
nucleosam 0:cd62cd5b2c77 32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
nucleosam 0:cd62cd5b2c77 33 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
nucleosam 0:cd62cd5b2c77 34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
nucleosam 0:cd62cd5b2c77 35 *
nucleosam 0:cd62cd5b2c77 36 ******************************************************************************
nucleosam 0:cd62cd5b2c77 37 */
nucleosam 0:cd62cd5b2c77 38
nucleosam 0:cd62cd5b2c77 39
nucleosam 0:cd62cd5b2c77 40 /* Includes ------------------------------------------------------------------*/
nucleosam 0:cd62cd5b2c77 41
nucleosam 0:cd62cd5b2c77 42 /* mbed specific header files. */
nucleosam 0:cd62cd5b2c77 43 #include "mbed.h"
nucleosam 0:cd62cd5b2c77 44
nucleosam 0:cd62cd5b2c77 45 /* Helper header files. */
nucleosam 0:cd62cd5b2c77 46 #include "DevSPI.h"
nucleosam 0:cd62cd5b2c77 47
nucleosam 0:cd62cd5b2c77 48 /* Component specific header files. */
nucleosam 0:cd62cd5b2c77 49 #include "powerstep01_class.h"
nucleosam 0:cd62cd5b2c77 50
nucleosam 0:cd62cd5b2c77 51 /* Variables -----------------------------------------------------------------*/
nucleosam 0:cd62cd5b2c77 52
nucleosam 0:cd62cd5b2c77 53 /* Initialization parameters of the motor connected to the expansion board. */
nucleosam 0:cd62cd5b2c77 54 /* Current mode. */
nucleosam 0:cd62cd5b2c77 55 powerstep01_Init_u_t initDeviceParameters =
nucleosam 0:cd62cd5b2c77 56 {
nucleosam 0:cd62cd5b2c77 57 /* common parameters */
nucleosam 0:cd62cd5b2c77 58 .cm.cp.cmVmSelection = POWERSTEP01_CM_VM_CURRENT, // enum powerstep01_CmVm_t
nucleosam 0:cd62cd5b2c77 59 582, // Acceleration rate in step/s2, range 14.55 to 59590 steps/s^2
nucleosam 0:cd62cd5b2c77 60 582, // Deceleration rate in step/s2, range 14.55 to 59590 steps/s^2
nucleosam 0:cd62cd5b2c77 61 488, // Maximum speed in step/s, range 15.25 to 15610 steps/s
nucleosam 0:cd62cd5b2c77 62 0, // Minimum speed in step/s, range 0 to 976.3 steps/s
nucleosam 0:cd62cd5b2c77 63 POWERSTEP01_LSPD_OPT_OFF, // Low speed optimization bit, enum powerstep01_LspdOpt_t
nucleosam 0:cd62cd5b2c77 64 244.16, // Full step speed in step/s, range 7.63 to 15625 steps/s
nucleosam 0:cd62cd5b2c77 65 POWERSTEP01_BOOST_MODE_OFF, // Boost of the amplitude square wave, enum powerstep01_BoostMode_t
nucleosam 0:cd62cd5b2c77 66 281.25, // Overcurrent threshold settings via enum powerstep01_OcdTh_t
nucleosam 0:cd62cd5b2c77 67 STEP_MODE_1_16, // Step mode settings via enum motorStepMode_t
nucleosam 0:cd62cd5b2c77 68 POWERSTEP01_SYNC_SEL_DISABLED, // Synch. Mode settings via enum powerstep01_SyncSel_t
nucleosam 0:cd62cd5b2c77 69 (POWERSTEP01_ALARM_EN_OVERCURRENT|
nucleosam 0:cd62cd5b2c77 70 POWERSTEP01_ALARM_EN_THERMAL_SHUTDOWN|
nucleosam 0:cd62cd5b2c77 71 POWERSTEP01_ALARM_EN_THERMAL_WARNING|
nucleosam 0:cd62cd5b2c77 72 POWERSTEP01_ALARM_EN_UVLO|
nucleosam 0:cd62cd5b2c77 73 POWERSTEP01_ALARM_EN_STALL_DETECTION|
nucleosam 0:cd62cd5b2c77 74 POWERSTEP01_ALARM_EN_SW_TURN_ON|
nucleosam 0:cd62cd5b2c77 75 POWERSTEP01_ALARM_EN_WRONG_NPERF_CMD), // Alarm settings via bitmap enum powerstep01_AlarmEn_t
nucleosam 0:cd62cd5b2c77 76 POWERSTEP01_IGATE_64mA, // Gate sink/source current via enum powerstep01_Igate_t
nucleosam 0:cd62cd5b2c77 77 POWERSTEP01_TBOOST_0ns, // Duration of the overboost phase during gate turn-off via enum powerstep01_Tboost_t
nucleosam 0:cd62cd5b2c77 78 POWERSTEP01_TCC_500ns, // Controlled current time via enum powerstep01_Tcc_t
nucleosam 0:cd62cd5b2c77 79 POWERSTEP01_WD_EN_DISABLE, // External clock watchdog, enum powerstep01_WdEn_t
nucleosam 0:cd62cd5b2c77 80 POWERSTEP01_TBLANK_375ns, // Duration of the blanking time via enum powerstep01_TBlank_t
nucleosam 0:cd62cd5b2c77 81 POWERSTEP01_TDT_125ns, // Duration of the dead time via enum powerstep01_Tdt_t
nucleosam 0:cd62cd5b2c77 82 /* current mode parameters */
nucleosam 0:cd62cd5b2c77 83 328.12, // Hold torque in mV, range from 7.8mV to 1000 mV
nucleosam 0:cd62cd5b2c77 84 328.12, // Running torque in mV, range from 7.8mV to 1000 mV
nucleosam 0:cd62cd5b2c77 85 328.12, // Acceleration torque in mV, range from 7.8mV to 1000 mV
nucleosam 0:cd62cd5b2c77 86 328.12, // Deceleration torque in mV, range from 7.8mV to 1000 mV
nucleosam 0:cd62cd5b2c77 87 POWERSTEP01_TOFF_FAST_8us, //Maximum fast decay time , enum powerstep01_ToffFast_t
nucleosam 0:cd62cd5b2c77 88 POWERSTEP01_FAST_STEP_12us, //Maximum fall step time , enum powerstep01_FastStep_t
nucleosam 0:cd62cd5b2c77 89 3.0, // Minimum on-time in us, range 0.5us to 64us
nucleosam 0:cd62cd5b2c77 90 21.0, // Minimum off-time in us, range 0.5us to 64us
nucleosam 0:cd62cd5b2c77 91 POWERSTEP01_CONFIG_INT_16MHZ_OSCOUT_2MHZ, // Clock setting , enum powerstep01_ConfigOscMgmt_t
nucleosam 0:cd62cd5b2c77 92 POWERSTEP01_CONFIG_SW_HARD_STOP, // External switch hard stop interrupt mode, enum powerstep01_ConfigSwMode_t
nucleosam 0:cd62cd5b2c77 93 POWERSTEP01_CONFIG_TQ_REG_TVAL_USED, // External torque regulation enabling , enum powerstep01_ConfigEnTqReg_t
nucleosam 0:cd62cd5b2c77 94 POWERSTEP01_CONFIG_VS_COMP_DISABLE, // Motor Supply Voltage Compensation enabling , enum powerstep01_ConfigEnVscomp_t
nucleosam 0:cd62cd5b2c77 95 POWERSTEP01_CONFIG_OC_SD_DISABLE, // Over current shutwdown enabling, enum powerstep01_ConfigOcSd_t
nucleosam 0:cd62cd5b2c77 96 POWERSTEP01_CONFIG_UVLOVAL_LOW, // UVLO Threshold via powerstep01_ConfigUvLoVal_t
nucleosam 0:cd62cd5b2c77 97 POWERSTEP01_CONFIG_VCCVAL_15V, // VCC Val, enum powerstep01_ConfigVccVal_t
nucleosam 0:cd62cd5b2c77 98 POWERSTEP01_CONFIG_TSW_048us, // Switching period, enum powerstep01_ConfigTsw_t
nucleosam 0:cd62cd5b2c77 99 POWERSTEP01_CONFIG_PRED_DISABLE, // Predictive current enabling , enum powerstep01_ConfigPredEn_t
nucleosam 0:cd62cd5b2c77 100 };
nucleosam 0:cd62cd5b2c77 101
nucleosam 0:cd62cd5b2c77 102 /* Motor Control Component. */
nucleosam 0:cd62cd5b2c77 103 POWERSTEP01 *motor;
nucleosam 0:cd62cd5b2c77 104
nucleosam 0:cd62cd5b2c77 105
nucleosam 0:cd62cd5b2c77 106 /* Functions -----------------------------------------------------------------*/
nucleosam 0:cd62cd5b2c77 107
nucleosam 0:cd62cd5b2c77 108 /**
nucleosam 0:cd62cd5b2c77 109 * @brief This is an example of user handler for the flag interrupt.
nucleosam 0:cd62cd5b2c77 110 * @param None
nucleosam 0:cd62cd5b2c77 111 * @retval None
nucleosam 0:cd62cd5b2c77 112 * @note If needed, implement it, and then attach and enable it:
nucleosam 0:cd62cd5b2c77 113 * + motor->AttachFlagIRQ(&FlagIRQHandler);
nucleosam 0:cd62cd5b2c77 114 * + motor->EnableFlagIRQ();
nucleosam 0:cd62cd5b2c77 115 * To disable it:
nucleosam 0:cd62cd5b2c77 116 * + motor->DisbleFlagIRQ();
nucleosam 0:cd62cd5b2c77 117 */
nucleosam 0:cd62cd5b2c77 118 void myFlagIRQHandler(void)
nucleosam 0:cd62cd5b2c77 119 {
nucleosam 0:cd62cd5b2c77 120 /* Set ISR flag. */
nucleosam 0:cd62cd5b2c77 121 motor->isrFlag = TRUE;
nucleosam 0:cd62cd5b2c77 122
nucleosam 0:cd62cd5b2c77 123 /* Get the value of the status register. */
nucleosam 0:cd62cd5b2c77 124 unsigned int statusRegister = motor->GetStatus();
nucleosam 0:cd62cd5b2c77 125
nucleosam 0:cd62cd5b2c77 126 /* Check HIZ flag: if set, power brigdes are disabled */
nucleosam 0:cd62cd5b2c77 127 if ((statusRegister & POWERSTEP01_STATUS_HIZ)==POWERSTEP01_STATUS_HIZ)
nucleosam 0:cd62cd5b2c77 128 {
nucleosam 0:cd62cd5b2c77 129 // HIZ state
nucleosam 0:cd62cd5b2c77 130 printf(" WARNING: \"FLAG\" interrupt triggered. HiZ state.\r\n");
nucleosam 0:cd62cd5b2c77 131 }
nucleosam 0:cd62cd5b2c77 132 /* Check BUSY flag: if not set, a command is under execution */
nucleosam 0:cd62cd5b2c77 133 if ((statusRegister & POWERSTEP01_STATUS_BUSY)==0)
nucleosam 0:cd62cd5b2c77 134 {
nucleosam 0:cd62cd5b2c77 135 // BUSY
nucleosam 0:cd62cd5b2c77 136 }
nucleosam 0:cd62cd5b2c77 137 /* Check SW_F flag: if not set, the SW input is opened */
nucleosam 0:cd62cd5b2c77 138 if ((statusRegister & POWERSTEP01_STATUS_SW_F )==0)
nucleosam 0:cd62cd5b2c77 139 {
nucleosam 0:cd62cd5b2c77 140 // SW OPEN
nucleosam 0:cd62cd5b2c77 141 }
nucleosam 0:cd62cd5b2c77 142 else
nucleosam 0:cd62cd5b2c77 143 {
nucleosam 0:cd62cd5b2c77 144 // SW CLOSED
nucleosam 0:cd62cd5b2c77 145 }
nucleosam 0:cd62cd5b2c77 146 /* Check SW_EN bit */
nucleosam 0:cd62cd5b2c77 147 if ((statusRegister & POWERSTEP01_STATUS_SW_EVN)==POWERSTEP01_STATUS_SW_EVN)
nucleosam 0:cd62cd5b2c77 148 {
nucleosam 0:cd62cd5b2c77 149 // switch turn_on event
nucleosam 0:cd62cd5b2c77 150 }
nucleosam 0:cd62cd5b2c77 151 /* Check direction bit */
nucleosam 0:cd62cd5b2c77 152 if ((statusRegister & POWERSTEP01_STATUS_DIR)==0)
nucleosam 0:cd62cd5b2c77 153 {
nucleosam 0:cd62cd5b2c77 154 // BACKWARD
nucleosam 0:cd62cd5b2c77 155 }
nucleosam 0:cd62cd5b2c77 156 else
nucleosam 0:cd62cd5b2c77 157 {
nucleosam 0:cd62cd5b2c77 158 // FORWARD
nucleosam 0:cd62cd5b2c77 159 }
nucleosam 0:cd62cd5b2c77 160 if ((statusRegister & POWERSTEP01_STATUS_MOT_STATUS)==
nucleosam 0:cd62cd5b2c77 161 POWERSTEP01_STATUS_MOT_STATUS_STOPPED)
nucleosam 0:cd62cd5b2c77 162 {
nucleosam 0:cd62cd5b2c77 163 // MOTOR STOPPED
nucleosam 0:cd62cd5b2c77 164 }
nucleosam 0:cd62cd5b2c77 165 else if ((statusRegister & POWERSTEP01_STATUS_MOT_STATUS)==
nucleosam 0:cd62cd5b2c77 166 POWERSTEP01_STATUS_MOT_STATUS_ACCELERATION)
nucleosam 0:cd62cd5b2c77 167 {
nucleosam 0:cd62cd5b2c77 168 // MOTOR ACCELERATION
nucleosam 0:cd62cd5b2c77 169 }
nucleosam 0:cd62cd5b2c77 170 else if ((statusRegister & POWERSTEP01_STATUS_MOT_STATUS)==
nucleosam 0:cd62cd5b2c77 171 POWERSTEP01_STATUS_MOT_STATUS_DECELERATION)
nucleosam 0:cd62cd5b2c77 172 {
nucleosam 0:cd62cd5b2c77 173 // MOTOR DECELERATION
nucleosam 0:cd62cd5b2c77 174 }
nucleosam 0:cd62cd5b2c77 175 else if ((statusRegister & POWERSTEP01_STATUS_MOT_STATUS)==
nucleosam 0:cd62cd5b2c77 176 POWERSTEP01_STATUS_MOT_STATUS_CONST_SPD)
nucleosam 0:cd62cd5b2c77 177 {
nucleosam 0:cd62cd5b2c77 178 // MOTOR RUNNING AT CONSTANT SPEED
nucleosam 0:cd62cd5b2c77 179 }
nucleosam 0:cd62cd5b2c77 180 /* Check Command Error flag: if set, the command received by SPI can't be */
nucleosam 0:cd62cd5b2c77 181 /* performed. This occurs for instance when a move command is sent to the */
nucleosam 0:cd62cd5b2c77 182 /* Powerstep01 while it is already running */
nucleosam 0:cd62cd5b2c77 183 if ((statusRegister & POWERSTEP01_STATUS_CMD_ERROR)==
nucleosam 0:cd62cd5b2c77 184 POWERSTEP01_STATUS_CMD_ERROR)
nucleosam 0:cd62cd5b2c77 185 {
nucleosam 0:cd62cd5b2c77 186 // Command Error
nucleosam 0:cd62cd5b2c77 187 printf(" WARNING: \"FLAG\" interrupt triggered. Non-performable command detected.\r\n");
nucleosam 0:cd62cd5b2c77 188 }
nucleosam 0:cd62cd5b2c77 189 /* Check Step mode clock flag: if set, the device is working in step clock mode */
nucleosam 0:cd62cd5b2c77 190 if ((statusRegister & POWERSTEP01_STATUS_STCK_MOD)==
nucleosam 0:cd62cd5b2c77 191 POWERSTEP01_STATUS_STCK_MOD)
nucleosam 0:cd62cd5b2c77 192 {
nucleosam 0:cd62cd5b2c77 193 //Step clock mode enabled
nucleosam 0:cd62cd5b2c77 194 }
nucleosam 0:cd62cd5b2c77 195 /* Check UVLO flag: if not set, there is an undervoltage lock-out */
nucleosam 0:cd62cd5b2c77 196 if ((statusRegister & POWERSTEP01_STATUS_UVLO)==0)
nucleosam 0:cd62cd5b2c77 197 {
nucleosam 0:cd62cd5b2c77 198 //undervoltage lock-out
nucleosam 0:cd62cd5b2c77 199 }
nucleosam 0:cd62cd5b2c77 200 /* Check UVLO ADC flag: if not set, there is an ADC undervoltage lock-out */
nucleosam 0:cd62cd5b2c77 201 if ((statusRegister & POWERSTEP01_STATUS_UVLO_ADC)==0)
nucleosam 0:cd62cd5b2c77 202 {
nucleosam 0:cd62cd5b2c77 203 //ADC undervoltage lock-out
nucleosam 0:cd62cd5b2c77 204 }
nucleosam 0:cd62cd5b2c77 205 /* Check thermal STATUS flags: if set, the thermal status is not normal */
nucleosam 0:cd62cd5b2c77 206 if ((statusRegister & POWERSTEP01_STATUS_TH_STATUS)!=0)
nucleosam 0:cd62cd5b2c77 207 {
nucleosam 0:cd62cd5b2c77 208 //thermal status: 1: Warning, 2: Bridge shutdown, 3: Device shutdown
nucleosam 0:cd62cd5b2c77 209 }
nucleosam 0:cd62cd5b2c77 210 /* Check OCD flag: if not set, there is an overcurrent detection */
nucleosam 0:cd62cd5b2c77 211 if ((statusRegister & POWERSTEP01_STATUS_OCD)==0)
nucleosam 0:cd62cd5b2c77 212 {
nucleosam 0:cd62cd5b2c77 213 //overcurrent detection
nucleosam 0:cd62cd5b2c77 214 }
nucleosam 0:cd62cd5b2c77 215 /* Check STALL_A flag: if not set, there is a Stall condition on bridge A */
nucleosam 0:cd62cd5b2c77 216 if ((statusRegister & POWERSTEP01_STATUS_STALL_A)==0)
nucleosam 0:cd62cd5b2c77 217 {
nucleosam 0:cd62cd5b2c77 218 //overcurrent detection
nucleosam 0:cd62cd5b2c77 219 }
nucleosam 0:cd62cd5b2c77 220 /* Check STALL_B flag: if not set, there is a Stall condition on bridge B */
nucleosam 0:cd62cd5b2c77 221 if ((statusRegister & POWERSTEP01_STATUS_STALL_B)==0)
nucleosam 0:cd62cd5b2c77 222 {
nucleosam 0:cd62cd5b2c77 223 //overcurrent detection
nucleosam 0:cd62cd5b2c77 224 }
nucleosam 0:cd62cd5b2c77 225
nucleosam 0:cd62cd5b2c77 226 /* Reset ISR flag. */
nucleosam 0:cd62cd5b2c77 227 motor->isrFlag = FALSE;
nucleosam 0:cd62cd5b2c77 228 }
nucleosam 0:cd62cd5b2c77 229
nucleosam 0:cd62cd5b2c77 230 /**
nucleosam 0:cd62cd5b2c77 231 * @brief This is an example of user handler for the busy interrupt.
nucleosam 0:cd62cd5b2c77 232 * @param None
nucleosam 0:cd62cd5b2c77 233 * @retval None
nucleosam 0:cd62cd5b2c77 234 * @note If needed, implement it, and then attach and enable it:
nucleosam 0:cd62cd5b2c77 235 * + motor->AttachBusyIRQ(&FlagIRQHandler);
nucleosam 0:cd62cd5b2c77 236 * + motor->EnableBusyIRQ();
nucleosam 0:cd62cd5b2c77 237 * To disable it:
nucleosam 0:cd62cd5b2c77 238 * + motor->DisbleBusyIRQ();
nucleosam 0:cd62cd5b2c77 239 */
nucleosam 0:cd62cd5b2c77 240 void myBusyIRQHandler(void)
nucleosam 0:cd62cd5b2c77 241 {
nucleosam 0:cd62cd5b2c77 242 /* Set ISR flag. */
nucleosam 0:cd62cd5b2c77 243 motor->isrFlag = TRUE;
nucleosam 0:cd62cd5b2c77 244
nucleosam 0:cd62cd5b2c77 245 if (motor->CheckBusyHw())
nucleosam 0:cd62cd5b2c77 246 {
nucleosam 0:cd62cd5b2c77 247 /* Busy pin is low, so at list one Powerstep01 chip is busy */
nucleosam 0:cd62cd5b2c77 248 /* To be customized (for example Switch on a LED) */
nucleosam 0:cd62cd5b2c77 249 }
nucleosam 0:cd62cd5b2c77 250 else
nucleosam 0:cd62cd5b2c77 251 {
nucleosam 0:cd62cd5b2c77 252 /* To be customized (for example Switch off a LED) */
nucleosam 0:cd62cd5b2c77 253 }
nucleosam 0:cd62cd5b2c77 254
nucleosam 0:cd62cd5b2c77 255 /* Reset ISR flag. */
nucleosam 0:cd62cd5b2c77 256 motor->isrFlag = FALSE;
nucleosam 0:cd62cd5b2c77 257 }
nucleosam 0:cd62cd5b2c77 258
nucleosam 0:cd62cd5b2c77 259 /**
nucleosam 0:cd62cd5b2c77 260 * @brief This is an example of error handler.
nucleosam 0:cd62cd5b2c77 261 * @param[in] error Number of the error
nucleosam 0:cd62cd5b2c77 262 * @retval None
nucleosam 0:cd62cd5b2c77 263 */
nucleosam 0:cd62cd5b2c77 264 void myErrorHandler(uint16_t error)
nucleosam 0:cd62cd5b2c77 265 {
nucleosam 0:cd62cd5b2c77 266 /* Printing to the console. */
nucleosam 0:cd62cd5b2c77 267 printf("Error %d detected\r\n\n", error);
nucleosam 0:cd62cd5b2c77 268
nucleosam 0:cd62cd5b2c77 269 /* Infinite loop */
nucleosam 0:cd62cd5b2c77 270 while(1)
nucleosam 0:cd62cd5b2c77 271 {
nucleosam 0:cd62cd5b2c77 272 }
nucleosam 0:cd62cd5b2c77 273 }
nucleosam 0:cd62cd5b2c77 274
nucleosam 0:cd62cd5b2c77 275 /* Main ----------------------------------------------------------------------*/
nucleosam 0:cd62cd5b2c77 276
nucleosam 0:cd62cd5b2c77 277 int main()
nucleosam 0:cd62cd5b2c77 278 {
nucleosam 0:cd62cd5b2c77 279 int32_t pos;
nucleosam 0:cd62cd5b2c77 280 uint32_t unsignedIntegerValue;
nucleosam 0:cd62cd5b2c77 281 float floatValue;
nucleosam 0:cd62cd5b2c77 282
nucleosam 0:cd62cd5b2c77 283 /* Printing to the console. */
nucleosam 0:cd62cd5b2c77 284 printf("STARTING MAIN PROGRAM\r\n");
nucleosam 0:cd62cd5b2c77 285 printf(" Reminder:\r\n");
nucleosam 0:cd62cd5b2c77 286 printf(" The position unit is in agreement to the step mode.\r\n");
nucleosam 0:cd62cd5b2c77 287 printf(" The speed, acceleration or deceleration unit\r\n");
nucleosam 0:cd62cd5b2c77 288 printf(" do not depend on the step mode and the step unit is a full step.\r\n");
nucleosam 0:cd62cd5b2c77 289
nucleosam 0:cd62cd5b2c77 290 //----- Initialization
nucleosam 0:cd62cd5b2c77 291 /* Initializing SPI bus. */
nucleosam 0:cd62cd5b2c77 292 DevSPI dev_spi(D11, D12, D13);
nucleosam 0:cd62cd5b2c77 293
nucleosam 0:cd62cd5b2c77 294 /* Initializing Motor Control Component. */
nucleosam 0:cd62cd5b2c77 295 motor = new POWERSTEP01(D2, D4, D8, D9, D10, dev_spi);
nucleosam 0:cd62cd5b2c77 296 if (motor->Init(&initDeviceParameters) != COMPONENT_OK) exit(EXIT_FAILURE);
nucleosam 0:cd62cd5b2c77 297
nucleosam 0:cd62cd5b2c77 298 /* Attaching and enabling interrupt handlers. */
nucleosam 0:cd62cd5b2c77 299 motor->AttachFlagIRQ(&myFlagIRQHandler);
nucleosam 0:cd62cd5b2c77 300 motor->EnableFlagIRQ();
nucleosam 0:cd62cd5b2c77 301 motor->AttachBusyIRQ(&myBusyIRQHandler);
nucleosam 0:cd62cd5b2c77 302 motor->EnableBusyIRQ();
nucleosam 0:cd62cd5b2c77 303
nucleosam 0:cd62cd5b2c77 304 /* Attaching an error handler */
nucleosam 0:cd62cd5b2c77 305 motor->AttachErrorHandler(&myErrorHandler);
nucleosam 0:cd62cd5b2c77 306
nucleosam 0:cd62cd5b2c77 307 /* Printing to the console. */
nucleosam 0:cd62cd5b2c77 308 printf("Motor Control Application Example for 1 Motor\r\n");
nucleosam 0:cd62cd5b2c77 309
nucleosam 0:cd62cd5b2c77 310 //----- Move of 16000 steps in the FW direction
nucleosam 0:cd62cd5b2c77 311 /* Printing to the console. */
nucleosam 0:cd62cd5b2c77 312 printf("--> Moving forward 16000 steps.\r\n");
nucleosam 0:cd62cd5b2c77 313
nucleosam 0:cd62cd5b2c77 314 /* Move 16000 steps in the FORWARD direction*/
nucleosam 0:cd62cd5b2c77 315 motor->Move(StepperMotor::FWD, 16000);
nucleosam 0:cd62cd5b2c77 316
nucleosam 0:cd62cd5b2c77 317 /* Waiting while the motor is active. */
nucleosam 0:cd62cd5b2c77 318 motor->WaitWhileActive();
nucleosam 0:cd62cd5b2c77 319
nucleosam 0:cd62cd5b2c77 320 /* Wait for 2 seconds */
nucleosam 0:cd62cd5b2c77 321 wait_ms(2000);
nucleosam 0:cd62cd5b2c77 322
nucleosam 0:cd62cd5b2c77 323 //----- Move of 16000 steps in the BW direction
nucleosam 0:cd62cd5b2c77 324 /* Printing to the console. */
nucleosam 0:cd62cd5b2c77 325 printf("--> Moving backward 16000 steps.\r\n");
nucleosam 0:cd62cd5b2c77 326
nucleosam 0:cd62cd5b2c77 327 /* Move 16000 steps in the BACKWARD direction*/
nucleosam 0:cd62cd5b2c77 328 motor->Move(StepperMotor::BWD, 16000);
nucleosam 0:cd62cd5b2c77 329
nucleosam 0:cd62cd5b2c77 330 /* Waiting while the motor is active. */
nucleosam 0:cd62cd5b2c77 331 motor->WaitWhileActive();
nucleosam 0:cd62cd5b2c77 332
nucleosam 0:cd62cd5b2c77 333 /* Wait for 2 seconds */
nucleosam 0:cd62cd5b2c77 334 wait_ms(2000);
nucleosam 0:cd62cd5b2c77 335
nucleosam 0:cd62cd5b2c77 336 //----- Go to position -6400
nucleosam 0:cd62cd5b2c77 337 /* Printing to the console. */
nucleosam 0:cd62cd5b2c77 338 printf("--> Go to position -6400 steps.\r\n");
nucleosam 0:cd62cd5b2c77 339
nucleosam 0:cd62cd5b2c77 340 /* Request device to go to position -6400 */
nucleosam 0:cd62cd5b2c77 341 motor->GoTo(-6400);
nucleosam 0:cd62cd5b2c77 342
nucleosam 0:cd62cd5b2c77 343 /* Wait for the motor ends moving */
nucleosam 0:cd62cd5b2c77 344 motor->WaitWhileActive();
nucleosam 0:cd62cd5b2c77 345
nucleosam 0:cd62cd5b2c77 346 /* Get current position of device and print to the console */
nucleosam 0:cd62cd5b2c77 347 pos = motor->GetPosition();
nucleosam 0:cd62cd5b2c77 348 printf(" Position: %d.\r\n", pos);
nucleosam 0:cd62cd5b2c77 349
nucleosam 0:cd62cd5b2c77 350 /* Mark the current position and print to the console */
nucleosam 0:cd62cd5b2c77 351 motor->SetMark();
nucleosam 0:cd62cd5b2c77 352 printf(" Position marked: -6400.\r\n");
nucleosam 0:cd62cd5b2c77 353
nucleosam 0:cd62cd5b2c77 354 /* Wait for 2 seconds */
nucleosam 0:cd62cd5b2c77 355 wait_ms(2000);
nucleosam 0:cd62cd5b2c77 356
nucleosam 0:cd62cd5b2c77 357 //----- Go Home
nucleosam 0:cd62cd5b2c77 358 /* Printing to the console. */
nucleosam 0:cd62cd5b2c77 359 printf("--> Go to home position.\r\n");
nucleosam 0:cd62cd5b2c77 360
nucleosam 0:cd62cd5b2c77 361 /* Request device to go to Home */
nucleosam 0:cd62cd5b2c77 362 motor->GoHome();
nucleosam 0:cd62cd5b2c77 363 motor->WaitWhileActive();
nucleosam 0:cd62cd5b2c77 364
nucleosam 0:cd62cd5b2c77 365 /* Get current position of device and print to the console */
nucleosam 0:cd62cd5b2c77 366 pos = motor->GetPosition();
nucleosam 0:cd62cd5b2c77 367 printf(" Position: %d.\r\n", pos);
nucleosam 0:cd62cd5b2c77 368
nucleosam 0:cd62cd5b2c77 369 /* Wait for 2 seconds */
nucleosam 0:cd62cd5b2c77 370 wait_ms(2000);
nucleosam 0:cd62cd5b2c77 371
nucleosam 0:cd62cd5b2c77 372 //----- Go to position 6400
nucleosam 0:cd62cd5b2c77 373 /* Printing to the console. */
nucleosam 0:cd62cd5b2c77 374 printf("--> Go to position 6400 steps.\r\n");
nucleosam 0:cd62cd5b2c77 375
nucleosam 0:cd62cd5b2c77 376 /* Request device to go to position 6400 */
nucleosam 0:cd62cd5b2c77 377 motor->GoTo(6400);
nucleosam 0:cd62cd5b2c77 378
nucleosam 0:cd62cd5b2c77 379 /* Wait for the motor of device ends moving */
nucleosam 0:cd62cd5b2c77 380 motor->WaitWhileActive();
nucleosam 0:cd62cd5b2c77 381
nucleosam 0:cd62cd5b2c77 382 /* Get current position of device and print to the console */
nucleosam 0:cd62cd5b2c77 383 pos = motor->GetPosition();
nucleosam 0:cd62cd5b2c77 384 printf(" Position: %d.\r\n", pos);
nucleosam 0:cd62cd5b2c77 385
nucleosam 0:cd62cd5b2c77 386 /* Wait for 2 seconds */
nucleosam 0:cd62cd5b2c77 387 wait_ms(2000);
nucleosam 0:cd62cd5b2c77 388
nucleosam 0:cd62cd5b2c77 389 //----- Go Mark which was set previously after go to -6400
nucleosam 0:cd62cd5b2c77 390 /* Printing to the console. */
nucleosam 0:cd62cd5b2c77 391 printf("--> Go to the marked position.\r\n");
nucleosam 0:cd62cd5b2c77 392
nucleosam 0:cd62cd5b2c77 393 /* Request device to go to Mark position */
nucleosam 0:cd62cd5b2c77 394 motor->GoMark();
nucleosam 0:cd62cd5b2c77 395
nucleosam 0:cd62cd5b2c77 396 /* Wait for the motor of device ends moving */
nucleosam 0:cd62cd5b2c77 397 motor->WaitWhileActive();
nucleosam 0:cd62cd5b2c77 398
nucleosam 0:cd62cd5b2c77 399 /* Get current position of device and print to the console */
nucleosam 0:cd62cd5b2c77 400 pos = motor->GetPosition();
nucleosam 0:cd62cd5b2c77 401 printf(" Position: %d.\r\n", pos);
nucleosam 0:cd62cd5b2c77 402
nucleosam 0:cd62cd5b2c77 403 /* Wait for 2 seconds */
nucleosam 0:cd62cd5b2c77 404 wait_ms(2000);
nucleosam 0:cd62cd5b2c77 405
nucleosam 0:cd62cd5b2c77 406 //----- Run the motor BACKWARD
nucleosam 0:cd62cd5b2c77 407 /* Printing to the console. */
nucleosam 0:cd62cd5b2c77 408 printf("--> Run the motor backward at 400 step/s.\r\n");
nucleosam 0:cd62cd5b2c77 409
nucleosam 0:cd62cd5b2c77 410 /* Request device to run BACKWARD at 400 step/s */
nucleosam 0:cd62cd5b2c77 411 motor->Run(StepperMotor::BWD,400);
nucleosam 0:cd62cd5b2c77 412
nucleosam 0:cd62cd5b2c77 413 //----- Get parameter example
nucleosam 0:cd62cd5b2c77 414 /* Wait for device reaches the targeted speed */
nucleosam 0:cd62cd5b2c77 415 while((motor->ReadStatusRegister() & POWERSTEP01_STATUS_MOT_STATUS)!=
nucleosam 0:cd62cd5b2c77 416 POWERSTEP01_STATUS_MOT_STATUS_CONST_SPD);
nucleosam 0:cd62cd5b2c77 417
nucleosam 0:cd62cd5b2c77 418 /* Record the reached speed in step/s */
nucleosam 0:cd62cd5b2c77 419 floatValue = motor->GetAnalogValue(POWERSTEP01_SPEED);
nucleosam 0:cd62cd5b2c77 420 /* Print reached speed to the console in step/s */
nucleosam 0:cd62cd5b2c77 421 printf(" Reached Speed: %f step/s.\r\n", floatValue);
nucleosam 0:cd62cd5b2c77 422
nucleosam 0:cd62cd5b2c77 423 /* Record the reached speed in step/s rounded to integer */
nucleosam 0:cd62cd5b2c77 424 unsignedIntegerValue = motor->GetSpeed();
nucleosam 0:cd62cd5b2c77 425 /* Print reached speed to the console in step/s */
nucleosam 0:cd62cd5b2c77 426 printf(" Reached Speed: %d step/s.\r\n", unsignedIntegerValue);
nucleosam 0:cd62cd5b2c77 427
nucleosam 0:cd62cd5b2c77 428 /* Record the reached speed in step/tick */
nucleosam 0:cd62cd5b2c77 429 unsignedIntegerValue = motor->GetParameter(POWERSTEP01_SPEED);
nucleosam 0:cd62cd5b2c77 430 /* Print reached speed to the console in step/tick */
nucleosam 0:cd62cd5b2c77 431 printf(" Reached Speed: %d step/tick.\r\n", unsignedIntegerValue);
nucleosam 0:cd62cd5b2c77 432
nucleosam 0:cd62cd5b2c77 433 //----- Soft stopped required while running
nucleosam 0:cd62cd5b2c77 434 /* Printing to the console. */
nucleosam 0:cd62cd5b2c77 435 printf("--> Soft stop requested.\r\n");
nucleosam 0:cd62cd5b2c77 436
nucleosam 0:cd62cd5b2c77 437 /* Request a soft stop of device and keep the power bridges enabled */
nucleosam 0:cd62cd5b2c77 438 motor->SoftHiZ();
nucleosam 0:cd62cd5b2c77 439
nucleosam 0:cd62cd5b2c77 440 /* Wait for the motor of device ends moving */
nucleosam 0:cd62cd5b2c77 441 motor->WaitWhileActive();
nucleosam 0:cd62cd5b2c77 442
nucleosam 0:cd62cd5b2c77 443 /* Wait for 2 seconds */
nucleosam 0:cd62cd5b2c77 444 wait_ms(2000);
nucleosam 0:cd62cd5b2c77 445
nucleosam 0:cd62cd5b2c77 446 //----- Run stopped by hardstop
nucleosam 0:cd62cd5b2c77 447 /* Printing to the console. */
nucleosam 0:cd62cd5b2c77 448 printf("--> Run the motor forward at 300 step/s.\r\n");
nucleosam 0:cd62cd5b2c77 449
nucleosam 0:cd62cd5b2c77 450 /* Request device to run in FORWARD direction at 300 step/s */
nucleosam 0:cd62cd5b2c77 451 motor->Run(StepperMotor::FWD,300);
nucleosam 0:cd62cd5b2c77 452 wait_ms(5000);
nucleosam 0:cd62cd5b2c77 453
nucleosam 0:cd62cd5b2c77 454 /* Printing to the console. */
nucleosam 0:cd62cd5b2c77 455 printf("--> Hard stop requested.\r\n");
nucleosam 0:cd62cd5b2c77 456
nucleosam 0:cd62cd5b2c77 457 /* Request device to immediatly stop */
nucleosam 0:cd62cd5b2c77 458 motor->HardStop();
nucleosam 0:cd62cd5b2c77 459 motor->WaitWhileActive();
nucleosam 0:cd62cd5b2c77 460
nucleosam 0:cd62cd5b2c77 461 /* Wait for 2 seconds */
nucleosam 0:cd62cd5b2c77 462 wait_ms(2000);
nucleosam 0:cd62cd5b2c77 463
nucleosam 0:cd62cd5b2c77 464 //----- GOTO stopped by soft stop
nucleosam 0:cd62cd5b2c77 465 /* Printing to the console. */
nucleosam 0:cd62cd5b2c77 466 printf("--> Go to position 200000 steps.\r\n");
nucleosam 0:cd62cd5b2c77 467
nucleosam 0:cd62cd5b2c77 468 /* Request device to go to position 200000 */
nucleosam 0:cd62cd5b2c77 469 motor->GoTo(200000);
nucleosam 0:cd62cd5b2c77 470 wait_ms(2000);
nucleosam 0:cd62cd5b2c77 471
nucleosam 0:cd62cd5b2c77 472 /* Printing to the console. */
nucleosam 0:cd62cd5b2c77 473 printf("--> Soft stop requested.\r\n");
nucleosam 0:cd62cd5b2c77 474
nucleosam 0:cd62cd5b2c77 475 /* Request device to perform a soft stop */
nucleosam 0:cd62cd5b2c77 476 motor->SoftStop();
nucleosam 0:cd62cd5b2c77 477 motor->WaitWhileActive();
nucleosam 0:cd62cd5b2c77 478
nucleosam 0:cd62cd5b2c77 479 /* Get current position of device and print to the console */
nucleosam 0:cd62cd5b2c77 480 pos = motor->GetPosition();
nucleosam 0:cd62cd5b2c77 481 printf(" Position: %d.\r\n", pos);
nucleosam 0:cd62cd5b2c77 482
nucleosam 0:cd62cd5b2c77 483 /* Wait for 2 seconds */
nucleosam 0:cd62cd5b2c77 484 wait_ms(2000);
nucleosam 0:cd62cd5b2c77 485
nucleosam 0:cd62cd5b2c77 486 //----- Read inexistent register to test MyFlagInterruptHandler
nucleosam 0:cd62cd5b2c77 487 /* Printing to the console. */
nucleosam 0:cd62cd5b2c77 488 printf("--> Try to read an inexistent register.\r\n");
nucleosam 0:cd62cd5b2c77 489
nucleosam 0:cd62cd5b2c77 490 /* Try to read an inexistent register */
nucleosam 0:cd62cd5b2c77 491 /* the flag interrupt should be raised */
nucleosam 0:cd62cd5b2c77 492 /* and the MyFlagInterruptHandler function called */
nucleosam 0:cd62cd5b2c77 493 motor->GetParameter(0x1F);
nucleosam 0:cd62cd5b2c77 494
nucleosam 0:cd62cd5b2c77 495 //----- Put the bridges in high impedance
nucleosam 0:cd62cd5b2c77 496 /* Printing to the console. */
nucleosam 0:cd62cd5b2c77 497 printf("--> Request disabling of device power bridges.\r\n");
nucleosam 0:cd62cd5b2c77 498
nucleosam 0:cd62cd5b2c77 499 /* Request disabling of device power bridges */
nucleosam 0:cd62cd5b2c77 500 motor->HardHiZ();
nucleosam 0:cd62cd5b2c77 501 wait_ms(5000);
nucleosam 0:cd62cd5b2c77 502
nucleosam 0:cd62cd5b2c77 503 //----- Step clock mode example
nucleosam 0:cd62cd5b2c77 504 /* Printing to the console. */
nucleosam 0:cd62cd5b2c77 505 printf("--> Enable Step Clock Mode of the Powerstep01, enabling power bridges.\r\n");
nucleosam 0:cd62cd5b2c77 506
nucleosam 0:cd62cd5b2c77 507 /* Enable Step Clock Mode of the Powerstep01, enabling power bridges */
nucleosam 0:cd62cd5b2c77 508 motor->StepClockModeEnable(StepperMotor::FWD);
nucleosam 0:cd62cd5b2c77 509
nucleosam 0:cd62cd5b2c77 510 /* Printing to the console. */
nucleosam 0:cd62cd5b2c77 511 printf("--> Start step clock.\r\n");
nucleosam 0:cd62cd5b2c77 512
nucleosam 0:cd62cd5b2c77 513 /* Enable the step clock at 333 Hz */
nucleosam 0:cd62cd5b2c77 514 motor->StepClockStart(333);
nucleosam 0:cd62cd5b2c77 515
nucleosam 0:cd62cd5b2c77 516 /* Let the motor runs for 5 second at 333 step/s */
nucleosam 0:cd62cd5b2c77 517 wait_ms(5000);
nucleosam 0:cd62cd5b2c77 518
nucleosam 0:cd62cd5b2c77 519 /* Printing to the console. */
nucleosam 0:cd62cd5b2c77 520 printf("--> Stop step clock.\r\n");
nucleosam 0:cd62cd5b2c77 521
nucleosam 0:cd62cd5b2c77 522 /* Stop the step clock */
nucleosam 0:cd62cd5b2c77 523 motor->StepClockStop();
nucleosam 0:cd62cd5b2c77 524
nucleosam 0:cd62cd5b2c77 525 /* Wait for 2 seconds */
nucleosam 0:cd62cd5b2c77 526 wait_ms(2000);
nucleosam 0:cd62cd5b2c77 527
nucleosam 0:cd62cd5b2c77 528 //----- Set parameter example
nucleosam 0:cd62cd5b2c77 529 /* Printing to the console. */
nucleosam 0:cd62cd5b2c77 530 printf("--> Set POWERSTEP01_MAX_SPEED parameter to 3.\r\n");
nucleosam 0:cd62cd5b2c77 531 printf(" This is corresponding to 45.75 full step/s.\r\n");
nucleosam 0:cd62cd5b2c77 532
nucleosam 0:cd62cd5b2c77 533 /* Change the maximum speed to 3*2^18 step/tick */
nucleosam 0:cd62cd5b2c77 534 motor->SetParameter(POWERSTEP01_MAX_SPEED, 3);
nucleosam 0:cd62cd5b2c77 535
nucleosam 0:cd62cd5b2c77 536 /* Printing to the console. */
nucleosam 0:cd62cd5b2c77 537 printf("--> Move the motor 3200 steps in forward direction.\r\n");
nucleosam 0:cd62cd5b2c77 538
nucleosam 0:cd62cd5b2c77 539 /* Request device to move 3200 microsteps */
nucleosam 0:cd62cd5b2c77 540 motor->Move(StepperMotor::FWD,3200);
nucleosam 0:cd62cd5b2c77 541
nucleosam 0:cd62cd5b2c77 542 /* Wait for the motor ends moving */
nucleosam 0:cd62cd5b2c77 543 motor->WaitWhileActive();
nucleosam 0:cd62cd5b2c77 544
nucleosam 0:cd62cd5b2c77 545 /* Wait for 2 seconds */
nucleosam 0:cd62cd5b2c77 546 wait_ms(2000);
nucleosam 0:cd62cd5b2c77 547
nucleosam 0:cd62cd5b2c77 548 //----- Change step mode to full step mode
nucleosam 0:cd62cd5b2c77 549 /* Printing to the console. */
nucleosam 0:cd62cd5b2c77 550 printf("--> Select full step mode.\r\n");
nucleosam 0:cd62cd5b2c77 551
nucleosam 0:cd62cd5b2c77 552 /* Select full step mode for device */
nucleosam 0:cd62cd5b2c77 553 motor->SetStepMode(STEP_MODE_FULL);
nucleosam 0:cd62cd5b2c77 554
nucleosam 0:cd62cd5b2c77 555 /* Printing to the console. */
nucleosam 0:cd62cd5b2c77 556 printf("--> Set the device position to POWERSTEP01_MIN_POSITION + 199 (-2^21+199).\r\n");
nucleosam 0:cd62cd5b2c77 557
nucleosam 0:cd62cd5b2c77 558 /* Set the device position to POWERSTEP01_MIN_POSITION + 199 */
nucleosam 0:cd62cd5b2c77 559 motor->SetParameter(POWERSTEP01_ABS_POS,(uint32_t)(POWERSTEP01_MIN_POSITION+199));
nucleosam 0:cd62cd5b2c77 560
nucleosam 0:cd62cd5b2c77 561 /* Get current position of device and print to the console */
nucleosam 0:cd62cd5b2c77 562 pos = motor->GetPosition();
nucleosam 0:cd62cd5b2c77 563 printf(" Position: %d.\r\n", pos);
nucleosam 0:cd62cd5b2c77 564
nucleosam 0:cd62cd5b2c77 565 /* Printing to the console. */
nucleosam 0:cd62cd5b2c77 566 printf("--> Go to POWERSTEP01_MAX_POSITION (2^21-1) using the shortest path.\r\n");
nucleosam 0:cd62cd5b2c77 567
nucleosam 0:cd62cd5b2c77 568 /* Request device to go to the POWERSTEP01_MAX_POSITION using the shortest path */
nucleosam 0:cd62cd5b2c77 569 motor->GoTo(POWERSTEP01_MAX_POSITION);
nucleosam 0:cd62cd5b2c77 570
nucleosam 0:cd62cd5b2c77 571 /* Wait for the motor of device ends moving */
nucleosam 0:cd62cd5b2c77 572 motor->WaitWhileActive();
nucleosam 0:cd62cd5b2c77 573
nucleosam 0:cd62cd5b2c77 574 /* Get current position of device and print to the console */
nucleosam 0:cd62cd5b2c77 575 pos = motor->GetPosition();
nucleosam 0:cd62cd5b2c77 576 printf(" Position: %d.\r\n", pos);
nucleosam 0:cd62cd5b2c77 577
nucleosam 0:cd62cd5b2c77 578 /* Wait for 2 seconds */
nucleosam 0:cd62cd5b2c77 579 wait_ms(2000);
nucleosam 0:cd62cd5b2c77 580
nucleosam 0:cd62cd5b2c77 581 /* Printing to the console. */
nucleosam 0:cd62cd5b2c77 582 printf("--> Set the device position to POWERSTEP01_MIN_POSITION + 199 (-2^21+199).\r\n");
nucleosam 0:cd62cd5b2c77 583
nucleosam 0:cd62cd5b2c77 584 /* Set the device position to POWERSTEP01_MIN_POSITION + 199 */
nucleosam 0:cd62cd5b2c77 585 motor->SetParameter(POWERSTEP01_ABS_POS,(uint32_t)(POWERSTEP01_MIN_POSITION+199));
nucleosam 0:cd62cd5b2c77 586
nucleosam 0:cd62cd5b2c77 587 /* Get current position of device and print to the console */
nucleosam 0:cd62cd5b2c77 588 pos = motor->GetPosition();
nucleosam 0:cd62cd5b2c77 589 printf(" Position: %d.\r\n", pos);
nucleosam 0:cd62cd5b2c77 590
nucleosam 0:cd62cd5b2c77 591 //----- GoTo_DIR example
nucleosam 0:cd62cd5b2c77 592 /* Printing to the console. */
nucleosam 0:cd62cd5b2c77 593 printf("--> Go to the POWERSTEP01_MAX_POSITION using backward direction.\r\n");
nucleosam 0:cd62cd5b2c77 594
nucleosam 0:cd62cd5b2c77 595 /* Request device to go to the POWERSTEP01_MAX_POSITION using backward direction */
nucleosam 0:cd62cd5b2c77 596 motor->GoTo(StepperMotor::BWD,POWERSTEP01_MAX_POSITION);
nucleosam 0:cd62cd5b2c77 597
nucleosam 0:cd62cd5b2c77 598 /* Wait for the motor of device ends moving */
nucleosam 0:cd62cd5b2c77 599 motor->WaitWhileActive();
nucleosam 0:cd62cd5b2c77 600
nucleosam 0:cd62cd5b2c77 601 /* Get current position of device and print to the console */
nucleosam 0:cd62cd5b2c77 602 pos = motor->GetPosition();
nucleosam 0:cd62cd5b2c77 603 printf(" Position: %d.\r\n", pos);
nucleosam 0:cd62cd5b2c77 604
nucleosam 0:cd62cd5b2c77 605 /* Printing to the console. */
nucleosam 0:cd62cd5b2c77 606 printf("--> Restore device initial max speed.\r\n");
nucleosam 0:cd62cd5b2c77 607
nucleosam 0:cd62cd5b2c77 608 /* Restore device initial max speed */
nucleosam 0:cd62cd5b2c77 609 motor->SetAnalogValue(POWERSTEP01_MAX_SPEED, POWERSTEP01_CONF_PARAM_MAX_SPEED_DEVICE_0);
nucleosam 0:cd62cd5b2c77 610
nucleosam 0:cd62cd5b2c77 611 /* Get the maximum speed in step/s */
nucleosam 0:cd62cd5b2c77 612 floatValue = motor->GetAnalogValue(POWERSTEP01_MAX_SPEED);
nucleosam 0:cd62cd5b2c77 613 /* Print maximum speed to the console in step/s */
nucleosam 0:cd62cd5b2c77 614 printf(" Maximum Speed: %f step/s.\r\n", floatValue);
nucleosam 0:cd62cd5b2c77 615
nucleosam 0:cd62cd5b2c77 616 //----- Restore initial microstepping mode
nucleosam 0:cd62cd5b2c77 617 /* Printing to the console. */
nucleosam 0:cd62cd5b2c77 618 printf("--> Restore device initial step mode.\r\n");
nucleosam 0:cd62cd5b2c77 619
nucleosam 0:cd62cd5b2c77 620 /* Reset device to its initial microstepping mode */
nucleosam 0:cd62cd5b2c77 621 motor->SetStepMode(POWERSTEP01_CONF_PARAM_STEP_MODE_DEVICE_0);
nucleosam 0:cd62cd5b2c77 622
nucleosam 0:cd62cd5b2c77 623 /* Wait for 2 seconds */
nucleosam 0:cd62cd5b2c77 624 wait_ms(2000);
nucleosam 0:cd62cd5b2c77 625
nucleosam 0:cd62cd5b2c77 626 /* Printing to the console. */
nucleosam 0:cd62cd5b2c77 627 printf("--> Infinite Loop...\r\n");
nucleosam 0:cd62cd5b2c77 628 /* Infinite Loop. */
nucleosam 0:cd62cd5b2c77 629 while (1)
nucleosam 0:cd62cd5b2c77 630 {
nucleosam 0:cd62cd5b2c77 631 /* Request device to go position -6400 */
nucleosam 0:cd62cd5b2c77 632 motor->GoTo(-6400);
nucleosam 0:cd62cd5b2c77 633
nucleosam 0:cd62cd5b2c77 634 /* Waiting while the motor is active. */
nucleosam 0:cd62cd5b2c77 635 motor->WaitWhileActive();
nucleosam 0:cd62cd5b2c77 636
nucleosam 0:cd62cd5b2c77 637 /* Request device to go position 6400 */
nucleosam 0:cd62cd5b2c77 638 motor->GoTo(6400);
nucleosam 0:cd62cd5b2c77 639
nucleosam 0:cd62cd5b2c77 640 /* Waiting while the motor is active. */
nucleosam 0:cd62cd5b2c77 641 motor->WaitWhileActive();
nucleosam 0:cd62cd5b2c77 642 }
nucleosam 0:cd62cd5b2c77 643 }
nucleosam 0:cd62cd5b2c77 644 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/