Werkt nu met lagere Fs, nog wel thresholds aanpassen en outputs controleren.
Fork of EMG2spier by
main.cpp@5:6fd237516c27, 2013-10-30 (annotated)
- Committer:
- DanAuhust
- Date:
- Wed Oct 30 15:05:06 2013 +0000
- Revision:
- 5:6fd237516c27
- Parent:
- 4:41222da4a577
asddf
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
DanAuhust | 0:3a1196d78030 | 1 | #include "mbed.h" |
DanAuhust | 0:3a1196d78030 | 2 | #include "MODSERIAL.h" |
DanAuhust | 2:5c6873981eac | 3 | // test // |
DanAuhust | 0:3a1196d78030 | 4 | //Define objects |
DanAuhust | 0:3a1196d78030 | 5 | AnalogIn emg_biceps(PTB0); //Analog input |
DanAuhust | 0:3a1196d78030 | 6 | AnalogIn emg_triceps(PTB1); |
jorick92 | 3:b299102c7d19 | 7 | AnalogIn emg_flexoren(PTB2); |
jorick92 | 3:b299102c7d19 | 8 | AnalogIn emg_extensoren(PTB3); |
DanAuhust | 0:3a1196d78030 | 9 | PwmOut red(LED_RED); // sig_out biceps |
DanAuhust | 0:3a1196d78030 | 10 | PwmOut blue(LED_BLUE); // sig_out triceps |
DanAuhust | 0:3a1196d78030 | 11 | // PwmOut green(LED_GREEN); |
DanAuhust | 0:3a1196d78030 | 12 | |
DanAuhust | 0:3a1196d78030 | 13 | Ticker timer; |
DanAuhust | 0:3a1196d78030 | 14 | MODSERIAL pc(USBTX,USBRX,64,1024); |
DanAuhust | 0:3a1196d78030 | 15 | |
DanAuhust | 0:3a1196d78030 | 16 | #define MAXCOUNT 40 |
DanAuhust | 0:3a1196d78030 | 17 | #define inertia 4 |
DanAuhust | 0:3a1196d78030 | 18 | |
DanAuhust | 0:3a1196d78030 | 19 | #define gain_biceps 1 |
DanAuhust | 5:6fd237516c27 | 20 | #define threshold_biceps 0.06 |
DanAuhust | 0:3a1196d78030 | 21 | #define border_biceps 0.1125 //25% van .57 - .12 |
DanAuhust | 5:6fd237516c27 | 22 | #define cap_biceps 2 |
DanAuhust | 0:3a1196d78030 | 23 | |
DanAuhust | 0:3a1196d78030 | 24 | #define gain_triceps 1 |
DanAuhust | 5:6fd237516c27 | 25 | #define threshold_triceps 0.06 |
DanAuhust | 0:3a1196d78030 | 26 | #define border_triceps 0.1237 //25% van .605 - .11 = .12375 |
DanAuhust | 5:6fd237516c27 | 27 | #define cap_triceps 2 |
DanAuhust | 5:6fd237516c27 | 28 | // constanten butterworth in aantekeningen EMG op dropbox |
DanAuhust | 0:3a1196d78030 | 29 | #define NUM0 0.8841 // constante |
DanAuhust | 0:3a1196d78030 | 30 | #define NUM1 -3.53647 // z^-1 |
DanAuhust | 0:3a1196d78030 | 31 | #define NUM2 5.3046 // z^-2etc. |
DanAuhust | 0:3a1196d78030 | 32 | #define NUM3 -3.5364 |
DanAuhust | 0:3a1196d78030 | 33 | #define NUM4 0.8841 |
DanAuhust | 0:3a1196d78030 | 34 | |
DanAuhust | 0:3a1196d78030 | 35 | #define DEN0 1 // constante |
DanAuhust | 0:3a1196d78030 | 36 | #define DEN1 -3.7538 |
DanAuhust | 0:3a1196d78030 | 37 | #define DEN2 5.2912 |
DanAuhust | 0:3a1196d78030 | 38 | #define DEN3 -3.3189 |
DanAuhust | 0:3a1196d78030 | 39 | #define DEN4 0.7816 |
DanAuhust | 0:3a1196d78030 | 40 | |
DanAuhust | 0:3a1196d78030 | 41 | //filter functie definieren. filter(signal_number) |
DanAuhust | 0:3a1196d78030 | 42 | //signal_number=1 --> biceps filteren |
DanAuhust | 0:3a1196d78030 | 43 | //signal_number=2 --> triceps filteren |
DanAuhust | 0:3a1196d78030 | 44 | //signal_number=3 --> flexoren filteren |
DanAuhust | 0:3a1196d78030 | 45 | //signal_number=4 --> extensoren filteren |
DanAuhust | 0:3a1196d78030 | 46 | |
DanAuhust | 5:6fd237516c27 | 47 | float filter(int signal_number) |
DanAuhust | 5:6fd237516c27 | 48 | { |
DanAuhust | 0:3a1196d78030 | 49 | //static variables keep their values between function calls |
DanAuhust | 0:3a1196d78030 | 50 | //the assignents are only executed the first iteration. |
DanAuhust | 0:3a1196d78030 | 51 | |
DanAuhust | 0:3a1196d78030 | 52 | //variabelen biceps definieren |
DanAuhust | 1:fb33955ca402 | 53 | float in0_biceps =0; |
DanAuhust | 1:fb33955ca402 | 54 | static float in1_biceps =0, in2_biceps = 0, in3_biceps = 0, in4_biceps = 0; |
DanAuhust | 0:3a1196d78030 | 55 | static float out0_biceps = 0, out1_biceps = 0 , out2_biceps = 0, out3_biceps = 0, out4_biceps = 0; |
DanAuhust | 0:3a1196d78030 | 56 | |
DanAuhust | 0:3a1196d78030 | 57 | // variabelen triceps definieren |
DanAuhust | 0:3a1196d78030 | 58 | static float in0_triceps = 0, in1_triceps = 0, in2_triceps = 0, in3_triceps = 0, in4_triceps = 0; |
DanAuhust | 0:3a1196d78030 | 59 | static float out0_triceps = 0, out1_triceps = 0, out2_triceps = 0, out3_triceps = 0, out4_triceps = 0; |
DanAuhust | 0:3a1196d78030 | 60 | |
DanAuhust | 0:3a1196d78030 | 61 | //variabelen flexoren definieren |
DanAuhust | 0:3a1196d78030 | 62 | static float in0_flexoren = 0, in1_flexoren = 0, in2_flexoren = 0, in3_flexoren = 0, in4_flexoren = 0; |
DanAuhust | 0:3a1196d78030 | 63 | static float out0_flexoren = 0, out1_flexoren = 0, out2_flexoren = 0, out3_flexoren = 0, out4_flexoren = 0; |
DanAuhust | 0:3a1196d78030 | 64 | |
DanAuhust | 0:3a1196d78030 | 65 | //variablen extensoren definieren |
DanAuhust | 0:3a1196d78030 | 66 | static float in0_extensoren = 0, in1_extensoren = 0, in2_extensoren = 0, in3_extensoren = 0, in4_extensoren = 0; |
DanAuhust | 0:3a1196d78030 | 67 | static float out0_extensoren = 0, out1_extensoren = 0, out2_extensoren = 0, out3_extensoren = 0, out4_extensoren = 0; |
DanAuhust | 0:3a1196d78030 | 68 | |
DanAuhust | 0:3a1196d78030 | 69 | //overige variabelen definieren |
DanAuhust | 0:3a1196d78030 | 70 | // verwijder static waar mogelijk, maakt programma iets sneller |
DanAuhust | 0:3a1196d78030 | 71 | static float count_biceps = 0, count_triceps = 0, count_extensoren = 0, count_flexoren = 0; |
DanAuhust | 0:3a1196d78030 | 72 | static float square_biceps = 0, square_triceps = 0, square_flexoren = 0, square_extensoren = 0; |
DanAuhust | 0:3a1196d78030 | 73 | static float sum_biceps = 0, sum_triceps = 0, sum_flexoren = 0, sum_extensoren = 0; |
DanAuhust | 0:3a1196d78030 | 74 | static float mean_biceps = 0.1, mean_triceps = 0.1, mean_flexoren = 0.1, mean_extensoren = 0.1; |
DanAuhust | 5:6fd237516c27 | 75 | //static float emg_biceps, emg_triceps, emg_flexoren, emg_extensoren; // output ruwe EMG |
DanAuhust | 0:3a1196d78030 | 76 | static float sig_in_biceps, sig_in_triceps, sig_in_extensoren, sig_in_flexoren; // naam gewijzigd, output StDev |
DanAuhust | 0:3a1196d78030 | 77 | static float sig_out_biceps, sig_out_triceps, sig_out_extensoren, sig_out_flexoren; |
DanAuhust | 5:6fd237516c27 | 78 | float sig_out, deltaV; |
DanAuhust | 1:fb33955ca402 | 79 | static float sig_prev_biceps = 0, sig_prev_triceps = 0, sig_prev_extensoren = 0, sig_prev_flexoren = 0; |
DanAuhust | 1:fb33955ca402 | 80 | static int stat0_biceps, stat0_triceps, stat0_extensoren, stat0_flexoren; |
DanAuhust | 1:fb33955ca402 | 81 | static int stat1_biceps = 0, stat1_triceps = 0, stat1_extensoren = 0, stat1_flexoren = 0; |
DanAuhust | 0:3a1196d78030 | 82 | |
DanAuhust | 5:6fd237516c27 | 83 | switch (signal_number) |
DanAuhust | 5:6fd237516c27 | 84 | { |
DanAuhust | 0:3a1196d78030 | 85 | case 1: |
DanAuhust | 0:3a1196d78030 | 86 | //biceps filteren |
DanAuhust | 0:3a1196d78030 | 87 | in4_biceps = in3_biceps; in3_biceps = in2_biceps; in2_biceps = in1_biceps; in1_biceps = in0_biceps; |
DanAuhust | 0:3a1196d78030 | 88 | in0_biceps = emg_biceps.read(); |
DanAuhust | 1:fb33955ca402 | 89 | out4_biceps = out3_biceps; out3_biceps = out2_biceps; out2_biceps = out1_biceps; out1_biceps = out0_biceps; |
DanAuhust | 0:3a1196d78030 | 90 | out0_biceps = (NUM0*in0_biceps + NUM1*in1_biceps + NUM2*in2_biceps + NUM3*in3_biceps + NUM4*in4_biceps - DEN1*out1_biceps - DEN2*out2_biceps - DEN3*out3_biceps - DEN4*out4_biceps ) / DEN0; |
DanAuhust | 0:3a1196d78030 | 91 | |
DanAuhust | 0:3a1196d78030 | 92 | //std deviatie bepalen, om de N metingen |
DanAuhust | 0:3a1196d78030 | 93 | sum_biceps += out0_biceps; |
DanAuhust | 5:6fd237516c27 | 94 | square_biceps += (out0_biceps - mean_biceps)*(out0_biceps - mean_biceps); //neem absolute waarde, kwadrateer, voeg toe aan vorige square |
DanAuhust | 0:3a1196d78030 | 95 | // voeg rest EMG's toe, variabelen alleen _spier geven als het nodig is. |
DanAuhust | 0:3a1196d78030 | 96 | count_biceps += 1; // hou bij hoeveel squares er zijn opgeteld |
DanAuhust | 0:3a1196d78030 | 97 | if (count_biceps >= MAXCOUNT) |
DanAuhust | 0:3a1196d78030 | 98 | { sig_in_biceps = sqrt(square_biceps/count_biceps); |
DanAuhust | 0:3a1196d78030 | 99 | mean_biceps = sum_biceps/count_biceps; |
DanAuhust | 0:3a1196d78030 | 100 | count_biceps = 0; square_biceps = 0; sum_biceps = 0; // en neem de RMS als er genoeg zijn geteld, stuur die door, en reset sqaure en count |
DanAuhust | 5:6fd237516c27 | 101 | |
DanAuhust | 1:fb33955ca402 | 102 | deltaV = sig_in_biceps - sig_prev_biceps; |
DanAuhust | 0:3a1196d78030 | 103 | if (sig_in_biceps <= threshold_biceps) // threshold |
DanAuhust | 0:3a1196d78030 | 104 | { stat0_biceps = 0; |
DanAuhust | 0:3a1196d78030 | 105 | if (stat1_biceps == 1) |
DanAuhust | 0:3a1196d78030 | 106 | sig_out_biceps = sig_prev_biceps + deltaV / inertia; |
DanAuhust | 0:3a1196d78030 | 107 | else sig_out_biceps = 0; |
DanAuhust | 0:3a1196d78030 | 108 | } |
DanAuhust | 5:6fd237516c27 | 109 | else if (sig_in_biceps >= cap_biceps) // cap |
DanAuhust | 5:6fd237516c27 | 110 | { stat0_biceps = 0; |
DanAuhust | 5:6fd237516c27 | 111 | sig_out_biceps = cap_biceps; |
DanAuhust | 5:6fd237516c27 | 112 | } |
DanAuhust | 0:3a1196d78030 | 113 | else if ( deltaV >= border_biceps ) // stijging |
DanAuhust | 0:3a1196d78030 | 114 | { stat0_biceps = 1; |
DanAuhust | 0:3a1196d78030 | 115 | if (stat1_biceps == -1) |
DanAuhust | 0:3a1196d78030 | 116 | sig_out_biceps = sig_prev_biceps + deltaV / inertia; |
DanAuhust | 0:3a1196d78030 | 117 | else sig_out_biceps = sig_in_biceps; |
DanAuhust | 0:3a1196d78030 | 118 | } |
DanAuhust | 0:3a1196d78030 | 119 | else if ( deltaV <= -border_biceps ) // daling |
DanAuhust | 0:3a1196d78030 | 120 | { stat0_biceps = -1; |
DanAuhust | 0:3a1196d78030 | 121 | if (stat1_biceps == 1) |
DanAuhust | 0:3a1196d78030 | 122 | sig_out_biceps = sig_prev_biceps + deltaV / inertia; |
DanAuhust | 0:3a1196d78030 | 123 | else sig_out_biceps = sig_in_biceps; |
DanAuhust | 0:3a1196d78030 | 124 | } |
DanAuhust | 0:3a1196d78030 | 125 | else { stat0_biceps = 0; |
DanAuhust | 0:3a1196d78030 | 126 | sig_out_biceps = sig_in_biceps; |
DanAuhust | 0:3a1196d78030 | 127 | } |
DanAuhust | 5:6fd237516c27 | 128 | sig_prev_biceps = sig_out_biceps; |
DanAuhust | 0:3a1196d78030 | 129 | stat1_biceps = stat0_biceps; |
DanAuhust | 0:3a1196d78030 | 130 | sig_out = sig_out_biceps; |
DanAuhust | 0:3a1196d78030 | 131 | } |
DanAuhust | 0:3a1196d78030 | 132 | else sig_out = -1; |
DanAuhust | 0:3a1196d78030 | 133 | break; |
DanAuhust | 0:3a1196d78030 | 134 | case 2: |
DanAuhust | 0:3a1196d78030 | 135 | //triceps filteren |
DanAuhust | 0:3a1196d78030 | 136 | in4_triceps = in3_triceps; in3_triceps = in2_triceps; in2_triceps = in1_triceps; in1_triceps = in0_triceps; |
DanAuhust | 0:3a1196d78030 | 137 | in0_triceps = emg_triceps.read(); |
DanAuhust | 0:3a1196d78030 | 138 | out4_triceps = out3_triceps; out3_triceps = out2_triceps; out2_triceps = out1_triceps; out1_triceps = out0_triceps; |
DanAuhust | 5:6fd237516c27 | 139 | out0_triceps = (NUM0*in0_triceps + NUM1*in1_triceps + NUM2*in2_triceps + NUM3*in3_triceps + NUM4*in4_triceps - DEN1*out1_triceps - DEN2*out2_triceps - DEN3*out3_triceps - DEN4*out4_triceps ) / DEN0; |
DanAuhust | 0:3a1196d78030 | 140 | //std deviatie bepalen om de N metingen |
DanAuhust | 0:3a1196d78030 | 141 | sum_triceps += out0_triceps; |
DanAuhust | 5:6fd237516c27 | 142 | square_triceps += (out0_triceps - mean_triceps)*(out0_triceps - mean_triceps); //neem absolute waarde, kwadrateer, voeg toe aan vorige square |
DanAuhust | 0:3a1196d78030 | 143 | // voeg rest EMG's toe, variabelen alleen _spier geven als het nodig is. |
DanAuhust | 0:3a1196d78030 | 144 | count_triceps += 1; // hou bij hoeveel squares er zijn opgeteld |
DanAuhust | 0:3a1196d78030 | 145 | if (count_triceps >= MAXCOUNT) |
DanAuhust | 0:3a1196d78030 | 146 | { sig_in_triceps = sqrt(square_triceps/count_triceps); |
DanAuhust | 0:3a1196d78030 | 147 | mean_triceps = sum_triceps/count_triceps; |
DanAuhust | 0:3a1196d78030 | 148 | count_triceps = 0; square_triceps = 0; sum_triceps = 0;// en neem de RMS als er genoeg zijn geteld, stuur die door, en reset sqaure en count |
DanAuhust | 1:fb33955ca402 | 149 | deltaV = sig_in_triceps - sig_prev_triceps; |
DanAuhust | 5:6fd237516c27 | 150 | if(pc.txBufferGetSize(0)-pc.txBufferGetCount() > 30) // in sommige versies staat rx, dit klopt niet |
DanAuhust | 5:6fd237516c27 | 151 | pc.printf("%.6f\n",sig_in_triceps); |
DanAuhust | 0:3a1196d78030 | 152 | if (sig_in_triceps <= threshold_triceps) // threshold |
DanAuhust | 0:3a1196d78030 | 153 | { stat0_triceps = 0; |
DanAuhust | 0:3a1196d78030 | 154 | if (stat1_triceps == 1) |
DanAuhust | 0:3a1196d78030 | 155 | sig_out_triceps = sig_prev_triceps + deltaV / inertia; |
DanAuhust | 0:3a1196d78030 | 156 | else sig_out_triceps = 0; |
DanAuhust | 0:3a1196d78030 | 157 | } |
DanAuhust | 5:6fd237516c27 | 158 | else if (sig_in_triceps >= cap_triceps) // cap |
DanAuhust | 5:6fd237516c27 | 159 | { stat0_triceps = 0; |
DanAuhust | 5:6fd237516c27 | 160 | sig_out_triceps = cap_triceps; |
DanAuhust | 5:6fd237516c27 | 161 | } |
DanAuhust | 0:3a1196d78030 | 162 | else if ( deltaV >= border_triceps ) // stijging |
DanAuhust | 0:3a1196d78030 | 163 | { stat0_triceps = 1; |
DanAuhust | 0:3a1196d78030 | 164 | if (stat1_triceps == -1) |
DanAuhust | 5:6fd237516c27 | 165 | sig_out_triceps = sig_prev_triceps + deltaV / inertia; |
DanAuhust | 0:3a1196d78030 | 166 | else sig_out_triceps = sig_in_triceps; |
DanAuhust | 0:3a1196d78030 | 167 | } |
DanAuhust | 0:3a1196d78030 | 168 | else if ( deltaV <= -border_triceps ) // daling |
DanAuhust | 0:3a1196d78030 | 169 | { stat0_triceps = -1; |
DanAuhust | 0:3a1196d78030 | 170 | if (stat1_triceps == 1) |
DanAuhust | 0:3a1196d78030 | 171 | sig_out_triceps = sig_prev_triceps + deltaV / inertia; |
DanAuhust | 0:3a1196d78030 | 172 | else sig_out_triceps = sig_in_triceps; |
DanAuhust | 0:3a1196d78030 | 173 | } |
DanAuhust | 0:3a1196d78030 | 174 | else { stat0_triceps = 0; |
DanAuhust | 0:3a1196d78030 | 175 | sig_out_triceps = sig_in_triceps; |
DanAuhust | 0:3a1196d78030 | 176 | } |
DanAuhust | 5:6fd237516c27 | 177 | sig_prev_triceps = sig_out_triceps; |
DanAuhust | 0:3a1196d78030 | 178 | stat1_triceps = stat0_triceps; |
DanAuhust | 0:3a1196d78030 | 179 | sig_out = sig_out_triceps; |
DanAuhust | 0:3a1196d78030 | 180 | } |
DanAuhust | 0:3a1196d78030 | 181 | else sig_out = -1; |
DanAuhust | 0:3a1196d78030 | 182 | break; |
DanAuhust | 0:3a1196d78030 | 183 | case 3: |
DanAuhust | 0:3a1196d78030 | 184 | //flexoren filteren |
DanAuhust | 0:3a1196d78030 | 185 | in4_flexoren = in3_flexoren; in3_flexoren = in2_flexoren; in2_flexoren = in1_flexoren; in1_flexoren = in0_flexoren; |
DanAuhust | 0:3a1196d78030 | 186 | in0_flexoren = emg_flexoren.read(); |
DanAuhust | 0:3a1196d78030 | 187 | out4_flexoren = out3_flexoren; out3_flexoren = out2_flexoren; out2_flexoren = out1_flexoren; out1_flexoren = out0_flexoren; |
DanAuhust | 0:3a1196d78030 | 188 | out0_flexoren = (NUM0*in0_flexoren + NUM1*in1_flexoren + NUM2*in2_flexoren + NUM3*in3_flexoren + NUM4*in4_flexoren - DEN1*out1_flexoren - DEN2*out2_flexoren - DEN3*out3_flexoren - DEN4*out4_flexoren) / DEN0; |
DanAuhust | 0:3a1196d78030 | 189 | |
DanAuhust | 0:3a1196d78030 | 190 | //std deviatie bepalen om de N metingen |
DanAuhust | 0:3a1196d78030 | 191 | sum_flexoren += out0_flexoren; |
DanAuhust | 5:6fd237516c27 | 192 | square_flexoren += (out0_flexoren - mean_flexoren)*(out0_flexoren - mean_flexoren); //neem absolute waarde, kwadrateer, voeg toe aan vorige square |
DanAuhust | 0:3a1196d78030 | 193 | // voeg rest EMG's toe, variabelen alleen _spier geven als het nodig is. |
DanAuhust | 0:3a1196d78030 | 194 | count_flexoren += 1; // hou bij hoeveel squares er zijn opgeteld |
DanAuhust | 0:3a1196d78030 | 195 | if (count_flexoren >= MAXCOUNT) |
DanAuhust | 0:3a1196d78030 | 196 | { sig_in_flexoren = sqrt(square_flexoren/count_flexoren); |
DanAuhust | 0:3a1196d78030 | 197 | mean_flexoren = sum_flexoren/count_flexoren; |
DanAuhust | 0:3a1196d78030 | 198 | count_flexoren = 0; square_flexoren = 0; sum_flexoren = 0; // en neem de RMS als er genoeg zijn geteld, stuur die door, en reset sqaure en count |
DanAuhust | 0:3a1196d78030 | 199 | |
DanAuhust | 0:3a1196d78030 | 200 | sig_out = sig_out_flexoren; |
DanAuhust | 0:3a1196d78030 | 201 | } |
DanAuhust | 0:3a1196d78030 | 202 | else sig_out = -1; |
DanAuhust | 0:3a1196d78030 | 203 | break; |
DanAuhust | 0:3a1196d78030 | 204 | case 4: |
DanAuhust | 0:3a1196d78030 | 205 | //extensoren filteren |
DanAuhust | 0:3a1196d78030 | 206 | in4_extensoren = in3_extensoren; in3_extensoren = in2_extensoren; in2_extensoren = in1_extensoren; in1_extensoren = in0_extensoren; |
DanAuhust | 0:3a1196d78030 | 207 | in0_extensoren = emg_extensoren.read(); |
DanAuhust | 0:3a1196d78030 | 208 | out4_extensoren = out3_extensoren; out3_extensoren = out2_extensoren; out2_extensoren = out1_extensoren; out1_extensoren = out0_extensoren; |
DanAuhust | 0:3a1196d78030 | 209 | out0_extensoren = (NUM0*in0_extensoren + NUM1*in1_extensoren + NUM2*in2_extensoren + NUM3*in3_extensoren + NUM4*in4_extensoren - DEN1*out1_extensoren - DEN2*out2_extensoren - DEN3*out3_extensoren - DEN4*out4_extensoren) / DEN0; |
DanAuhust | 0:3a1196d78030 | 210 | |
DanAuhust | 0:3a1196d78030 | 211 | //std deviatie bepalen om de 50 metingen |
DanAuhust | 0:3a1196d78030 | 212 | sum_extensoren += out0_extensoren; |
DanAuhust | 5:6fd237516c27 | 213 | square_extensoren += (out0_extensoren - mean_extensoren)*(out0_extensoren - mean_extensoren); //neem absolute waarde, kwadrateer, voeg toe aan vorige square |
DanAuhust | 0:3a1196d78030 | 214 | // voeg rest EMG's toe, variabelen alleen _spier geven als het nodig is. |
DanAuhust | 0:3a1196d78030 | 215 | count_extensoren += 1; // hou bij hoeveel squares er zijn opgeteld |
DanAuhust | 0:3a1196d78030 | 216 | if (count_extensoren >= MAXCOUNT) |
DanAuhust | 0:3a1196d78030 | 217 | { sig_in_extensoren = sqrt(square_extensoren/count_extensoren); |
DanAuhust | 0:3a1196d78030 | 218 | mean_extensoren = sum_extensoren/count_extensoren; |
DanAuhust | 0:3a1196d78030 | 219 | count_extensoren = 0; square_extensoren = 0; sum_extensoren = 0; // en neem de RMS als er genoeg zijn geteld, stuur die door, en reset sqaure en count |
DanAuhust | 0:3a1196d78030 | 220 | |
DanAuhust | 0:3a1196d78030 | 221 | sig_out=sig_out_extensoren; |
DanAuhust | 0:3a1196d78030 | 222 | } |
DanAuhust | 0:3a1196d78030 | 223 | else sig_out = -1; |
DanAuhust | 0:3a1196d78030 | 224 | break; |
DanAuhust | 0:3a1196d78030 | 225 | } |
DanAuhust | 0:3a1196d78030 | 226 | |
DanAuhust | 0:3a1196d78030 | 227 | return sig_out; |
DanAuhust | 0:3a1196d78030 | 228 | |
DanAuhust | 0:3a1196d78030 | 229 | } |
DanAuhust | 0:3a1196d78030 | 230 | |
DanAuhust | 0:3a1196d78030 | 231 | void looper() |
DanAuhust | 0:3a1196d78030 | 232 | { |
jorick92 | 3:b299102c7d19 | 233 | static float biceps, triceps, extensoren, flexoren, emg_filter_test, dy, dx; |
DanAuhust | 0:3a1196d78030 | 234 | |
DanAuhust | 0:3a1196d78030 | 235 | emg_filter_test = filter(1); |
DanAuhust | 5:6fd237516c27 | 236 | if (emg_filter_test != -1) |
DanAuhust | 5:6fd237516c27 | 237 | {biceps = emg_filter_test; |
DanAuhust | 5:6fd237516c27 | 238 | } |
DanAuhust | 0:3a1196d78030 | 239 | emg_filter_test = filter(2); |
DanAuhust | 5:6fd237516c27 | 240 | if (emg_filter_test != -1) |
DanAuhust | 5:6fd237516c27 | 241 | {triceps = emg_filter_test; |
DanAuhust | 5:6fd237516c27 | 242 | } |
DanAuhust | 5:6fd237516c27 | 243 | |
DanAuhust | 5:6fd237516c27 | 244 | dx = biceps - triceps; |
DanAuhust | 5:6fd237516c27 | 245 | |
DanAuhust | 5:6fd237516c27 | 246 | if (biceps > triceps) |
DanAuhust | 5:6fd237516c27 | 247 | {//dx = biceps; |
DanAuhust | 5:6fd237516c27 | 248 | red = biceps; blue = 0; |
DanAuhust | 5:6fd237516c27 | 249 | } |
DanAuhust | 5:6fd237516c27 | 250 | else if (biceps < triceps) |
DanAuhust | 5:6fd237516c27 | 251 | {//dx = -triceps; |
DanAuhust | 5:6fd237516c27 | 252 | blue = gain_triceps*triceps; red = 0; |
DanAuhust | 5:6fd237516c27 | 253 | } |
DanAuhust | 5:6fd237516c27 | 254 | else { |
DanAuhust | 5:6fd237516c27 | 255 | dx = 0; red = 0; blue = 0; |
DanAuhust | 5:6fd237516c27 | 256 | } |
DanAuhust | 5:6fd237516c27 | 257 | /*if(pc.txBufferGetSize(0)-pc.txBufferGetCount() > 30) // in sommige versies staat rx, dit klopt niet |
DanAuhust | 5:6fd237516c27 | 258 | pc.printf("%.6f\n",biceps); */ |
DanAuhust | 5:6fd237516c27 | 259 | |
DanAuhust | 0:3a1196d78030 | 260 | /*emg_filter_test = filter(3); |
DanAuhust | 0:3a1196d78030 | 261 | if (emg_filter_test != -1) flexoren = emg_filter_test; |
DanAuhust | 0:3a1196d78030 | 262 | emg_filter_test = filter(4); |
DanAuhust | 0:3a1196d78030 | 263 | if (emg_filter_test != -1) extensoren = emg_filter_test; |
DanAuhust | 0:3a1196d78030 | 264 | */ |
DanAuhust | 0:3a1196d78030 | 265 | } |
DanAuhust | 0:3a1196d78030 | 266 | |
DanAuhust | 0:3a1196d78030 | 267 | int main() |
DanAuhust | 0:3a1196d78030 | 268 | { |
DanAuhust | 0:3a1196d78030 | 269 | /*setup baudrate. Choose the same in your program on PC side*/ |
DanAuhust | 0:3a1196d78030 | 270 | pc.baud(115200); |
DanAuhust | 0:3a1196d78030 | 271 | /*set the period for the PWM to the red LED*/ |
DanAuhust | 5:6fd237516c27 | 272 | red.period_ms(MAXCOUNT*2); // periode pwm = 2*Fs , blijkbaar. |
DanAuhust | 5:6fd237516c27 | 273 | blue.period_ms(MAXCOUNT*2); |
DanAuhust | 0:3a1196d78030 | 274 | |
DanAuhust | 0:3a1196d78030 | 275 | |
DanAuhust | 0:3a1196d78030 | 276 | /**Here you attach the 'void looper(void)' function to the Ticker object0 |
DanAuhust | 0:3a1196d78030 | 277 | * The looper() function will be called every 0.001 seconds. |
DanAuhust | 0:3a1196d78030 | 278 | * Please mind that the parentheses after looper are omitted when using attach. |
DanAuhust | 0:3a1196d78030 | 279 | */ |
DanAuhust | 5:6fd237516c27 | 280 | timer.attach(looper, 0.001); // programma zou sneller lopen als niet alle 4 de vensters tegelijk aflopen. Hiervoor moeten meer timers gebruikt worden. |
DanAuhust | 0:3a1196d78030 | 281 | while(1) // Loop |
DanAuhust | 0:3a1196d78030 | 282 | { |
DanAuhust | 1:fb33955ca402 | 283 | // zie 'encoder' , timer bepaalt wanneer een if in de while-loop berekeningen doet voor de motor. |
DanAuhust | 5:6fd237516c27 | 284 | // loop is leeg voor enkel meten EMG |
DanAuhust | 0:3a1196d78030 | 285 | } |
DanAuhust | 5:6fd237516c27 | 286 | } |