Calibratie motor, demo, (EMG calibratie en movement werkt niet)

Dependencies:   mbed QEI HIDScope biquadFilter MODSERIAL Encoder FastPWM

main.cpp

Committer:
S1933191
Date:
2019-10-30
Revision:
3:16df793da2be
Parent:
2:5093b66c9b26
Child:
4:7d0df890e801

File content as of revision 3:16df793da2be:

#include <math.h>
#include "mbed.h"
#include "MODSERIAL.h"
#include "QEI.h"
#include "FastPWM.h"
#include "encoder.h"

const double PI = 3.1415926535897;  

InterruptIn but1(D1);
InterruptIn but2(D0);
DigitalIn butsw2(SW2);
DigitalIn butsw3(SW3);
AnalogIn potMeter1(A2);
AnalogIn potMeter2(A1);

DigitalOut motor1_direction(D4);                                                //value 0=CCW, 1=CW
FastPWM motor1_pwm(D5);                                                          //Biorobotics Motor 1 PWM controle van de snelheid
DigitalOut motor2_direction(D7);                                                //value 0=CCW, 1=CW
FastPWM motor2_pwm(D6);

Ticker loop_ticker; 
// SERIAL COMMUNICATION WITH PC.................................................
Serial pc(USBTX, USBRX);

enum States {s_idle, s_calibratie_encoder, s_demo};
States state;

// ENCODER .....................................................................
Encoder enc1 (D13, D12, true); //encoder 1 gebruiken
Encoder enc2 (D9,  D8,  true); //encoder 2 gebruiken 
        
float dt = 0.001;
double e_int = 0;
double e_int2 = 0;
float theta1;
float theta2;
int enc1_zero = 0;//the zero position of the encoders, to be determined from the
int enc2_zero = 0;//encoder calibration
int enc1_value;
int enc2_value;
volatile double Huidigepositie1;
volatile double Huidigepositie2;
volatile double motorValue1;
volatile double motorValue2;
volatile double refP;
volatile double refP2;
volatile double error1;
volatile double error2;
bool state_changed = false; 
volatile bool A=true;
volatile bool B=true;
volatile bool but1_pressed = false;
volatile bool but2_pressed = false;
volatile bool butsw2_pressed = false;
volatile bool butsw3_pressed = false;
volatile bool failure_occurred = false;

const bool clockwise = true;
volatile bool direction1 = clockwise;
volatile bool direction2 = clockwise;

void rest()
    //Idle state. Used in the beginning, before the calibration states.  
{
    if (but1_pressed) {
        state_changed = true;
        state = s_calibratie_encoder;
        but1_pressed = false;
    }
}

void calibratie_encoder()
{
    if (state_changed) {
        pc.printf("Started encoder calibration\r\n");
        state_changed = false;
    }
    if (but1_pressed) {
        pc.printf("Encoder has been calibrated \r\n");
        enc1_value = enc1.getPosition();
        enc2_value = enc2.getPosition();
    //enc1_value -= enc1_zero;
    //enc2_value -= enc2_zero;
        theta1 = (float)(enc1_value)/(float)(8400)*2*PI;
        theta2 = (float)(enc2_value)/(float)(8400)*2*PI;
        enc1_zero = enc1_value;
        enc2_zero = enc2_value;
        but1_pressed = false;
        state_changed = true;
        state = s_demo;
        pc.printf("enc01: %i\r\n", enc1_zero);
        pc.printf("enc1value: %i\r\n", enc1_value);
        pc.printf("enc02: %i\r\n",enc2_zero);
        pc.printf("enc2value: %i\r\n", enc2_value);
        pc.printf("hoek 1: %f\r\n",theta1);
        pc.printf("hoek 2: %f\r\n",theta2);
        }
        
        if (but2_pressed) {
        state_changed = true;
        state = s_idle;
        but2_pressed = false;
        pc.printf("FAILURE!\r\n");
        state_changed = false;
    }
}

double GetReferencePosition() 
{
    double Potmeterwaarde = potMeter2.read(); //naam moet universeel worden
    int maxwaarde = 400;                   // = 64x64
    double refP = Potmeterwaarde*maxwaarde;
    return refP;                            // value between 0 and 4096 
}
 
double GetReferencePosition2() 
{
    double potmeterwaarde2 = potMeter1.read();
    int maxwaarde2 = 400;                   // = 64x64
    double refP2 = potmeterwaarde2*maxwaarde2;
    return refP2;                            // value between 0 and 4096 
}
   
