Gerhard Berman / Mbed 2 deprecated prog_pract3_v2

Dependencies:   MODSERIAL QEI mbed HIDScope

Fork of prog_pract3 by Marieke M

main.cpp

Committer:
Marieke
Date:
2016-10-10
Revision:
1:6be8bcde9f05
Parent:
0:8f8157690923
Child:
2:ee821b9bf42b

File content as of revision 1:6be8bcde9f05:

#include "mbed.h"
#include <math.h>
#include "MODSERIAL.h"

AnalogIn potMeterIn(PTB2);
DigitalIn button1(D7);
DigitalOut motor1DirectionPin(D4);
PwmOut motor1MagnitudePin(D5);

Serial pc(USBTX,USBRX);
Ticker MeasureTicker, TimeTracker;

float referenceVelocity = 0;

volatile bool MeasureTicker_go=false, TimeTracker_go=false;

void MeasureTicker_act(){MeasureTicker_go=true;}; // Activates go-flags
void TimeTracker_act(){TimeTracker_go=true;};

float GetReferenceVelocity()
{
    // Returns reference velocity in rad/s. 
    // Positive value means clockwise rotation.
    const float maxVelocity = 8.4; // in rad/s of course!
    if (button1)
    {
        // Clockwise rotation
        referenceVelocity = potMeterIn.read() * maxVelocity;
    } else
    {
        // Counterclockwise rotation
        referenceVelocity = -1*potMeterIn.read() * maxVelocity;
    }
    return referenceVelocity;
}

float FeedForwardControl(float referenceVelocity)
{
    // very simple linear feed-forward control
    const float MotorGain=8.4; // unit: (rad/s) / PWM
    volatile float motorValue = referenceVelocity / MotorGain;
    return motorValue;
}

void SetMotor1(float motorValue)
{
    // Given -1<=motorValue<=1, this sets the PWM and direction
    // bits for motor 1. Positive value makes motor rotating
    // clockwise. motorValues outside range are truncated to
    // within range
    if (motorValue >=0) motor1DirectionPin=1;
        else motor1DirectionPin=0;
    if (fabs(motorValue)>1) motor1MagnitudePin = 1;
        else motor1MagnitudePin = fabs(motorValue);
}

void MeasureAndControl(void)
{
    // This function measures the potmeter position, extracts a
    // reference velocity from it, and controls the motor with 
    // a simple FeedForward controller. Call this from a Ticker.
    float referenceVelocity = GetReferenceVelocity();
    float motorValue = FeedForwardControl(referenceVelocity);
    SetMotor1(motorValue);
}

void TimeTrackerF(){
     wait(1);   
     pc.printf("Reference velocity: %f rad/s \r\n", referenceVelocity);
}

int main()
{
 //Initialize
 MeasureTicker.attach(&MeasureTicker_act, 0.1f); 
 TimeTracker.attach(&TimeTracker_act, 1.0f);
 pc.baud(115200);  
 pc.printf("Reference velocity: %f rad/s \r\n", referenceVelocity);  
 while(1)
    {
        if (MeasureTicker_go){
            MeasureTicker_go=false;
            MeasureAndControl();
        }
        if (TimeTracker_go){
            TimeTracker_go=false;
            TimeTrackerF();
        }
    }
}