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