Het complete motorscript met alle gewenste functies

Dependencies:   HIDScope MODSERIAL QEI biquadFilter mbed

Fork of Motor_EMG_Definitief by Margreeth de Breij

Revision:
1:3f49c8818619
Parent:
0:5816557b2064
Child:
2:7873c44b0568
--- a/main.cpp	Mon Oct 19 10:06:36 2015 +0000
+++ b/main.cpp	Thu Oct 22 10:46:10 2015 +0000
@@ -15,7 +15,7 @@
     MODSERIAL pc(USBTX, USBRX);             // To/From PC
     QEI Encoder2(D3, D2, NC, 32);           // Encoder Motor 2
     QEI Encoder1(D13,D12,NC, 32);           // Encoder Motor 1
-    HIDScope scope(5);                      // Scope, 4 channels
+    HIDScope scope(6);                      // Scope, 4 channels
 
 // LEDs
     DigitalOut LedR(LED_RED);
@@ -50,10 +50,6 @@
     int count = 0;
     double Grens2 = 90, Grens1 = 90;
     double Stapgrootte = 5;
-    
-    DigitalOut led(LED_RED);
-    DigitalOut ledG(LED_GREEN);
-    DigitalOut ledB(LED_BLUE);
    
 // Declaring variables
     double EMG_L_f_v1 = 0, EMG_L_f_v2 = 0;
@@ -85,18 +81,13 @@
     const double m2_Ts = 0.01, m1_Ts = 0.01;
 
 //Controller gain Motor 2 & 1
-    const double m2_Kp = 5,m2_Ki = 0.01, m2_Kd = 20;
-    const double m1_Kp = 5,m1_Ki = 0.01, m1_Kd = 20;
+    const double m2_Kp = 2.1/57,m2_Ki = 3.9/57, m2_Kd = 0.1/57;
+    const double m1_Kp = 2.1/57,m1_Ki = 3.9/57, m1_Kd = 0.1/57;
     double m2_err_int = 0, m2_prev_err = 0;
     double m1_err_int = 0, m1_prev_err = 0;
-
-//Derivative filter coeffs Motor 2 & 1
-    const double BiGain2 = 0.012, BiGain1 = 0.016955;
-    const double m2_f_a1 = -0.96608908283*BiGain2, m2_f_a2 = 0.0*BiGain2, m2_f_b0 = 1.0*BiGain2, m2_f_b1 = 1.0*BiGain2, m2_f_b2 = 0.0*BiGain2;
-    const double m1_f_a1 = -0.96608908283*BiGain1, m1_f_a2 = 0.0*BiGain1, m1_f_b0 = 1.0*BiGain1, m1_f_b1 = 1.0*BiGain1, m1_f_b2 = 0.0*BiGain1;
     
 // coëfficiënten
-const double BiGainEMG_H1 = 0.796821; 
+    const double BiGainEMG_H1 = 0.796821; 
     const double EMGH1_a1 = -1.47500228332, EMGH1_a2 = 0.55273994299, EMGH1_b0 = 1.0*BiGainEMG_H1, EMGH1_b1 = -1.99922446977*BiGainEMG_H1, EMGH1_b2 = 1.0*BiGainEMG_H1; //coefficients for high-pass filter
     
     const double BiGainEMG_L1= 0.001041;
@@ -104,10 +95,6 @@
    
     const double BiGainEMG_N1 = 1.0;
     const double EMGN1_a1 = -1.58174308681, EMGN1_a2 = 0.96540248979, EMGN1_b0 = 1.0*BiGainEMG_N1, EMGN1_b1 = -1.61816176147*BiGainEMG_N1, EMGN1_b2 = 1.0*BiGainEMG_N1; //coefficients for notch filter
-   
-// Filter variables
-    double m2_f_v1 = 0, m2_f_v2 = 0;
-    double m1_f_v1 = 0, m1_f_v2 = 0;
     
 // Creating the filters
     biquadFilter EMG_highpass1 (EMGH1_a1, EMGH1_a2, EMGH1_b0, EMGH1_b1, EMGH1_b2);        // creates the high pass filter
@@ -126,12 +113,11 @@
 //HIDScope
     void ScopeSend()//Functie die de gegevens voor de scope uitleest en doorstuurt
     {
-        scope.set(0, reference2 - position2);
-        scope.set(1, position2);
-        scope.set(2, reference1 - position1);    
-        scope.set(3, position1);
-        scope.set(4, EMG_left_MAF);
-        scope.set(5, EMG_right_MAF);
+        scope.set(0, position2);  
+        scope.set(1, position1);
+        scope.set(2, EMG_left_MAF);
+        scope.set(3, EMG_right_MAF);
+        scope.set(4, count);
         scope.send();
     
     }
