Stepper motor control class library
Dependents: StepperMotor_HelloWorld
Components pages
Components pages are available for bipolar
and unipolar
motor libraries
StepperMotor.h@0:4beb37ae37ce, 2010-11-25 (annotated)
- Committer:
- okano
- Date:
- Thu Nov 25 11:11:51 2010 +0000
- Revision:
- 0:4beb37ae37ce
- Child:
- 1:dc6cf8f8bcb7
Who changed what in which revision?
User | Revision | Line number | New 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 |