Allegro A3930 BLDC driver
a3930.h@1:464cd2cb852e, 2013-11-10 (annotated)
- Committer:
- Reiko
- Date:
- Sun Nov 10 15:36:47 2013 +0000
- Revision:
- 1:464cd2cb852e
- Parent:
- 0:a6123d12f08b
Added debounce to DIRO
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Reiko | 0:a6123d12f08b | 1 | #ifndef A3930_H |
Reiko | 0:a6123d12f08b | 2 | #define A3930_H |
Reiko | 0:a6123d12f08b | 3 | |
Reiko | 0:a6123d12f08b | 4 | #include "mbed.h" |
Reiko | 0:a6123d12f08b | 5 | #include "PCA9555.h" |
Reiko | 1:464cd2cb852e | 6 | #include "PinDetect.h" |
Reiko | 0:a6123d12f08b | 7 | |
Reiko | 0:a6123d12f08b | 8 | /** Class for controlling motors trough PCA9555 */ |
Reiko | 0:a6123d12f08b | 9 | class A3930 { |
Reiko | 0:a6123d12f08b | 10 | protected: |
Reiko | 0:a6123d12f08b | 11 | FunctionPointer stallChangeCallback; |
Reiko | 0:a6123d12f08b | 12 | FunctionPointer stallEndCallback; |
Reiko | 0:a6123d12f08b | 13 | FunctionPointer stallWarningCallback; |
Reiko | 0:a6123d12f08b | 14 | FunctionPointer stallErrorCallback; |
Reiko | 0:a6123d12f08b | 15 | public: |
Reiko | 0:a6123d12f08b | 16 | /** Create an instance of the motor connected to specfied pins, and IO-expander. |
Reiko | 0:a6123d12f08b | 17 | * |
Reiko | 0:a6123d12f08b | 18 | * @param PWMpin Pin for PWM output |
Reiko | 0:a6123d12f08b | 19 | * @param *ioExt Pointer to IO-expander object |
Reiko | 0:a6123d12f08b | 20 | * @param dir1Pin Direction pin 1 number (on IO-expander) |
Reiko | 0:a6123d12f08b | 21 | * @param dir2Pin Direction pin 2 number (on IO-expander) |
Reiko | 0:a6123d12f08b | 22 | * @param encA Encoder pin |
Reiko | 0:a6123d12f08b | 23 | * @param encB Encoder pin |
Reiko | 0:a6123d12f08b | 24 | */ |
Reiko | 0:a6123d12f08b | 25 | A3930(PinName PWMpin, PCA9555 *ioExt, unsigned int dirPin, unsigned int brakePin, unsigned int coastPin, PinName tachoPin, PinName diroPin); |
Reiko | 0:a6123d12f08b | 26 | |
Reiko | 0:a6123d12f08b | 27 | /** Set speed setpoint |
Reiko | 0:a6123d12f08b | 28 | * |
Reiko | 0:a6123d12f08b | 29 | * @param newSpeed New setpoint |
Reiko | 0:a6123d12f08b | 30 | */ |
Reiko | 0:a6123d12f08b | 31 | void setSpeed(int newSpeed); |
Reiko | 0:a6123d12f08b | 32 | |
Reiko | 0:a6123d12f08b | 33 | /** Get current speed setpoint value */ |
Reiko | 0:a6123d12f08b | 34 | int getSpeed(); |
Reiko | 0:a6123d12f08b | 35 | |
Reiko | 0:a6123d12f08b | 36 | /**Method that calculates appropriate PWM values for keeping motor speed close to setpoint |
Reiko | 0:a6123d12f08b | 37 | * This method shoud be called periodically (60Hz) |
Reiko | 0:a6123d12f08b | 38 | */ |
Reiko | 0:a6123d12f08b | 39 | void pid(); |
Reiko | 0:a6123d12f08b | 40 | |
Reiko | 0:a6123d12f08b | 41 | /** Set pwm duty cycle |
Reiko | 0:a6123d12f08b | 42 | * |
Reiko | 0:a6123d12f08b | 43 | * @param newPWM Duty cycle |
Reiko | 0:a6123d12f08b | 44 | */ |
Reiko | 0:a6123d12f08b | 45 | void setPWM(float newPWM); |
Reiko | 0:a6123d12f08b | 46 | |
Reiko | 1:464cd2cb852e | 47 | void setRawPWM(float newPWM); |
Reiko | 1:464cd2cb852e | 48 | |
Reiko | 0:a6123d12f08b | 49 | int getStallLevel(); |
Reiko | 0:a6123d12f08b | 50 | |
Reiko | 0:a6123d12f08b | 51 | void stallChange(void (*function)(void)); |
Reiko | 0:a6123d12f08b | 52 | |
Reiko | 0:a6123d12f08b | 53 | template<typename T> |
Reiko | 0:a6123d12f08b | 54 | void stallChange(T *object, void (T::*member)(void)) { |
Reiko | 0:a6123d12f08b | 55 | stallChangeCallback.attach(object, member); |
Reiko | 0:a6123d12f08b | 56 | } |
Reiko | 0:a6123d12f08b | 57 | |
Reiko | 0:a6123d12f08b | 58 | void stallEnd(void (*function)(void)); |
Reiko | 0:a6123d12f08b | 59 | |
Reiko | 0:a6123d12f08b | 60 | template<typename T> |
Reiko | 0:a6123d12f08b | 61 | void stallEnd(T *object, void (T::*member)(void)) { |
Reiko | 0:a6123d12f08b | 62 | stallEndCallback.attach(object, member); |
Reiko | 0:a6123d12f08b | 63 | } |
Reiko | 0:a6123d12f08b | 64 | |
Reiko | 0:a6123d12f08b | 65 | void stallWarning(void (*function)(void)); |
Reiko | 0:a6123d12f08b | 66 | |
Reiko | 0:a6123d12f08b | 67 | template<typename T> |
Reiko | 0:a6123d12f08b | 68 | void stallWarning(T *object, void (T::*member)(void)) { |
Reiko | 0:a6123d12f08b | 69 | stallWarningCallback.attach(object, member); |
Reiko | 0:a6123d12f08b | 70 | } |
Reiko | 0:a6123d12f08b | 71 | |
Reiko | 0:a6123d12f08b | 72 | void stallError(void (*function)(void)); |
Reiko | 0:a6123d12f08b | 73 | |
Reiko | 0:a6123d12f08b | 74 | template<typename T> |
Reiko | 0:a6123d12f08b | 75 | void stallError(T *object, void (T::*member)(void)) { |
Reiko | 0:a6123d12f08b | 76 | stallErrorCallback.attach(object, member); |
Reiko | 0:a6123d12f08b | 77 | } |
Reiko | 0:a6123d12f08b | 78 | |
Reiko | 0:a6123d12f08b | 79 | private: |
Reiko | 0:a6123d12f08b | 80 | PwmOut pwm; |
Reiko | 0:a6123d12f08b | 81 | PCA9555 *extIO; |
Reiko | 0:a6123d12f08b | 82 | unsigned int dirPinNumber; |
Reiko | 0:a6123d12f08b | 83 | unsigned int brakePinNumber; |
Reiko | 0:a6123d12f08b | 84 | unsigned int coastPinNumber; |
Reiko | 0:a6123d12f08b | 85 | |
Reiko | 0:a6123d12f08b | 86 | InterruptIn interruptTacho; |
Reiko | 1:464cd2cb852e | 87 | //InterruptIn interruptDiro; |
Reiko | 1:464cd2cb852e | 88 | |
Reiko | 1:464cd2cb852e | 89 | //PinDetect interruptTacho; |
Reiko | 1:464cd2cb852e | 90 | PinDetect interruptDiro; |
Reiko | 0:a6123d12f08b | 91 | |
Reiko | 0:a6123d12f08b | 92 | volatile int diro; |
Reiko | 0:a6123d12f08b | 93 | volatile int pulses; |
Reiko | 0:a6123d12f08b | 94 | |
Reiko | 0:a6123d12f08b | 95 | int currentSpeed; |
Reiko | 0:a6123d12f08b | 96 | int getDecoderCount(); |
Reiko | 0:a6123d12f08b | 97 | |
Reiko | 0:a6123d12f08b | 98 | void tachoChanged(); |
Reiko | 0:a6123d12f08b | 99 | void diroRise(); |
Reiko | 0:a6123d12f08b | 100 | void diroFall(); |
Reiko | 0:a6123d12f08b | 101 | |
Reiko | 0:a6123d12f08b | 102 | void resetPID(); |
Reiko | 0:a6123d12f08b | 103 | |
Reiko | 0:a6123d12f08b | 104 | int setPoint; |
Reiko | 0:a6123d12f08b | 105 | float pMulti; |
Reiko | 0:a6123d12f08b | 106 | float iMulti; |
Reiko | 0:a6123d12f08b | 107 | float dMulti; |
Reiko | 0:a6123d12f08b | 108 | int error; |
Reiko | 0:a6123d12f08b | 109 | int prevError; |
Reiko | 0:a6123d12f08b | 110 | float P; |
Reiko | 0:a6123d12f08b | 111 | float I; |
Reiko | 0:a6123d12f08b | 112 | float D; |
Reiko | 0:a6123d12f08b | 113 | float minPwm; |
Reiko | 0:a6123d12f08b | 114 | |
Reiko | 0:a6123d12f08b | 115 | float pwmPeriod; |
Reiko | 0:a6123d12f08b | 116 | |
Reiko | 0:a6123d12f08b | 117 | float currentPWM; |
Reiko | 0:a6123d12f08b | 118 | int stallCount; |
Reiko | 0:a6123d12f08b | 119 | int prevStallCount; |
Reiko | 0:a6123d12f08b | 120 | int stallWarningLimit; |
Reiko | 0:a6123d12f08b | 121 | int stallErrorLimit; |
Reiko | 0:a6123d12f08b | 122 | int stallLevel; |
Reiko | 0:a6123d12f08b | 123 | }; |
Reiko | 0:a6123d12f08b | 124 | |
Reiko | 0:a6123d12f08b | 125 | #endif |