Motor

Fork of Motor by Reiko Randoja

Committer:
Reiko
Date:
Sun Nov 03 11:41:40 2013 +0000
Revision:
10:b0e6051a6109
Parent:
9:bec5a728405f
Increased PI controller parameters

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Reiko 0:5cafacc2a607 1 #ifndef MOTOR_H
Reiko 0:5cafacc2a607 2 #define MOTOR_H
Reiko 0:5cafacc2a607 3
Reiko 0:5cafacc2a607 4 #include "mbed.h"
Reiko 1:c97f8bcd6c0f 5 #include "PCA9555.h"
Reiko 1:c97f8bcd6c0f 6 #include "qed.h"
mlaane 4:2b77f4656e92 7 /** Class for controlling motors trough PCA9555 */
Reiko 0:5cafacc2a607 8 class Motor {
Reiko 5:99fa6dffea40 9 protected:
Reiko 8:63a67086a1b5 10 FunctionPointer stallChangeCallback;
Reiko 8:63a67086a1b5 11 FunctionPointer stallEndCallback;
Reiko 5:99fa6dffea40 12 FunctionPointer stallWarningCallback;
Reiko 5:99fa6dffea40 13 FunctionPointer stallErrorCallback;
Reiko 0:5cafacc2a607 14 public:
mlaane 4:2b77f4656e92 15 /** Create an instance of the motor connected to specfied pins, and IO-expander.
mlaane 4:2b77f4656e92 16 *
mlaane 4:2b77f4656e92 17 * @param PWMpin Pin for PWM output
mlaane 4:2b77f4656e92 18 * @param *ioExt Pointer to IO-expander object
mlaane 4:2b77f4656e92 19 * @param dir1Pin Direction pin 1 number (on IO-expander)
mlaane 4:2b77f4656e92 20 * @param dir2Pin Direction pin 2 number (on IO-expander)
mlaane 4:2b77f4656e92 21 * @param encA Encoder pin
mlaane 4:2b77f4656e92 22 * @param encB Encoder pin
mlaane 4:2b77f4656e92 23 */
Reiko 1:c97f8bcd6c0f 24 Motor(PinName PWMpin, PCA9555 *ioExt, unsigned int dir1Pin, unsigned int dir2Pin, PinName encA, PinName encB);
mlaane 4:2b77f4656e92 25
mlaane 4:2b77f4656e92 26 /** Set speed setpoint
mlaane 4:2b77f4656e92 27 *
mlaane 4:2b77f4656e92 28 * @param newSpeed New setpoint
mlaane 4:2b77f4656e92 29 */
Reiko 0:5cafacc2a607 30 void setSpeed(int newSpeed);
mlaane 4:2b77f4656e92 31
mlaane 4:2b77f4656e92 32 /** Get current speed setpoint value */
Reiko 0:5cafacc2a607 33 int getSpeed();
mlaane 4:2b77f4656e92 34
mlaane 4:2b77f4656e92 35 /**Method that calculates appropriate PWM values for keeping motor speed close to setpoint
mlaane 4:2b77f4656e92 36 * This method shoud be called periodically (60Hz)
mlaane 4:2b77f4656e92 37 */
Reiko 1:c97f8bcd6c0f 38 void pid();
Reiko 5:99fa6dffea40 39
Reiko 8:63a67086a1b5 40 int getStallLevel();
Reiko 8:63a67086a1b5 41
Reiko 8:63a67086a1b5 42 void stallChange(void (*function)(void));
Reiko 8:63a67086a1b5 43
Reiko 8:63a67086a1b5 44 template<typename T>
Reiko 8:63a67086a1b5 45 void stallChange(T *object, void (T::*member)(void)) {
Reiko 8:63a67086a1b5 46 stallChangeCallback.attach(object, member);
Reiko 8:63a67086a1b5 47 }
Reiko 8:63a67086a1b5 48
Reiko 8:63a67086a1b5 49 void stallEnd(void (*function)(void));
Reiko 8:63a67086a1b5 50
Reiko 8:63a67086a1b5 51 template<typename T>
Reiko 8:63a67086a1b5 52 void stallEnd(T *object, void (T::*member)(void)) {
Reiko 8:63a67086a1b5 53 stallEndCallback.attach(object, member);
Reiko 8:63a67086a1b5 54 }
Reiko 8:63a67086a1b5 55
Reiko 5:99fa6dffea40 56 void stallWarning(void (*function)(void));
Reiko 5:99fa6dffea40 57
Reiko 5:99fa6dffea40 58 template<typename T>
Reiko 5:99fa6dffea40 59 void stallWarning(T *object, void (T::*member)(void)) {
Reiko 5:99fa6dffea40 60 stallWarningCallback.attach(object, member);
Reiko 5:99fa6dffea40 61 }
Reiko 5:99fa6dffea40 62
Reiko 5:99fa6dffea40 63 void stallError(void (*function)(void));
Reiko 5:99fa6dffea40 64
Reiko 5:99fa6dffea40 65 template<typename T>
Reiko 5:99fa6dffea40 66 void stallError(T *object, void (T::*member)(void)) {
Reiko 5:99fa6dffea40 67 stallErrorCallback.attach(object, member);
Reiko 5:99fa6dffea40 68 }
Reiko 0:5cafacc2a607 69
Reiko 0:5cafacc2a607 70 private:
Reiko 1:c97f8bcd6c0f 71 PwmOut pwm;
Reiko 1:c97f8bcd6c0f 72 PCA9555 *extIO;
Reiko 1:c97f8bcd6c0f 73 unsigned int dir1;
Reiko 1:c97f8bcd6c0f 74 unsigned int dir2;
Reiko 1:c97f8bcd6c0f 75 QED qed;
Reiko 1:c97f8bcd6c0f 76
Reiko 1:c97f8bcd6c0f 77 int currentSpeed;
Reiko 1:c97f8bcd6c0f 78 int getDecoderCount();
Reiko 0:5cafacc2a607 79
Reiko 2:3faf5dcde08f 80 void resetPID();
Reiko 7:fbd3fa0445e5 81
mlaane 4:2b77f4656e92 82 /** Set pwm duty cycle
mlaane 4:2b77f4656e92 83 *
mlaane 4:2b77f4656e92 84 * @param newPWM Duty cycle
mlaane 4:2b77f4656e92 85 */
mlaane 4:2b77f4656e92 86 void setPWM(int newPWM);
mlaane 4:2b77f4656e92 87
Reiko 1:c97f8bcd6c0f 88 //void pid();
Reiko 7:fbd3fa0445e5 89
Reiko 1:c97f8bcd6c0f 90 int setPoint;
Reiko 3:94db629c0a83 91 int pMulti;
Reiko 10:b0e6051a6109 92 int iMulti;
Reiko 3:94db629c0a83 93 int dMulti;
Reiko 3:94db629c0a83 94 int error;
Reiko 3:94db629c0a83 95 int prevError;
Reiko 3:94db629c0a83 96 int P;
Reiko 3:94db629c0a83 97 int I;
Reiko 3:94db629c0a83 98 int D;
Reiko 3:94db629c0a83 99 int minPwm;
Reiko 3:94db629c0a83 100 int pidMulti;
Reiko 3:94db629c0a83 101 int iMax;
Reiko 5:99fa6dffea40 102
Reiko 9:bec5a728405f 103 int pwmPeriod;
Reiko 9:bec5a728405f 104
Reiko 5:99fa6dffea40 105 int currentPWM;
Reiko 8:63a67086a1b5 106 int stallCount;
Reiko 8:63a67086a1b5 107 int prevStallCount;
Reiko 8:63a67086a1b5 108 int stallWarningLimit;
Reiko 8:63a67086a1b5 109 int stallErrorLimit;
Reiko 8:63a67086a1b5 110 int stallLevel;
Reiko 0:5cafacc2a607 111 };
Reiko 0:5cafacc2a607 112
Reiko 0:5cafacc2a607 113 #endif