Ramon Waninge / Mbed 2 deprecated Milestone1

Dependencies:   FastPWM mbed QEI biquadFilter HIDScope MODSERIAL

main.cpp

Committer:
efvanmarrewijk
Date:
2018-10-29
Revision:
25:76e9e5597416
Parent:
24:d255752065d1
Child:
26:b48708ed51ff

File content as of revision 25:76e9e5597416:

// Inclusion of libraries
#include "mbed.h"
#include "FastPWM.h"    
#include "QEI.h"        // Includes library for encoder
#include "MODSERIAL.h"
#include "HIDScope.h"
#include "BiQuad.h"

// Input
AnalogIn pot1(A1);
AnalogIn pot2(A2);
InterruptIn button1(D0);
InterruptIn button2(D1);
InterruptIn emergencybutton(SW2);  /* This is not yet implemented! 
The button SW2 on the K64F is the emergency button: if you press this, 
everything will abort as soon as possible
*/

DigitalIn pin8(D8);     // Encoder 1 B
DigitalIn pin9(D9);     // Encoder 1 A
DigitalIn pin10(D10);   // Encoder 2 B
DigitalIn pin11(D11);   // Encoder 2 A
DigitalIn pin12(D12);   // Encoder 3 B
DigitalIn pin13(D13);   // Encoder 3 A

// Output
DigitalOut pin2(D2);    // Motor 3 direction
FastPWM pin3(D3);       // Motor 3 pwm
DigitalOut pin4(D4);    // Motor 2 direction
FastPWM pin5(D5);       // Motor 2 pwm
FastPWM pin6(D6);       // Motor 1 pwm
DigitalOut pin7(D7);    // Motor 1 direction
//float u1  = pot1;

// Utilisation of libraries
MODSERIAL   pc(USBTX, USBRX);
QEI         Encoder1(D11,D10,NC,4200);      // Counterclockwise motor rotation is the positive direction
QEI         Encoder2(D9,D8,NC,4200);        // Counterclockwise motor rotation is the positive direction
QEI         Encoder3(D13,D12,NC,4200);      // Counterclockwise motor rotation is the positive direction
Ticker      motor;
Ticker      encoders;

// Global variables
const float     pi = 3.14159265358979;
float           u3 = 0.0;         // Normalised variable for the movement of motor 3
const float     fCountsRad = 4200.0;
const double    dt = 0.01;
double          Kp = 17.5;

// Functions
float   CurrentAngle(float counts)
{   float angle = ((float)counts*2.0*pi)/fCountsRad;
    while (angle > 2.0*pi)
    {   angle = angle - 2.0*pi;
    }
    while (angle < -2.0*pi)
    {   angle = angle + 2.0*pi;
    }
    return angle;
}

int Counts1input()
{   int counts1;
    counts1 = Encoder1.getPulses();
    return counts1;
}
int Counts2input()
{   int counts2;
    counts2 = Encoder2.getPulses();
    return counts2;
}
int Counts3input()
{   int counts3;
    counts3 = Encoder3.getPulses();
    return counts3;
}

double Pcontroller(double yref,double CurAngle)
{   double error = yref - CurAngle;
    
    // Proportional part:
    double u_k = Kp * error;
    // Sum all parts and return it
    return u_k;
}

void turn1()    
{    float u1 = 2.0*(pot2 - 0.5);    // Normalised variable for the movement of motor 2
    if (u1<0)
    {   pin7 = true;
    }
    else if(u1>0)
    {   pin7 = false;    
    }
    double  refvalue1 = fabs(u1);
    int counts1 = Counts1input();
    float angle1 = CurrentAngle(counts1);
    pin6 = Pcontroller(refvalue1,angle1); 
    //pc.printf("Counts1,2,3: %i       Angle1,2,3: %f  \r\n",counts1,angle1);
}
  
void turn2()    
/*  Function for the movement of all motors, using the potmeters for the moving
    direction and speed of motor 1 and 2, and using button 1 and 2 on the biorobotics
    shield for the moving direction and speed of motor 3.
*/
{   float u2 = 2.0*(pot1 - 0.5);    // Normalised variable for the movement of motor 2
    if (u2<0)
    {   pin4 = true;
    }
    else if(u2>0)
    {   pin4 = false;    
    }
    double  refvalue2 = fabs(u2);
    int counts2 = Counts2input();
    float angle2 = CurrentAngle(counts2);
    pin5 = Pcontroller(refvalue2,angle2); 
    //pc.printf("Counts1,2,3: %i       Angle1,2,3: %f  \r\n",counts1,angle1);
}
 
/*double RefVelocity(float pot)
{   // Returns reference velocity in rad/s. 
    // Positive value means clockwise rotation.
    const float maxVelocity=8.4; // in rad/s of course!    
    double RefVel;  // in rad/s
    
    if (button1 == 1)   
    {   // Clockwise rotation      
        RefVel = pot*maxVelocity; 
    } 
    else
    {   // Counterclockwise rotation       
        RefVel = -1*pot*maxVelocity;   
    }
    return RefVel;
}
*/

/*
double ActualPosition(int counts, int offsetcounts)
{   // After calibration, the counts are returned to 0;
    double MotorPos = - (counts - offsetcounts) / dCountsRad;
    // minus sign to correct for direction convention
    return MotorPos;
}
*/

// Main program
int main()
{   
    pc.baud(115200);
        
    
    pin3.period(0.1);
    pin5.period(0.1);
    pin6.period(0.1);
    motor.attach(turn1,dt);
    //motor.attach(turn2,dt);

            
    while   (true)
    {   
        
    }
}