Library for driving a motor with one PWM and one DIR signal using PI control.

Fork of Motor2 by Reiko Randoja

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers motor.h Source File

motor.h

00001 #ifndef MOTOR_H
00002 #define MOTOR_H
00003 
00004 #include "mbed.h"
00005 #include "PCA9555.h"
00006 #include "qed.h"
00007  /** Class for controlling motors trough PCA9555 */
00008 class Motor {
00009 protected:
00010     FunctionPointer stallChangeCallback;
00011     FunctionPointer stallEndCallback;
00012     FunctionPointer stallWarningCallback;
00013     FunctionPointer stallErrorCallback;
00014 public:
00015     /** Create an instance of the motor connected to specfied pins, and IO-expander.
00016      *
00017      * @param PWMpin Pin for PWM output
00018      * @param *ioExt Pointer to IO-expander object
00019      * @param dir1Pin Direction pin 1 number (on IO-expander)
00020      * @param dir2Pin Direction pin 2 number (on IO-expander)
00021      * @param encA Encoder pin
00022      * @param encB Encoder pin
00023      */
00024     Motor(PinName PWMpin, PCA9555 *ioExt, unsigned int dirPin, PinName encA, PinName encB);
00025     
00026     /** Set speed setpoint
00027      *
00028      * @param newSpeed New setpoint
00029      */
00030     void setSpeed(int newSpeed);
00031     
00032     /** Get current speed setpoint value */
00033     int getSpeed();
00034     
00035     /**Method that calculates appropriate PWM values for keeping motor speed close to setpoint
00036     *     This method shoud be called periodically (60Hz)
00037     */
00038     void pid();
00039     
00040     int getStallLevel();
00041     
00042     void stallChange(void (*function)(void));
00043     
00044     template<typename T>
00045     void stallChange(T *object, void (T::*member)(void)) { 
00046         stallChangeCallback.attach(object, member); 
00047     }
00048     
00049     void stallEnd(void (*function)(void));
00050     
00051     template<typename T>
00052     void stallEnd(T *object, void (T::*member)(void)) { 
00053         stallEndCallback.attach(object, member); 
00054     }
00055     
00056     void stallWarning(void (*function)(void));
00057     
00058     template<typename T>
00059     void stallWarning(T *object, void (T::*member)(void)) { 
00060         stallWarningCallback.attach(object, member); 
00061     }
00062     
00063     void stallError(void (*function)(void));
00064     
00065     template<typename T>
00066     void stallError(T *object, void (T::*member)(void)) { 
00067         stallErrorCallback.attach(object, member); 
00068     }
00069  
00070 private:
00071     PwmOut pwm;
00072     PCA9555 *extIO;
00073     unsigned int dir;
00074     QED qed;
00075     
00076     int currentSpeed;
00077     int getDecoderCount();
00078     
00079     void resetPID();
00080 
00081     /** Set pwm duty cycle
00082      *
00083      * @param newPWM Duty cycle
00084      */
00085     void setPWM(int newPWM);
00086     
00087     //void pid();
00088 
00089     int setPoint;
00090     int pMulti;
00091     int iMulti;
00092     int dMulti;
00093     int error;
00094     int prevError;
00095     int P;
00096     int I;
00097     int D;
00098     int minPwm;
00099     int pidMulti;
00100     int iMax;
00101     
00102     int pwmPeriod;
00103     
00104     int currentPWM;
00105     int stallCount;
00106     int prevStallCount;
00107     int stallWarningLimit;
00108     int stallErrorLimit;
00109     int stallLevel;
00110 };
00111 
00112 #endif