Stepper motor control class library

Dependents:   StepperMotor_HelloWorld

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:30:35 2017 +0000
Revision:
2:f14b5e7276b0
Parent:
1:dc6cf8f8bcb7
version 0.6: fixed to keep last position while power-control disabled

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okano 0:4beb37ae37ce 1 /** Stepper Motor control library
okano 0:4beb37ae37ce 2 *
okano 1:dc6cf8f8bcb7 3 * @class StepperMotor
okano 1:dc6cf8f8bcb7 4 * @author Tedd OKANO
okano 1:dc6cf8f8bcb7 5 * @version 0.51(27-Nov-2010)
okano 1:dc6cf8f8bcb7 6 *
okano 0:4beb37ae37ce 7 * Copyright: 2010 Tedd OKANO, Tsukimidai Communications Syndicate - Crawl Design
okano 0:4beb37ae37ce 8 * The library that controls stepper motor via motor driver chip: TA7774
okano 0:4beb37ae37ce 9 * The TA7774 is a driver for a bipolar stepper motor.
okano 0:4beb37ae37ce 10 * With this library, mbed will generate 2 phase pulses to operate the motor.
okano 0:4beb37ae37ce 11 */
okano 0:4beb37ae37ce 12
okano 0:4beb37ae37ce 13 #ifndef MBED_STEPPERMOTOR
okano 0:4beb37ae37ce 14 #define MBED_STEPPERMOTOR
okano 0:4beb37ae37ce 15
okano 0:4beb37ae37ce 16 #include "mbed.h"
okano 0:4beb37ae37ce 17
okano 1:dc6cf8f8bcb7 18 #define MAX_PPS 100 // pulse per second
okano 0:4beb37ae37ce 19
okano 0:4beb37ae37ce 20 /** Stepper Motor control class
okano 0:4beb37ae37ce 21 *
okano 0:4beb37ae37ce 22 * Example:
okano 0:4beb37ae37ce 23 * @code
okano 0:4beb37ae37ce 24 * #include "mbed.h"
okano 0:4beb37ae37ce 25 * #include "StepperMotor.h"
okano 0:4beb37ae37ce 26 *
okano 0:4beb37ae37ce 27 * StepperMotor m( p21, p22, p23, p24 );
okano 0:4beb37ae37ce 28 *
okano 0:4beb37ae37ce 29 * int main() {
okano 1:dc6cf8f8bcb7 30 * m.set_steps_per_rotate( 480 );
okano 0:4beb37ae37ce 31 * m.set_sync_mode( StepperMotor::SYNCHRONOUS );
okano 0:4beb37ae37ce 32 * m.set_power_ctrl( true );
okano 0:4beb37ae37ce 33 *
okano 0:4beb37ae37ce 34 * while( 1 ) {
okano 0:4beb37ae37ce 35 * m.go_angle( 120 );
okano 0:4beb37ae37ce 36 * wait( 0.5 );
okano 0:4beb37ae37ce 37 *
okano 0:4beb37ae37ce 38 * m.go_angle( 240 );
okano 0:4beb37ae37ce 39 * wait( 0.5 );
okano 0:4beb37ae37ce 40 *
okano 0:4beb37ae37ce 41 * m.go_angle( 0 );
okano 0:4beb37ae37ce 42 * wait( 0.5 );
okano 0:4beb37ae37ce 43 *
okano 0:4beb37ae37ce 44 * m.go_angle( 240 );
okano 0:4beb37ae37ce 45 * wait( 0.5 );
okano 0:4beb37ae37ce 46 *
okano 0:4beb37ae37ce 47 * m.go_angle( 120 );
okano 0:4beb37ae37ce 48 * wait( 0.5 );
okano 0:4beb37ae37ce 49 *
okano 0:4beb37ae37ce 50 * m.go_angle( 0 );
okano 0:4beb37ae37ce 51 * wait( 0.5 );
okano 0:4beb37ae37ce 52 * }
okano 0:4beb37ae37ce 53 * }
okano 0:4beb37ae37ce 54 * @endcode
okano 0:4beb37ae37ce 55 */
okano 0:4beb37ae37ce 56
okano 0:4beb37ae37ce 57 class StepperMotor {
okano 0:4beb37ae37ce 58 public:
okano 0:4beb37ae37ce 59
okano 0:4beb37ae37ce 60 /** Constants for motor rotate mode */
okano 0:4beb37ae37ce 61 typedef enum {
okano 0:4beb37ae37ce 62 SHORTEST, /**< turn by shortest direction */
okano 0:4beb37ae37ce 63 NO_WRAPAROUND, /**< do not accross home position */
okano 0:4beb37ae37ce 64 CLOCKWISE_ONLY, /**< one-way: clockwise turn */
okano 0:4beb37ae37ce 65 COUNTER_CLOCKWISE_ONLY /**< one-way: counter clockwise turn */
okano 0:4beb37ae37ce 66 } RotMode;
okano 0:4beb37ae37ce 67
okano 0:4beb37ae37ce 68 /** Constants for syncronization mode */
okano 0:4beb37ae37ce 69 typedef enum {
okano 0:4beb37ae37ce 70 ASYNCHRONOUS, /**< program does wait motor turn completion */
okano 0:4beb37ae37ce 71 SYNCHRONOUS /**< program doesn't wait motor turn completion */
okano 0:4beb37ae37ce 72 } SyncMode;
okano 0:4beb37ae37ce 73
okano 0:4beb37ae37ce 74 /** Constants for position detection edge polarity */
okano 0:4beb37ae37ce 75 typedef enum {
okano 0:4beb37ae37ce 76 RISING_EDGE, /**< position detection done by rising edge */
okano 0:4beb37ae37ce 77 FALLING_EDGE /**< position detection done by falling edge */
okano 0:4beb37ae37ce 78 } PositionDetectPorarity;
okano 0:4beb37ae37ce 79
okano 0:4beb37ae37ce 80 /** Create a stepper motor object connected to specified DigitalOut pins and a DigitalIn pin
okano 0:4beb37ae37ce 81 *
okano 0:4beb37ae37ce 82 * @param out_A DigitalOut pin for motor pulse signal-A
okano 0:4beb37ae37ce 83 * @param out_B DigitalOut pin for motor pulse signal-B
okano 0:4beb37ae37ce 84 * @param out_PWR DigitalOut pin for TA7774's power control (option)
okano 0:4beb37ae37ce 85 * @param position_detect DigitalIn pin for home position detection (option)
okano 0:4beb37ae37ce 86 */
okano 0:4beb37ae37ce 87 StepperMotor(
okano 0:4beb37ae37ce 88 PinName out_A = p21,
okano 0:4beb37ae37ce 89 PinName out_B = p22,
okano 0:4beb37ae37ce 90 PinName out_PWR = p23,
okano 0:4beb37ae37ce 91 PinName position_detect = p24
okano 0:4beb37ae37ce 92 ) ;
okano 0:4beb37ae37ce 93
okano 0:4beb37ae37ce 94 /** Set the pulse width (i.e. motor turning speed)
okano 0:4beb37ae37ce 95 *
okano 1:dc6cf8f8bcb7 96 * @param v pulse per second : lower number makes the turn slower (default = 100)
okano 0:4beb37ae37ce 97 */
okano 1:dc6cf8f8bcb7 98 float set_pps( float v );
okano 0:4beb37ae37ce 99
okano 0:4beb37ae37ce 100 /** Set maximum PPS (= minimum pulse width) which will be used in finding home position
okano 0:4beb37ae37ce 101 *
okano 1:dc6cf8f8bcb7 102 * @param v maximum pulse per second : lower number makes the turn slower (default = 100)
okano 0:4beb37ae37ce 103 */
okano 1:dc6cf8f8bcb7 104 void set_max_pps( float v );
okano 0:4beb37ae37ce 105
okano 0:4beb37ae37ce 106 /** Find home position: rotate the motor until the detection edge comes.
okano 0:4beb37ae37ce 107 *
okano 0:4beb37ae37ce 108 * Turns the motor until the home position detected.
okano 0:4beb37ae37ce 109 * The "home position" is a reference point for the step and angle. It will be step=0 and angle=0.
okano 0:4beb37ae37ce 110 * The detection signal edge can be defined by an argument.
okano 0:4beb37ae37ce 111 * It follows the rotate mode.
okano 0:4beb37ae37ce 112 * When the edge is detected, the motor will be stopped and it will be the new home position.
okano 0:4beb37ae37ce 113 * If no detection signal detected, no home position update done.
okano 0:4beb37ae37ce 114 *
okano 0:4beb37ae37ce 115 * @param edge defines detection edge rise or fall
okano 0:4beb37ae37ce 116 */
okano 0:4beb37ae37ce 117 int find_home_position( PositionDetectPorarity edge );
okano 0:4beb37ae37ce 118
okano 0:4beb37ae37ce 119 /** Update home position
okano 0:4beb37ae37ce 120 *
okano 0:4beb37ae37ce 121 * Set the home position as current motor position.
okano 0:4beb37ae37ce 122 */
okano 0:4beb37ae37ce 123 void set_home_position( void );
okano 0:4beb37ae37ce 124
okano 0:4beb37ae37ce 125 /** Turn the motor to defined position (by steps from home position)
okano 0:4beb37ae37ce 126 *
okano 0:4beb37ae37ce 127 * Make motor move to absolute position
okano 0:4beb37ae37ce 128 *
okano 0:4beb37ae37ce 129 * @param v the position defined by steps from home position
okano 0:4beb37ae37ce 130 */
okano 0:4beb37ae37ce 131 int go_position( int v );
okano 0:4beb37ae37ce 132
okano 1:dc6cf8f8bcb7 133 /** Turn the motor to defined position (by angle (degree)) from home position)
okano 0:4beb37ae37ce 134 *
okano 0:4beb37ae37ce 135 * Make motor move to absolute position
okano 0:4beb37ae37ce 136 *
okano 0:4beb37ae37ce 137 * @param v the position defined by steps from home position
okano 0:4beb37ae37ce 138 */
okano 0:4beb37ae37ce 139 void go_angle( float angle );
okano 0:4beb37ae37ce 140
okano 0:4beb37ae37ce 141 /** Turn the motor to defined position (by steps from current position)
okano 0:4beb37ae37ce 142 *
okano 0:4beb37ae37ce 143 * Make motor move to defined position
okano 0:4beb37ae37ce 144 *
okano 0:4beb37ae37ce 145 * @param v the position defined by steps from home position
okano 0:4beb37ae37ce 146 */
okano 0:4beb37ae37ce 147 int move_steps( int s );
okano 0:4beb37ae37ce 148
okano 0:4beb37ae37ce 149 /** Interface for motor rotate mode setting
okano 0:4beb37ae37ce 150 *
okano 0:4beb37ae37ce 151 * Example:
okano 0:4beb37ae37ce 152 * @code
okano 0:4beb37ae37ce 153 * StepperMotor m( p21, p22, p23, p24 );
okano 0:4beb37ae37ce 154 * int main() {
okano 0:4beb37ae37ce 155 * m.set_rot_mode( StepperMotor::NO_WRAPAROUND );
okano 0:4beb37ae37ce 156 * ...
okano 0:4beb37ae37ce 157 * @endcode
okano 0:4beb37ae37ce 158 *
okano 1:dc6cf8f8bcb7 159 * @param m motor rotate mode : SHORTEST (default), NO_WRAPAROUND, CLOCKWISE_ONLY or COUNTER_CLOCKWISE_ONLY
okano 0:4beb37ae37ce 160 */
okano 0:4beb37ae37ce 161 void set_rot_mode( RotMode m );
okano 0:4beb37ae37ce 162
okano 0:4beb37ae37ce 163 /** Interface for syncronization mode setting
okano 0:4beb37ae37ce 164 *
okano 0:4beb37ae37ce 165 * Example:
okano 0:4beb37ae37ce 166 * @code
okano 0:4beb37ae37ce 167 * StepperMotor m( p21, p22, p23, p24 );
okano 0:4beb37ae37ce 168 * int main() {
okano 0:4beb37ae37ce 169 * m.set_sync_mode( StepperMotor::NO_WRAPAROUND );
okano 0:4beb37ae37ce 170 * ...
okano 0:4beb37ae37ce 171 * @endcode
okano 0:4beb37ae37ce 172 *
okano 1:dc6cf8f8bcb7 173 * @param m motor rotate mode : ASYNCHRONOUS (default) or SYNCHRONOUS
okano 0:4beb37ae37ce 174 */
okano 0:4beb37ae37ce 175 void set_sync_mode( SyncMode m );
okano 0:4beb37ae37ce 176
okano 0:4beb37ae37ce 177 /** Check remaining distance that motor need to move
okano 0:4beb37ae37ce 178 *
okano 0:4beb37ae37ce 179 * software can check if the motor action completed in asynchronous mode
okano 0:4beb37ae37ce 180 *
okano 0:4beb37ae37ce 181 * @return remaining steps that motor need to go
okano 0:4beb37ae37ce 182 */
okano 0:4beb37ae37ce 183 int distance( void );
okano 0:4beb37ae37ce 184
okano 0:4beb37ae37ce 185 /** Pause/Resume the motor action
okano 0:4beb37ae37ce 186 *
okano 1:dc6cf8f8bcb7 187 * @param sw use "true" for pause, "false" (default) for resume
okano 0:4beb37ae37ce 188 */
okano 0:4beb37ae37ce 189 void set_pause( int sw );
okano 0:4beb37ae37ce 190
okano 0:4beb37ae37ce 191 /** Auto power control enable
okano 0:4beb37ae37ce 192 *
okano 0:4beb37ae37ce 193 * If the auto power control is enabled, the motor power will be turned-off when it stays same place
okano 0:4beb37ae37ce 194 *
okano 1:dc6cf8f8bcb7 195 * @param sw use "true" for pause, "false" (default) for resume
okano 0:4beb37ae37ce 196 */
okano 0:4beb37ae37ce 197 void set_power_ctrl( int sw );
okano 0:4beb37ae37ce 198
okano 0:4beb37ae37ce 199 /** Setting for steps/rotate
okano 0:4beb37ae37ce 200 *
okano 0:4beb37ae37ce 201 * This parameter is required if program want to use the "go_angle()" interface.
okano 0:4beb37ae37ce 202 * The angle will be calculated from this parameter.
okano 0:4beb37ae37ce 203 *
okano 0:4beb37ae37ce 204 * @param steps per rotate
okano 0:4beb37ae37ce 205 */
okano 0:4beb37ae37ce 206 void set_steps_per_rotate( int steps );
okano 0:4beb37ae37ce 207
okano 0:4beb37ae37ce 208 private:
okano 0:4beb37ae37ce 209
okano 0:4beb37ae37ce 210 Ticker t;
okano 0:4beb37ae37ce 211 BusOut motor_out;
okano 0:4beb37ae37ce 212 DigitalOut pwr_out;
okano 0:4beb37ae37ce 213 DigitalIn position_detect_pin;
okano 0:4beb37ae37ce 214
okano 0:4beb37ae37ce 215 static const unsigned char pat[ 4 ]; // 2 phase pulse pattern for motor control
okano 0:4beb37ae37ce 216 RotMode rot_mode;
okano 0:4beb37ae37ce 217 SyncMode sync_mode;
okano 0:4beb37ae37ce 218 int max_pos;
okano 0:4beb37ae37ce 219 int current_pos;
okano 0:4beb37ae37ce 220 int pos_offset;
okano 0:4beb37ae37ce 221 int target_pos;
okano 1:dc6cf8f8bcb7 222 float pps;
okano 1:dc6cf8f8bcb7 223 float max_pps;
okano 0:4beb37ae37ce 224 int init_done;
okano 0:4beb37ae37ce 225 int pause;
okano 0:4beb37ae37ce 226 int power_ctrl;
okano 0:4beb37ae37ce 227
okano 0:4beb37ae37ce 228 void set_target_pos( int p ); // target position setting interface
okano 0:4beb37ae37ce 229 void motor_maintain( void ); // this function is called periodically by Ticker
okano 0:4beb37ae37ce 230 };
okano 0:4beb37ae37ce 231
okano 0:4beb37ae37ce 232
okano 0:4beb37ae37ce 233 #endif