Committer:
farbodjam
Date:
Sat Aug 27 09:56:46 2011 +0000
Revision:
0:6a968d1c95c7

        

Who changed what in which revision?

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