Gerhard Berman / Mbed 2 deprecated prog_pract3_v1

Dependencies:   HIDScope MODSERIAL QEI mbed

Fork of prog_pract3 by Marieke M

Committer:
Marieke
Date:
Mon Oct 10 12:07:25 2016 +0000
Revision:
1:6be8bcde9f05
Parent:
0:8f8157690923
Child:
2:ee821b9bf42b
Putty working and go-flags implemented! Motor not working!

Who changed what in which revision?

UserRevisionLine numberNew contents of line
GerhardBerman 0:8f8157690923 1 #include "mbed.h"
GerhardBerman 0:8f8157690923 2 #include <math.h>
GerhardBerman 0:8f8157690923 3 #include "MODSERIAL.h"
GerhardBerman 0:8f8157690923 4
Marieke 1:6be8bcde9f05 5 AnalogIn potMeterIn(PTB2);
GerhardBerman 0:8f8157690923 6 DigitalIn button1(D7);
GerhardBerman 0:8f8157690923 7 DigitalOut motor1DirectionPin(D4);
GerhardBerman 0:8f8157690923 8 PwmOut motor1MagnitudePin(D5);
GerhardBerman 0:8f8157690923 9
GerhardBerman 0:8f8157690923 10 Serial pc(USBTX,USBRX);
Marieke 1:6be8bcde9f05 11 Ticker MeasureTicker, TimeTracker;
Marieke 1:6be8bcde9f05 12
Marieke 1:6be8bcde9f05 13 float referenceVelocity = 0;
GerhardBerman 0:8f8157690923 14
Marieke 1:6be8bcde9f05 15 volatile bool MeasureTicker_go=false, TimeTracker_go=false;
Marieke 1:6be8bcde9f05 16
Marieke 1:6be8bcde9f05 17 void MeasureTicker_act(){MeasureTicker_go=true;}; // Activates go-flags
Marieke 1:6be8bcde9f05 18 void TimeTracker_act(){TimeTracker_go=true;};
GerhardBerman 0:8f8157690923 19
GerhardBerman 0:8f8157690923 20 float GetReferenceVelocity()
GerhardBerman 0:8f8157690923 21 {
GerhardBerman 0:8f8157690923 22 // Returns reference velocity in rad/s.
GerhardBerman 0:8f8157690923 23 // Positive value means clockwise rotation.
Marieke 1:6be8bcde9f05 24 const float maxVelocity = 8.4; // in rad/s of course!
GerhardBerman 0:8f8157690923 25 if (button1)
GerhardBerman 0:8f8157690923 26 {
GerhardBerman 0:8f8157690923 27 // Clockwise rotation
Marieke 1:6be8bcde9f05 28 referenceVelocity = potMeterIn.read() * maxVelocity;
GerhardBerman 0:8f8157690923 29 } else
GerhardBerman 0:8f8157690923 30 {
GerhardBerman 0:8f8157690923 31 // Counterclockwise rotation
Marieke 1:6be8bcde9f05 32 referenceVelocity = -1*potMeterIn.read() * maxVelocity;
GerhardBerman 0:8f8157690923 33 }
GerhardBerman 0:8f8157690923 34 return referenceVelocity;
GerhardBerman 0:8f8157690923 35 }
GerhardBerman 0:8f8157690923 36
GerhardBerman 0:8f8157690923 37 float FeedForwardControl(float referenceVelocity)
GerhardBerman 0:8f8157690923 38 {
GerhardBerman 0:8f8157690923 39 // very simple linear feed-forward control
GerhardBerman 0:8f8157690923 40 const float MotorGain=8.4; // unit: (rad/s) / PWM
GerhardBerman 0:8f8157690923 41 volatile float motorValue = referenceVelocity / MotorGain;
GerhardBerman 0:8f8157690923 42 return motorValue;
GerhardBerman 0:8f8157690923 43 }
GerhardBerman 0:8f8157690923 44
GerhardBerman 0:8f8157690923 45 void SetMotor1(float motorValue)
GerhardBerman 0:8f8157690923 46 {
GerhardBerman 0:8f8157690923 47 // Given -1<=motorValue<=1, this sets the PWM and direction
GerhardBerman 0:8f8157690923 48 // bits for motor 1. Positive value makes motor rotating
GerhardBerman 0:8f8157690923 49 // clockwise. motorValues outside range are truncated to
GerhardBerman 0:8f8157690923 50 // within range
GerhardBerman 0:8f8157690923 51 if (motorValue >=0) motor1DirectionPin=1;
GerhardBerman 0:8f8157690923 52 else motor1DirectionPin=0;
GerhardBerman 0:8f8157690923 53 if (fabs(motorValue)>1) motor1MagnitudePin = 1;
GerhardBerman 0:8f8157690923 54 else motor1MagnitudePin = fabs(motorValue);
GerhardBerman 0:8f8157690923 55 }
GerhardBerman 0:8f8157690923 56
GerhardBerman 0:8f8157690923 57 void MeasureAndControl(void)
GerhardBerman 0:8f8157690923 58 {
GerhardBerman 0:8f8157690923 59 // This function measures the potmeter position, extracts a
GerhardBerman 0:8f8157690923 60 // reference velocity from it, and controls the motor with
GerhardBerman 0:8f8157690923 61 // a simple FeedForward controller. Call this from a Ticker.
Marieke 1:6be8bcde9f05 62 float referenceVelocity = GetReferenceVelocity();
GerhardBerman 0:8f8157690923 63 float motorValue = FeedForwardControl(referenceVelocity);
GerhardBerman 0:8f8157690923 64 SetMotor1(motorValue);
GerhardBerman 0:8f8157690923 65 }
GerhardBerman 0:8f8157690923 66
Marieke 1:6be8bcde9f05 67 void TimeTrackerF(){
Marieke 1:6be8bcde9f05 68 wait(1);
Marieke 1:6be8bcde9f05 69 pc.printf("Reference velocity: %f rad/s \r\n", referenceVelocity);
Marieke 1:6be8bcde9f05 70 }
GerhardBerman 0:8f8157690923 71
GerhardBerman 0:8f8157690923 72 int main()
GerhardBerman 0:8f8157690923 73 {
GerhardBerman 0:8f8157690923 74 //Initialize
Marieke 1:6be8bcde9f05 75 MeasureTicker.attach(&MeasureTicker_act, 0.1f);
Marieke 1:6be8bcde9f05 76 TimeTracker.attach(&TimeTracker_act, 1.0f);
GerhardBerman 0:8f8157690923 77 pc.baud(115200);
Marieke 1:6be8bcde9f05 78 pc.printf("Reference velocity: %f rad/s \r\n", referenceVelocity);
Marieke 1:6be8bcde9f05 79 while(1)
Marieke 1:6be8bcde9f05 80 {
Marieke 1:6be8bcde9f05 81 if (MeasureTicker_go){
Marieke 1:6be8bcde9f05 82 MeasureTicker_go=false;
Marieke 1:6be8bcde9f05 83 MeasureAndControl();
Marieke 1:6be8bcde9f05 84 }
Marieke 1:6be8bcde9f05 85 if (TimeTracker_go){
Marieke 1:6be8bcde9f05 86 TimeTracker_go=false;
Marieke 1:6be8bcde9f05 87 TimeTrackerF();
Marieke 1:6be8bcde9f05 88 }
Marieke 1:6be8bcde9f05 89 }
Marieke 1:6be8bcde9f05 90 }
Marieke 1:6be8bcde9f05 91
Marieke 1:6be8bcde9f05 92