Revision:
0:6a968d1c95c7
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/StepperMotor.h	Sat Aug 27 09:56:46 2011 +0000
@@ -0,0 +1,228 @@
+/** Stepper Motor control library
+ *  
+ *  Copyright: 2010 Tedd OKANO, Tsukimidai Communications Syndicate - Crawl Design
+ *  The library that controls stepper motor via motor driver chip: TA7774
+ *  The TA7774 is a driver for a bipolar stepper motor. 
+ *  With this library, mbed will generate 2 phase pulses to operate the motor. 
+ */
+ 
+#ifndef    MBED_STEPPERMOTOR
+#define    MBED_STEPPERMOTOR
+
+#include "mbed.h"
+
+#define MAX_PPS   50   //  pulse per second
+
+/** Stepper Motor control class
+ *
+ *  Example:
+ *  @code
+ *  #include "mbed.h"
+ *  #include "StepperMotor.h"
+ *
+ *  StepperMotor m( p21, p22, p23, p24 );
+ *
+ *  int main() {
+ *      m.set_sync_mode( StepperMotor::SYNCHRONOUS );
+ *      m.set_power_ctrl( true );
+ *
+ *      while( 1 ) {
+ *          m.go_angle( 120 );
+ *          wait( 0.5 );
+ *     
+ *          m.go_angle( 240 );
+ *          wait( 0.5 );
+ *   
+ *          m.go_angle( 0 );
+ *          wait( 0.5 ); 
+ *
+ *          m.go_angle( 240 );
+ *          wait( 0.5 );
+ *     
+ *          m.go_angle( 120 );
+ *          wait( 0.5 );
+ *   
+ *          m.go_angle( 0 );
+ *          wait( 0.5 ); 
+ *      }
+ *  }
+ *  @endcode
+ */
+
+class StepperMotor {
+public:
+
+    /** Constants for motor rotate mode */     
+    typedef enum  {
+        SHORTEST,                   /**< turn by shortest direction      */
+        NO_WRAPAROUND,              /**< do not accross home position    */
+        CLOCKWISE_ONLY,             /**< one-way: clockwise turn         */
+        COUNTER_CLOCKWISE_ONLY      /**< one-way: counter clockwise turn */
+    } RotMode;
+
+    /** Constants for syncronization mode */     
+    typedef enum  {
+        ASYNCHRONOUS,               /**< program does wait motor turn completion     */
+        SYNCHRONOUS                 /**< program doesn't wait motor turn completion  */
+    } SyncMode;
+
+    /** Constants for position detection edge polarity */     
+    typedef enum  {
+        RISING_EDGE,                /**< position detection done by rising  edge */
+        FALLING_EDGE                /**< position detection done by falling edge */
+    } PositionDetectPorarity;
+
+    /** Create a stepper motor object connected to specified DigitalOut pins and a DigitalIn pin
+     *
+     *  @param out_A DigitalOut pin for motor pulse signal-A
+     *  @param out_B DigitalOut pin for motor pulse signal-B
+     *  @param out_PWR DigitalOut pin for TA7774's power control (option)
+     *  @param position_detect DigitalIn pin for home position detection (option)
+     */
+    StepperMotor(
+        PinName out_A   = p21,
+        PinName out_B   = p22,
+        PinName out_PWR = p23,
+        PinName position_detect = p24
+    ) ;
+
+    /** Set the pulse width (i.e. motor turning speed)
+     *
+     *  @param v pulse per second : default is 100. lower number makes the turn slower
+     */
+    int set_pps( int v );
+
+    /** Set maximum PPS (= minimum pulse width) which will be used in finding home position
+     *
+     *  @param v maximum pulse per second : default is 100. lower number makes the turn slower
+     */
+    void set_max_pps( int v );
+
+    /** Find home position: rotate the motor until the detection edge comes.
+     *
+     *  Turns the motor until the home position detected. 
+     *  The "home position" is a reference point for the step and angle. It will be step=0 and angle=0. 
+     *  The detection signal edge can be defined by an argument. 
+     *  It follows the rotate mode. 
+     *  When the edge is detected, the motor will be stopped and it will be the new home position. 
+     *  If no detection signal detected, no home position update done. 
+     * 
+     *  @param edge defines detection edge rise or fall
+     */
+    int find_home_position( PositionDetectPorarity edge );
+    
+    /** Update home position
+     *
+     *  Set the home position as current motor position.
+     */     
+    void set_home_position( void );
+    
+    /** Turn the motor to defined position (by steps from home position)
+     *
+     *  Make motor move to absolute position
+     *
+     *  @param v the position defined by steps from home position
+     */     
+    int go_position( int v );
+
+    /** Turn the motor to defined position (by angle (0.0..360 degree) from home position)
+     *
+     *  Make motor move to absolute position
+     *
+     *  @param v the position defined by steps from home position
+     */     
+    void go_angle( float angle );
+
+    /** Turn the motor to defined position (by steps from current position)
+     *
+     *  Make motor move to defined position
+     *
+     *  @param v the position defined by steps from home position
+     */     
+    int move_steps( int s );
+    
+    /** Interface for motor rotate mode setting
+     *
+     *  Example:
+     *  @code
+     *  StepperMotor    m( p21, p22, p23, p24 );
+     *  int main() {
+     *      m.set_rot_mode( StepperMotor::NO_WRAPAROUND );
+     *      ...
+     *  @endcode
+     *
+     *  @param m motor rotate mode : SHORTEST, NO_WRAPAROUND, CLOCKWISE_ONLY or COUNTER_CLOCKWISE_ONLY
+     */
+    void set_rot_mode( RotMode m );
+
+    /** Interface for syncronization mode setting
+     *
+     *  Example:
+     *  @code
+     *  StepperMotor    m( p21, p22, p23, p24 );
+     *  int main() {
+     *      m.set_sync_mode( StepperMotor::NO_WRAPAROUND );
+     *      ...
+     *  @endcode
+     *
+     *  @param m motor rotate mode : ASYNCHRONOUS or SYNCHRONOUS
+     */
+    void set_sync_mode( SyncMode m );
+
+    /** Check remaining distance that motor need to move
+     *
+     *  software can check if the motor action completed in asynchronous mode
+     *  
+     *  @return remaining steps that motor need to go
+     */
+    int distance( void );
+
+    /** Pause/Resume the motor action
+     *
+     *  @param sw use "true" for pause, "false" for resume
+     */
+    void set_pause( int sw );
+
+    /** Auto power control enable
+     *
+     *  If the auto power control is enabled, the motor power will be turned-off when it stays same place
+     *  
+     *  @param sw use "true" for pause, "false" for resume
+     */
+    void set_power_ctrl( int sw );
+
+    /** Setting for steps/rotate
+     *
+     *  This parameter is required if program want to use the "go_angle()" interface. 
+     *  The angle will be calculated from this parameter.
+     *  
+     *  @param steps per rotate
+     */
+    void set_steps_per_rotate( int steps );
+    
+private:
+
+    Ticker      t;
+    BusOut      motor_out;
+    DigitalOut  pwr_out;
+    DigitalIn   position_detect_pin;
+
+    static const unsigned char  pat[ 4 ];  //  2 phase pulse pattern for motor control
+    RotMode     rot_mode;
+    SyncMode    sync_mode;
+    int         max_pos;
+    int         current_pos;
+    int         pos_offset;
+    int         target_pos;
+    int         pps;
+    int         max_pps;
+    int         init_done;
+    int         pause;
+    int         power_ctrl;
+
+    void set_target_pos( int p );  //  target position setting interface
+    void motor_maintain( void );   //  this function is called periodically by Ticker
+};
+
+
+#endif
\ No newline at end of file