first succes

Dependencies:   mbed

Committer:
DBerendsen
Date:
Tue Oct 03 18:13:07 2017 +0000
Revision:
0:63306fecdb08
first succesful;

Who changed what in which revision?

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