Motion control example for 1 motor.
Dependencies: X_NUCLEO_IHM03A1 mbed
Fork of IHM03A1_ExampleFor1Motor by
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.
main.cpp@1:6b179be4937e, 2016-04-07 (annotated)
- Committer:
- nucleosam
- Date:
- Thu Apr 07 16:32:55 2016 +0000
- Revision:
- 1:6b179be4937e
- Parent:
- 0:cd62cd5b2c77
- Child:
- 2:7e8485b5d57d
StepperMotor class modification and induced changes
Who changed what in which revision?
User | Revision | Line number | New 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>© 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 | 1:6b179be4937e | 429 | unsignedIntegerValue = motor->GetRawParameter(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 | 1:6b179be4937e | 493 | motor->GetRawParameter(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 | 1:6b179be4937e | 534 | motor->SetRawParameter(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 | 1:6b179be4937e | 553 | motor->SetStepMode(StepperMotor::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 | 1:6b179be4937e | 559 | motor->SetRawParameter(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 | 1:6b179be4937e | 585 | motor->SetRawParameter(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 | 1:6b179be4937e | 621 | motor->SetStepMode((StepperMotor::step_mode_t)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****/ |