double FeedBackControl(double error, double &e_int)   // schaalt de snelheid naar de snelheid zodat onze chip het begrijpt (is nog niet in werking)
{
    double kp = 0.0015;                               // kind of scaled.
    double Proportional= kp*error1;
    
    double ki = 0.0001;                           // kind of scaled.
    e_int = e_int+dt*error1;
    double Integrator = ki*e_int;
    
    motorValue1 = Proportional + Integrator ;
    return motorValue1;
}
 
double FeedBackControl2(double error2, double &e_int2)   // schaalt de snelheid naar de snelheid zodat onze chip het begrijpt (is nog niet in werking)
{
    double kp2 = 0.002;                             // kind of scaled.
    double Proportional2= kp2*error2;
    
    double ki2 = 0.00005;                           // kind of scaled.
    e_int2 = e_int2+dt*error2;
    double Integrator2 = ki2*e_int2;
    
    double motorValue2 = Proportional2 + Integrator2 ;
    return motorValue2;
}

void SetMotor1(float motorValue1) {
    // Given motorValue1<=1, writes the velocity to the pwm control.
    // MotorValues outside range are truncated to within range.
    motor1_pwm.write(fabs(motorValue1) > 1 ? 1 : fabs(motorValue1));
}

void SetMotor2(float motorValue2) {
    // Given motorValue2<=1, writes the velocity to the pwm control.
    // MotorValues outside range are truncated to within range.
    motor2_pwm.write(fabs(motorValue2) > 1 ? 1 : fabs(motorValue2));
}    
 
void MeasureAndControl(void)
{
    //SetpointRobot(); 
    // RKI aanroepen
    //RKI();
    // hier the control of the 1st control system
    refP = GetReferencePosition();                    //moet nog met RKI
    Huidigepositie1 = enc1.getPosition(); 
    error1 = (refP - Huidigepositie1);// make an error
    motorValue1 = FeedBackControl(error1, e_int);
    SetMotor1(motorValue1);
    // hier the control of the 2nd control system
    refP2 = GetReferencePosition2(); 
    Huidigepositie2 = enc2.getPosition(); 
    error2 = (refP2 - Huidigepositie2);// make an error
    motorValue2 = FeedBackControl2(error2, e_int2);
    SetMotor2(motorValue2);
    pc.printf("refP = %f, huidigepos = %f, motorvalue = %f, refP2 = %f, huidigepos2 = %f, motorvalue2 = %f \r\n", refP, Huidigepositie1, motorValue1, refP2, Huidigepositie2, Huidigepositie2);
        
}

void direction()
{ 
    if (butsw2==0) {
        if (A==true){// zodat het knopje 1 x wordt afgelezen
        // reverses the direction
        motor1_direction.write(direction1 = !direction1);
        pc.printf("direction: %s\r\n\n", direction1 ? "clockwise" : "counter clockwise");
        A=false;
        }
    }
    else{
    A=true;
    }
    
    if (butsw3==0){
        if (B==true){
        motor2_direction.write(direction2 = !direction2);
        pc.printf("direction: %s\r\n\n", direction2 ? "clockwise" : "counter clockwise");
        B=false;
        }
    }
    else{
    B=true;
}
}

/*void measure_signals()
{
    enc1_value = enc1.getPosition();
    enc2_value = enc2.getPosition();
    //enc1_value -= enc1_zero;
    //enc2_value -= enc2_zero;
    theta1 = (float)(enc1_value)/(float)(8400)*2*PI;
    theta2 = (float)(enc2_value)/(float)(8400)*2*PI;    
    }  
*/  
void state_machine()
{
    //run current state
    switch (state) {
        case s_idle:
            rest();
            break;
        case s_calibratie_encoder:
            calibratie_encoder();
            break;
        case s_demo:
            MeasureAndControl();
            direction();
        break;
        
}
}

void but1_interrupt()
{
    if(but2.read()) {//both buttons are pressed
        failure_occurred = true;
    }
    but1_pressed = true;
    pc.printf("Button 1 pressed \n\r"); 
}
 
void but2_interrupt()
{
    if(but1.read()) {//both buttons are pressed
        failure_occurred = true;
    }
    but2_pressed = true;
    pc.printf("Button 2 pressed \n\r");
}
    
void main_loop()
{
    //measure_signals();
    state_machine();
}

int main()
{
    pc.baud(115200);
    pc.printf("Executing main()... \r\n");
    state = s_idle;
    
    
    but1.fall(&but1_interrupt);
    but2.fall(&but2_interrupt);
    loop_ticker.attach(&main_loop, dt);
    pc.printf("main_loop is running\n\r");
   
  }