User | Revision | Line number | New 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 |