Allegro A3930 BLDC driver

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?

UserRevisionLine numberNew 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