Dustin Berendsen
/
First_Motorcontrol
first succes
main.cpp@0:63306fecdb08, 2017-10-03 (annotated)
- Committer:
- DBerendsen
- Date:
- Tue Oct 03 18:13:07 2017 +0000
- Revision:
- 0:63306fecdb08
first succesful;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
DBerendsen | 0:63306fecdb08 | 1 | #include "mbed.h" |
DBerendsen | 0:63306fecdb08 | 2 | |
DBerendsen | 0:63306fecdb08 | 3 | DigitalOut motor1DirectionPin(D4); |
DBerendsen | 0:63306fecdb08 | 4 | PwmOut motor1MagnitudePin(D5); |
DBerendsen | 0:63306fecdb08 | 5 | DigitalIn button1(D8); |
DBerendsen | 0:63306fecdb08 | 6 | AnalogIn potMeterIn(A3); |
DBerendsen | 0:63306fecdb08 | 7 | Ticker tick; |
DBerendsen | 0:63306fecdb08 | 8 | |
DBerendsen | 0:63306fecdb08 | 9 | |
DBerendsen | 0:63306fecdb08 | 10 | |
DBerendsen | 0:63306fecdb08 | 11 | float GetReferenceVelocity() |
DBerendsen | 0:63306fecdb08 | 12 | { |
DBerendsen | 0:63306fecdb08 | 13 | // Returns reference velocity in rad/s. |
DBerendsen | 0:63306fecdb08 | 14 | // Positive value means clockwise rotation. |
DBerendsen | 0:63306fecdb08 | 15 | const float maxVelocity=8.4; // in rad/s of course! |
DBerendsen | 0:63306fecdb08 | 16 | |
DBerendsen | 0:63306fecdb08 | 17 | float referenceVelocity; // in rad/s |
DBerendsen | 0:63306fecdb08 | 18 | if (button1) |
DBerendsen | 0:63306fecdb08 | 19 | { //Clockwise rotation |
DBerendsen | 0:63306fecdb08 | 20 | referenceVelocity = potMeterIn * maxVelocity; |
DBerendsen | 0:63306fecdb08 | 21 | } |
DBerendsen | 0:63306fecdb08 | 22 | else |
DBerendsen | 0:63306fecdb08 | 23 | { |
DBerendsen | 0:63306fecdb08 | 24 | // Counterclockwise rotation |
DBerendsen | 0:63306fecdb08 | 25 | referenceVelocity = -1*potMeterIn * maxVelocity; |
DBerendsen | 0:63306fecdb08 | 26 | } |
DBerendsen | 0:63306fecdb08 | 27 | return referenceVelocity; |
DBerendsen | 0:63306fecdb08 | 28 | } |
DBerendsen | 0:63306fecdb08 | 29 | |
DBerendsen | 0:63306fecdb08 | 30 | void Setmotor1(float motorValue) |
DBerendsen | 0:63306fecdb08 | 31 | { |
DBerendsen | 0:63306fecdb08 | 32 | // Given -1<=motorValue<=1, this sets the PWM and direction |
DBerendsen | 0:63306fecdb08 | 33 | // bits for motor 1. Positive value makes motor rotating |
DBerendsen | 0:63306fecdb08 | 34 | // clockwise. motorValues outside range are truncated to |
DBerendsen | 0:63306fecdb08 | 35 | // within range |
DBerendsen | 0:63306fecdb08 | 36 | if (motorValue >=0) { |
DBerendsen | 0:63306fecdb08 | 37 | motor1DirectionPin=1; |
DBerendsen | 0:63306fecdb08 | 38 | } |
DBerendsen | 0:63306fecdb08 | 39 | else { |
DBerendsen | 0:63306fecdb08 | 40 | motor1DirectionPin=0; |
DBerendsen | 0:63306fecdb08 | 41 | } |
DBerendsen | 0:63306fecdb08 | 42 | if (fabs(motorValue)>1) { |
DBerendsen | 0:63306fecdb08 | 43 | motor1MagnitudePin = 1; |
DBerendsen | 0:63306fecdb08 | 44 | } |
DBerendsen | 0:63306fecdb08 | 45 | else { |
DBerendsen | 0:63306fecdb08 | 46 | motor1MagnitudePin = fabs(motorValue); |
DBerendsen | 0:63306fecdb08 | 47 | } |
DBerendsen | 0:63306fecdb08 | 48 | |
DBerendsen | 0:63306fecdb08 | 49 | } |
DBerendsen | 0:63306fecdb08 | 50 | |
DBerendsen | 0:63306fecdb08 | 51 | float FeedForwardControl(float referenceVelocity) |
DBerendsen | 0:63306fecdb08 | 52 | { |
DBerendsen | 0:63306fecdb08 | 53 | // very simple linear feed-forward control |
DBerendsen | 0:63306fecdb08 | 54 | const float MotorGain=8.4; // unit: (rad/s) / PWM |
DBerendsen | 0:63306fecdb08 | 55 | float motorValue = referenceVelocity / MotorGain; |
DBerendsen | 0:63306fecdb08 | 56 | return motorValue; |
DBerendsen | 0:63306fecdb08 | 57 | } |
DBerendsen | 0:63306fecdb08 | 58 | void MeasureAndControl(void) |
DBerendsen | 0:63306fecdb08 | 59 | { |
DBerendsen | 0:63306fecdb08 | 60 | // This function measures the potmeter position, extracts a |
DBerendsen | 0:63306fecdb08 | 61 | // reference velocity from it, and controls the motor with |
DBerendsen | 0:63306fecdb08 | 62 | // a simple FeedForward controller. Call this from a Ticker. |
DBerendsen | 0:63306fecdb08 | 63 | float referenceVelocity = GetReferenceVelocity(); |
DBerendsen | 0:63306fecdb08 | 64 | float motorValue = FeedForwardControl(referenceVelocity); |
DBerendsen | 0:63306fecdb08 | 65 | Setmotor1(motorValue); |
DBerendsen | 0:63306fecdb08 | 66 | } |
DBerendsen | 0:63306fecdb08 | 67 | |
DBerendsen | 0:63306fecdb08 | 68 | int main() |
DBerendsen | 0:63306fecdb08 | 69 | { |
DBerendsen | 0:63306fecdb08 | 70 | |
DBerendsen | 0:63306fecdb08 | 71 | tick.attach(MeasureAndControl, 0.5f); |
DBerendsen | 0:63306fecdb08 | 72 | |
DBerendsen | 0:63306fecdb08 | 73 | |
DBerendsen | 0:63306fecdb08 | 74 | |
DBerendsen | 0:63306fecdb08 | 75 | } |