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