Script voor aansturen motoren

Dependencies:   Encoder HIDScope MODSERIAL mbed-dsp mbed

main.cpp

Committer:
jessekaiser
Date:
2014-10-31
Revision:
25:f45d61cc6dc6
Parent:
24:7fbd904d191c
Child:
26:5981d4b1144e

File content as of revision 25:f45d61cc6dc6:

#include "mbed.h"
#include "encoder.h"
#include "HIDScope.h"
#include "PwmOut.h"

#define TSAMP 0.005
#define K_P1 (3.5) //voor motor1 is het 3.5
#define K_I1 (0.01  *TSAMP) //voor motor1 is het 0.01
#define K_P2 (1.0)
#define K_I2 (0.01 *TSAMP)
#define I_LIMIT 1.
#define PI 3.14159265
#define l_arm 0.5

#define M1_PWM PTC8
#define M1_DIR PTC9
#define M2_PWM PTA5
#define M2_DIR PTA4

//Groene kabel moet op de GROUND en blauw op de 3.3v aansluiting

Serial pc(USBTX, USBRX);
DigitalOut led1(LED_RED);
HIDScope scope(2);

//motor 25D
Encoder motor1(PTD3,PTD5); //wit, geel
PwmOut pwm_motor1(M2_PWM);
DigitalOut motordir1(M2_DIR);

//motor2 37D
Encoder motor2(PTD2, PTD0); //wit, geel
PwmOut pwm_motor2(M1_PWM);
DigitalOut motordir2(M1_DIR);
//void clamp(float * in, float min, float max);
//float pid(float setpoint, float measurement);
float pwm1_percentage = 0;
float pwm2_percentage = 0;
int cur_pos_motor1;
int prev_pos_motor1 = 0;
int cur_pos_motor2;
int prev_pos_motor2 = 0;
float speed1_rad;
float speed2_rad;
float pos_motor1_rad;
float pos_motor2_rad;
int staat = 0;




void clamp(float* in, float min, float max) // "*" is een pointer (verwijst naar het adres waar een variabele instaat). Dus je slaat niet de variabele op
// maar de locatie van de variabele.
{
*in > min ? /*(*/*in < max? /*niets doen*/ : *in = max/*)*/: *in = min; // a ? b : c --> als a waar is, dan doe je b, en anders c
    // *in = het getal dat staat op locatie van in --> waarde van new_pwm
}


float pid1(float setpoint1, float measurement1)
{
    float error1;
    float           out_p1 = 0;
    static float    out_i1 = 0;
    error1  = (setpoint1 - measurement1);
    out_p1  = error1*K_P1;
    out_i1 += error1*K_I1;
    clamp(&out_i1,-I_LIMIT,I_LIMIT);
    return out_p1 + out_i1;
}

float prev_setpoint1 = 0;
float setpoint1 = 0;
float prev_setpoint2 = 0;
float setpoint2 = 0;

void batje_links ()
{
    speed1_rad = -1.0; //positief is CCW, negatief CW (boven aanzicht)
    cur_pos_motor1 = motor1.getPosition();
    pos_motor1_rad = (float)cur_pos_motor1/(3600.0/(2.0*PI));
    setpoint1 = prev_setpoint1 + TSAMP * speed1_rad;
    if(setpoint1 > (180*2.0*PI/360)) { //setpoint in graden
        setpoint1 = (180*2.0*PI/360);
    }
    if(setpoint1 < -(180*2.0*PI/360)) {
        setpoint1 = -(180*2.0*PI/360);
    }

    pwm_motor1.write(abs(pwm1_percentage));
    prev_setpoint1 = setpoint1;
    wait(TSAMP);

}

