Unipolar stepper motor operation library

Dependents:   LAB04_Oppgave1 test_stepper Stepper_Motor_Demo StepperMotorUni_Hello ... more

Unipolar stepper motor library

This library generates pulses on 4 digital output pins of the mbed. The pulses are generated by mbed's ticker function.

The mbed pins cannot drive the stepper motor directly. So it requires driver stage for the motor. The circuit may be like following diagram.
The driver stage should be chosen by requirement for the stepper motor.

/media/uploads/okano/unipolar-steppermotor-sample.png


The mbed generates pulses on 4 output pins for external driver stage.
This library can generate 3 types of pulses.

1 phase drive (wave drive) /media/uploads/okano/1phase_drive.gif

2 phase drive /media/uploads/okano/2phase_drive.gif

1-2 phase (half step) drive /media/uploads/okano/halfstep_drive.gif

Components pages

Components pages are available for bipolar and unipolar motor libraries

A bipolar stepper motor driving pulse generator

A unipolar stepper motor driving pulse generator

Committer:
okano
Date:
Wed Sep 13 04:00:47 2017 +0000
Revision:
7:7e6fb609780a
Parent:
6:007d0570ba4f
version (v1.1.3) information added

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okano 0:5d0abdf92786 1 /** Stepper Motor (Unipolar) control library
okano 0:5d0abdf92786 2 *
okano 0:5d0abdf92786 3 * @class StepperMotorUni
okano 0:5d0abdf92786 4 * @author Tedd OKANO
okano 7:7e6fb609780a 5 * @version 1.1.3
okano 7:7e6fb609780a 6 * @date 13-Sep-2017
okano 0:5d0abdf92786 7 *
okano 7:7e6fb609780a 8 * Copyright: 2010, 2014, 2015, 2017 Tedd OKANO
okano 0:5d0abdf92786 9 * Released under the Apache 2 license License
okano 0:5d0abdf92786 10 *
okano 0:5d0abdf92786 11 * The library that controls stepper motor via motor driver chip
okano 0:5d0abdf92786 12 * This is a driver for a unipolar stepper motor.
okano 0:5d0abdf92786 13 *
okano 0:5d0abdf92786 14 * Example:
okano 0:5d0abdf92786 15 * @code
okano 0:5d0abdf92786 16 * #include "mbed.h"
okano 0:5d0abdf92786 17 * #include "StepperMotorUni.h"
okano 4:6909efe4c8ac 18 *
okano 0:5d0abdf92786 19 * StepperMotorUni motor( p26, p25, p24, p23 );
okano 4:6909efe4c8ac 20 *
okano 0:5d0abdf92786 21 * int main()
okano 0:5d0abdf92786 22 * {
okano 0:5d0abdf92786 23 * motor.set_pps( 50 );
okano 4:6909efe4c8ac 24 *
okano 0:5d0abdf92786 25 * while ( 1 ) {
okano 0:5d0abdf92786 26 * motor.move_steps( 24 );
okano 0:5d0abdf92786 27 * wait( 1 );
okano 4:6909efe4c8ac 28 *
okano 0:5d0abdf92786 29 * motor.move_steps( -24 );
okano 0:5d0abdf92786 30 * wait( 1 );
okano 0:5d0abdf92786 31 * }
okano 0:5d0abdf92786 32 * }
okano 0:5d0abdf92786 33 * @endcode
okano 4:6909efe4c8ac 34 *
okano 4:6909efe4c8ac 35 * version 0.51 (27-Nov-2010) // initial version (un-published)
okano 4:6909efe4c8ac 36 * version 0.6 (15-Jan-2014) // compatible to LPC1768, LPC11U24 and LPC1114 targets
okano 4:6909efe4c8ac 37 * version 1.0 (19-Jun-2014) // version 1.0 release
okano 3:0eec6148e739 38 * version 1.0.1 (14-Apr-2015) // API document correction
okano 4:6909efe4c8ac 39 * version 1.1 (21-Apr-2015) // ramp control function enabled
okano 4:6909efe4c8ac 40 * version 1.1.1 (22-Apr-2015) // fixed: find_home_position compatibility with ramp control feature
okano 5:93f9ce526f38 41 * version 1.1.2 (27-Apr-2015) // fixed: init_done behavior
okano 7:7e6fb609780a 42 * version 1.1.3 (13-Sep-2017) // fixed: keeping stopped position while power_ctrl is set false
okano 0:5d0abdf92786 43 */
okano 0:5d0abdf92786 44
okano 0:5d0abdf92786 45 #include "mbed.h"
okano 0:5d0abdf92786 46 #include "StepperMotorUni.h"
okano 0:5d0abdf92786 47
okano 0:5d0abdf92786 48 StepperMotorUni::StepperMotorUni(
okano 0:5d0abdf92786 49 PinName out_A,
okano 0:5d0abdf92786 50 PinName out_B,
okano 0:5d0abdf92786 51 PinName out_C,
okano 0:5d0abdf92786 52 PinName out_D,
okano 0:5d0abdf92786 53 PinName position_detect
okano 0:5d0abdf92786 54 ) :
okano 5:93f9ce526f38 55 init_done( false ),
okano 4:6909efe4c8ac 56 motor_out( out_A, out_B, out_C, out_D ),
okano 4:6909efe4c8ac 57 position_detect_pin( position_detect ),
okano 4:6909efe4c8ac 58 rot_mode( SHORTEST ),
okano 4:6909efe4c8ac 59 sync_mode( ASYNCHRONOUS ),
okano 4:6909efe4c8ac 60 max_pos( 480 ),
okano 4:6909efe4c8ac 61 current_pos( 0 ),
okano 4:6909efe4c8ac 62 pos_offset( 0 ),
okano 4:6909efe4c8ac 63 target_pos( 0 ),
okano 4:6909efe4c8ac 64 max_pps( MAX_PPS ),
okano 4:6909efe4c8ac 65 pause( false ),
okano 4:6909efe4c8ac 66 power_ctrl( false ),
okano 4:6909efe4c8ac 67 ramp_init_speed_rate( 1.0 ),
okano 4:6909efe4c8ac 68 ramp_control_steps( 0 ),
okano 4:6909efe4c8ac 69 ramp_rate( 1.0 )
okano 4:6909efe4c8ac 70 {
okano 0:5d0abdf92786 71
okano 0:5d0abdf92786 72 pps = max_pps;
okano 0:5d0abdf92786 73 pattern = (unsigned char *)pattern_one_phase;
okano 0:5d0abdf92786 74 pat_index_mask = 0x3;
okano 0:5d0abdf92786 75 t.attach( this, &StepperMotorUni::motor_maintain, 1.0 / (float)pps );
okano 0:5d0abdf92786 76 }
okano 0:5d0abdf92786 77
okano 4:6909efe4c8ac 78 float StepperMotorUni::set_pps( float v )
okano 4:6909efe4c8ac 79 {
okano 0:5d0abdf92786 80 float p;
okano 0:5d0abdf92786 81
okano 0:5d0abdf92786 82 p = pps;
okano 0:5d0abdf92786 83 pps = v;
okano 0:5d0abdf92786 84 t.detach();
okano 0:5d0abdf92786 85 t.attach( this, &StepperMotorUni::motor_maintain, 1.0 / (float)pps );
okano 0:5d0abdf92786 86 return ( p );
okano 0:5d0abdf92786 87 }
okano 0:5d0abdf92786 88
okano 4:6909efe4c8ac 89 void StepperMotorUni::set_max_pps( float v )
okano 4:6909efe4c8ac 90 {
okano 0:5d0abdf92786 91 max_pps = v;
okano 0:5d0abdf92786 92 }
okano 0:5d0abdf92786 93
okano 4:6909efe4c8ac 94 int StepperMotorUni::find_home_position( PositionDetectPorarity edge )
okano 4:6909efe4c8ac 95 {
okano 0:5d0abdf92786 96 RotMode prev_rot;
okano 0:5d0abdf92786 97 SyncMode prev_sync;
okano 0:5d0abdf92786 98 float prev_pps;
okano 4:6909efe4c8ac 99 float prev_i_rate;
okano 4:6909efe4c8ac 100 int prev_rcs;
okano 0:5d0abdf92786 101 int prev_det_pin;
okano 0:5d0abdf92786 102 int direction;
okano 0:5d0abdf92786 103
okano 0:5d0abdf92786 104 if ( position_detect_pin == NC )
okano 0:5d0abdf92786 105 return 0;
okano 0:5d0abdf92786 106
okano 0:5d0abdf92786 107 prev_pps = set_pps( max_pps );
okano 4:6909efe4c8ac 108 prev_i_rate = ramp_init_speed_rate;
okano 4:6909efe4c8ac 109 prev_rcs = ramp_control_steps;
okano 0:5d0abdf92786 110 prev_rot = rot_mode;
okano 0:5d0abdf92786 111 prev_sync = sync_mode;
okano 0:5d0abdf92786 112 set_sync_mode( SYNCHRONOUS );
okano 0:5d0abdf92786 113 set_rot_mode( SHORTEST );
okano 0:5d0abdf92786 114
okano 4:6909efe4c8ac 115 prev_det_pin = position_detect_pin;
okano 4:6909efe4c8ac 116 set_ramp_control( 1.0, 0 );
okano 0:5d0abdf92786 117
okano 0:5d0abdf92786 118 if ( prev_rot == COUNTER_CLOCKWISE_ONLY )
okano 0:5d0abdf92786 119 direction = -1;
okano 0:5d0abdf92786 120 else
okano 0:5d0abdf92786 121 direction = 1;
okano 0:5d0abdf92786 122
okano 5:93f9ce526f38 123 init_done = false;
okano 5:93f9ce526f38 124
okano 0:5d0abdf92786 125 if ( prev_rot == NO_WRAPAROUND ) {
okano 0:5d0abdf92786 126
okano 0:5d0abdf92786 127 for ( int i = 0; i < (max_pos >> 1); i++ ) {
okano 0:5d0abdf92786 128 move_steps( -1 );
okano 0:5d0abdf92786 129 if ( ((edge == RISING_EDGE) && !prev_det_pin && position_detect_pin)
okano 0:5d0abdf92786 130 || ((edge == FALLING_EDGE) && prev_det_pin && !position_detect_pin) ) {
okano 0:5d0abdf92786 131 set_home_position();
okano 0:5d0abdf92786 132 init_done = true;
okano 0:5d0abdf92786 133 break;
okano 0:5d0abdf92786 134 }
okano 0:5d0abdf92786 135 prev_det_pin = position_detect_pin;
okano 0:5d0abdf92786 136 }
okano 0:5d0abdf92786 137 }
okano 0:5d0abdf92786 138
okano 0:5d0abdf92786 139 for ( int i = 0; i < ((prev_rot == NO_WRAPAROUND) ? (max_pos - 1) : (max_pos + 10)); i++ ) {
okano 0:5d0abdf92786 140 move_steps( direction );
okano 0:5d0abdf92786 141 if ( ((edge == RISING_EDGE) && !prev_det_pin && position_detect_pin)
okano 0:5d0abdf92786 142 || ((edge == FALLING_EDGE) && prev_det_pin && !position_detect_pin) ) {
okano 0:5d0abdf92786 143 set_home_position();
okano 0:5d0abdf92786 144 init_done = true;
okano 0:5d0abdf92786 145 break;
okano 0:5d0abdf92786 146 }
okano 0:5d0abdf92786 147 prev_det_pin = position_detect_pin;
okano 0:5d0abdf92786 148 }
okano 0:5d0abdf92786 149
okano 0:5d0abdf92786 150 go_position( 0 );
okano 0:5d0abdf92786 151 set_pps( prev_pps );
okano 0:5d0abdf92786 152 set_rot_mode( prev_rot );
okano 0:5d0abdf92786 153 set_sync_mode( prev_sync );
okano 4:6909efe4c8ac 154 set_ramp_control( prev_i_rate, prev_rcs );
okano 0:5d0abdf92786 155
okano 0:5d0abdf92786 156 return ( init_done );
okano 0:5d0abdf92786 157 }
okano 0:5d0abdf92786 158
okano 4:6909efe4c8ac 159 void StepperMotorUni::set_home_position( void )
okano 4:6909efe4c8ac 160 {
okano 0:5d0abdf92786 161 set_pause( true );
okano 0:5d0abdf92786 162 pos_offset = current_pos & 0x3;
okano 0:5d0abdf92786 163 current_pos = 0;
okano 0:5d0abdf92786 164 set_target_pos( 0 );
okano 0:5d0abdf92786 165 set_pause( false );
okano 0:5d0abdf92786 166 }
okano 0:5d0abdf92786 167
okano 0:5d0abdf92786 168
okano 4:6909efe4c8ac 169 void StepperMotorUni::go_angle( float angle )
okano 4:6909efe4c8ac 170 {
okano 0:5d0abdf92786 171 go_position( (int)((angle / 360.0) * (float)max_pos) );
okano 0:5d0abdf92786 172 }
okano 0:5d0abdf92786 173
okano 4:6909efe4c8ac 174 int StepperMotorUni::move_steps( int s )
okano 4:6909efe4c8ac 175 {
okano 0:5d0abdf92786 176 set_target_pos( current_pos + s );
okano 0:5d0abdf92786 177 return ( current_pos );
okano 0:5d0abdf92786 178 }
okano 0:5d0abdf92786 179
okano 4:6909efe4c8ac 180 int StepperMotorUni::move_rotates( float r )
okano 4:6909efe4c8ac 181 {
okano 0:5d0abdf92786 182 set_target_pos( current_pos + (int)(r * (float)max_pos) );
okano 0:5d0abdf92786 183 return ( current_pos );
okano 0:5d0abdf92786 184 }
okano 0:5d0abdf92786 185
okano 4:6909efe4c8ac 186 void StepperMotorUni::set_operation_phase_mode( OperationPhaseMode v )
okano 4:6909efe4c8ac 187 {
okano 0:5d0abdf92786 188
okano 0:5d0abdf92786 189 switch ( v ) {
okano 0:5d0abdf92786 190 case StepperMotorUni::ONE_PHASE :
okano 0:5d0abdf92786 191 pattern = pattern_one_phase;
okano 0:5d0abdf92786 192 pat_index_mask = 0x3;
okano 0:5d0abdf92786 193 break;
okano 0:5d0abdf92786 194 case StepperMotorUni::TWO_PHASE :
okano 0:5d0abdf92786 195 pattern = pattern_two_phase;
okano 0:5d0abdf92786 196 pat_index_mask = 0x3;
okano 0:5d0abdf92786 197 break;
okano 0:5d0abdf92786 198 case StepperMotorUni::HALFSTEP :
okano 0:5d0abdf92786 199 pattern = pattern_halfstep;
okano 0:5d0abdf92786 200 pat_index_mask = 0x7;
okano 0:5d0abdf92786 201 break;
okano 0:5d0abdf92786 202 }
okano 0:5d0abdf92786 203
okano 0:5d0abdf92786 204 phase_mode = v;
okano 0:5d0abdf92786 205 }
okano 0:5d0abdf92786 206
okano 4:6909efe4c8ac 207 void StepperMotorUni::set_rot_mode( RotMode m )
okano 4:6909efe4c8ac 208 {
okano 0:5d0abdf92786 209 rot_mode = m;
okano 0:5d0abdf92786 210 }
okano 0:5d0abdf92786 211
okano 4:6909efe4c8ac 212 void StepperMotorUni::set_sync_mode( SyncMode m )
okano 4:6909efe4c8ac 213 {
okano 0:5d0abdf92786 214 sync_mode = m;
okano 0:5d0abdf92786 215 }
okano 0:5d0abdf92786 216
okano 4:6909efe4c8ac 217 int StepperMotorUni::distance( void )
okano 4:6909efe4c8ac 218 {
okano 0:5d0abdf92786 219 return( target_pos - current_pos );
okano 0:5d0abdf92786 220 }
okano 0:5d0abdf92786 221
okano 4:6909efe4c8ac 222 void StepperMotorUni::set_pause( int sw )
okano 4:6909efe4c8ac 223 {
okano 0:5d0abdf92786 224 pause = sw;
okano 0:5d0abdf92786 225 }
okano 0:5d0abdf92786 226
okano 4:6909efe4c8ac 227 void StepperMotorUni::brake( void )
okano 4:6909efe4c8ac 228 {
okano 0:5d0abdf92786 229 brake( SOFT_BRAKE );
okano 0:5d0abdf92786 230 }
okano 0:5d0abdf92786 231
okano 4:6909efe4c8ac 232 void StepperMotorUni::brake( BrakeMode mode )
okano 4:6909efe4c8ac 233 {
okano 0:5d0abdf92786 234 int extra_steps;
okano 0:5d0abdf92786 235
okano 0:5d0abdf92786 236 if ( mode == SOFT_BRAKE ) {
okano 0:5d0abdf92786 237 extra_steps = abs( target_pos - current_pos );
okano 0:5d0abdf92786 238 extra_steps = extra_steps < ramp_control_steps ? extra_steps : ramp_control_steps;
okano 0:5d0abdf92786 239 extra_steps = target_pos < current_pos ? -extra_steps : extra_steps;
okano 0:5d0abdf92786 240 } else {
okano 0:5d0abdf92786 241 extra_steps = 0;
okano 0:5d0abdf92786 242 }
okano 0:5d0abdf92786 243
okano 0:5d0abdf92786 244 target_pos = current_pos + extra_steps;
okano 0:5d0abdf92786 245 }
okano 0:5d0abdf92786 246
okano 4:6909efe4c8ac 247 void StepperMotorUni::set_target_pos( int p )
okano 4:6909efe4c8ac 248 {
okano 0:5d0abdf92786 249 target_pos = p;
okano 0:5d0abdf92786 250
okano 0:5d0abdf92786 251 if (sync_mode == SYNCHRONOUS)
okano 0:5d0abdf92786 252 while ( distance() )
okano 0:5d0abdf92786 253 wait( 0 );
okano 0:5d0abdf92786 254 }
okano 0:5d0abdf92786 255
okano 4:6909efe4c8ac 256 void StepperMotorUni::set_power_ctrl( int sw )
okano 4:6909efe4c8ac 257 {
okano 0:5d0abdf92786 258 power_ctrl = sw;
okano 0:5d0abdf92786 259 }
okano 0:5d0abdf92786 260
okano 4:6909efe4c8ac 261 void StepperMotorUni::set_steps_per_rotate( int steps )
okano 4:6909efe4c8ac 262 {
okano 0:5d0abdf92786 263 max_pos = steps;
okano 0:5d0abdf92786 264 }
okano 0:5d0abdf92786 265
okano 4:6909efe4c8ac 266 void StepperMotorUni::set_ramp_control( float initial_speed_rate, int ramp_steps )
okano 4:6909efe4c8ac 267 {
okano 0:5d0abdf92786 268 ramp_init_speed_rate = initial_speed_rate;
okano 0:5d0abdf92786 269 ramp_control_steps = ramp_steps;
okano 4:6909efe4c8ac 270
okano 4:6909efe4c8ac 271 if ( ramp_steps == 0 )
okano 4:6909efe4c8ac 272 ramp_rate = 1.0;
okano 4:6909efe4c8ac 273 else {
okano 4:6909efe4c8ac 274 ramp_rate = powf( ramp_init_speed_rate, 1.0 / (float)ramp_control_steps );
okano 4:6909efe4c8ac 275 }
okano 0:5d0abdf92786 276 }
okano 0:5d0abdf92786 277
okano 4:6909efe4c8ac 278 void StepperMotorUni::motor_maintain( void )
okano 4:6909efe4c8ac 279 {
okano 0:5d0abdf92786 280 int distance;
okano 0:5d0abdf92786 281 static int moved_steps = 0;
okano 0:5d0abdf92786 282 static int ramp_steps = 0;
okano 0:5d0abdf92786 283 static float speed_rate = 1.0;
okano 0:5d0abdf92786 284
okano 0:5d0abdf92786 285 if ( pause )
okano 0:5d0abdf92786 286 return;
okano 0:5d0abdf92786 287
okano 0:5d0abdf92786 288 distance = target_pos - current_pos;
okano 0:5d0abdf92786 289 distance = (distance < 0)? -distance : distance;
okano 0:5d0abdf92786 290
okano 0:5d0abdf92786 291 if ( !distance ) {
okano 6:007d0570ba4f 292 if ( power_ctrl )
okano 6:007d0570ba4f 293 motor_out = 0;
okano 6:007d0570ba4f 294
okano 0:5d0abdf92786 295 moved_steps = 0;
okano 0:5d0abdf92786 296 return;
okano 0:5d0abdf92786 297 }
okano 0:5d0abdf92786 298
okano 0:5d0abdf92786 299 if ( !moved_steps ) { // ramp control
okano 0:5d0abdf92786 300 speed_rate = ramp_init_speed_rate;
okano 0:5d0abdf92786 301 ramp_steps = ((ramp_control_steps * 2) - distance) / 2;
okano 0:5d0abdf92786 302 ramp_steps = (0 < ramp_steps) ? ramp_control_steps - ramp_steps : ramp_control_steps;
okano 0:5d0abdf92786 303 // printf( "ramp_steps=%d, speed_rate=%f\r\n", ramp_steps, speed_rate );
okano 0:5d0abdf92786 304 // printf( "diff=%d, speed_rate=%f\r\n", diff, speed_rate );
okano 0:5d0abdf92786 305 } else if ( moved_steps < ramp_steps ) {
okano 0:5d0abdf92786 306 speed_rate /= ramp_rate;
okano 0:5d0abdf92786 307 } else if ( distance <= ramp_steps ) {
okano 0:5d0abdf92786 308 speed_rate *= ramp_rate;
okano 0:5d0abdf92786 309 } else {
okano 0:5d0abdf92786 310 speed_rate = 1.0;
okano 0:5d0abdf92786 311 }
okano 0:5d0abdf92786 312
okano 0:5d0abdf92786 313 moved_steps++;
okano 0:5d0abdf92786 314 current_pos = current_pos + ( (target_pos < current_pos) ? -1 : 1 );
okano 0:5d0abdf92786 315
okano 0:5d0abdf92786 316 motor_out = pattern[ (current_pos + pos_offset) & pat_index_mask ];
okano 0:5d0abdf92786 317
okano 0:5d0abdf92786 318 //printf( "%d>>>%d\r\n", current_pos, target_pos );
okano 0:5d0abdf92786 319
okano 0:5d0abdf92786 320 if ( speed_rate != 1.0 ) {
okano 2:6835e719ff96 321 t.detach();
okano 2:6835e719ff96 322 t.attach( this, &StepperMotorUni::motor_maintain, ((1.0 / (float)pps)) / speed_rate );
okano 0:5d0abdf92786 323 }
okano 0:5d0abdf92786 324
okano 0:5d0abdf92786 325 if ( target_pos == current_pos ) {
okano 0:5d0abdf92786 326 current_pos = current_pos % max_pos;
okano 0:5d0abdf92786 327 target_pos = target_pos % max_pos;
okano 0:5d0abdf92786 328 moved_steps = 0;
okano 0:5d0abdf92786 329 }
okano 0:5d0abdf92786 330 };
okano 0:5d0abdf92786 331
okano 4:6909efe4c8ac 332 int StepperMotorUni::go_position( int target_pos )
okano 4:6909efe4c8ac 333 {
okano 0:5d0abdf92786 334
okano 0:5d0abdf92786 335 current_pos = current_pos % max_pos;
okano 0:5d0abdf92786 336 current_pos = (current_pos < 0) ? current_pos + max_pos : current_pos;
okano 0:5d0abdf92786 337
okano 0:5d0abdf92786 338 target_pos = target_pos % max_pos;
okano 0:5d0abdf92786 339 target_pos = (target_pos < 0) ? target_pos + max_pos : target_pos;
okano 0:5d0abdf92786 340
okano 0:5d0abdf92786 341 #define CW 0
okano 0:5d0abdf92786 342 #define CCW 1
okano 0:5d0abdf92786 343
okano 0:5d0abdf92786 344 int direction;
okano 0:5d0abdf92786 345
okano 0:5d0abdf92786 346 switch ( rot_mode ) {
okano 0:5d0abdf92786 347 case NO_WRAPAROUND :
okano 0:5d0abdf92786 348 direction = (current_pos < target_pos) ? CW : CCW;
okano 0:5d0abdf92786 349 break;
okano 0:5d0abdf92786 350 case CLOCKWISE_ONLY :
okano 0:5d0abdf92786 351 direction = CW;
okano 0:5d0abdf92786 352 break;
okano 0:5d0abdf92786 353 case COUNTER_CLOCKWISE_ONLY :
okano 0:5d0abdf92786 354 direction = CCW;
okano 0:5d0abdf92786 355 break;
okano 0:5d0abdf92786 356 default : // SHORTEST :
okano 0:5d0abdf92786 357 direction = ( (max_pos >> 1) < ((target_pos + max_pos - current_pos) % max_pos) ) ? CCW : CW;
okano 0:5d0abdf92786 358 break;
okano 0:5d0abdf92786 359 }
okano 0:5d0abdf92786 360
okano 0:5d0abdf92786 361 switch ( direction ) {
okano 0:5d0abdf92786 362 case CW :
okano 0:5d0abdf92786 363 current_pos = (target_pos < current_pos) ? current_pos - max_pos : current_pos;
okano 0:5d0abdf92786 364 break;
okano 0:5d0abdf92786 365 case CCW :
okano 0:5d0abdf92786 366 target_pos = (current_pos < target_pos) ? target_pos - max_pos : target_pos;
okano 0:5d0abdf92786 367 break;
okano 0:5d0abdf92786 368 }
okano 0:5d0abdf92786 369
okano 0:5d0abdf92786 370 set_target_pos( target_pos );
okano 0:5d0abdf92786 371 return ( current_pos );
okano 0:5d0abdf92786 372 }
okano 0:5d0abdf92786 373
okano 0:5d0abdf92786 374 #if 0
okano 0:5d0abdf92786 375 unsigned char StepperMotorUni::pattern_one_phase[ 4 ] = { 0x8, 0x4, 0x2, 0x1 };
okano 0:5d0abdf92786 376 unsigned char StepperMotorUni::pattern_two_phase[ 4 ] = { 0x9, 0xC, 0x6, 0x3 };
okano 0:5d0abdf92786 377 unsigned char StepperMotorUni::pattern_halfstep[ 8 ] = { 0x9, 0x8, 0xC, 0x4, 0x6, 0x2, 0x3, 0x1 };
okano 0:5d0abdf92786 378 #else
okano 0:5d0abdf92786 379 unsigned char StepperMotorUni::pattern_one_phase[ 4 ] = { 0x1, 0x2, 0x4, 0x8 };
okano 0:5d0abdf92786 380 unsigned char StepperMotorUni::pattern_two_phase[ 4 ] = { 0x3, 0x6, 0xC, 0x9 };
okano 0:5d0abdf92786 381 unsigned char StepperMotorUni::pattern_halfstep[ 8 ] = { 0x1, 0x3, 0x2, 0x6, 0x4, 0xC, 0x8, 0x9 };
okano 0:5d0abdf92786 382 #endif