Aansturing

Dependencies:   Encoder mbed HIDScope

Revision:
2:a42b34f9d6ab
Parent:
1:a644028231b5
Child:
3:57b98989b0b1
--- a/main.cpp	Thu Oct 27 13:51:14 2016 +0000
+++ b/main.cpp	Wed Nov 02 10:45:10 2016 +0000
@@ -3,17 +3,25 @@
 #include "encoder.h"
 #include "math.h"
 #include "HIDScope.h"
+#include "Filter.h"
+#include "FilterDesign.h"
+#include "Filter2.h"
+#include "FilterDesign2.h"
 
 //D8 doet het niet
 
 DigitalIn    knop_1(D2); //Motor 1
 DigitalIn    knop_2(D3); //Motor 2
 
+AnalogIn    emg1(A0);
+AnalogIn    emg2(A1);
+
 DigitalOut motor_1(D7); //richting (1 of 0)
 PwmOut pwm_motor_1(D6); //snelheid (tussen 0 en 1)
 DigitalOut motor_2(D4); //richting (1 of 0)
 PwmOut pwm_motor_2(D5); //snelheid (tussen 0 en 1)
 InterruptIn stop(SW3); //stoppen
+InterruptIn beginopnieuw(SW2); //stoppen
 
 Serial pc(USBTX, USBRX); //USB ports aanroepen, D0 en D1
 
@@ -23,18 +31,18 @@
 HIDScope scope(4);
 
 Ticker PID_ticker;
+Ticker FILTER_ticker;
 
 Timer tijd;
 
 //constante waardes
-const double x_start = 0.27;
+const double x_start = 0.255;
 const double dt = 0.001;
+const double dt_f = 0.001;
 const double Vx = 0.05; //m/s
 const double Vy = 0.03; //m/s
-const double L1=0.30; //m
-const double L2=0.35; //m
-const double L3=0.13; //m
-const double y_base = 0.22;
+const double L2 = 0.35; //m
+const double y_base = 0.045;
 //filter
 volatile double tijd_oud, tijd_nieuw, tijd_verschil;
 volatile double u_1, y_1, u_2, y_2; //ongefilerd signaal emg 1, gefilterd signaal emg 1, ongefilterd signaal emg 2, gefilterd signaal emg 2
@@ -44,24 +52,24 @@
 //beginpositie
 volatile double x = x_start; //m
 volatile double y = y_base; //m
-volatile double yc= y + L3 - L1; //m
 volatile bool opgepakt = false;
 volatile bool zakpunt = false;
 volatile bool uitdrukken = false;
-volatile double y_oppakken = 0.125, y_stijgen = 0.125, x_zakken = 0.1;
+volatile double y_oppakken = 0.10, y_stijgen = 0.15, x_zakken = 0.09;//Voorwaarde voor terugbewegen
+volatile bool run_programma = true;
 //PID
-const double m1_Kp = 20.0, m1_Ki = 0.5, m1_Kd = 0.6, m1_N = 50;
+const double m1_Kp = 2, m1_Ki = 5, m1_Kd = 0.1, m1_N = 50;
 double m1_v1 = 0, m1_v2 = 0; // Memory variables
-const double m1_Ts = 0.01; // Controller sample time
-const double m2_Kp = 20.0, m2_Ki = 0.5, m2_Kd = 0.6, m2_N = 50;
+const double m1_Ts = 0.001; // Controller sample time
+const double m2_Kp = 2, m2_Ki = 5, m2_Kd = 0.1, m2_N = 50;
 double m2_v1 = 0, m2_v2 = 0; // Memory variables
-const double m2_Ts = 0.01; // Controller sample time
+const double m2_Ts = 0.001; // Controller sample time
 
 
 //Controller PID motors
 void Controller()
 {
-    theta_1 = acos((sqrt(pow(x,2)+pow(yc,2)))/(2*L2))+asin(yc/(sqrt(pow(x,2)+pow(yc,2))));
+    theta_1 = acos((sqrt(pow(x,2)+pow(y,2)))/(2*L2))+asin(y/(sqrt(pow(x,2)+pow(y,2))));
     theta_2 = acos((x/L2)-cos(theta_1));
 
     reference_1 = -1.5*theta_1;     //reference
@@ -79,73 +87,108 @@
     if (pwm_2<0){motor_2 = 0;}
     else {motor_2 = 1;}
     pwm_motor_2 = fabs(pwm_2);
-    scope.set(0,pwm_1);
-    scope.set(1,error_1);
-    scope.set(2,pwm_2);
-    scope.set(3,error_2);
+    scope.set(0,error_1);
+    scope.set(1,reference_1);
+    scope.set(2,pwm_1);
+    scope.set(3,plaats_1);
     scope.send();
 }