void batje_rechts ()
{
    speed1_rad = 2.0; //positief is CCW, negatief CW (boven aanzicht)
    cur_pos_motor1 = motor1.getPosition();
    pos_motor1_rad = (float)cur_pos_motor1/(3200.0/(2.0*PI)); //moet 4128
    setpoint1 = prev_setpoint1 + TSAMP * speed1_rad;
    if(setpoint1 > (360*2.0*PI/360)) { //setpoint in graden
        setpoint1 = (360*2.0*PI/360);
    }
    if(setpoint1 < -(360*2.0*PI/360)) {
        setpoint1 = -(360*2.0*PI/360);
    }
    pwm_motor1.write(abs(pwm1_percentage));
    prev_setpoint1 = setpoint1;
    if(setpoint1 > (360*2.0*PI/360)) {
        staat = 1;
    }
    wait(TSAMP);


}

void arm_hoog () //LET OP, PAS VARIABELE NOG AAN DIT IS VOOR TESTEN
{
    speed1_rad = 6.0; //positief is CCW, negatief CW (boven aanzicht)
    cur_pos_motor1 = motor1.getPosition();
    pos_motor1_rad = (float)cur_pos_motor1/(3200.0/(2.0*PI)); //moet 4128
    setpoint1 = prev_setpoint1 + TSAMP * speed1_rad;
    if(setpoint1 > (155.0*2.0*PI/360)) { //setpoint in graden
        setpoint1 = (155.0*2.0*PI/360);
    }
    if(setpoint1 < -(155.0*2.0*PI/360)) {
        setpoint1 = -(155.0*2.0*PI/360);
    }
    pwm_motor1.write(abs(pwm1_percentage));
    prev_setpoint1 = setpoint1;
   //if(setpoint1 = (155.0*2.0*PI/360)) {
     // staat = 1;
    //}
    wait(TSAMP);

}

void arm_mid ()
{
    speed1_rad = -3.0; //positief is CCW, negatief CW (boven aanzicht)
    cur_pos_motor1 = motor1.getPosition();
    pos_motor1_rad = (float)cur_pos_motor1/(3200.0/(2.0*PI)); //moet 4128
    setpoint1 = prev_setpoint1 + TSAMP * speed1_rad;
    if(setpoint1 > (155*2.0*PI/360)) { //setpoint in graden
        setpoint1 = (155*2.0*PI/360);
    }
    if(setpoint1 < -(155*2.0*PI/360)) {
        setpoint1 = -(155*2.0*PI/360);
    }
    pwm_motor1.write(abs(pwm1_percentage));
    prev_setpoint1 = setpoint1;
    
    wait(TSAMP);
}

void arm_laag ()
{
    speed2_rad = -1.0; //positief is CCW, negatief CW (boven aanzicht)
    cur_pos_motor2 = motor2.getPosition();
    pos_motor2_rad = (float)cur_pos_motor2/(3600/(2.0*PI));
    setpoint2 = prev_setpoint2 + TSAMP * speed2_rad;
    if(setpoint2 > (100*2.0*PI/360)) { //setpoint in graden
        setpoint2 = (100*2.0*PI/360);
    }
    if(setpoint2 < -(100*2.0*PI/360)) {
        setpoint2 = -(100*2.0*PI/360);
    }

    pwm_motor2.write(abs(pwm2_percentage));
    prev_setpoint2 = setpoint2;
    wait(TSAMP);
}

int main()
{
    pwm_motor1.period_us(100);
    motor1.setPosition(0);
    pwm_motor2.period_us(100);
    motor2.setPosition(0);
    pc.baud(115200);

    while(1) {
        pc.printf("%d \r\n", motor1.getPosition());
        pwm1_percentage = pid1(setpoint1, pos_motor1_rad);
        if (pwm1_percentage < -1.0) {
            pwm1_percentage = -1.0;
        }
        if (pwm1_percentage > 1.0) {
            pwm1_percentage = 1.0;
        }

        if(pwm1_percentage > 0) {
            motordir1 = 0;
        } else {
            motordir1 = 1;
        }


        if(staat == 0) {
            arm_hoog();
        } 
        else 
        {
            arm_mid();
        }
       }
}