Motor
Fork of Motor by
motor.h@9:bec5a728405f, 2013-09-22 (annotated)
- Committer:
- Reiko
- Date:
- Sun Sep 22 07:24:15 2013 +0000
- Revision:
- 9:bec5a728405f
- Parent:
- 8:63a67086a1b5
- Child:
- 10:b0e6051a6109
Changed PWM frequency to 400Hz
Who changed what in which revision?
User | Revision | Line number | New 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 | 3:94db629c0a83 | 92 | int iDiv; |
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 |