Dit is het passieve stuurprogramma van de handorthese behorend bij mijn bacheloropdracht. Groet, Menno Sytsma

Dependencies:   EMG FastPWM HIDScope mbed-src

Revision:
1:f63d8a73460c
Parent:
0:46b6258b2b00
Child:
2:1dd9e630a7b5
--- a/main.cpp	Mon May 30 08:50:13 2016 +0000
+++ b/main.cpp	Mon May 30 13:14:25 2016 +0000
@@ -40,6 +40,8 @@
 double Error_prev = 0;
 double Error_int = 0;
 double Error_der;
+double Ref_der = 0;
+double Ref_prev = 0;
 // Define the HIDScope and Ticker object
 HIDScope    scope(4);
 Ticker Hidscope;
@@ -74,7 +76,7 @@
 {
     //double Inp = 10*B;            // De potmeter geeft ook waardes tussen 0 en 1, dit wordt met een factor 10 geschaald zodat deze als een positie in cm opgelegd kunnen worden.
     //Input = Filter2.step(Inp);
-    Input = 6+(3*-cos(time_));
+    Input = 5.5+(2.5*-cos(2*time_));
     if (Input>=9) {                             // De Input moet binnnen een aantal grenzen blijven. Groter dan 7 is mechanisch niet mogelijk.
         Input=9;                                // Bij een waarde kleiner dan 1,5 zijn de strings niet meer gewikkeld en werkt de controller averechts en is deze uiterst instabiel.
     } else if (Input<=3.0) {
@@ -87,13 +89,14 @@
 double Errorberekening(double Input,double Ref)
 {
     Error = Input-Ref;                  // Het Error-signaal wordt ook gebruikt voor de PWMOut, dus mag deze niet hoger worden dan 1, 1 is immers al full speed voor de motor.
-    if (Error>=1) {
+    /*if (Error>=1) {
         Error=1;
     } else if (Error<=-1) {
         Error = -1;
     } else if (fabs(Error)<0.01) {
         Error = 0;
     }
+    */
     return Error;
 }
 double PID_controller(double Error, double KP, double KI, double KD, double Ts, double &Error_int, double &e_prev)
@@ -123,148 +126,156 @@
 
 void Motor_controller()                 // De P_controller, door de ticker elke honderdste seconde uitgevoerd.
 {
-    if(Output>=0) {
-        motor1direction.write(1);
-        motor1speed = 0.3*fabs(Output);
-    } else if (Output<0) {
-        motor1direction.write(0);
-        motor1speed = fabs(Output);
-    }
-}
-
-void Extendfinger()
-{
-    Error = 0;
-    int J = 0;
-    time_ = 0;                                      // Voordat het hele programma begint, staat de Error op 0, zodat de motor niet spastisch gaat draaien om dit te compenseren.
-    while(1 && J<=640) {
-        Loopticker.attach(tickerfunctie2,0.01);
-        Hidscope.attach(scopeSend,0.01);                // Verzenden naar HIDscope
-        while(1 && J<=640) {
-            while(LoopTimerFlag2 !=1);                   // Als LTF 0 is, blijft hij 0 en stopt de loop.
-            LoopTimerFlag2 = 0;                         // Als voorgaand statement niet waar is, maken we de LTF weer 0 en gaan we verder met het programma
-            J= J+1;
-            pc.printf(" J is %i \n",J);
-            Led = 1;
-            double Input = Inputberekening(Boardpotmeter.read());
-            time_ += time_increment;
-            double Ref2 =  Referentieschaling(Referentie.read()/2,Input);       // De referentiewaarde is via deze functie (gevonden met metingen en polyfit) verbonden aan de afstand in centimeters voor waarden tussen 0 en 0.5.
-            Error = Errorberekening(Referentie2, Input);
-            Output = PID_controller(Error,1,0.5,1,0.01, Error_prev, Error_int);
-            Motor_controller();
+    if(Ref_der < 0) {
+        if(Output>=0) {
+            motor1direction.write(1);
+            motor1speed = 0.01*fabs(Output);
+        } else if (Output<0) {
+            motor1direction.write(0);
+            motor1speed = 0.05*fabs(Output);
         }
     }
-    motor1speed.write(0);
-
-}
-
-void tickerfunctie()
-{
-    LoopTimerFlag = 1;
-}
-
-void Determinetask()
-{
-    if (Button1pressed == 0) {
-
-        Groen = 0;
-        N++;
-        wait (0.5);
-        Groen = 1;
-    }
-}
-
-/* void Extendfinger()
-{
-    //i = i+1;
-    wait (0.5);      // Knipper 2 keer met Rood en 1 keer met paars
-    Rood = 0;
-    wait (0.5);
-    Rood = 1;
-    wait (0.5);
-    Rood = 0;
-    wait (0.5);
-    Rood = 1;
-    wait (0.5);
-    Rood = 0;
-    Blauw = 0;
-    wait (0.5);
-    Rood = 1;
-    Blauw = 1;
-    wait (0.5);
-} */
-
-int main()
-{
-    Rood = 1;
-    Blauw = 1;
-    Groen = 1;
-    int i = 0;
-    pc.printf("Hello World! %i \n", i);
-    Finitestatemachine.attach(tickerfunctie,0.1);
-
-    while (true) {
-        while(LoopTimerFlag !=1);                   // Als LTF 0 is, blijft hij 0 en stopt de loop.
-        LoopTimerFlag = 0;                           // Als voorgaand statement niet waar is, maken we de LTF weer 0 en gaan we verder met het programma
-        if (Start==0 && Setting==0 && Dotask==0) { // In eerste instantie gaan de leds even uit
-
-            Start = 1;
-            Groen = 0;
-            pc.printf("State 1\n");
-        }
-
-        if (Start==1 && Setting==0 && Dotask==0) {      // State 2 heeft Geel als kleur
-            Groen = 0;
-            Rood = 0;
-            pc.printf("State 2\n");
-            if (Button1pressed.read()==1 && Button2pressed.read()==0) {
-                Setting = true;
-                Start = false;
-                Groen = 1;
-                Rood = 1;
-                pc.printf("State 2 A\n");
-                wait(0.5);
-
-
-            }
-            if (Button1pressed.read()==0 && Button2pressed.read()==1 && N>0) {
-                Groen = 1;
-                Rood = 1;
-                Dotask = 1;
-                Start=0;
-                pc.printf("State 2 B\n");
-                wait(0.5);
-            }
-        }
-
-        if (Start==0 && Setting==1 && Dotask==0) {          // Leds zijn uit, elke count gaat het groene lampje even branden.
-            pc.printf("State 3\n");
-            Determinetask();                            // Aantal gewenste herhalingen van Dotask instellen
-            pc.printf("N = %i \n", N);
-            if (Button1pressed.read()== 1 && Button2pressed.read()== 0) {
-                Setting = 0;
-                Dotask = 1;
-                pc.printf("State 3 B\n");
-            }
-        }
-
-        if (Start==0 && Setting==0 && Dotask==1) {
-            pc.printf("State 4\n");
-            while(i < N) {
-
-                pc.printf("i = %i  N = %i \n", i, N);
-                Extendfinger();
-                //int J = 0;
-                pc.printf("Extendfinger()afgerond\n", i, N);
-                i++;
-            }
-            if (i==N) {
-                Dotask = 0;
-                Start = 1;
-                i=0;
-                pc.printf("Final state \n");
-            }
-
+    if(Ref_der >= 0) {
+        if(Output>=0) {
+            motor1direction.write(1);
+            motor1speed = (20*fabs(Output));
+        } else if (Output<0) {
+            motor1direction.write(0);
+            motor1speed = 0.01*fabs(Output);
         }
     }
 }
+    void Extendfinger(){
+        Error = 0;
+        int J = 0;
+        time_ = 0;                                      // Voordat het hele programma begint, staat de Error op 0, zodat de motor niet spastisch gaat draaien om dit te compenseren.
+        while(1 && J<=320) {
+            Loopticker.attach(tickerfunctie2,0.01);
+            Hidscope.attach(scopeSend,0.01);                // Verzenden naar HIDscope
+            while(1 && J<=320) {
+                while(LoopTimerFlag2 !=1);                   // Als LTF 0 is, blijft hij 0 en stopt de loop.
+                LoopTimerFlag2 = 0;                         // Als voorgaand statement niet waar is, maken we de LTF weer 0 en gaan we verder met het programma
+                J= J+1;
+                pc.printf(" J is %i \n",J);
+                Led = 1;
+                double Input = Inputberekening(Boardpotmeter.read());
+                time_ += time_increment;
+                double Ref2 =  Referentieschaling(Referentie.read()/2,Input);       // De referentiewaarde is via deze functie (gevonden met metingen en polyfit) verbonden aan de afstand in centimeters voor waarden tussen 0 en 0.5.
+                Ref_der = Referentie2-Ref_prev;
+                Ref_prev = Referentie2;
+                Error = Errorberekening(Input, Referentie2);
+                Output = PID_controller(Error,5,1,0.1,0.01, Error_prev, Error_int);
+                Motor_controller();
+            }
+        }
+        motor1speed.write(0);
+
+    }
+
+    void tickerfunctie() {
+        LoopTimerFlag = 1;
+    }
+
+    void Determinetask() {
+        if (Button1pressed == 0) {
+
+            Groen = 0;
+            N++;
+            wait (0.5);
+            Groen = 1;
+        }
+    }
+
+    /* void Extendfinger()
+    {
+        //i = i+1;
+        wait (0.5);      // Knipper 2 keer met Rood en 1 keer met paars
+        Rood = 0;
+        wait (0.5);
+        Rood = 1;
+        wait (0.5);
+        Rood = 0;
+        wait (0.5);
+        Rood = 1;
+        wait (0.5);
+        Rood = 0;
+        Blauw = 0;
+        wait (0.5);
+        Rood = 1;
+        Blauw = 1;
+        wait (0.5);
+    } */
+
+    int main() {
+        Rood = 1;
+        Blauw = 1;
+        Groen = 1;
+        int i = 0;
+        pc.printf("Hello World! %i \n", i);
+        Finitestatemachine.attach(tickerfunctie,0.1);
+
+        while (true) {
+            while(LoopTimerFlag !=1);                   // Als LTF 0 is, blijft hij 0 en stopt de loop.
+            LoopTimerFlag = 0;                           // Als voorgaand statement niet waar is, maken we de LTF weer 0 en gaan we verder met het programma
+            if (Start==0 && Setting==0 && Dotask==0) { // In eerste instantie gaan de leds even uit
+
+                Start = 1;
+                Groen = 0;
+                pc.printf("State 1\n");
+            }
+
+            if (Start==1 && Setting==0 && Dotask==0) {      // State 2 heeft Geel als kleur
+                Groen = 0;
+                Rood = 0;
+                pc.printf("State 2\n");
+                if (Button1pressed.read()==1 && Button2pressed.read()==0) {
+                    Setting = true;
+                    Start = false;
+                    Groen = 1;
+                    Rood = 1;
+                    pc.printf("State 2 A\n");
+                    wait(0.5);
+
+
+                }
+                if (Button1pressed.read()==0 && Button2pressed.read()==1 && N>0) {
+                    Groen = 1;
+                    Rood = 1;
+                    Dotask = 1;
+                    Start=0;
+                    pc.printf("State 2 B\n");
+                    wait(0.5);
+                }
+            }
+
+            if (Start==0 && Setting==1 && Dotask==0) {          // Leds zijn uit, elke count gaat het groene lampje even branden.
+                pc.printf("State 3\n");
+                Determinetask();                            // Aantal gewenste herhalingen van Dotask instellen
+                pc.printf("N = %i \n", N);
+                if (Button1pressed.read()== 1 && Button2pressed.read()== 0) {
+                    Setting = 0;
+                    Dotask = 1;
+                    pc.printf("State 3 B\n");
+                }
+            }
+
+            if (Start==0 && Setting==0 && Dotask==1) {
+                pc.printf("State 4\n");
+                while(i < N) {
+
+                    pc.printf("i = %i  N = %i \n", i, N);
+                    Extendfinger();
+                    //int J = 0;
+                    pc.printf("Extendfinger()afgerond\n", i, N);
+                    i++;
+                }
+                if (i==N) {
+                    Dotask = 0;
+                    Start = 1;
+                    i=0;
+                    pc.printf("Final state \n");
+                }
+
+            }
+        }
+    }