Stepper motor control class library
Dependents: StepperMotor_HelloWorld
Components pages
Components pages are available for bipolar
and unipolar
motor libraries
StepperMotor.h@2:f14b5e7276b0, 2017-09-13 (annotated)
- 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?
User | Revision | Line number | New 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 |