Allegro A3930 BLDC driver

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?

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