Gerhard Berman / Mbed 2 deprecated prog_pract3_v2

Dependencies:   MODSERIAL QEI mbed HIDScope

Fork of prog_pract3 by Marieke M

Committer:
Marieke
Date:
Mon Oct 10 13:11:05 2016 +0000
Revision:
2:ee821b9bf42b
Parent:
1:6be8bcde9f05
Child:
3:c1ef4d7490c1
Putty with MotorValue=0, Potmeter, referenceVelocity working! Motor still only on 2.

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