Functie van het slaan van de bal

Dependencies:   Encoder HIDScope mbed-dsp mbed MODSERIAL

main.cpp

Committer:
BasvanBuuren
Date:
2014-10-29
Revision:
14:e9ab81429271
Parent:
13:b35f3553f210

File content as of revision 14:e9ab81429271:

#include "mbed.h"
#include "HIDScope.h"
//#include "mbed-dsp.h"
#include "encoder.h"
//#include <iostream>
#include "MODSERIAL.h"

#define SAMP_TIME 0.01
#define K_P (0.001)
#define K_I (0.000001 *SAMP_TIME)
#define K_D (0.000005 /SAMP_TIME)
#define I_LIMIT 1.

#define MAXENCO 320
#define MINENCO 0


//define in and output
MODSERIAL pc(USBTX,USBRX);
Encoder encoderA(PTD0,PTD2);
PwmOut m1_speed(PTA5);
DigitalOut m1_dir(PTA4);

//define functions
void slam(int emg_value);
void clamp(float * in, float min, float max);
float pid(float rev_value, float mea_value);

//define global variables
//int y1;
float new_speed;
float max_speed;
float enca;
volatile bool looptimerflag;

void setlooptimerflag(void)
{
    looptimerflag = true;
}

int main()
{
    
    int y1;
    Ticker looptimer;
    pc.baud(9600);
    looptimer.attach(setlooptimerflag,SAMP_TIME);
    while(1)
    {   
        if(! pc.readable())
        {   
            pc.printf("Main %d\n\r", encoderA.getPosition());
            wait(0.1);
        }
        else
        {    
            y1 = pc.getc()-48;
            pc.printf("%d\n\r", y1 );
            slam(y1);
        }
    }
}

void slam(int emg_value)
{
    //pc.printf( "Ik begin met de slafunctie\n\r");
    //pc.printf( encoderA.getPosition() << endl << "check\n\r");
    pc.printf("Sla\n\r%d\n\r", encoderA.getPosition());
    switch (emg_value)
    {
        case 1:
            pc.printf( "zaak1\n\r");
            m1_dir=1;
            max_speed=0.33;
            //m1_speed.write(0.33);
            //pc.printf( "Motor 1 draait\n\r");
            break;
        case 2:
            pc.printf( "zaak2\n\r");
            m1_dir=1;
            max_speed=0.66;
            //m1_speed.write(0.66);
            pc.printf( "Motor 1 draait\n\r");
            break;
        case 3:
            pc.printf( "zaak3\n\r");
            m1_dir=1;
            max_speed=1;
            //m1_speed.write(1);
            pc.printf( "Motor 1 draait\n\r");
            break;
        default:
            m1_dir=1;
            m1_speed=0;
            break;
    }
    //pc.printf( "Ik ben uit de switch\n\r");
    while(!looptimerflag);
    looptimerflag=false;
    new_speed=pid(MAXENCO,encoderA.getPosition());
    clamp(&new_speed,-max_speed,max_speed);
    if (new_speed>0)
    {
        m1_dir=1;
    }
    else if (new_speed<0)
    {
        m1_dir=0;
    }
    m1_speed.write(fabs(new_speed));

    while(new_speed<-0.1 || new_speed>0.1)
    {
        while(!looptimerflag);
        looptimerflag=false;
        //pc.printf( "Eat, Sleep, Rave, Repeat\n\r");
        new_speed=pid(MAXENCO,encoderA.getPosition());
        clamp(&new_speed,-max_speed,max_speed);
        if (new_speed>0)
        {
            m1_dir=1;
        }
        else if (new_speed<0)
        {
            m1_dir=0;
        }
        m1_speed.write(fabs(new_speed));
        //pc.printf( new_speed << endl;
    }
    pc.printf( "Ik ben uit de eerste whilelus\n\r");
    //pc.printf( encoderA.getPosition() << endl << "check\n\r");
    pc.printf("%d\n\r", encoderA.getPosition());
    while(!looptimerflag);
    looptimerflag=false;
    new_speed=pid(MINENCO,encoderA.getPosition());
    clamp(&new_speed,-max_speed,max_speed);
    if (new_speed>0)
    {
        m1_dir=1;
    }
    else if (new_speed<0)
    {
        m1_dir=0;
    }
    m1_speed.write(fabs(new_speed));
    
    while(new_speed<-0.1 || new_speed>0.1)
    {
        while(!looptimerflag);
        looptimerflag=false;
        new_speed=pid(MINENCO,encoderA.getPosition());
        clamp(&new_speed,-0.5,0.5);
        if (new_speed>0)
        {
            m1_dir=1;    
        }
        else if (new_speed<0)
        {
            m1_dir=0;
        }
        m1_speed.write(fabs(new_speed));
    }
    m1_speed.write(0);
    pc.printf( "Ik ben uit de tweede whilelus\n\r");
    //pc.printf( encoderA.getPosition() << endl << "check\n\r");
    pc.printf("%d\n\r", encoderA.getPosition());
}

void clamp(float * in, float min, float max)
{
    *in > min ? * in < max? :  *in = max : *in = min;
}

float pid(float rev_value, float mea_value)
{
    float error;
    static float prev_error = 0;
    float p_out = 0;
    static float i_out = 0;
    float d_out = 0;
    error = rev_value - mea_value;
    p_out = error * K_P;
    i_out += error * K_I;
    d_out = (error - prev_error) * K_D;
    clamp(&i_out,-I_LIMIT,I_LIMIT);
    prev_error=error;
    return p_out + i_out + d_out;
}