Biorobotics / Mbed 2 deprecated P_controler

Dependencies:   QEI mbed

main.cpp

Committer:
yohoo15
Date:
2015-10-14
Revision:
3:b9e2c7d52953
Parent:
2:5ec7af981b32
Child:
4:1b4885298ade

File content as of revision 3:b9e2c7d52953:

#include "mbed.h"
#include "QEI.h"

Serial pc(USBTX, USBRX);
QEI wheel (PTC10, PTC11, NC, 624); // Pin for counting (analog in)

// Define pin for motor control
DigitalOut directionPin(D4);
PwmOut PWM(D5);

// define ticker
Ticker aansturen;
Ticker Printen;

// define rotation direction
const int cw = 1;
const int ccw = 0;

// Controller gain proportional and intergrator
const double motor1_Kp = 5; // more or les random number.


// calculating pulses to rotations in degree.
const double pulses_per_revolution = 4200 ;//8400 counts is aangegeven op de motor for x4.  10 - 30 counts oveshoot. for moter 1(tape)! Motor 2 almost the same(nice)
const double resolution = pulses_per_revolution / 360;
double Rotation = -2; // rotation in degree
double movement = Rotation * 360 * resolution; // times 360 to make Rotations degree.

// defining flags
volatile bool flag_motor = false;
volatile bool flag_pcprint = false;

// making function flags.
void Go_flag_motor()
{
    flag_motor = true;
}

void Go_flag_pcprint()
{
    flag_pcprint = true;
}

// Reusable P controller
double P(double error, const double Kp)
{
    double error_normalised_degree = error / resolution; // calculate how much degree the motor has to turn.
    double error_normalised_rotation = error_normalised_degree / 360; //calculate how much the rotaions the motor has to turn

    double P_output = Kp * error_normalised_rotation;
    return P_output;
}
// Next task, measure the error and apply the output to the plant
void motor1_Controller()
{
    double reference = movement;
    double position = wheel.getPulses();
    double error = reference - position;

    double output = P( error, motor1_Kp);



    if(error > 0) {
        directionPin.write(cw);
        PWM.write(output);
        //pc.printf("ref %.0f count%.0f cw\n",movement,position);

    }
    if(error < 0) {
        directionPin.write(ccw);
        PWM.write(-output); //min output to get output positive
        //pc.printf("a");
    }



}


void counts_showing()
{

    double kijken = wheel.getPulses();
    pc.printf("ref %.0f count%.0f \n",movement,kijken);

}

int main()
{
    aansturen.attach( &Go_flag_motor, 0.01f ); // 100 Hz // timer 0.00001f motor keeps spinning
    Printen.attach(&Go_flag_pcprint,0.1f); // 10 Hz // printstatement here because printing cost to much time. the motor void wouldn't be completed
    while( 1 ) {

        if(flag_motor) {
            flag_motor = false;
            motor1_Controller();
        }

        if(flag_pcprint) {
            flag_pcprint = false;
            counts_showing();
        }

    }
}