@@ -198,7 +184,7 @@
     {
         // Setpoint motor 2
             reference2 = m2_ref;                           // Reference in degrees
-            position2 = Encoder2.getPulses()*360/(32*131); // Position in degrees
+            position2 = 360.0*Encoder2.getPulses()/(32.0*131.0); // Position in degrees
         // Speed control
             double m2_P1 = PID( reference2 - position2, m2_Kp, m2_Ki, m2_Kd, m2_Ts, m2_err_int, m2_prev_err);
             double m2_P2 = m2_P1;
@@ -219,7 +205,7 @@
     {
         // Setpoint Motor 1
             reference1 = m1_ref;                           // Reference in degrees
-            position1 = Encoder1.getPulses()*360/(32*131); // Position in degrees
+            position1 = 360.0*Encoder1.getPulses()/(32.0*131.0); // Position in degrees
         // Speed control
             double m1_P1 = PID( reference1 - position1, m1_Kp, m1_Ki, m1_Kd, m1_Ts, m1_err_int, m1_prev_err);
             double m1_P2 = m1_P1;
@@ -258,46 +244,51 @@
         SampleEMGRight.attach(&EMGfilterRight, 0.01f);
         MovingAverageLeft.attach(&MovingAverageFilterLeft, 0.01f);
         MovingAverageRight.attach(&MovingAverageFilterRight, 0.01f);
-        
-    // Defining threshold 
-        ledG.write(1), led.write(1), ledB.write(1);
+//--------------------------------------------------------------------------------------------------------------------------//
+// Determing Threshold 
+//--------------------------------------------------------------------------------------------------------------------------//      
         wait(20);
     
-    ledG.write(1);
-    wait(0.2);
-    ledG.write(0);
-    wait(0.2);
-    ledG.write(1);
-    wait(0.2);
-    ledG.write(0);
-    wait(0.2);
-    ledG.write(1);
-    wait(0.2);    
-    ledG.write(0);
-    wait(2);
-    Threshold1 = 0.5*EMG_left_MAF;
-    Threshold2 = 0.2*EMG_left_MAF;
-    ledG.write(1);
+        LedG.write(1);
+        wait(0.2);
+        LedG.write(0);
+        wait(0.2);
+        LedG.write(1);
+        wait(0.2);
+        LedG.write(0);
+        wait(0.2);
+        LedG.write(1);
+        wait(0.2);    
+        LedG.write(0);
+        wait(2);
+        Threshold1 = 0.8*EMG_left_MAF;
+        Threshold2 = 0.2*EMG_left_MAF;
+        LedG.write(1);
+        LedR.write(0);
+        wait(2);
+        LedR.write(1);
+
+        wait(2);
+        LedB.write(1);
+        wait(0.2);
+        LedB.write(0);
+        wait(0.2);
+        LedB.write(1);
+        wait(0.2);
+        LedB.write(0);
+        wait(0.2);
+        LedB.write(1);
+        wait(0.2);    
+        LedB.write(0);
+        wait(2);
+        Threshold3 = 0.8*EMG_right_MAF;
+        Threshold4 = 0.2*EMG_right_MAF;
+        LedB.write(1);
+        pc.printf("T1 = %f, T2 = %f, T3 = %f, T4 = %f\n", Threshold1, Threshold2, Threshold3, Threshold4); 
+        LedR.write(0);
+        wait(2);
+        LedR.write(1);
     
-    wait(2);
-    ledB.write(1);
-    wait(0.2);
-    ledB.write(0);
-    wait(0.2);
-    ledB.write(1);
-    wait(0.2);
-    ledB.write(0);
-    wait(0.2);
-    ledB.write(1);
-    wait(0.2);    
-    ledB.write(0);
-    wait(2);
-    Threshold3 = 0.5*EMG_right_MAF;
-    Threshold4 = 0.2*EMG_right_MAF;
-    ledB.write(1);
-    
-    pc.printf("T1 = %f, T2 = %f, T3 = %f, T4 = %f\n", Threshold1, Threshold2, Threshold3, Threshold4); 
-    ledG.write(1);
     
 //--------------------------------------------------------------------------------------------------------------------------//
 // Control Program
@@ -306,14 +297,14 @@
     {
                                             //char c = pc.getc();
     // 1 Program UP
-       if ((EMG_right_MAF >= Threshold1) && (EMG_left_MAF >= Threshold1)) //if(c == 'e') //
+       if ((EMG_right_MAF >= Threshold3) && (EMG_left_MAF >= Threshold1)) //if(c == 'e') //
         {
             count = count + 1;
             if(count > 2)
                 {
                     count = 2;
                 }
-
+            wait(2);
         }
      // 1 Program DOWN
      //   if(c == 'd') // Hoe gaat dit aangestuurd worden?
@@ -339,6 +330,7 @@
                         m2_ref = Grens2;
                         m1_ref = -1*Grens1;
                     }
+                    wait(0.1);
                 }
                 if((EMG_right_MAF < Threshold1) && (EMG_left_MAF > Threshold1)) //if (c == 'f') //   
                 {
@@ -349,28 +341,33 @@
                         m2_ref = -1*Grens2;
                         m1_ref = Grens1;
                     }
+                    wait(0.1);
                 }
-        
+        }
     // PROGRAM 1: Motor 1 control, Red LED
         if(count == 1) 
         {
                 LedG = LedB = 1;
                 LedR = 0;
-                if ((EMG_right_MAF >= Threshold1) && (EMG_left_MAF <= Threshold1)) // if(c == 't') //
+                if ((EMG_right_MAF >= Threshold3) && (EMG_left_MAF <= Threshold1)) // if(c == 't') //
                 {
                     m1_ref = m1_ref + Stapgrootte;
+                    
                     if (m1_ref > Grens1)
                     {
                         m1_ref = Grens1;
                     }
+                    wait(0.1);
                 }
-                if ((EMG_left_MAF > Threshold1) && (EMG_right_MAF < Threshold1)) //if(c == 'g') //
+                if ((EMG_left_MAF > Threshold1) && (EMG_right_MAF < Threshold3)) //if(c == 'g') //
                 {
                     m1_ref = m1_ref - Stapgrootte;
+                  
                     if (m1_ref < -1*Grens1)
                     {
                         m1_ref = -1*Grens1;
                     }
+                    wait(0.1);
                 }
         }
     // PROGRAM 2: Firing mechanism & Reset, Blue LED
@@ -385,6 +382,6 @@
                 m1_ref = 0;
                 count = 0;   
         }
-}
+
 }
 }
\ No newline at end of file