Dit is het passieve stuurprogramma van de handorthese behorend bij mijn bacheloropdracht. Groet, Menno Sytsma
Dependencies: EMG FastPWM HIDScope mbed-src
Revision 7:9ea55ce667be, committed 2016-06-21
- Comitter:
- s1503189
- Date:
- Tue Jun 21 15:02:23 2016 +0000
- Parent:
- 6:e206abd0b2ca
- Commit message:
- Versie zonder pc.printf en comments;
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r e206abd0b2ca -r 9ea55ce667be main.cpp --- a/main.cpp Wed Jun 01 13:38:55 2016 +0000 +++ b/main.cpp Tue Jun 21 15:02:23 2016 +0000 @@ -5,7 +5,6 @@ #include "math.h" #include "biquadFilter.h" - DigitalOut Rood(LED_RED); DigitalOut Groen(LED_GREEN); DigitalOut Blauw(LED_BLUE); @@ -25,15 +24,12 @@ // Verklaren van de in en outputs Ticker Loopticker; // Deze ticker wordt gebruikt om de looptimerflag aan te roepen. volatile bool LoopTimerFlag2 = 0; // Volatile, omdat deze heel vaak verandert van waar naar onwaar. -//Ticker Loopticker2; // Deze ticker wordt gebruikt om de looptimerflag aan te roepen. -//volatile bool LoopTimerFlag3 = 0; AnalogIn Referentie(A0); // De schuifpotmeter naast de geleiding van de draad is de referentie. AnalogIn Boardpotmeter(A2); // POT1 op het board wordt gebruikt als input van de controlloop. AnalogIn Boardpotmeter2(A1); DigitalOut motor1direction(D7); //D6 en D7 voor motor 1 (op het motorshield) FastPWM motor1speed(D6); - float potmeter; float Error; float Referentie2;//=0.0; @@ -57,10 +53,6 @@ const double b0_LP = 0.020083365564211, b1_LP = 0.040166731128423, b2_LP = 0.020083365564211; const double a1_LP2 = -1.561018075800718, a2_LP2 = 0.641351538057563; const double b0_LP2 = 0.020083365564211, b1_LP2 = 0.040166731128423, b2_LP2 = 0.020083365564211; -//const double a1_LP2 = -1.866892279711715, a2_LP2 = 0.875214548253684; -//const double b0_LP2 = 0.002080567135492, b1_LP2 = 0.004161134270985, b2_LP2 = 0.002080567135492; -//const double a1_HP = -1.982228929792529, a2_HP = 0.982385450614125; -//const double b0_HP = 0.991153595101663, b1_HP = -1.982307190203327, b2_HP = 0.991153595101663; float time_; const float time_increment = 0.01; @@ -81,7 +73,7 @@ double Inputberekening(double B) { - Input = Baseline+(Amplitude*-cos(2*time_)); + Input = Baseline+(Amplitude*-cos(1.5*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) { @@ -92,15 +84,7 @@ 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) { - Error=1; - } else if (Error<=-1) { - Error = -1; - } else if (fabs(Error)<0.01) { - Error = 0; - } - */ + Error = Input-Ref; return Error; } double PID_controller(double Error, double KP, double KI, double KD, double Ts, double &Error_int, double &e_prev) @@ -133,16 +117,16 @@ if(Ref_der < 0) { if(Output>=0) { motor1direction.write(1); - motor1speed = 0.01*fabs(Output); + motor1speed = 0.1*fabs(Output); } else if (Output<0) { motor1direction.write(0); - motor1speed = 0.05*fabs(Output); + motor1speed = 0.25*fabs(Output); } } if(Ref_der > 0) { if(Output>=0) { motor1direction.write(1); - motor1speed = (20*fabs(Output)); + motor1speed = (fabs(Output)); } else if (Output<0) { motor1direction.write(0); motor1speed = 0.01*fabs(Output); @@ -153,11 +137,11 @@ void Motor_controller2(float Foutje) { if(Foutje>=0.01){ - motor1direction.write(1); - motor1speed.write(0.05*Foutje); + motor1direction.write(0); + motor1speed.write(0.02*Foutje); } else if(Foutje<=-0.01){ - motor1direction.write(0); + motor1direction.write(1); motor1speed.write(-Foutje); } else { @@ -170,7 +154,7 @@ 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) { + while(1 && J<=480) { 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; @@ -182,7 +166,7 @@ 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); + Output = PID_controller(Error,0.5,0.1,0.01,0.01, Error_prev, Error_int); //,5,1,0.1, Motor_controller(Output); } //} @@ -204,15 +188,11 @@ } else if (bool (1)) { POT = Boardpotmeter2.read(); } - Input = 10*POT; //Inputberekening2(POT,0); Inputberekening(Boardpotmeter.read()); // 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. - // time_ += time_increment; + Input = 10*POT; // 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. 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. Rood = 1; - //Ref_prev = Ref2; Error = Referentie2-Input; - // pc.printf("Input = %f Referentie= %f Error= %f \n", Input, Referentie2, Error); Motor_controller2(Error); - // pc.printf("output = %f \n", motor1speed.read()); } @@ -237,7 +217,6 @@ Blauw = 1; Groen = 1; int i = 0; - pc.printf("Hello World! %i \n", i); Finitestatemachine.attach(tickerfunctie,0.1); Loopticker.attach(tickerfunctie2,0.01); Hidscope.attach(scopeSend,0.01); // Verzenden naar HIDscope @@ -246,16 +225,12 @@ 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) { if (Amplitude != 0){ Setting = 2; @@ -263,14 +238,12 @@ Groen = 1; Rood = 1; N = 0; - pc.printf("State 2 D\n"); wait(0.5);} else { Setting = 1; Start = false; Groen = 1; Rood = 1; - pc.printf("State 2 A\n"); wait(0.5);} } @@ -279,20 +252,16 @@ 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 bepaling gaat het groene lampje even branden. - pc.printf("State 2 C\n"); P_controller(0,0); double Maximum = 10*POT; Groen = 1; - pc.printf("Max = %f \n", Maximum); P_controller(0,1); double Minimum = 10*POT; Groen = 1; - pc.printf("Min = %f \n", Minimum); Amplitude = (Minimum+Maximum)/2; Baseline = (Maximum-Minimum)/2; Rood = 0; @@ -304,31 +273,22 @@ } if (Start==0 && Setting==2 && 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"); } }