Biblioteca com go_angle

Dependencies:   mbed

Committer:
MatteusCarr
Date:
Mon Apr 13 22:17:13 2020 +0000
Revision:
0:765da3331ade
Biblioteca com go_angle

Who changed what in which revision?

UserRevisionLine numberNew 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