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:
Thu Nov 25 11:11:51 2010 +0000
Revision:
0:4beb37ae37ce
Child:
1:dc6cf8f8bcb7

        

Who changed what in which revision?

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