Unipolar stepper motor operation library

Dependents:   LAB04_Oppgave1 test_stepper Stepper_Motor_Demo StepperMotorUni_Hello ... more

Unipolar stepper motor library

This library generates pulses on 4 digital output pins of the mbed. The pulses are generated by mbed's ticker function.

The mbed pins cannot drive the stepper motor directly. So it requires driver stage for the motor. The circuit may be like following diagram.
The driver stage should be chosen by requirement for the stepper motor.

/media/uploads/okano/unipolar-steppermotor-sample.png


The mbed generates pulses on 4 output pins for external driver stage.
This library can generate 3 types of pulses.

1 phase drive (wave drive) /media/uploads/okano/1phase_drive.gif

2 phase drive /media/uploads/okano/2phase_drive.gif

1-2 phase (half step) drive /media/uploads/okano/halfstep_drive.gif

Components pages

Components pages are available for bipolar and unipolar motor libraries

A bipolar stepper motor driving pulse generator

A unipolar stepper motor driving pulse generator

Committer:
okano
Date:
Wed Sep 13 04:00:47 2017 +0000
Revision:
7:7e6fb609780a
Parent:
5:93f9ce526f38
version (v1.1.3) information added

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okano 0:5d0abdf92786 1 /** Stepper Motor (Unipolar) control library
okano 0:5d0abdf92786 2 *
okano 0:5d0abdf92786 3 * @class StepperMotorUni
okano 0:5d0abdf92786 4 * @author Tedd OKANO
okano 7:7e6fb609780a 5 * @version 1.1.3
okano 7:7e6fb609780a 6 * @date 13-Sep-2017
okano 0:5d0abdf92786 7 *
okano 7:7e6fb609780a 8 * Copyright: 2010, 2014, 2015, 2017 Tedd OKANO
okano 0:5d0abdf92786 9 * Released under the Apache 2 license License
okano 0:5d0abdf92786 10 *
okano 0:5d0abdf92786 11 * The library that controls stepper motor via motor driver chip
okano 0:5d0abdf92786 12 * This is a driver for a unipolar stepper motor.
okano 0:5d0abdf92786 13 *
okano 0:5d0abdf92786 14 * Example:
okano 0:5d0abdf92786 15 * @code
okano 0:5d0abdf92786 16 * #include "mbed.h"
okano 0:5d0abdf92786 17 * #include "StepperMotorUni.h"
okano 4:6909efe4c8ac 18 *
okano 0:5d0abdf92786 19 * StepperMotorUni motor( p26, p25, p24, p23 );
okano 4:6909efe4c8ac 20 *
okano 0:5d0abdf92786 21 * int main()
okano 0:5d0abdf92786 22 * {
okano 0:5d0abdf92786 23 * motor.set_pps( 50 );
okano 4:6909efe4c8ac 24 *
okano 0:5d0abdf92786 25 * while ( 1 ) {
okano 0:5d0abdf92786 26 * motor.move_steps( 24 );
okano 0:5d0abdf92786 27 * wait( 1 );
okano 4:6909efe4c8ac 28 *
okano 0:5d0abdf92786 29 * motor.move_steps( -24 );
okano 0:5d0abdf92786 30 * wait( 1 );
okano 0:5d0abdf92786 31 * }
okano 0:5d0abdf92786 32 * }
okano 0:5d0abdf92786 33 * @endcode
okano 4:6909efe4c8ac 34 *
okano 4:6909efe4c8ac 35 * version 0.51 (27-Nov-2010) // initial version (un-published)
okano 4:6909efe4c8ac 36 * version 0.6 (15-Jan-2014) // compatible to LPC1768, LPC11U24 and LPC1114 targets
okano 4:6909efe4c8ac 37 * version 1.0 (19-Jun-2014) // version 1.0 release
okano 1:5de3a9848490 38 * version 1.0.1 (14-Apr-2015) // API document correction
okano 4:6909efe4c8ac 39 * version 1.1 (21-Apr-2015) // ramp control function enabled
okano 4:6909efe4c8ac 40 * version 1.1.1 (22-Apr-2015) // fixed: find_home_position compatibility with ramp control feature
okano 5:93f9ce526f38 41 * version 1.1.2 (27-Apr-2015) // fixed: init_done behavior
okano 7:7e6fb609780a 42 * version 1.1.3 (13-Sep-2017) // fixed: keeping stopped position while power_ctrl is set false
okano 0:5d0abdf92786 43 */
okano 0:5d0abdf92786 44
okano 0:5d0abdf92786 45 #ifndef MBED_STEPPERMOTOR_UNIPOLAR
okano 0:5d0abdf92786 46 #define MBED_STEPPERMOTOR_UNIPOLAR
okano 0:5d0abdf92786 47
okano 0:5d0abdf92786 48 #include "mbed.h"
okano 0:5d0abdf92786 49
okano 0:5d0abdf92786 50 #define MAX_PPS 100 // pulse per second
okano 0:5d0abdf92786 51
okano 0:5d0abdf92786 52
okano 0:5d0abdf92786 53 class StepperMotorUni
okano 0:5d0abdf92786 54 {
okano 0:5d0abdf92786 55 public:
okano 0:5d0abdf92786 56
okano 0:5d0abdf92786 57 /** Constants for motor rotate mode */
okano 0:5d0abdf92786 58 typedef enum {
okano 0:5d0abdf92786 59 ONE_PHASE, /**< 1 phase operation (default) */
okano 0:5d0abdf92786 60 TWO_PHASE, /**< 2 phase operation */
okano 0:5d0abdf92786 61 HALFSTEP /**< halfstep operation */
okano 0:5d0abdf92786 62 } OperationPhaseMode;
okano 0:5d0abdf92786 63
okano 0:5d0abdf92786 64 /** Constants for motor rotate mode */
okano 0:5d0abdf92786 65 typedef enum {
okano 0:5d0abdf92786 66 SHORTEST, /**< turn by shortest direction (default) */
okano 0:5d0abdf92786 67 NO_WRAPAROUND, /**< do not accross home position */
okano 0:5d0abdf92786 68 CLOCKWISE_ONLY, /**< one-way: clockwise turn */
okano 0:5d0abdf92786 69 COUNTER_CLOCKWISE_ONLY /**< one-way: counter clockwise turn */
okano 0:5d0abdf92786 70 } RotMode;
okano 0:5d0abdf92786 71 /** Constants for syncronization mode */
okano 0:5d0abdf92786 72 typedef enum {
okano 0:5d0abdf92786 73 ASYNCHRONOUS, /**< program does wait motor turn completion (default) */
okano 0:5d0abdf92786 74 SYNCHRONOUS /**< program doesn't wait motor turn completion */
okano 0:5d0abdf92786 75 } SyncMode;
okano 0:5d0abdf92786 76
okano 0:5d0abdf92786 77 /** Constants for position detection edge polarity */
okano 0:5d0abdf92786 78 typedef enum {
okano 0:5d0abdf92786 79 RISING_EDGE, /**< position detection done by rising edge */
okano 0:5d0abdf92786 80 FALLING_EDGE /**< position detection done by falling edge */
okano 0:5d0abdf92786 81 } PositionDetectPorarity;
okano 0:5d0abdf92786 82
okano 0:5d0abdf92786 83 /** Constants for position detection edge polarity */
okano 0:5d0abdf92786 84 typedef enum {
okano 0:5d0abdf92786 85 SOFT_BRAKE, /**< brake with slowing down */
okano 0:5d0abdf92786 86 HARD_BRAKE /**< for immedate stop */
okano 0:5d0abdf92786 87 } BrakeMode;
okano 0:5d0abdf92786 88
okano 0:5d0abdf92786 89 /** Create a stepper motor object connected to specified DigitalOut pins and a DigitalIn pin
okano 0:5d0abdf92786 90 *
okano 0:5d0abdf92786 91 * @param out_A DigitalOut pin for motor pulse signal-A
okano 0:5d0abdf92786 92 * @param out_B DigitalOut pin for motor pulse signal-B
okano 0:5d0abdf92786 93 * @param out_C DigitalOut pin for motor pulse signal-C
okano 0:5d0abdf92786 94 * @param out_D DigitalOut pin for motor pulse signal-D
okano 0:5d0abdf92786 95 * @param position_detect DigitalIn pin for home position detection (option). if not defined, "find_home_position()" function cannot be used
okano 0:5d0abdf92786 96 */
okano 0:5d0abdf92786 97 StepperMotorUni(
okano 0:5d0abdf92786 98 PinName out_A,
okano 0:5d0abdf92786 99 PinName out_B,
okano 0:5d0abdf92786 100 PinName out_C,
okano 0:5d0abdf92786 101 PinName out_D,
okano 0:5d0abdf92786 102 PinName position_detect = NC
okano 0:5d0abdf92786 103 ) ;
okano 0:5d0abdf92786 104
okano 0:5d0abdf92786 105 /** Set the pulse width (i.e. motor turning speed)
okano 0:5d0abdf92786 106 *
okano 0:5d0abdf92786 107 * @param v pulse per second (pps) : lower number makes the turn slower (default = 100)
okano 0:5d0abdf92786 108 */
okano 0:5d0abdf92786 109 float set_pps( float v );
okano 0:5d0abdf92786 110
okano 0:5d0abdf92786 111 /** Set maximum PPS (= minimum pulse width) which will be used in finding home position
okano 0:5d0abdf92786 112 *
okano 0:5d0abdf92786 113 * @param v maximum pulse per second : lower number makes the turn slower (default = 100)
okano 0:5d0abdf92786 114 */
okano 0:5d0abdf92786 115 void set_max_pps( float v );
okano 0:5d0abdf92786 116
okano 0:5d0abdf92786 117 /** Find home position: rotate the motor until the detection edge comes.
okano 0:5d0abdf92786 118 *
okano 0:5d0abdf92786 119 * Turns the motor until the home position detected.
okano 0:5d0abdf92786 120 * The "home position" is a reference point for the step and angle. It will be step=0 and angle=0.
okano 0:5d0abdf92786 121 * The detection signal edge can be defined by an argument.
okano 0:5d0abdf92786 122 * It follows the rotate mode.
okano 0:5d0abdf92786 123 * When the edge is detected, the motor will be stopped and it will be the new home position.
okano 0:5d0abdf92786 124 * If no detection signal detected, no home position update done.
okano 0:5d0abdf92786 125 *
okano 0:5d0abdf92786 126 * @param edge defines detection edge rise or fall
okano 0:5d0abdf92786 127 */
okano 0:5d0abdf92786 128 int find_home_position( PositionDetectPorarity edge );
okano 0:5d0abdf92786 129
okano 0:5d0abdf92786 130 /** Update home position
okano 0:5d0abdf92786 131 *
okano 0:5d0abdf92786 132 * Set the home position as current motor position.
okano 0:5d0abdf92786 133 */
okano 0:5d0abdf92786 134 void set_home_position( void );
okano 0:5d0abdf92786 135
okano 0:5d0abdf92786 136 /** Turn the motor to defined position (by steps from home position)
okano 0:5d0abdf92786 137 *
okano 0:5d0abdf92786 138 * Make motor move to absolute position
okano 0:5d0abdf92786 139 *
okano 0:5d0abdf92786 140 * @param v the position defined by steps from home position
okano 0:5d0abdf92786 141 */
okano 0:5d0abdf92786 142 int go_position( int v );
okano 0:5d0abdf92786 143
okano 0:5d0abdf92786 144 /** Turn the motor to defined position (by angle (degree)) from home position)
okano 0:5d0abdf92786 145 *
okano 0:5d0abdf92786 146 * Make motor move to absolute position
okano 0:5d0abdf92786 147 *
okano 0:5d0abdf92786 148 * @param v the position defined by steps from home position
okano 0:5d0abdf92786 149 */
okano 0:5d0abdf92786 150 void go_angle( float angle );
okano 0:5d0abdf92786 151
okano 0:5d0abdf92786 152 /** Turn the motor to defined position (by steps from current position)
okano 0:5d0abdf92786 153 *
okano 0:5d0abdf92786 154 * Make motor move to defined position
okano 0:5d0abdf92786 155 *
okano 0:5d0abdf92786 156 * @param v the position defined by steps from current position
okano 0:5d0abdf92786 157 */
okano 0:5d0abdf92786 158 int move_steps( int s );
okano 0:5d0abdf92786 159
okano 0:5d0abdf92786 160 /** Turn the motor to defined rotation (from current position)
okano 0:5d0abdf92786 161 *
okano 0:5d0abdf92786 162 * Make motor rotate
okano 0:5d0abdf92786 163 *
okano 0:5d0abdf92786 164 * @param r number of rotation start from current position
okano 0:5d0abdf92786 165 */
okano 0:5d0abdf92786 166 int move_rotates( float r );
okano 0:5d0abdf92786 167
okano 0:5d0abdf92786 168 /** Interface for opertion phase mode setting
okano 0:5d0abdf92786 169 *
okano 1:5de3a9848490 170 * @param v Driving phase mode change : ONE_PHASE (default), TWO_PHASE or HALFSTEP
okano 0:5d0abdf92786 171 */
okano 0:5d0abdf92786 172 void set_operation_phase_mode( OperationPhaseMode v );
okano 0:5d0abdf92786 173
okano 0:5d0abdf92786 174 /** Interface for motor rotate mode setting
okano 0:5d0abdf92786 175 *
okano 0:5d0abdf92786 176 * Example:
okano 0:5d0abdf92786 177 * @code
okano 0:5d0abdf92786 178 * StepperMotor m( p21, p22, p23, p24 );
okano 0:5d0abdf92786 179 * int main() {
okano 0:5d0abdf92786 180 * m.set_rot_mode( StepperMotor::NO_WRAPAROUND );
okano 0:5d0abdf92786 181 * ...
okano 0:5d0abdf92786 182 * @endcode
okano 0:5d0abdf92786 183 *
okano 0:5d0abdf92786 184 * @param m motor rotate mode : SHORTEST (default), NO_WRAPAROUND, CLOCKWISE_ONLY or COUNTER_CLOCKWISE_ONLY
okano 0:5d0abdf92786 185 */
okano 0:5d0abdf92786 186
okano 0:5d0abdf92786 187 void set_rot_mode( RotMode m );
okano 0:5d0abdf92786 188
okano 0:5d0abdf92786 189 /** Interface for syncronization mode setting
okano 0:5d0abdf92786 190 *
okano 0:5d0abdf92786 191 * Example:
okano 0:5d0abdf92786 192 * @code
okano 0:5d0abdf92786 193 * StepperMotor m( p21, p22, p23, p24 );
okano 0:5d0abdf92786 194 * int main() {
okano 0:5d0abdf92786 195 * m.set_sync_mode( StepperMotor::NO_WRAPAROUND );
okano 0:5d0abdf92786 196 * ...
okano 0:5d0abdf92786 197 * @endcode
okano 0:5d0abdf92786 198 *
okano 0:5d0abdf92786 199 * @param m motor rotate mode : ASYNCHRONOUS (default) or SYNCHRONOUS
okano 0:5d0abdf92786 200 */
okano 0:5d0abdf92786 201 void set_sync_mode( SyncMode m );
okano 0:5d0abdf92786 202
okano 0:5d0abdf92786 203 /** Check remaining distance that motor need to move
okano 0:5d0abdf92786 204 *
okano 0:5d0abdf92786 205 * software can check if the motor action completed in asynchronous mode
okano 0:5d0abdf92786 206 *
okano 0:5d0abdf92786 207 * @return remaining steps that motor need to go
okano 0:5d0abdf92786 208 */
okano 0:5d0abdf92786 209 int distance( void );
okano 0:5d0abdf92786 210
okano 0:5d0abdf92786 211 /** Pause/Resume the motor action
okano 0:5d0abdf92786 212 *
okano 0:5d0abdf92786 213 * @param sw use "true" for pause, "false" (default) for resume
okano 0:5d0abdf92786 214 */
okano 0:5d0abdf92786 215 void set_pause( int sw );
okano 0:5d0abdf92786 216
okano 0:5d0abdf92786 217 /** Pause/Resume the motor action
okano 0:5d0abdf92786 218 *
okano 0:5d0abdf92786 219 * @param sw use "true" for pause, "false" (default) for resume
okano 0:5d0abdf92786 220 */
okano 0:5d0abdf92786 221 void brake( void );
okano 0:5d0abdf92786 222 void brake( BrakeMode mode );
okano 0:5d0abdf92786 223
okano 0:5d0abdf92786 224 /** Auto power control enable
okano 0:5d0abdf92786 225 *
okano 0:5d0abdf92786 226 * If the auto power control is enabled, the motor power will be turned-off when it stays same place
okano 0:5d0abdf92786 227 *
okano 0:5d0abdf92786 228 * @param sw use "true" for pause, "false" (default) for resume
okano 0:5d0abdf92786 229 */
okano 0:5d0abdf92786 230 void set_power_ctrl( int sw );
okano 0:5d0abdf92786 231
okano 0:5d0abdf92786 232 /** Setting for steps/rotate
okano 0:5d0abdf92786 233 *
okano 0:5d0abdf92786 234 * This parameter is required if program want to use the "go_angle()" interface.
okano 0:5d0abdf92786 235 * The angle will be calculated from this parameter.
okano 0:5d0abdf92786 236 *
okano 0:5d0abdf92786 237 * @param steps per rotate
okano 0:5d0abdf92786 238 */
okano 0:5d0abdf92786 239 void set_steps_per_rotate( int steps );
okano 0:5d0abdf92786 240
okano 2:6835e719ff96 241 /** Setting for ramp control
okano 2:6835e719ff96 242 *
okano 2:6835e719ff96 243 * This function enables the ramp-up and ramp-down of the motor behavior
okano 2:6835e719ff96 244 *
okano 5:93f9ce526f38 245 * @param initial_speed_rate speed rate. if the pps was set to 50pps and
okano 5:93f9ce526f38 246 * initial_speed_rate is given like 0.1, the ramp-up-start and ramp-dowm-end
okano 2:6835e719ff96 247 * speed will be 5pps (= 0.1 * 50pps)
okano 5:93f9ce526f38 248 * @param ramp_steps the steps for ramp-up and ramp-down.
okano 2:6835e719ff96 249 */
okano 0:5d0abdf92786 250 void set_ramp_control( float initial_speed_rate, int ramp_steps );
okano 5:93f9ce526f38 251
okano 5:93f9ce526f38 252 int init_done;
okano 5:93f9ce526f38 253
okano 0:5d0abdf92786 254 private:
okano 0:5d0abdf92786 255
okano 0:5d0abdf92786 256 Ticker t;
okano 0:5d0abdf92786 257 BusOut motor_out;
okano 0:5d0abdf92786 258 DigitalIn position_detect_pin;
okano 0:5d0abdf92786 259
okano 0:5d0abdf92786 260 static unsigned char pattern_one_phase[ 4 ]; // 1 phase pulse pattern for motor control
okano 0:5d0abdf92786 261 static unsigned char pattern_two_phase[ 4 ]; // 1 phase pulse pattern for motor control
okano 0:5d0abdf92786 262 static unsigned char pattern_halfstep[ 8 ]; // 1 phase pulse pattern for motor control
okano 0:5d0abdf92786 263 unsigned char *pattern;
okano 0:5d0abdf92786 264 int pat_index_mask;
okano 0:5d0abdf92786 265 OperationPhaseMode phase_mode;
okano 0:5d0abdf92786 266 RotMode rot_mode;
okano 0:5d0abdf92786 267 SyncMode sync_mode;
okano 0:5d0abdf92786 268 int max_pos;
okano 0:5d0abdf92786 269 int current_pos;
okano 0:5d0abdf92786 270 int pos_offset;
okano 0:5d0abdf92786 271 int target_pos;
okano 0:5d0abdf92786 272 float pps;
okano 0:5d0abdf92786 273 float max_pps;
okano 0:5d0abdf92786 274 int pause;
okano 0:5d0abdf92786 275 int power_ctrl;
okano 0:5d0abdf92786 276 float ramp_init_speed_rate;
okano 0:5d0abdf92786 277 int ramp_control_steps;
okano 0:5d0abdf92786 278 float ramp_rate;
okano 0:5d0abdf92786 279
okano 0:5d0abdf92786 280 void set_target_pos( int p ); // target position setting interface
okano 0:5d0abdf92786 281 void motor_maintain( void ); // this function is called periodically by Ticker
okano 0:5d0abdf92786 282 };
okano 0:5d0abdf92786 283
okano 0:5d0abdf92786 284
okano 0:5d0abdf92786 285 #endif