+//Ticker filterwaardes
+void Filter_Samples()
+{
+        u_1 = emg1.read();
+        y_1 = FilterDesign(u_1);
+        u_2 = emg2.read();
+        y_2 = FilterDesign2(u_2);
+}
 
 //Failsave
 void Stop() //Zet allebei de snelheden op nul
 {
+    PID_ticker.detach();
     pwm_motor_1 = 0;
     pwm_motor_2 = 0;
-    while(true){}
+    run_programma = false;
+}
+
+void Beginopnieuw()
+{
+    run_programma = true;
+    x = x_start; y = y_base; m1_v1 = 0; m1_v2 = 0; m2_v1 = 0; m2_v2 = 0;
+    theta_1 = acos((sqrt(pow(x,2)+pow(y,2)))/(2*L2))+asin(y/(sqrt(pow(x,2)+pow(y,2))));
+    theta_2 = acos((x/L2)-cos(theta_1));
+    double positie_motor_1 = -1.5*theta_1;
+    double positie_motor_2 = -1.5*theta_2;
+    encoder_1.setPosition(positie_motor_1/0.0014959); //positie encodercounts naar hoek
+    encoder_2.setPosition(positie_motor_2/0.0014959); //positie encodercounts naar hoek
+    PID_ticker.attach(&Controller,dt);
+    tijd.reset();
+    tijd.start();
 }
 
 int main()
 {
     pc.baud(115200);
     stop.fall(&Stop); //stop de snelheden van de motoren bij indrukken
-    tijd.reset();
-    tijd.start();
-    theta_1 = acos((sqrt(pow(x,2)+pow(yc,2)))/(2*L2))+asin(yc/(sqrt(pow(x,2)+pow(yc,2))));
+    beginopnieuw.fall(&Beginopnieuw);
+    pwm_motor_1.period_us(1);
+    pwm_motor_2.period_us(1);
+    theta_1 = acos((sqrt(pow(x,2)+pow(y,2)))/(2*L2))+asin(y/(sqrt(pow(x,2)+pow(y,2))));
     theta_2 = acos((x/L2)-cos(theta_1));
     double positie_motor_1 = -1.5*theta_1;
     double positie_motor_2 = -1.5*theta_2;
     encoder_1.setPosition(positie_motor_1/0.0014959); //positie encodercounts naar hoek
     encoder_2.setPosition(positie_motor_2/0.0014959); //positie encodercounts naar hoek
+    FILTER_ticker.attach(&Filter_Samples,dt_f);
     PID_ticker.attach(&Controller,dt);
-    
+    wait(1);
+    tijd.reset();
+    tijd.start();
     while(true)
     {
+    while(run_programma)
+    {
     tijd_nieuw = tijd;
     tijd_verschil = tijd_nieuw - tijd_oud;
     tijd_oud = tijd_nieuw;
     
     if      (knop_1 == 0 && knop_2 == 1){mode = 1;} 
     else if (knop_1 == 1 && knop_2 == 0){mode = 2;} 
-    else if (knop_1 == 0 && knop_2 == 0){mode = 3;}
-    else                              {mode = 4;} //default
+    else if (knop_1 == 0 && knop_2 == 0 && x>(x_start+x_zakken)){mode = 3;}
+    else                             {mode = 4;} //default
     
+    /*
+    if      (y_1 >= 0.4 && y_2 <  0.4)                        {mode = 1;} 
+    else if (y_1 <  0.4 && y_2 >= 0.4)                        {mode = 2;} 
+    else if (y_1 >= 0.4 && y_2 >= 0.4 && x>(x_start+x_zakken)){mode = 3;}
+    else                                                      {mode = 4;} //default
+    */
     switch (mode)
     {
         case 1: x = x + tijd_verschil*Vx;
                 if (x>0.6){x = 0.6;}
                 y = y_base;
-                yc= y + L3 - L1;
                 break;
         case 2: x = x - tijd_verschil*Vx;
                 if (x<x_start){x = x_start;}
                 y = y_base;
-                yc= y + L3 - L1;
                 break;
         case 3: while(y > (y_base-y_oppakken))    
                 {
                     tijd_nieuw = tijd;
                     tijd_verschil = tijd_nieuw - tijd_oud;        
-                    y = y - tijd_verschil*Vy*4;
-                    yc= y + L3 - L1;
+                    y = y - tijd_verschil*Vy*3;
                     x = x;
                     tijd_oud = tijd_nieuw;
                 }
+                wait(1);
+                tijd_nieuw = tijd;
+                tijd_oud = tijd_nieuw;
                 while(y < (y_base+y_stijgen))
                 {
                     tijd_nieuw = tijd;
                     tijd_verschil = tijd_nieuw - tijd_oud;        
-                    y = y + tijd_verschil*Vy*2;
-                    yc= y + L3 - L1;
+                    y = y + tijd_verschil*Vy*5;
                     x = x;
                     tijd_oud = tijd_nieuw;
                 }
@@ -153,36 +196,33 @@
                 {
                     tijd_nieuw = tijd;
                     tijd_verschil = tijd_nieuw - tijd_oud;        
-                    x = x-tijd_verschil*Vx;
-                    yc = yc;
+                    x = x-tijd_verschil*Vx*2;
                     tijd_oud = tijd_nieuw;
                 }
                 while(y>y_base)
                 {
                     tijd_nieuw = tijd;
                     tijd_verschil = tijd_nieuw - tijd_oud;    
-                    y = y - tijd_verschil*Vy;
-                    yc= y + L3 - L1;
+                    y = y - tijd_verschil*Vy*2;
                     x = x;
                     tijd_oud = tijd_nieuw;
                 }
-                while(x>x_start-0.04)
+                while(x>x_start-0.02)
                 {
                     tijd_nieuw = tijd;
                     tijd_verschil = tijd_nieuw - tijd_oud;   
                     y = y_base;
-                    yc= y + L3 - L1;
-                    x = x - tijd_verschil*Vx;
+                    x = x - tijd_verschil*Vx*2;
                     tijd_oud = tijd_nieuw;
                 }
                 wait(0.5);
                     x = x_start;
                     y = y_base;
-                    yc= y + L3 - L1;
                 break;
         default: x = x;
-                 yc = yc;
+                 y = y;
                  break;
     }    
     }
+    }
 }
\ No newline at end of file