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

Dependencies:   mbed QEI HIDScope biquadFilter MODSERIAL Encoder FastPWM

main.cpp

Committer:
S1933191
Date:
2019-10-29
Revision:
2:5093b66c9b26
Parent:
1:b862262a9d14
Child:
3:16df793da2be

File content as of revision 2:5093b66c9b26:

#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(D2);
InterruptIn but2(D3);
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_cali_enc, 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;
bool state_changed = false; 
volatile bool but1_pressed = false;
volatile bool but2_pressed = false;
volatile bool failure_occurred = false;

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

void cali_enc()
{
    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_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);
        
 
    }
}
    
double GetReferencePosition() 
{
    double Potmeterwaarde = potMeter1.read(); //naam moet universeel worden
    int maxwaarde = 200;                   // = 64x64
    double refP = Potmeterwaarde*maxwaarde;
    return refP;                            // value between 0 and 4096 
}
 
double GetReferencePosition2() 
{
    double potmeterwaarde2 = potMeter2.read();
    int maxwaarde2 = 200;                   // = 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*error;
    
    double ki = 0.0001;                           // kind of scaled.
    e_int = e_int+dt*error;
    double Integrator = ki*e_int;
    
    
    double motorValue = Proportional + Integrator ;
    return motorValue;
}
 
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(double motorValue)
{
    if (motorValue >= 0) {
        motor1_direction = 0;
    }
    else {
        motor1_direction = 1;
    }
 
    if  (fabs(motorValue) > 1) {
        motor1_pwm = 1;                    //de snelheid wordt teruggeschaald naar 8.4 rad/s (maximale snelheid, dus waarde 1)
    }
    else {    
        motor1_pwm = fabs(motorValue);      //de absolute snelheid wordt bepaald, de motor staat uit bij een waarde 0
    }
}
 
void SetMotor2(double motorValue2)
{
    if (motorValue2 >= 0) {
        motor2_direction = 1;
    }
    else {
        motor2_direction = 0;
    }
 
    if  (fabs(motorValue2) > 1) {
        motor2_pwm = 1;                    //de snelheid wordt teruggeschaald naar 8.4 rad/s (maximale snelheid, dus waarde 1)
    }
    else {    
        motor2_pwm = fabs(motorValue2);      //de absolute snelheid wordt bepaald, de motor staat uit bij een waarde 0
    }
}
 
void MeasureAndControl(void)
{
    //SetpointRobot(); 
    // RKI aanroepen
    //RKI();
    // hier the control of the 1st control system
    double refP = GetReferencePosition();                    //KOMT UIT RKI
    double Huidigepositie = enc1.getPosition(); 
    double error = (refP - Huidigepositie);// make an error
    double motorValue = FeedBackControl(error, e_int);
    SetMotor1(motorValue);
    // hier the control of the 2nd control system
    double refP2 = GetReferencePosition2(); 
    double Huidigepositie2 = enc2.getPosition(); 
    double error2 = (refP2 - Huidigepositie2);// make an error
    double motorValue2 = FeedBackControl2(error2, e_int2);
    SetMotor2(motorValue2);
    pc.printf("refP = %f, huidigepos = %f, motorvalue = %f, refP2 = %f, huidigepos2 = %f, motorvalue2 = %f \r\n", refP, Huidigepositie, motorValue, refP2, Huidigepositie2, Huidigepositie2);
}
    
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:
            do_nothing();
            break;
        case s_cali_enc:
            cali_enc();
            break;
        case s_demo:
        MeasureAndControl();
        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");
   
  }