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.
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)
2 phase drive
1-2 phase (half step) drive
Components pages
Components pages are available for bipolar
and unipolar
motor libraries
Diff: StepperMotorUni.cpp
- Revision:
- 4:6909efe4c8ac
- Parent:
- 3:0eec6148e739
- Child:
- 5:93f9ce526f38
--- a/StepperMotorUni.cpp Tue Apr 21 14:37:52 2015 +0000 +++ b/StepperMotorUni.cpp Wed Apr 22 03:24:21 2015 +0000 @@ -2,8 +2,8 @@ * * @class StepperMotorUni * @author Tedd OKANO - * @version 1.1 - * @date 21-Apr-2015 + * @version 1.1.1 + * @date 22-Apr-2015 * * Copyright: 2010, 2014, 2015 Tedd OKANO * Released under the Apache 2 license License @@ -15,28 +15,29 @@ * @code * #include "mbed.h" * #include "StepperMotorUni.h" - * + * * StepperMotorUni motor( p26, p25, p24, p23 ); - * + * * int main() * { * motor.set_pps( 50 ); - * + * * while ( 1 ) { * motor.move_steps( 24 ); * wait( 1 ); - * + * * motor.move_steps( -24 ); * wait( 1 ); * } * } * @endcode - * - * version 0.51(27-Nov-2010) // initial version (un-published) - * version 0.6 (15-Jan-2014) // compatible to LPC1768, LPC11U24 and LPC1114 targets - * version 1.0 (19-Jun-2014) // version 1.0 release + * + * version 0.51 (27-Nov-2010) // initial version (un-published) + * version 0.6 (15-Jan-2014) // compatible to LPC1768, LPC11U24 and LPC1114 targets + * version 1.0 (19-Jun-2014) // version 1.0 release * version 1.0.1 (14-Apr-2015) // API document correction - * version 1.1 (21-Apr-2015) // ramp control function enabled + * version 1.1 (21-Apr-2015) // ramp control function enabled + * version 1.1.1 (22-Apr-2015) // fixed: find_home_position compatibility with ramp control feature */ #include "mbed.h" @@ -49,21 +50,22 @@ PinName out_D, PinName position_detect ) : - motor_out( out_A, out_B, out_C, out_D ), - position_detect_pin( position_detect ), - rot_mode( SHORTEST ), - sync_mode( ASYNCHRONOUS ), - max_pos( 480 ), - current_pos( 0 ), - pos_offset( 0 ), - target_pos( 0 ), - max_pps( MAX_PPS ), - init_done( false ), - pause( false ), - power_ctrl( false ), - ramp_init_speed_rate( 1.0 ), - ramp_control_steps( 0 ), - ramp_rate( 1.0 ) { + motor_out( out_A, out_B, out_C, out_D ), + position_detect_pin( position_detect ), + rot_mode( SHORTEST ), + sync_mode( ASYNCHRONOUS ), + max_pos( 480 ), + current_pos( 0 ), + pos_offset( 0 ), + target_pos( 0 ), + max_pps( MAX_PPS ), + init_done( false ), + pause( false ), + power_ctrl( false ), + ramp_init_speed_rate( 1.0 ), + ramp_control_steps( 0 ), + ramp_rate( 1.0 ) +{ pps = max_pps; pattern = (unsigned char *)pattern_one_phase; @@ -71,7 +73,8 @@ t.attach( this, &StepperMotorUni::motor_maintain, 1.0 / (float)pps ); } -float StepperMotorUni::set_pps( float v ) { +float StepperMotorUni::set_pps( float v ) +{ float p; p = pps; @@ -81,14 +84,18 @@ return ( p ); } -void StepperMotorUni::set_max_pps( float v ) { +void StepperMotorUni::set_max_pps( float v ) +{ max_pps = v; } -int StepperMotorUni::find_home_position( PositionDetectPorarity edge ) { +int StepperMotorUni::find_home_position( PositionDetectPorarity edge ) +{ RotMode prev_rot; SyncMode prev_sync; float prev_pps; + float prev_i_rate; + int prev_rcs; int prev_det_pin; int direction; @@ -96,12 +103,15 @@ return 0; prev_pps = set_pps( max_pps ); + prev_i_rate = ramp_init_speed_rate; + prev_rcs = ramp_control_steps; prev_rot = rot_mode; prev_sync = sync_mode; set_sync_mode( SYNCHRONOUS ); set_rot_mode( SHORTEST ); - prev_det_pin = position_detect_pin; + prev_det_pin = position_detect_pin; + set_ramp_control( 1.0, 0 ); if ( prev_rot == COUNTER_CLOCKWISE_ONLY ) direction = -1; @@ -137,11 +147,13 @@ set_pps( prev_pps ); set_rot_mode( prev_rot ); set_sync_mode( prev_sync ); + set_ramp_control( prev_i_rate, prev_rcs ); return ( init_done ); } -void StepperMotorUni::set_home_position( void ) { +void StepperMotorUni::set_home_position( void ) +{ set_pause( true ); pos_offset = current_pos & 0x3; current_pos = 0; @@ -150,21 +162,25 @@ } -void StepperMotorUni::go_angle( float angle ) { +void StepperMotorUni::go_angle( float angle ) +{ go_position( (int)((angle / 360.0) * (float)max_pos) ); } -int StepperMotorUni::move_steps( int s ) { +int StepperMotorUni::move_steps( int s ) +{ set_target_pos( current_pos + s ); return ( current_pos ); } -int StepperMotorUni::move_rotates( float r ) { +int StepperMotorUni::move_rotates( float r ) +{ set_target_pos( current_pos + (int)(r * (float)max_pos) ); return ( current_pos ); } -void StepperMotorUni::set_operation_phase_mode( OperationPhaseMode v ) { +void StepperMotorUni::set_operation_phase_mode( OperationPhaseMode v ) +{ switch ( v ) { case StepperMotorUni::ONE_PHASE : @@ -184,27 +200,33 @@ phase_mode = v; } -void StepperMotorUni::set_rot_mode( RotMode m ) { +void StepperMotorUni::set_rot_mode( RotMode m ) +{ rot_mode = m; } -void StepperMotorUni::set_sync_mode( SyncMode m ) { +void StepperMotorUni::set_sync_mode( SyncMode m ) +{ sync_mode = m; } -int StepperMotorUni::distance( void ) { +int StepperMotorUni::distance( void ) +{ return( target_pos - current_pos ); } -void StepperMotorUni::set_pause( int sw ) { +void StepperMotorUni::set_pause( int sw ) +{ pause = sw; } -void StepperMotorUni::brake( void ) { +void StepperMotorUni::brake( void ) +{ brake( SOFT_BRAKE ); } -void StepperMotorUni::brake( BrakeMode mode ) { +void StepperMotorUni::brake( BrakeMode mode ) +{ int extra_steps; if ( mode == SOFT_BRAKE ) { @@ -218,7 +240,8 @@ target_pos = current_pos + extra_steps; } -void StepperMotorUni::set_target_pos( int p ) { +void StepperMotorUni::set_target_pos( int p ) +{ target_pos = p; if (sync_mode == SYNCHRONOUS) @@ -226,21 +249,30 @@ wait( 0 ); } -void StepperMotorUni::set_power_ctrl( int sw ) { +void StepperMotorUni::set_power_ctrl( int sw ) +{ power_ctrl = sw; } -void StepperMotorUni::set_steps_per_rotate( int steps ) { +void StepperMotorUni::set_steps_per_rotate( int steps ) +{ max_pos = steps; } -void StepperMotorUni::set_ramp_control( float initial_speed_rate, int ramp_steps ) { +void StepperMotorUni::set_ramp_control( float initial_speed_rate, int ramp_steps ) +{ ramp_init_speed_rate = initial_speed_rate; ramp_control_steps = ramp_steps; - ramp_rate = powf( ramp_init_speed_rate, 1.0 / (float)ramp_control_steps ); + + if ( ramp_steps == 0 ) + ramp_rate = 1.0; + else { + ramp_rate = powf( ramp_init_speed_rate, 1.0 / (float)ramp_control_steps ); + } } -void StepperMotorUni::motor_maintain( void ) { +void StepperMotorUni::motor_maintain( void ) +{ int distance; static int moved_steps = 0; static int ramp_steps = 0; @@ -291,7 +323,8 @@ } }; -int StepperMotorUni::go_position( int target_pos ) { +int StepperMotorUni::go_position( int target_pos ) +{ current_pos = current_pos % max_pos; current_pos = (current_pos < 0) ? current_pos + max_pos : current_pos;