update

Stepper.h

Committer:
mederic
Date:
2013-04-15
Revision:
0:f2a3b0be279d
Child:
1:a456aa3935ca

File content as of revision 0:f2a3b0be279d:

#ifndef STEPPER_H
#define STEPPER_H

#include "mbed.h"
/** Stepper class.
 *  Used for drive Stepper motor
 *
 * Example:
 * @code
 * #include "mbed.h"
 * #include "Stepper.h"
 *
 * DigitalIn home(p20);
 * Stepper mot(p21,p22);
 *
 * int main()
 * {
 *    mot.setSpeed(1200);
 *    mot.setAcceleration(4000);
 *    mot.setDeceleration(4000);
 *
 *    mot.rotate(CW);
 *    while(!home);
 *    mot.stop();
 *    mot.setPositionZero();
 *
 *    mot.goesTo(1600);
 *    while(!mot.stopped());
 *
 *    while(1)
 *    {
 *
 *    }
 * }
 * @endcode
 */
class Stepper
{
public:
    /** Create Stepper instance connected to pin clk & dir
    * @param clk pin to connect at clk/step output
    * @param dir pin to connect at dir output
    */
    Stepper(PinName clk, PinName dir);
    
    /** Moving the motor relative to a reference position (set by setPositionZero())
    * @param position steps from position zero 
    */
    void goesTo(int position); 
    
    /** Moving the motor for given steps
    * @param steps number of steps to go(>0 CW ; <0 CCW)
    */
    void move(int steps);
    
    /** Moving the motor until user stop
    * @param direction rotation Stepper::CC or Stepper::CCW
    */
    void rotate(bool direction);
    
    /** Stop the motor as fast as possible
    */
    void stop(void);
    
    /**Set Rotation Speed
    * @param speed [steps/sec]
    */
    void setSpeed(float speed);
    
    /**Set Acceleration ramp
    * @param acc acceleration [steps/sec²] (0 = infinite acceleration 1st step @ max speed)
    */
    void setAcceleration(float acc);
    
    /**Set Deceleration ramp
    * @param dec deceleration [steps/sec²] (0 = infinite deceleration last step @ max speed)
    */
    void setDeceleration(float dec);
    
    /**Give Origin for motor absolute movement
    */
    void setPositionZero(void);
    
    /**Check if motor is stopped
    * @returns true if motor stopped
    */  
    bool stopped(void);
    
    /**Get absolute position from origin
    * @returns position [steps] from origin set by setPositionZero()
    */
    int getPosition(void);
    
    /**Get Acceleration
    * @returns acceleration [steps/sec²]
    */
    float getAcceleration(void);
    
    /**Get Deceleration
    * @returns deceleration [steps/sec²]
    */
    float getDeceleration(void);
    
    /**Get Speed
    * @returns speed [steps/sec]
    */
    float getSpeed(void);
    
    /**Enum for direction
    *   CW=true or 1; CCW=false or 0
    */
    typedef enum {CW=1,CCW=0} direction;
    
protected:
    void run(void);         //step generator thread
    unsigned int nTo(float speed,float acc);
      
private:
    float _acc;                         //Acceleration [step/s²]
    float _dec;                         //Decceleration [step/s²]
    float _spd;                         //Speed [step/s]
    unsigned int _steps;                //nbr total of steps per mov
    DigitalOut _clk;                    //output clock pin 
    DigitalOut _dir;                    //output dir pin
    Timeout _timer;                     //step timer
    enum {STOP,ACCEL,CRUISE,DECEL}_state;  //Motor state
    unsigned int _dt0;                  //initial delay [µs]
    unsigned int _dtmin;                //delay minimum [µs]
    int _pos;                           //motor position
};

#endif