2014-10-15 Arm 1 naar thuispositie. Eerste poging, fout in keep_in_range

Dependencies:   Encoder MODSERIAL TextLCD mbed mbed-dsp

Committer:
JKleinRot
Date:
Fri Oct 24 11:06:15 2014 +0000
Revision:
13:54ee98850a15
Parent:
12:996f9f8e3acc
Child:
14:e1816efa712d
2014-10-24 Filterformules gemaakt, offset metingen gedaan. Offset bepalen nog niet gelukt

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JKleinRot 0:859c89785d3f 1 #include "mbed.h" //Mbed bibliotheek inladen, standaard functies
JKleinRot 0:859c89785d3f 2 #include "MODSERIAL.h" //MODSERIAL bibliotheek inladen, communicatie met PC
JKleinRot 0:859c89785d3f 3 #include "encoder.h" //Encoder bibliotheek inladen, communicatie met encoder
JKleinRot 0:859c89785d3f 4 #include "TextLCD.h" //LCD scherm bibliotheek inladen, communicatie met LCD scherm
JKleinRot 0:859c89785d3f 5
JKleinRot 0:859c89785d3f 6 //Constanten definiëren en waarde geven
JKleinRot 11:e9b906b5f572 7 #define SAMPLETIME_REGELAAR 0.005 //Sampletijd ticker regelaar motor
JKleinRot 13:54ee98850a15 8 #define KP_arm1 0.3 //Factor proprotionele regelaar arm 1
JKleinRot 13:54ee98850a15 9 #define KI_arm1 0 //Factor integraal regelaar arm 1
JKleinRot 13:54ee98850a15 10 #define KD_arm1 0.02 //Factor afgeleide regelaar arm 1
JKleinRot 13:54ee98850a15 11 #define KP_arm2 0.001 //Factor proprotionele regelaar arm 2
JKleinRot 13:54ee98850a15 12 #define KI_arm2 0 //Factor integraal regelaar arm 2
JKleinRot 13:54ee98850a15 13 #define KD_arm2 0 //Factor afgeleide regelaar arm 2
JKleinRot 11:e9b906b5f572 14 #define SAMPLETIME_EMG 0.005 //Sampletijd ticker EMG meten
JKleinRot 11:e9b906b5f572 15 #define PULS_ARM1_HOME_KALIBRATIE 180 //Aantal pulsen die de encoder moet tellen voordat de arm de goede positie heeft
JKleinRot 11:e9b906b5f572 16 #define PULS_ARM2_HOME_KALIBRATIE 393 //Aantal pulsen die de encoder moet tellen voordat de arm de goede positie heeft
JKleinRot 0:859c89785d3f 17
JKleinRot 13:54ee98850a15 18 //High Pass filter Filtercoëfficiënten
JKleinRot 13:54ee98850a15 19 #define A1 1
JKleinRot 13:54ee98850a15 20 #define A2 -3.1806
JKleinRot 13:54ee98850a15 21 #define A3 3.8612
JKleinRot 13:54ee98850a15 22 #define A4 -2.1122
JKleinRot 13:54ee98850a15 23 #define A5 0.4383
JKleinRot 13:54ee98850a15 24 #define B1 4.1660E-4
JKleinRot 13:54ee98850a15 25 #define B2 0.0017
JKleinRot 13:54ee98850a15 26 #define B3 0.0025
JKleinRot 13:54ee98850a15 27 #define B4 0.0017
JKleinRot 13:54ee98850a15 28 #define B5 4.1660E-4
JKleinRot 13:54ee98850a15 29
JKleinRot 13:54ee98850a15 30 //Notch filter Filtercoëfficiënten
JKleinRot 13:54ee98850a15 31 #define C1 1
JKleinRot 13:54ee98850a15 32 #define C2 -1.1873E-16
JKleinRot 13:54ee98850a15 33 #define C3 0.9391
JKleinRot 13:54ee98850a15 34 #define D1 0.9695
JKleinRot 13:54ee98850a15 35 #define D2 -1.1873E-16
JKleinRot 13:54ee98850a15 36 #define D3 0.9695
JKleinRot 13:54ee98850a15 37
JKleinRot 13:54ee98850a15 38 //Low pass filter Filtercoëfficiënten
JKleinRot 13:54ee98850a15 39 #define E1 1
JKleinRot 13:54ee98850a15 40 #define E2 3.9179
JKleinRot 13:54ee98850a15 41 #define E3 5.7571
JKleinRot 13:54ee98850a15 42 #define E4 3.7603
JKleinRot 13:54ee98850a15 43 #define E5 0.9212
JKleinRot 13:54ee98850a15 44 #define F1 0.9598
JKleinRot 13:54ee98850a15 45 #define F2 3.8391
JKleinRot 13:54ee98850a15 46 #define F3 5.7587
JKleinRot 13:54ee98850a15 47 #define F4 3.8391
JKleinRot 13:54ee98850a15 48 #define F5 0.9598
JKleinRot 13:54ee98850a15 49
JKleinRot 0:859c89785d3f 50 //Pinverdeling en naamgeving variabelen
JKleinRot 0:859c89785d3f 51 TextLCD lcd(PTD2, PTB8, PTB9, PTB10, PTB11, PTE2); //LCD scherm
JKleinRot 0:859c89785d3f 52 MODSERIAL pc(USBTX, USBRX); //PC
JKleinRot 0:859c89785d3f 53
JKleinRot 1:e5e1eb9d0025 54 PwmOut pwm_motor_arm1(PTA5); //PWM naar motor arm 1
JKleinRot 9:454e7da8ab65 55 DigitalOut dir_motor_arm1(PTA4); //Richting van motor arm 1
JKleinRot 12:996f9f8e3acc 56 Encoder puls_motor_arm1(PTD0, PTD2); //Encoder pulsen tellen van motor arm 1, (geel, wit)
JKleinRot 11:e9b906b5f572 57 PwmOut pwm_motor_arm2(PTC8); //PWM naar motor arm 2
JKleinRot 9:454e7da8ab65 58 DigitalOut dir_motor_arm2(PTC9); //Ricting van motor arm 2
JKleinRot 12:996f9f8e3acc 59 Encoder puls_motor_arm2(PTD5, PTA13); //Encoder pulsen tellen van motor arm 2, (geel, wit)
JKleinRot 6:3b6fad529520 60 AnalogIn EMG_bi(PTB1); //Meten EMG signaal biceps
JKleinRot 12:996f9f8e3acc 61 //Blauw op 3,3 V en groen op GND
JKleinRot 1:e5e1eb9d0025 62
JKleinRot 6:3b6fad529520 63 Ticker ticker_regelaar; //Ticker voor regelaar motor
JKleinRot 6:3b6fad529520 64 Ticker ticker_EMG; //Ticker voor EMG meten
JKleinRot 1:e5e1eb9d0025 65
JKleinRot 9:454e7da8ab65 66 //States definiëren
JKleinRot 13:54ee98850a15 67 enum pipostate {RUST, KALIBRATIE_ARM1, KALIBRATIE_ARM2, EMG_OFFSET_BICEPS, EMG_BICEPS, KALIBRATIE_BICEPS, EMG_OFFSET_TRICEPS, EMG_TRICEPS, KALIBRATIE_TRICEPS}; //Alle states benoemen, ieder krijgt een getal beginnend met 0
JKleinRot 9:454e7da8ab65 68 uint8_t state = RUST; //State is rust aan het begin
JKleinRot 9:454e7da8ab65 69
JKleinRot 6:3b6fad529520 70 //Gedefinieerde datatypen en naamgeving en beginwaarden
JKleinRot 6:3b6fad529520 71 char *lcd_r1 = new char[16]; //Char voor tekst op eerste regel LCD scherm
JKleinRot 6:3b6fad529520 72 char *lcd_r2 = new char[16]; //Char voor tekst op tweede regel LCD scherm
JKleinRot 0:859c89785d3f 73
JKleinRot 11:e9b906b5f572 74 float pwm_to_motor_arm1; //PWM output naar motor arm 1
JKleinRot 11:e9b906b5f572 75 float pwm_to_motor_arm2; //PWM output naar motor arm 2
JKleinRot 13:54ee98850a15 76 float error_arm1_kalibratie; //Error in pulsen arm 1
JKleinRot 13:54ee98850a15 77 float vorige_error_arm1 = 0; //Derivative actie van regelaar arm 1
JKleinRot 13:54ee98850a15 78 float integraal_arm1 = 0; //Integraal actie van regelaar arm 1
JKleinRot 13:54ee98850a15 79 float afgeleide_arm1; //Afgeleide actie van regelaar arm 1
JKleinRot 13:54ee98850a15 80 float error_arm2_kalibratie; //Error in pulsen arm 2
JKleinRot 13:54ee98850a15 81 float vorige_error_arm2 = 0; //Derivative actie van regelaar arm 2
JKleinRot 13:54ee98850a15 82 float integraal_arm2 = 0; //Integraal actie van regelaar arm 2
JKleinRot 13:54ee98850a15 83 float afgeleide_arm2; //Afgeleide actie van regelaar arm 2
JKleinRot 13:54ee98850a15 84 float xbk = 0; //Gemeten EMG waarde biceps in de kalibratie
JKleinRot 13:54ee98850a15 85 float xbk1 = 0; //Gemeten EMG waarde biceps in de kalibratie
JKleinRot 13:54ee98850a15 86 float xbk2 = 0; //Gemeten EMG waarde biceps in de kalibratie
JKleinRot 13:54ee98850a15 87 float xbk3 = 0; //Gemeten EMG waarde biceps in de kalibratie
JKleinRot 13:54ee98850a15 88 float xbk4 = 0; //Gemeten EMG waarde biceps in de kalibratie
JKleinRot 13:54ee98850a15 89 float xbk5 = 0; //Gemeten EMG waarde biceps in de kalibratie
JKleinRot 13:54ee98850a15 90 float xbk6 = 0; //Gemeten EMG waarde biceps in de kalibratie
JKleinRot 13:54ee98850a15 91 float xbk7 = 0; //Gemeten EMG waarde biceps in de kalibratie
JKleinRot 13:54ee98850a15 92 float xbk8 = 0; //Gemeten EMG waarde biceps in de kalibratie
JKleinRot 13:54ee98850a15 93 float xbk9 = 0; //Gemeten EMG waarde biceps in de kalibratie
JKleinRot 13:54ee98850a15 94 float xbk10 = 0; //Gemeten EMG waarde biceps in de kalibratie
JKleinRot 13:54ee98850a15 95 float meanxbk; //Offset van biceps kalibratie
JKleinRot 13:54ee98850a15 96 float xb; //Gemeten EMG waarde biceps
JKleinRot 13:54ee98850a15 97 float xbo; //Gemeten EMG waarde biceps min de offset, deze gaat in de filters
JKleinRot 13:54ee98850a15 98
JKleinRot 13:54ee98850a15 99 //High Pass filter Y(n-x) waarden instellen op nul en definiëren als float
JKleinRot 13:54ee98850a15 100 float xbhp; //Zelfde als xbo, maar makkelijker in notatie in filter
JKleinRot 13:54ee98850a15 101 float xbhp1 = 0;
JKleinRot 13:54ee98850a15 102 float xbhp2 = 0;
JKleinRot 13:54ee98850a15 103 float xbhp3 = 0;
JKleinRot 13:54ee98850a15 104 float xbhp4 = 0;
JKleinRot 13:54ee98850a15 105 float xbhp5 = 0;
JKleinRot 13:54ee98850a15 106 float ybhp;
JKleinRot 13:54ee98850a15 107 float ybhp1 = 0;
JKleinRot 13:54ee98850a15 108 float ybhp2 = 0;
JKleinRot 13:54ee98850a15 109 float ybhp3 = 0;
JKleinRot 13:54ee98850a15 110 float ybhp4 = 0;
JKleinRot 13:54ee98850a15 111 float ybhp5 = 0;
JKleinRot 13:54ee98850a15 112
JKleinRot 13:54ee98850a15 113 //Notch filter
JKleinRot 13:54ee98850a15 114 float xbn;
JKleinRot 13:54ee98850a15 115 float xbn1 = 0;
JKleinRot 13:54ee98850a15 116 float xbn2 = 0;
JKleinRot 13:54ee98850a15 117 float ybn;
JKleinRot 13:54ee98850a15 118 float ybn1 = 0;
JKleinRot 13:54ee98850a15 119 float ybn2 = 0;
JKleinRot 13:54ee98850a15 120
JKleinRot 13:54ee98850a15 121 //Rectifier
JKleinRot 13:54ee98850a15 122 float rb;
JKleinRot 13:54ee98850a15 123 float rbr;
JKleinRot 13:54ee98850a15 124
JKleinRot 13:54ee98850a15 125 //Low pass filter
JKleinRot 13:54ee98850a15 126 float xblp;
JKleinRot 13:54ee98850a15 127 float xblp1 = 0;
JKleinRot 13:54ee98850a15 128 float xblp2 = 0;
JKleinRot 13:54ee98850a15 129 float xblp3 = 0;
JKleinRot 13:54ee98850a15 130 float xblp4 = 0;
JKleinRot 13:54ee98850a15 131 float xblp5 = 0;
JKleinRot 13:54ee98850a15 132 float yblp;
JKleinRot 13:54ee98850a15 133 float yblp1 = 0;
JKleinRot 13:54ee98850a15 134 float yblp2 = 0;
JKleinRot 13:54ee98850a15 135 float yblp3 = 0;
JKleinRot 13:54ee98850a15 136 float yblp4 = 0;
JKleinRot 13:54ee98850a15 137 float yblp5 = 0;
JKleinRot 13:54ee98850a15 138
JKleinRot 13:54ee98850a15 139 //Gefilterde biceps EMG
JKleinRot 13:54ee98850a15 140 float xbf;
JKleinRot 13:54ee98850a15 141 float ybf;
JKleinRot 7:dd3cba61b34b 142
JKleinRot 6:3b6fad529520 143 volatile bool regelaar_ticker_flag; //Definiëren flag als bool die verandert kan worden in programma
JKleinRot 10:52b22bff409a 144 void setregelaar_ticker_flag() //Setregelaar_ticker_flag zet de regelaar_ticker_flag op true
JKleinRot 10:52b22bff409a 145 {
JKleinRot 10:52b22bff409a 146 regelaar_ticker_flag = true;
JKleinRot 1:e5e1eb9d0025 147 }
JKleinRot 1:e5e1eb9d0025 148
JKleinRot 6:3b6fad529520 149 volatile bool regelaar_EMG_flag; //Definiëren flag als bool die verandert kan worden in programma
JKleinRot 10:52b22bff409a 150 void setregelaar_EMG_flag() //Setregelaar_EMG_flag zet de regelaar_EMG_flag op true
JKleinRot 10:52b22bff409a 151 {
JKleinRot 10:52b22bff409a 152 regelaar_EMG_flag = true;
JKleinRot 4:69540b9c0646 153 }
JKleinRot 4:69540b9c0646 154
JKleinRot 10:52b22bff409a 155 void keep_in_range(float * in, float min, float max) //Zorgt ervoor dat een getal niet buiten een bepaald minimum en maximum komt
JKleinRot 10:52b22bff409a 156 {
JKleinRot 10:52b22bff409a 157 if (*in < min) { //Als de waarde kleiner is als het minimum wordt de waarde het minimum
JKleinRot 2:0cb899f2800a 158 *in = min;
JKleinRot 2:0cb899f2800a 159 }
JKleinRot 10:52b22bff409a 160 if (*in > max) { //Als de waarde groter is dan het maximum is de waarde het maximum
JKleinRot 2:0cb899f2800a 161 *in = max;
JKleinRot 10:52b22bff409a 162 } else { //In alle andere gevallen is de waarde de waarde zelf
JKleinRot 2:0cb899f2800a 163 *in = *in;
JKleinRot 2:0cb899f2800a 164 }
JKleinRot 2:0cb899f2800a 165 }
JKleinRot 1:e5e1eb9d0025 166
JKleinRot 10:52b22bff409a 167 void arm1_naar_thuispositie()
JKleinRot 10:52b22bff409a 168 {
JKleinRot 13:54ee98850a15 169 error_arm1_kalibratie = (PULS_ARM1_HOME_KALIBRATIE - puls_motor_arm1.getPosition()); //PWM naar motor is het verschil tussen het voorgestelde aantal pulsen en de huidige positie maal een factor
JKleinRot 13:54ee98850a15 170 integraal_arm1 = integraal_arm1 + error_arm1_kalibratie*SAMPLETIME_REGELAAR; //Integraal deel van regelaar
JKleinRot 13:54ee98850a15 171 afgeleide_arm1 = (error_arm1_kalibratie - vorige_error_arm1)/SAMPLETIME_REGELAAR; //Afgeleide deel van regelaar
JKleinRot 13:54ee98850a15 172 pwm_to_motor_arm1 = error_arm1_kalibratie*KP_arm1 + integraal_arm1*KI_arm1 + afgeleide_arm1*KD_arm1; //Output naar motor na PID regelaar
JKleinRot 7:dd3cba61b34b 173 keep_in_range(&pwm_to_motor_arm1, -1, 1); //PWM moet tussen 1 en -1 blijven (niet meer dan 100% dutycycle)
JKleinRot 10:52b22bff409a 174
JKleinRot 11:e9b906b5f572 175 if (pwm_to_motor_arm1 > 0) { //Als PWM is positief, dan richting 1
JKleinRot 10:52b22bff409a 176 dir_motor_arm1.write(1);
JKleinRot 11:e9b906b5f572 177 } else { //Anders richting nul
JKleinRot 7:dd3cba61b34b 178 dir_motor_arm1.write(0);
JKleinRot 7:dd3cba61b34b 179 }
JKleinRot 11:e9b906b5f572 180 pwm_motor_arm1.write(fabs(pwm_to_motor_arm1)); //Output PWM naar motor is de absolute waarde van de berekende PWM
JKleinRot 10:52b22bff409a 181 pc.printf("pulsmotorgetposition %d ", puls_motor_arm1.getPosition());
JKleinRot 9:454e7da8ab65 182 pc.printf("pwmmotor %f\n\r", pwm_to_motor_arm1);
JKleinRot 10:52b22bff409a 183
JKleinRot 11:e9b906b5f572 184 if (pwm_to_motor_arm1 == 0) { //Als het verschil tussen de voorgestelde en huidige positie nul is wordt de while loop gestopt (condities kloppen niet meer)
JKleinRot 11:e9b906b5f572 185 state = KALIBRATIE_ARM2; //State wordt kalibratie arm 2, zo daar naar volgende onderdeel
JKleinRot 13:54ee98850a15 186 pc.printf("KALIBRATIE_ARM1 afgerond\n"); //Tekst voor controle Arm 1 naar thuispositie
JKleinRot 10:52b22bff409a 187 }
JKleinRot 10:52b22bff409a 188 }
JKleinRot 7:dd3cba61b34b 189
JKleinRot 10:52b22bff409a 190 void arm2_naar_thuispositie()
JKleinRot 10:52b22bff409a 191 {
JKleinRot 13:54ee98850a15 192 error_arm2_kalibratie = (PULS_ARM2_HOME_KALIBRATIE - puls_motor_arm2.getPosition()); //PWM naar motor is het verschil tussen het voorgestelde aantal pulsen en de huidige positie maal een factor
JKleinRot 13:54ee98850a15 193 integraal_arm2 = integraal_arm2 + error_arm2_kalibratie*SAMPLETIME_REGELAAR; //Integraal deel van regelaar
JKleinRot 13:54ee98850a15 194 afgeleide_arm2 = (error_arm2_kalibratie - vorige_error_arm2)/SAMPLETIME_REGELAAR; //Afgeleide deel van regelaar
JKleinRot 13:54ee98850a15 195 pwm_to_motor_arm2 = error_arm2_kalibratie*KP_arm2 + integraal_arm2*KI_arm2 + afgeleide_arm2*KD_arm2; //Output naar motor na PID regelaar
JKleinRot 7:dd3cba61b34b 196 keep_in_range(&pwm_to_motor_arm2, -1, 1); //PWM moet tussen 1 en -1 blijven (niet meer dan 100% dutycycle)
JKleinRot 10:52b22bff409a 197
JKleinRot 11:e9b906b5f572 198 if (pwm_to_motor_arm2 > 0) { //Als PWM is positief, dan richting 1
JKleinRot 7:dd3cba61b34b 199 dir_motor_arm2.write(1);
JKleinRot 11:e9b906b5f572 200 } else { //Anders richting nul
JKleinRot 7:dd3cba61b34b 201 dir_motor_arm2.write(0);
JKleinRot 7:dd3cba61b34b 202 }
JKleinRot 11:e9b906b5f572 203 pwm_motor_arm2.write(fabs(pwm_to_motor_arm2)); //Output PWM naar motor is de absolute waarde van de berekende PWM
JKleinRot 13:54ee98850a15 204 pc.printf("pulsmotorgetposition %d ", puls_motor_arm2.getPosition());
JKleinRot 13:54ee98850a15 205 pc.printf("pwmmotor %f\n\r", pwm_to_motor_arm2);
JKleinRot 10:52b22bff409a 206
JKleinRot 11:e9b906b5f572 207 if (pwm_to_motor_arm2 == 0) { //Als het verschil tussen de voorgestelde en huidige positie nul is wordt de while loop gestopt (condities kloppen niet meer)
JKleinRot 13:54ee98850a15 208 state = EMG_OFFSET_BICEPS; //State wordt kalibratie arm 2, zo daar naar volgende onderdeel
JKleinRot 13:54ee98850a15 209 pc.printf("KALIBRATIE_ARM2 afgerond\n"); //Tekst voor controle Arm 2 naar thuispositie
JKleinRot 7:dd3cba61b34b 210 }
JKleinRot 7:dd3cba61b34b 211 }
JKleinRot 0:859c89785d3f 212
JKleinRot 13:54ee98850a15 213 void filter_biceps()
JKleinRot 13:54ee98850a15 214 {
JKleinRot 13:54ee98850a15 215 //High pass
JKleinRot 13:54ee98850a15 216 xbhp = xbo; //Input in filter
JKleinRot 13:54ee98850a15 217 ybhp = -A2*ybhp1 - A3*ybhp2 - A4*ybhp3 - A5*ybhp4 + B1*xbhp + B2*xbhp1 + B3*xbhp2 + B4*xbhp3 + B5*xbhp4; //Filterformule in z-domein
JKleinRot 13:54ee98850a15 218
JKleinRot 13:54ee98850a15 219 //Waarden voor de volgende ronde benoemen
JKleinRot 13:54ee98850a15 220 xbhp4 = xbhp3;
JKleinRot 13:54ee98850a15 221 xbhp3 = xbhp2;
JKleinRot 13:54ee98850a15 222 xbhp2 = xbhp1;
JKleinRot 13:54ee98850a15 223 xbhp1 = xbhp;
JKleinRot 13:54ee98850a15 224 xbn = xbhp;
JKleinRot 13:54ee98850a15 225
JKleinRot 13:54ee98850a15 226 ybhp4 = ybhp3;
JKleinRot 13:54ee98850a15 227 ybhp3 = ybhp2;
JKleinRot 13:54ee98850a15 228 ybhp2 = ybhp1;
JKleinRot 13:54ee98850a15 229 ybhp1 = ybhp;
JKleinRot 13:54ee98850a15 230 ybn1 = ybhp; //De vorige waarde in het notchfilter is de waarde uit het high pass filter
JKleinRot 13:54ee98850a15 231
JKleinRot 13:54ee98850a15 232 //Notch
JKleinRot 13:54ee98850a15 233 ybn = -C2*ybn1 - C3*ybn2 + D1*xbn + D2*xbn1 + D3*xbn2; //Filterfunctie in z-domein
JKleinRot 13:54ee98850a15 234
JKleinRot 13:54ee98850a15 235 //Waarden voor de volgende ronde benoemen
JKleinRot 13:54ee98850a15 236 xbn2 = xbn1;
JKleinRot 13:54ee98850a15 237 xbn1 = xbn;
JKleinRot 13:54ee98850a15 238 xblp = xbn;
JKleinRot 13:54ee98850a15 239
JKleinRot 13:54ee98850a15 240 ybn2 = ybn1;
JKleinRot 13:54ee98850a15 241 ybn1 = ybn;
JKleinRot 13:54ee98850a15 242 rb = ybn;
JKleinRot 13:54ee98850a15 243
JKleinRot 13:54ee98850a15 244 //Rectify
JKleinRot 13:54ee98850a15 245 rbr = fabs(rb); //Absolute waarde van de waarde uit notchfilter
JKleinRot 13:54ee98850a15 246
JKleinRot 13:54ee98850a15 247 yblp1 = rbr;
JKleinRot 13:54ee98850a15 248
JKleinRot 13:54ee98850a15 249 //Low pass
JKleinRot 13:54ee98850a15 250 yblp = -E2*yblp1 - E3*yblp2 - E4*yblp3 - E5*yblp4 + F1*xblp + F2*xblp1 + F3*xblp2 + F4*xblp3 + F5*xblp4; //Filterfunctie in z-domein
JKleinRot 13:54ee98850a15 251
JKleinRot 13:54ee98850a15 252 xblp4 = xblp3;
JKleinRot 13:54ee98850a15 253 xblp3 = xblp2;
JKleinRot 13:54ee98850a15 254 xblp2 = xblp1;
JKleinRot 13:54ee98850a15 255 xblp1 = xblp;
JKleinRot 13:54ee98850a15 256 xbf = xblp;
JKleinRot 13:54ee98850a15 257
JKleinRot 13:54ee98850a15 258 yblp4 = yblp3;
JKleinRot 13:54ee98850a15 259 yblp3 = yblp2;
JKleinRot 13:54ee98850a15 260 yblp2 = yblp1;
JKleinRot 13:54ee98850a15 261 yblp1 = yblp;
JKleinRot 13:54ee98850a15 262 ybf = yblp;
JKleinRot 13:54ee98850a15 263 }
JKleinRot 13:54ee98850a15 264
JKleinRot 0:859c89785d3f 265
JKleinRot 10:52b22bff409a 266 int main()
JKleinRot 10:52b22bff409a 267 {
JKleinRot 11:e9b906b5f572 268 while(1) { //Oneindige while loop, anders wordt er na het uitvoeren van de eerste case niets meer gedaan
JKleinRot 10:52b22bff409a 269 //PC baud rate instellen
JKleinRot 10:52b22bff409a 270 pc.baud(38400); //PC baud rate is 38400 bits/seconde
JKleinRot 10:52b22bff409a 271
JKleinRot 10:52b22bff409a 272 switch(state) { //Switch benoemen, zorgt ervoor dat in de goede volgorde de dingen worden doorlopen, aan einde een case wordt de state de naam van de nieuwe case
JKleinRot 10:52b22bff409a 273
JKleinRot 11:e9b906b5f572 274 case RUST: { //Aanzetten
JKleinRot 10:52b22bff409a 275 lcd_r1 = " BMT M9 GR. 4 "; //Tekst op eerste regel van LCD scherm
JKleinRot 10:52b22bff409a 276 lcd_r2 = "Hoi! Ik ben PIPO"; //Tekst op tweede regel van LCD scherm
JKleinRot 10:52b22bff409a 277 wait(2); //Twee seconden wachten
JKleinRot 13:54ee98850a15 278 pc.printf("RUST afgerond\n"); //Tekst voor controle Aanzetten
JKleinRot 10:52b22bff409a 279 state = KALIBRATIE_ARM1; //State wordt kalibratie arm 1, zo door naar volgende onderdeel
JKleinRot 10:52b22bff409a 280 break; //Stopt acties in deze case
JKleinRot 10:52b22bff409a 281 }
JKleinRot 10:52b22bff409a 282
JKleinRot 10:52b22bff409a 283 case KALIBRATIE_ARM1: { //Arm 1 naar thuispositie
JKleinRot 13:54ee98850a15 284 pc.printf("KALIBRATIE_ARM1\n");
JKleinRot 10:52b22bff409a 285 wait(1); //Een seconde wachten
JKleinRot 10:52b22bff409a 286 ticker_regelaar.attach(setregelaar_ticker_flag,SAMPLETIME_REGELAAR); //Ticker iedere zoveel seconde de flag op laten steken
JKleinRot 10:52b22bff409a 287
JKleinRot 10:52b22bff409a 288 while(state == KALIBRATIE_ARM1) {
JKleinRot 10:52b22bff409a 289 while(regelaar_ticker_flag != true) ; //Als geen flag opgestoken, dan niks doen, wel flag, dan uit de while loop en door naar volgende regel
JKleinRot 10:52b22bff409a 290 regelaar_ticker_flag = false; //Flag weer naar beneden, zodat deze straks weer omhoog kan
JKleinRot 10:52b22bff409a 291
JKleinRot 10:52b22bff409a 292 arm1_naar_thuispositie(); //Voer acties uit om arm 1 naar thuispositie te krijgen
JKleinRot 10:52b22bff409a 293 }
JKleinRot 10:52b22bff409a 294 wait(1); //Een seconde wachten
JKleinRot 11:e9b906b5f572 295 break; //Stopt acties in deze case
JKleinRot 10:52b22bff409a 296 }
JKleinRot 10:52b22bff409a 297
JKleinRot 11:e9b906b5f572 298 case KALIBRATIE_ARM2: { //Arm 2 naar thuispositie
JKleinRot 13:54ee98850a15 299 pc.printf("KALIBRATIE_ARM1\n");
JKleinRot 10:52b22bff409a 300 wait(1); //Een seconde wachten
JKleinRot 10:52b22bff409a 301
JKleinRot 10:52b22bff409a 302 //ticker_regelaar.attach(setregelaar_ticker_flag,SAMPLETIME_REGELAAR); //Ticker iedere zoveel seconde de flag op laten steken
JKleinRot 10:52b22bff409a 303
JKleinRot 10:52b22bff409a 304 while(state == KALIBRATIE_ARM2) {
JKleinRot 10:52b22bff409a 305 while(regelaar_ticker_flag != true) ; //Als geen flag opgestoken, dan niks doen, wel flag, dan uit de while loop en door naar volgende regel
JKleinRot 10:52b22bff409a 306 regelaar_ticker_flag = false; //Flag weer naar beneden, zodat deze straks weer omhoog kan
JKleinRot 10:52b22bff409a 307
JKleinRot 10:52b22bff409a 308 arm2_naar_thuispositie(); //Voer acties uit om arm 2 naar thuispositie te krijgen
JKleinRot 10:52b22bff409a 309 }
JKleinRot 11:e9b906b5f572 310 wait(1); //Een seconde wachten
JKleinRot 11:e9b906b5f572 311 ticker_regelaar.detach(); //Ticker detachten, ticker doet nu niks meer
JKleinRot 10:52b22bff409a 312 break; //Stopt acties in deze case
JKleinRot 10:52b22bff409a 313 }
JKleinRot 10:52b22bff409a 314
JKleinRot 13:54ee98850a15 315 case EMG_OFFSET_BICEPS: { //Kalibratie EMG signaal biceps
JKleinRot 13:54ee98850a15 316 pc.printf("EMG_OFFSET_BICEPS\n");
JKleinRot 10:52b22bff409a 317 wait(1); //Een seconde wachten
JKleinRot 10:52b22bff409a 318
JKleinRot 10:52b22bff409a 319 ticker_EMG.attach(setregelaar_EMG_flag,SAMPLETIME_EMG); //Ticker iedere zoveel seconden de flag laten opsteken
JKleinRot 10:52b22bff409a 320
JKleinRot 13:54ee98850a15 321 pc.printf("Ticker voor kalibratie compleet\n"); //Tekst voor controle Ticker voor kalibratie
JKleinRot 10:52b22bff409a 322
JKleinRot 10:52b22bff409a 323 //5 seconden EMG biceps meten
JKleinRot 10:52b22bff409a 324
JKleinRot 10:52b22bff409a 325 wait(1); //Een seconde wachten
JKleinRot 10:52b22bff409a 326 lcd_r1 = " EMG kalibratie "; //Tekst op eerste regel van LCD scherm
JKleinRot 10:52b22bff409a 327 lcd_r2 = " Span biceps aan"; //Tekst op tweede regel van LCD scherm
JKleinRot 10:52b22bff409a 328
JKleinRot 13:54ee98850a15 329 while(state == EMG_OFFSET_BICEPS){
JKleinRot 10:52b22bff409a 330 while(regelaar_EMG_flag != true) ; //Als geen flag opgestoken, dan niks doen, wel flag, dan uit de while loop en door naar volgende regel
JKleinRot 10:52b22bff409a 331 regelaar_EMG_flag = false; //Flag weer naar beneden, zodat deze straks weer omhoog kan
JKleinRot 13:54ee98850a15 332
JKleinRot 13:54ee98850a15 333 pc.printf("Ga EMG meten\n");
JKleinRot 10:52b22bff409a 334
JKleinRot 10:52b22bff409a 335 xbk = EMG_bi.read(); //EMG signaal uitlezen
JKleinRot 13:54ee98850a15 336 xbk10 = xbk9;
JKleinRot 13:54ee98850a15 337 xbk9 = xbk8;
JKleinRot 13:54ee98850a15 338 xbk8 = xbk7;
JKleinRot 13:54ee98850a15 339 xbk7 = xbk6;
JKleinRot 13:54ee98850a15 340 xbk6 = xbk5;
JKleinRot 13:54ee98850a15 341 xbk5 = xbk4;
JKleinRot 13:54ee98850a15 342 xbk4 = xbk3;
JKleinRot 13:54ee98850a15 343 xbk3 = xbk2;
JKleinRot 13:54ee98850a15 344 xbk2 = xbk1;
JKleinRot 13:54ee98850a15 345 xbk1 = xbk;
JKleinRot 13:54ee98850a15 346 pc.printf("xbk10 is %f\n", xbk10);
JKleinRot 13:54ee98850a15 347
JKleinRot 13:54ee98850a15 348 if(xbk10 > 0){
JKleinRot 13:54ee98850a15 349 pc.printf("10 waarden gemeten\n");
JKleinRot 13:54ee98850a15 350 state = EMG_BICEPS;
JKleinRot 13:54ee98850a15 351 }
JKleinRot 10:52b22bff409a 352 }
JKleinRot 10:52b22bff409a 353 break;
JKleinRot 13:54ee98850a15 354 }
JKleinRot 13:54ee98850a15 355
JKleinRot 13:54ee98850a15 356 case EMG_BICEPS:
JKleinRot 13:54ee98850a15 357 {
JKleinRot 13:54ee98850a15 358 pc.printf("EMG_BICEPS\n");
JKleinRot 13:54ee98850a15 359 meanxbk = (xbk1 + xbk2 + xbk3 + xbk4 + xbk5 + xbk6 + xbk7 + xbk8 + xbk9 + xbk10)/10; //Offset bepalen van de eerste 10 gemeten waarden
JKleinRot 13:54ee98850a15 360
JKleinRot 13:54ee98850a15 361 while(regelaar_EMG_flag != true) ; //Als geen flag opgestoken, dan niks doen, wel flag, dan uit de while loop en door naar volgende regel
JKleinRot 13:54ee98850a15 362 regelaar_EMG_flag = false; //Flag weer naar beneden, zodat deze straks weer omhoog kan
JKleinRot 13:54ee98850a15 363
JKleinRot 13:54ee98850a15 364 xb = EMG_bi.read(); //EMG meten van biceps
JKleinRot 13:54ee98850a15 365 xbo = xb - meanxbk; //Gemeten waarden zonder offset
JKleinRot 13:54ee98850a15 366
JKleinRot 13:54ee98850a15 367 filter_biceps();
JKleinRot 10:52b22bff409a 368
JKleinRot 10:52b22bff409a 369 }
JKleinRot 13:54ee98850a15 370
JKleinRot 11:e9b906b5f572 371 default: { //Default state, mocht er iets misgaan en het programma kan niet naar een volgende case
JKleinRot 11:e9b906b5f572 372 state = RUST; //Als dat gebeurt wordt de state rust en begint hij weer vooraan
JKleinRot 10:52b22bff409a 373 }
JKleinRot 9:454e7da8ab65 374 }
JKleinRot 10:52b22bff409a 375 pc.printf("state: %u\n",state);
JKleinRot 3:adc3052039e7 376 }
JKleinRot 0:859c89785d3f 377 }