testen StDev

Dependencies:   MODSERIAL mbed

Committer:
DanAuhust
Date:
Sat Nov 02 13:47:09 2013 +0000
Revision:
0:a9143c04e7ef
testen STDev

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DanAuhust 0:a9143c04e7ef 1 #include "mbed.h"
DanAuhust 0:a9143c04e7ef 2 #include "MODSERIAL.h"
DanAuhust 0:a9143c04e7ef 3
DanAuhust 0:a9143c04e7ef 4 //Define objects
DanAuhust 0:a9143c04e7ef 5 AnalogIn emg_biceps(PTB0);
DanAuhust 0:a9143c04e7ef 6 AnalogIn emg_triceps(PTB1);
DanAuhust 0:a9143c04e7ef 7 AnalogIn emg_flexoren(PTB2);
DanAuhust 0:a9143c04e7ef 8 AnalogIn emg_extensoren(PTB3); //Analog input
DanAuhust 0:a9143c04e7ef 9 PwmOut red(LED_RED); //PWM output
DanAuhust 0:a9143c04e7ef 10 Ticker timer;
DanAuhust 0:a9143c04e7ef 11 MODSERIAL pc(USBTX,USBRX,64,1024);
DanAuhust 0:a9143c04e7ef 12
DanAuhust 0:a9143c04e7ef 13 #define offset_biceps 0 // offset ruwe invoer met adapter motoren
DanAuhust 0:a9143c04e7ef 14
DanAuhust 0:a9143c04e7ef 15 //high pass filter constantes 15Hz cutoff 4e orde, Fs = 311
DanAuhust 0:a9143c04e7ef 16 #define NUM0 0.3628 // constante
DanAuhust 0:a9143c04e7ef 17 #define NUM1 -1.4511 // z^-1
DanAuhust 0:a9143c04e7ef 18 #define NUM2 2.1766 // z^-2etc.
DanAuhust 0:a9143c04e7ef 19 #define NUM3 -1.511
DanAuhust 0:a9143c04e7ef 20 #define NUM4 0.3628
DanAuhust 0:a9143c04e7ef 21
DanAuhust 0:a9143c04e7ef 22 #define DEN0 1 // constante
DanAuhust 0:a9143c04e7ef 23 #define DEN1 -2.0484
DanAuhust 0:a9143c04e7ef 24 #define DEN2 1.8418
DanAuhust 0:a9143c04e7ef 25 #define DEN3 -0.7824
DanAuhust 0:a9143c04e7ef 26 #define DEN4 0.1317
DanAuhust 0:a9143c04e7ef 27
DanAuhust 0:a9143c04e7ef 28 //lowpass filter constantes 40 Hz 4e orde
DanAuhust 0:a9143c04e7ef 29 #define NUM0_2 0.0466 // constante
DanAuhust 0:a9143c04e7ef 30 #define NUM1_2 0.1863 // z^-1
DanAuhust 0:a9143c04e7ef 31 #define NUM2_2 0.2795 // z^-2etc.
DanAuhust 0:a9143c04e7ef 32 #define NUM3_2 0.1863
DanAuhust 0:a9143c04e7ef 33 #define NUM4_2 0.0466
DanAuhust 0:a9143c04e7ef 34
DanAuhust 0:a9143c04e7ef 35 #define DEN0_2 1 // constante
DanAuhust 0:a9143c04e7ef 36 #define DEN1_2 -0.7821
DanAuhust 0:a9143c04e7ef 37 #define DEN2_2 0.6800
DanAuhust 0:a9143c04e7ef 38 #define DEN3_2 -0.1827
DanAuhust 0:a9143c04e7ef 39 #define DEN4_2 0.0301
DanAuhust 0:a9143c04e7ef 40
DanAuhust 0:a9143c04e7ef 41 //lowpass filter constantes 4Hz 4e orde, FS = 311z
DanAuhust 0:a9143c04e7ef 42 #define NUM0_3 0.0000796 // constante
DanAuhust 0:a9143c04e7ef 43 #define NUM1_3 0.0003183 // z^-1
DanAuhust 0:a9143c04e7ef 44 #define NUM2_3 0.0004774 // z^-2etc.
DanAuhust 0:a9143c04e7ef 45 #define NUM3_3 0.0003183
DanAuhust 0:a9143c04e7ef 46 #define NUM4_3 0.0000796
DanAuhust 0:a9143c04e7ef 47
DanAuhust 0:a9143c04e7ef 48 #define DEN0_3 1 // constante
DanAuhust 0:a9143c04e7ef 49 #define DEN1_3 -3.4750
DanAuhust 0:a9143c04e7ef 50 #define DEN2_3 4.5585
DanAuhust 0:a9143c04e7ef 51 #define DEN3_3 -2.6729
DanAuhust 0:a9143c04e7ef 52 #define DEN4_3 0.5907
DanAuhust 0:a9143c04e7ef 53
DanAuhust 0:a9143c04e7ef 54 // highpass filter 1 Hz 2de orde, tegen storing motorshield
DanAuhust 0:a9143c04e7ef 55 #define NUM0_4 0.9780 // constante
DanAuhust 0:a9143c04e7ef 56 #define NUM1_4 -1.9561 // z^-1
DanAuhust 0:a9143c04e7ef 57 #define NUM2_4 0.9780 // z^-2etc.
DanAuhust 0:a9143c04e7ef 58
DanAuhust 0:a9143c04e7ef 59 #define DEN0_4 1 // constante
DanAuhust 0:a9143c04e7ef 60 #define DEN1_4 -1.9556
DanAuhust 0:a9143c04e7ef 61 #define DEN2_4 0.9565
DanAuhust 0:a9143c04e7ef 62
DanAuhust 0:a9143c04e7ef 63
DanAuhust 0:a9143c04e7ef 64 float std_dev (float input, int sig_number){
DanAuhust 0:a9143c04e7ef 65 // define variables
DanAuhust 0:a9143c04e7ef 66 float sum;
DanAuhust 0:a9143c04e7ef 67 int size;
DanAuhust 0:a9143c04e7ef 68 float sig_out;
DanAuhust 0:a9143c04e7ef 69 float mean;
DanAuhust 0:a9143c04e7ef 70 static int count_biceps=0;
DanAuhust 0:a9143c04e7ef 71 static int count_triceps=0;
DanAuhust 0:a9143c04e7ef 72 static int count_flexoren=0;
DanAuhust 0:a9143c04e7ef 73 static int count_extensoren=0;
DanAuhust 0:a9143c04e7ef 74 static float keeper_biceps[10];
DanAuhust 0:a9143c04e7ef 75 static float keeper_triceps[10];
DanAuhust 0:a9143c04e7ef 76 static float keeper_flexoren[10];
DanAuhust 0:a9143c04e7ef 77 static float keeper_extensoren[10];
DanAuhust 0:a9143c04e7ef 78
DanAuhust 0:a9143c04e7ef 79 switch(sig_number){
DanAuhust 0:a9143c04e7ef 80 case 1:
DanAuhust 0:a9143c04e7ef 81 keeper_biceps[count_biceps]=input;
DanAuhust 0:a9143c04e7ef 82 count_biceps++;
DanAuhust 0:a9143c04e7ef 83 if(count_biceps==size)
DanAuhust 0:a9143c04e7ef 84 count_biceps=0;
DanAuhust 0:a9143c04e7ef 85 size=sizeof(keeper_biceps)/sizeof(float);
DanAuhust 0:a9143c04e7ef 86 for(int i=0; i < size; i++)
DanAuhust 0:a9143c04e7ef 87 {sum+=keeper_biceps[i];
DanAuhust 0:a9143c04e7ef 88 }
DanAuhust 0:a9143c04e7ef 89 mean=sum/size;
DanAuhust 0:a9143c04e7ef 90 sum=0;
DanAuhust 0:a9143c04e7ef 91 for(int i=0; i < size; i++)
DanAuhust 0:a9143c04e7ef 92 {sum+=(keeper_biceps[i]-mean)*(keeper_biceps[i]-mean);
DanAuhust 0:a9143c04e7ef 93 }
DanAuhust 0:a9143c04e7ef 94 sig_out=sqrt(sum/size);
DanAuhust 0:a9143c04e7ef 95 sum=0;
DanAuhust 0:a9143c04e7ef 96 break;
DanAuhust 0:a9143c04e7ef 97 case 2:
DanAuhust 0:a9143c04e7ef 98 keeper_triceps[count_triceps]=input;
DanAuhust 0:a9143c04e7ef 99 count_triceps++;
DanAuhust 0:a9143c04e7ef 100 if(count_triceps==size) count_triceps=0;
DanAuhust 0:a9143c04e7ef 101
DanAuhust 0:a9143c04e7ef 102 size=sizeof(keeper_triceps) / sizeof(float);
DanAuhust 0:a9143c04e7ef 103 for(int i=0; i < size; i++){
DanAuhust 0:a9143c04e7ef 104 sum+=keeper_triceps[i];
DanAuhust 0:a9143c04e7ef 105 }
DanAuhust 0:a9143c04e7ef 106 mean=sum/size;
DanAuhust 0:a9143c04e7ef 107 sum=0;
DanAuhust 0:a9143c04e7ef 108 for(int i=0; i < size; i++){
DanAuhust 0:a9143c04e7ef 109 sum+=(keeper_triceps[i]-mean)*(keeper_triceps[i]-mean);
DanAuhust 0:a9143c04e7ef 110 }
DanAuhust 0:a9143c04e7ef 111 sig_out=sqrt(sum/size);
DanAuhust 0:a9143c04e7ef 112 sum=0;
DanAuhust 0:a9143c04e7ef 113 break;
DanAuhust 0:a9143c04e7ef 114 case 3:
DanAuhust 0:a9143c04e7ef 115 keeper_flexoren[count_flexoren]=input;
DanAuhust 0:a9143c04e7ef 116 count_flexoren++;
DanAuhust 0:a9143c04e7ef 117 if(count_flexoren==size) count_flexoren=0;
DanAuhust 0:a9143c04e7ef 118
DanAuhust 0:a9143c04e7ef 119 size=sizeof(keeper_flexoren)/sizeof(float);
DanAuhust 0:a9143c04e7ef 120 for(int i; i < size; i++){
DanAuhust 0:a9143c04e7ef 121 sum+=keeper_flexoren[i];
DanAuhust 0:a9143c04e7ef 122 }
DanAuhust 0:a9143c04e7ef 123 mean=sum/size;
DanAuhust 0:a9143c04e7ef 124 sum=0;
DanAuhust 0:a9143c04e7ef 125 for(int i; i < size; i++){
DanAuhust 0:a9143c04e7ef 126 sum+=(keeper_flexoren[i]-mean)*(keeper_flexoren[i]-mean);
DanAuhust 0:a9143c04e7ef 127 }
DanAuhust 0:a9143c04e7ef 128 sig_out=sqrt(sum/size);
DanAuhust 0:a9143c04e7ef 129 sum=0;
DanAuhust 0:a9143c04e7ef 130 break;
DanAuhust 0:a9143c04e7ef 131 case 4:
DanAuhust 0:a9143c04e7ef 132 keeper_extensoren[count_extensoren]=input;
DanAuhust 0:a9143c04e7ef 133 count_extensoren++;
DanAuhust 0:a9143c04e7ef 134 if(count_extensoren==size) count_extensoren=0;
DanAuhust 0:a9143c04e7ef 135
DanAuhust 0:a9143c04e7ef 136 size=sizeof(keeper_extensoren)/sizeof(float);
DanAuhust 0:a9143c04e7ef 137 for(int i; i < size; i++){
DanAuhust 0:a9143c04e7ef 138 sum+=keeper_extensoren[i];
DanAuhust 0:a9143c04e7ef 139 }
DanAuhust 0:a9143c04e7ef 140 mean=sum/size;
DanAuhust 0:a9143c04e7ef 141 sum=0;
DanAuhust 0:a9143c04e7ef 142 for(int i; i < size; i++){
DanAuhust 0:a9143c04e7ef 143 sum+=(keeper_extensoren[i]-mean)*(keeper_extensoren[i]-mean);
DanAuhust 0:a9143c04e7ef 144 }
DanAuhust 0:a9143c04e7ef 145 sig_out=sqrt(sum/size);
DanAuhust 0:a9143c04e7ef 146 sum=0;
DanAuhust 0:a9143c04e7ef 147 break;
DanAuhust 0:a9143c04e7ef 148 } // einde switch
DanAuhust 0:a9143c04e7ef 149
DanAuhust 0:a9143c04e7ef 150
DanAuhust 0:a9143c04e7ef 151 return sig_out;
DanAuhust 0:a9143c04e7ef 152 }
DanAuhust 0:a9143c04e7ef 153
DanAuhust 0:a9143c04e7ef 154 float filter(int sig_number){
DanAuhust 0:a9143c04e7ef 155 float sig_out;
DanAuhust 0:a9143c04e7ef 156 // eerst variabelen definieren
DanAuhust 0:a9143c04e7ef 157
DanAuhust 0:a9143c04e7ef 158 //biceps
DanAuhust 0:a9143c04e7ef 159 //filter 1
DanAuhust 0:a9143c04e7ef 160 float in0_biceps =0;
DanAuhust 0:a9143c04e7ef 161 static float in1_biceps =0, in2_biceps = 0, in3_biceps = 0, in4_biceps = 0;
DanAuhust 0:a9143c04e7ef 162 static float out0_biceps = 0, out1_biceps = 0 , out2_biceps = 0, out3_biceps = 0, out4_biceps = 0;
DanAuhust 0:a9143c04e7ef 163 //filter 2
DanAuhust 0:a9143c04e7ef 164 float in0_2_biceps =0;
DanAuhust 0:a9143c04e7ef 165 static float in1_2_biceps =0, in2_2_biceps = 0, in3_2_biceps = 0, in4_2_biceps = 0;
DanAuhust 0:a9143c04e7ef 166 static float out0_2_biceps = 0, out1_2_biceps = 0 , out2_2_biceps = 0, out3_2_biceps = 0, out4_2_biceps = 0;
DanAuhust 0:a9143c04e7ef 167 //filter 3
DanAuhust 0:a9143c04e7ef 168 float in0_3_biceps =0;
DanAuhust 0:a9143c04e7ef 169 static float in1_3_biceps =0, in2_3_biceps = 0, in3_3_biceps = 0, in4_3_biceps = 0;
DanAuhust 0:a9143c04e7ef 170 static float out0_3_biceps = 0, out1_3_biceps = 0 , out2_3_biceps = 0, out3_3_biceps = 0, out4_3_biceps = 0;
DanAuhust 0:a9143c04e7ef 171 //filter 4
DanAuhust 0:a9143c04e7ef 172 float in0_4_biceps =0;
DanAuhust 0:a9143c04e7ef 173 static float in1_4_biceps =0, in2_4_biceps = 0;
DanAuhust 0:a9143c04e7ef 174 static float out0_4_biceps = 0, out1_4_biceps = 0 , out2_4_biceps = 0;
DanAuhust 0:a9143c04e7ef 175
DanAuhust 0:a9143c04e7ef 176 //triceps
DanAuhust 0:a9143c04e7ef 177 //filter 1
DanAuhust 0:a9143c04e7ef 178 float in0_triceps =0;
DanAuhust 0:a9143c04e7ef 179 static float in1_triceps =0, in2_triceps = 0, in3_triceps = 0, in4_triceps = 0;
DanAuhust 0:a9143c04e7ef 180 static float out0_triceps = 0, out1_triceps = 0 , out2_triceps = 0, out3_triceps = 0, out4_triceps = 0;
DanAuhust 0:a9143c04e7ef 181 //filter 2
DanAuhust 0:a9143c04e7ef 182 float in0_2_triceps =0;
DanAuhust 0:a9143c04e7ef 183 static float in1_2_triceps =0, in2_2_triceps = 0, in3_2_triceps = 0, in4_2_triceps = 0;
DanAuhust 0:a9143c04e7ef 184 static float out0_2_triceps = 0, out1_2_triceps = 0 , out2_2_triceps = 0, out3_2_triceps = 0, out4_2_triceps = 0;
DanAuhust 0:a9143c04e7ef 185 //filter 3
DanAuhust 0:a9143c04e7ef 186 float in0_3_triceps =0;
DanAuhust 0:a9143c04e7ef 187 static float in1_3_triceps =0, in2_3_triceps = 0, in3_3_triceps = 0, in4_3_triceps = 0;
DanAuhust 0:a9143c04e7ef 188 static float out0_3_triceps = 0, out1_3_triceps = 0 , out2_3_triceps = 0, out3_3_triceps = 0, out4_3_triceps = 0;
DanAuhust 0:a9143c04e7ef 189 //filter 4
DanAuhust 0:a9143c04e7ef 190 float in0_4_triceps =0;
DanAuhust 0:a9143c04e7ef 191 static float in1_4_triceps =0, in2_4_triceps = 0;
DanAuhust 0:a9143c04e7ef 192 static float out0_4_triceps = 0, out1_4_triceps = 0 , out2_4_triceps = 0;
DanAuhust 0:a9143c04e7ef 193
DanAuhust 0:a9143c04e7ef 194 //flexoren
DanAuhust 0:a9143c04e7ef 195 //filter 1
DanAuhust 0:a9143c04e7ef 196 float in0_flexoren =0;
DanAuhust 0:a9143c04e7ef 197 static float in1_flexoren =0, in2_flexoren = 0, in3_flexoren = 0, in4_flexoren = 0;
DanAuhust 0:a9143c04e7ef 198 static float out0_flexoren = 0, out1_flexoren = 0 , out2_flexoren = 0, out3_flexoren = 0, out4_flexoren = 0;
DanAuhust 0:a9143c04e7ef 199 //filter 2
DanAuhust 0:a9143c04e7ef 200 float in0_2_flexoren =0;
DanAuhust 0:a9143c04e7ef 201 static float in1_2_flexoren =0, in2_2_flexoren = 0, in3_2_flexoren = 0, in4_2_flexoren = 0;
DanAuhust 0:a9143c04e7ef 202 static float out0_2_flexoren = 0, out1_2_flexoren = 0 , out2_2_flexoren = 0, out3_2_flexoren = 0, out4_2_flexoren = 0;
DanAuhust 0:a9143c04e7ef 203 //filter 3
DanAuhust 0:a9143c04e7ef 204 float in0_3_flexoren =0;
DanAuhust 0:a9143c04e7ef 205 static float in1_3_flexoren =0, in2_3_flexoren = 0, in3_3_flexoren = 0, in4_3_flexoren = 0;
DanAuhust 0:a9143c04e7ef 206 static float out0_3_flexoren = 0, out1_3_flexoren = 0 , out2_3_flexoren = 0, out3_3_flexoren = 0, out4_3_flexoren = 0;
DanAuhust 0:a9143c04e7ef 207 //filter 4
DanAuhust 0:a9143c04e7ef 208 float in0_4_flexoren =0;
DanAuhust 0:a9143c04e7ef 209 static float in1_4_flexoren =0, in2_4_flexoren = 0;
DanAuhust 0:a9143c04e7ef 210 static float out0_4_flexoren = 0, out1_4_flexoren = 0 , out2_4_flexoren = 0;
DanAuhust 0:a9143c04e7ef 211
DanAuhust 0:a9143c04e7ef 212 //extensoren
DanAuhust 0:a9143c04e7ef 213 //filter 1
DanAuhust 0:a9143c04e7ef 214 float in0_extensoren =0;
DanAuhust 0:a9143c04e7ef 215 static float in1_extensoren =0, in2_extensoren = 0, in3_extensoren = 0, in4_extensoren = 0;
DanAuhust 0:a9143c04e7ef 216 static float out0_extensoren = 0, out1_extensoren = 0 , out2_extensoren = 0, out3_extensoren = 0, out4_extensoren = 0;
DanAuhust 0:a9143c04e7ef 217 //filter 2
DanAuhust 0:a9143c04e7ef 218 float in0_2_extensoren =0;
DanAuhust 0:a9143c04e7ef 219 static float in1_2_extensoren =0, in2_2_extensoren = 0, in3_2_extensoren = 0, in4_2_extensoren = 0;
DanAuhust 0:a9143c04e7ef 220 static float out0_2_extensoren = 0, out1_2_extensoren = 0 , out2_2_extensoren = 0, out3_2_extensoren = 0, out4_2_extensoren = 0;
DanAuhust 0:a9143c04e7ef 221 //filter 3
DanAuhust 0:a9143c04e7ef 222 float in0_3_extensoren =0;
DanAuhust 0:a9143c04e7ef 223 static float in1_3_extensoren =0, in2_3_extensoren = 0, in3_3_extensoren = 0, in4_3_extensoren = 0;
DanAuhust 0:a9143c04e7ef 224 static float out0_3_extensoren = 0, out1_3_extensoren = 0 , out2_3_extensoren = 0, out3_3_extensoren = 0, out4_3_extensoren = 0;
DanAuhust 0:a9143c04e7ef 225 //filter 4
DanAuhust 0:a9143c04e7ef 226 float in0_4_extensoren =0;
DanAuhust 0:a9143c04e7ef 227 static float in1_4_extensoren =0, in2_4_extensoren = 0;
DanAuhust 0:a9143c04e7ef 228 static float out0_4_extensoren = 0, out1_4_extensoren = 0 , out2_4_extensoren = 0;
DanAuhust 0:a9143c04e7ef 229
DanAuhust 0:a9143c04e7ef 230
DanAuhust 0:a9143c04e7ef 231 switch(sig_number){
DanAuhust 0:a9143c04e7ef 232 case 1:
DanAuhust 0:a9143c04e7ef 233 // signaal filteren op 15 Hz HIGHPASS
DanAuhust 0:a9143c04e7ef 234 in4_biceps = in3_biceps; in3_biceps = in2_biceps; in2_biceps = in1_biceps; in1_biceps = in0_biceps;
DanAuhust 0:a9143c04e7ef 235 in0_biceps = emg_biceps.read() - offset_biceps;
DanAuhust 0:a9143c04e7ef 236 out4_biceps = out3_biceps; out3_biceps = out2_biceps; out2_biceps = out1_biceps; out1_biceps = out0_biceps;
DanAuhust 0:a9143c04e7ef 237 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:a9143c04e7ef 238 /*
DanAuhust 0:a9143c04e7ef 239 //signaal filteren op 40 HZ LOWPASS
DanAuhust 0:a9143c04e7ef 240 in4_2_biceps = in3_2_biceps; in3_2_biceps = in2_2_biceps; in2_2_biceps = in1_2_biceps; in1_2_biceps = in0_2_biceps;
DanAuhust 0:a9143c04e7ef 241 in0_2_biceps = out0_biceps;
DanAuhust 0:a9143c04e7ef 242 out4_2_biceps = out3_2_biceps; out3_2_biceps = out2_2_biceps; out2_2_biceps = out1_2_biceps; out1_2_biceps = out0_2_biceps;
DanAuhust 0:a9143c04e7ef 243 out0_2_biceps = (NUM0_2*in0_2_biceps + NUM1_2*in1_2_biceps + NUM2_2*in2_2_biceps + NUM3_2*in3_2_biceps + NUM4_2*in4_2_biceps - DEN1_2*out1_2_biceps - DEN2_2*out2_2_biceps - DEN3_2*out3_2_biceps - DEN4_2*out4_2_biceps ) / DEN0_2;
DanAuhust 0:a9143c04e7ef 244 */
DanAuhust 0:a9143c04e7ef 245 //signaal filteren op 5Hz LOWPASS
DanAuhust 0:a9143c04e7ef 246 in4_3_biceps = in3_3_biceps; in3_3_biceps = in2_3_biceps; in2_3_biceps = in1_3_biceps; in1_3_biceps = in0_3_biceps;
DanAuhust 0:a9143c04e7ef 247 in0_3_biceps = abs(out0_biceps); // ruw - offset -> filter 1 -> stdev (-> filter 3)
DanAuhust 0:a9143c04e7ef 248 out4_3_biceps = out3_3_biceps; out3_3_biceps = out2_3_biceps; out2_3_biceps = out1_3_biceps; out1_3_biceps = out0_3_biceps;
DanAuhust 0:a9143c04e7ef 249 out0_3_biceps = (NUM0_3*in0_3_biceps + NUM1_3*in1_3_biceps + NUM2_3*in2_3_biceps + NUM3_3*in3_3_biceps + NUM4_3*in4_3_biceps - DEN1_3*out1_3_biceps - DEN2_3*out2_3_biceps - DEN3_3*out3_3_biceps - DEN4_3*out4_3_biceps ) / DEN0_3;
DanAuhust 0:a9143c04e7ef 250
DanAuhust 0:a9143c04e7ef 251 /*
DanAuhust 0:a9143c04e7ef 252 //signaal filteren op 1 HZ HIGHPASS
DanAuhust 0:a9143c04e7ef 253 in2_4_biceps = in1_4_biceps; in1_4_biceps = in0_4_biceps;
DanAuhust 0:a9143c04e7ef 254 in0_4_biceps = out0_3_biceps;
DanAuhust 0:a9143c04e7ef 255 out2_4_biceps = out1_4_biceps; out1_4_biceps = out0_4_biceps;
DanAuhust 0:a9143c04e7ef 256 out0_4_biceps = (NUM0_4*in0_4_biceps + NUM1_4*in1_4_biceps + NUM2_4*in2_4_biceps - DEN1_4*out1_4_biceps - DEN2_4*out2_4_biceps ) / DEN0_4;
DanAuhust 0:a9143c04e7ef 257 */
DanAuhust 0:a9143c04e7ef 258 sig_out = out0_biceps;
DanAuhust 0:a9143c04e7ef 259 break;
DanAuhust 0:a9143c04e7ef 260 case 2:
DanAuhust 0:a9143c04e7ef 261 // signaal filteren op 15 Hz HIGHPASS
DanAuhust 0:a9143c04e7ef 262 in4_triceps = in3_triceps; in3_triceps = in2_triceps; in2_triceps = in1_triceps; in1_triceps = in0_triceps;
DanAuhust 0:a9143c04e7ef 263 in0_triceps = emg_triceps.read() - offset_biceps;
DanAuhust 0:a9143c04e7ef 264 out4_triceps = out3_triceps; out3_triceps = out2_triceps; out2_triceps = out1_triceps; out1_triceps = out0_triceps;
DanAuhust 0:a9143c04e7ef 265 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:a9143c04e7ef 266
DanAuhust 0:a9143c04e7ef 267 /*//signaal filteren op 40 HZ LOWPASS
DanAuhust 0:a9143c04e7ef 268 in4_2_triceps = in3_2_triceps; in3_2_triceps = in2_2_triceps; in2_2_triceps = in1_2_triceps; in1_2_triceps = in0_2_triceps;
DanAuhust 0:a9143c04e7ef 269 in0_2_triceps = out0_triceps;
DanAuhust 0:a9143c04e7ef 270 out4_2_triceps = out3_2_triceps; out3_2_triceps = out2_2_triceps; out2_2_triceps = out1_2_triceps; out1_2_triceps = out0_2_triceps;
DanAuhust 0:a9143c04e7ef 271 out0_2_triceps = (NUM0_2*in0_2_triceps + NUM1_2*in1_2_triceps + NUM2_2*in2_2_triceps + NUM3_2*in3_2_triceps + NUM4_2*in4_2_triceps - DEN1_2*out1_2_triceps - DEN2_2*out2_2_triceps - DEN3_2*out3_2_triceps - DEN4_2*out4_2_triceps ) / DEN0_2;
DanAuhust 0:a9143c04e7ef 272 */
DanAuhust 0:a9143c04e7ef 273 //signaal filteren op 5Hz LOWPASS
DanAuhust 0:a9143c04e7ef 274 /*in4_3_triceps = in3_3_triceps; in3_3_triceps = in2_3_triceps; in2_3_triceps = in1_3_triceps; in1_3_triceps = in0_3_triceps;
DanAuhust 0:a9143c04e7ef 275 in0_3_triceps = abs(out0_triceps);
DanAuhust 0:a9143c04e7ef 276 out4_3_triceps = out3_3_triceps; out3_3_triceps = out2_3_triceps; out2_3_triceps = out1_3_triceps; out1_3_triceps = out0_3_triceps;
DanAuhust 0:a9143c04e7ef 277 out0_3_triceps = (NUM0_3*in0_3_triceps + NUM1_3*in1_3_triceps + NUM2_3*in2_3_triceps + NUM3_3*in3_3_triceps + NUM4_3*in4_3_triceps - DEN1_3*out1_3_triceps - DEN2_3*out2_3_triceps - DEN3_3*out3_3_triceps - DEN4_3*out4_3_triceps ) / DEN0_3;
DanAuhust 0:a9143c04e7ef 278 */
DanAuhust 0:a9143c04e7ef 279 /*//signaal filteren op .5 HZ HIGHPASS
DanAuhust 0:a9143c04e7ef 280 in2_4_triceps = in1_4_triceps; in1_4_triceps = in0_4_triceps;
DanAuhust 0:a9143c04e7ef 281 in0_4_triceps = out0_3_triceps;
DanAuhust 0:a9143c04e7ef 282 out2_4_triceps = out1_4_triceps; out1_4_triceps = out0_4_triceps;
DanAuhust 0:a9143c04e7ef 283 out0_4_triceps = (NUM0_4*in0_4_triceps + NUM1_4*in1_4_triceps + NUM2_4*in2_4_triceps - DEN1_4*out1_4_triceps - DEN2_4*out2_4_triceps ) / DEN0_4;
DanAuhust 0:a9143c04e7ef 284 */
DanAuhust 0:a9143c04e7ef 285 sig_out = out0_triceps;
DanAuhust 0:a9143c04e7ef 286 break;
DanAuhust 0:a9143c04e7ef 287 case 3:
DanAuhust 0:a9143c04e7ef 288 // signaal filteren op 15 Hz HIGHPASS
DanAuhust 0:a9143c04e7ef 289 in4_flexoren = in3_flexoren; in3_flexoren = in2_flexoren; in2_flexoren = in1_flexoren; in1_flexoren = in0_flexoren;
DanAuhust 0:a9143c04e7ef 290 in0_flexoren = emg_flexoren.read();
DanAuhust 0:a9143c04e7ef 291 out4_flexoren = out3_flexoren; out3_flexoren = out2_flexoren; out2_flexoren = out1_flexoren; out1_flexoren = out0_flexoren;
DanAuhust 0:a9143c04e7ef 292 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:a9143c04e7ef 293
DanAuhust 0:a9143c04e7ef 294 //signaal filteren op 40 HZ LOWPASS
DanAuhust 0:a9143c04e7ef 295 in4_2_flexoren = in3_2_flexoren; in3_2_flexoren = in2_2_flexoren; in2_2_flexoren = in1_2_flexoren; in1_2_flexoren = in0_2_flexoren;
DanAuhust 0:a9143c04e7ef 296 in0_2_flexoren = out0_flexoren;
DanAuhust 0:a9143c04e7ef 297 out4_2_flexoren = out3_2_flexoren; out3_2_flexoren = out2_2_flexoren; out2_2_flexoren = out1_2_flexoren; out1_2_flexoren = out0_2_flexoren;
DanAuhust 0:a9143c04e7ef 298 out0_2_flexoren = (NUM0_2*in0_2_flexoren + NUM1_2*in1_2_flexoren + NUM2_2*in2_2_flexoren + NUM3_2*in3_2_flexoren + NUM4_2*in4_2_flexoren - DEN1_2*out1_2_flexoren - DEN2_2*out2_2_flexoren - DEN3_2*out3_2_flexoren - DEN4_2*out4_2_flexoren ) / DEN0_2;
DanAuhust 0:a9143c04e7ef 299
DanAuhust 0:a9143c04e7ef 300 //signaal filteren op 5Hz LOWPASS
DanAuhust 0:a9143c04e7ef 301 in4_3_flexoren = in3_3_flexoren; in3_3_flexoren = in2_3_flexoren; in2_3_flexoren = in1_3_flexoren; in1_3_flexoren = in0_3_flexoren;
DanAuhust 0:a9143c04e7ef 302 in0_3_flexoren = abs(out0_2_flexoren);
DanAuhust 0:a9143c04e7ef 303 out4_3_flexoren = out3_3_flexoren; out3_3_flexoren = out2_3_flexoren; out2_3_flexoren = out1_3_flexoren; out1_3_flexoren = out0_3_flexoren;
DanAuhust 0:a9143c04e7ef 304 out0_3_flexoren = (NUM0_3*in0_3_flexoren + NUM1_3*in1_3_flexoren + NUM2_3*in2_3_flexoren + NUM3_3*in3_3_flexoren + NUM4_3*in4_3_flexoren - DEN1_3*out1_3_flexoren - DEN2_3*out2_3_flexoren - DEN3_3*out3_3_flexoren - DEN4_3*out4_3_flexoren ) / DEN0_3;
DanAuhust 0:a9143c04e7ef 305
DanAuhust 0:a9143c04e7ef 306 //signaal filteren op .5 HZ HIGHPASS
DanAuhust 0:a9143c04e7ef 307 in2_4_flexoren = in1_4_flexoren; in1_4_flexoren = in0_4_flexoren;
DanAuhust 0:a9143c04e7ef 308 in0_4_flexoren = out0_3_flexoren;
DanAuhust 0:a9143c04e7ef 309 out2_4_flexoren = out1_4_flexoren; out1_4_flexoren = out0_4_flexoren;
DanAuhust 0:a9143c04e7ef 310 out0_4_flexoren = (NUM0_4*in0_4_flexoren + NUM1_4*in1_4_flexoren + NUM2_4*in2_4_flexoren - DEN1_4*out1_4_flexoren - DEN2_4*out2_4_flexoren ) / DEN0_4;
DanAuhust 0:a9143c04e7ef 311
DanAuhust 0:a9143c04e7ef 312 sig_out = out0_4_flexoren;
DanAuhust 0:a9143c04e7ef 313 break;
DanAuhust 0:a9143c04e7ef 314 case 4:
DanAuhust 0:a9143c04e7ef 315 // signaal filteren op 15 Hz HIGHPASS
DanAuhust 0:a9143c04e7ef 316 in4_extensoren = in3_extensoren; in3_extensoren = in2_extensoren; in2_extensoren = in1_extensoren; in1_extensoren = in0_extensoren;
DanAuhust 0:a9143c04e7ef 317 in0_extensoren = emg_extensoren.read();
DanAuhust 0:a9143c04e7ef 318 out4_extensoren = out3_extensoren; out3_extensoren = out2_extensoren; out2_extensoren = out1_extensoren; out1_extensoren = out0_extensoren;
DanAuhust 0:a9143c04e7ef 319 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:a9143c04e7ef 320
DanAuhust 0:a9143c04e7ef 321 //signaal filteren op 40 HZ LOWPASS
DanAuhust 0:a9143c04e7ef 322 in4_2_extensoren = in3_2_extensoren; in3_2_extensoren = in2_2_extensoren; in2_2_extensoren = in1_2_extensoren; in1_2_extensoren = in0_2_extensoren;
DanAuhust 0:a9143c04e7ef 323 in0_2_extensoren = out0_extensoren;
DanAuhust 0:a9143c04e7ef 324 out4_2_extensoren = out3_2_extensoren; out3_2_extensoren = out2_2_extensoren; out2_2_extensoren = out1_2_extensoren; out1_2_extensoren = out0_2_extensoren;
DanAuhust 0:a9143c04e7ef 325 out0_2_extensoren = (NUM0_2*in0_2_extensoren + NUM1_2*in1_2_extensoren + NUM2_2*in2_2_extensoren + NUM3_2*in3_2_extensoren + NUM4_2*in4_2_extensoren - DEN1_2*out1_2_extensoren - DEN2_2*out2_2_extensoren - DEN3_2*out3_2_extensoren - DEN4_2*out4_2_extensoren ) / DEN0_2;
DanAuhust 0:a9143c04e7ef 326
DanAuhust 0:a9143c04e7ef 327 //signaal filteren op 5Hz LOWPASS
DanAuhust 0:a9143c04e7ef 328 in4_3_extensoren = in3_3_extensoren; in3_3_extensoren = in2_3_extensoren; in2_3_extensoren = in1_3_extensoren; in1_3_extensoren = in0_3_extensoren;
DanAuhust 0:a9143c04e7ef 329 in0_3_extensoren = abs(out0_2_extensoren);
DanAuhust 0:a9143c04e7ef 330 out4_3_extensoren = out3_3_extensoren; out3_3_extensoren = out2_3_extensoren; out2_3_extensoren = out1_3_extensoren; out1_3_extensoren = out0_3_extensoren;
DanAuhust 0:a9143c04e7ef 331 out0_3_extensoren = (NUM0_3*in0_3_extensoren + NUM1_3*in1_3_extensoren + NUM2_3*in2_3_extensoren + NUM3_3*in3_3_extensoren + NUM4_3*in4_3_extensoren - DEN1_3*out1_3_extensoren - DEN2_3*out2_3_extensoren - DEN3_3*out3_3_extensoren - DEN4_3*out4_3_extensoren ) / DEN0_3;
DanAuhust 0:a9143c04e7ef 332
DanAuhust 0:a9143c04e7ef 333 //signaal filteren op .5 HZ HIGHPASS
DanAuhust 0:a9143c04e7ef 334 in2_4_extensoren = in1_4_extensoren; in1_4_extensoren = in0_4_extensoren;
DanAuhust 0:a9143c04e7ef 335 in0_4_extensoren = out0_3_extensoren;
DanAuhust 0:a9143c04e7ef 336 out2_4_extensoren = out1_4_extensoren; out1_4_extensoren = out0_4_extensoren;
DanAuhust 0:a9143c04e7ef 337 out0_4_extensoren = (NUM0_4*in0_4_extensoren + NUM1_4*in1_4_extensoren + NUM2_4*in2_4_extensoren - DEN1_4*out1_4_extensoren - DEN2_4*out2_4_extensoren ) / DEN0_4;
DanAuhust 0:a9143c04e7ef 338
DanAuhust 0:a9143c04e7ef 339 sig_out = out0_4_extensoren;
DanAuhust 0:a9143c04e7ef 340 break;
DanAuhust 0:a9143c04e7ef 341 }
DanAuhust 0:a9143c04e7ef 342 return sig_out;
DanAuhust 0:a9143c04e7ef 343 }
DanAuhust 0:a9143c04e7ef 344
DanAuhust 0:a9143c04e7ef 345 void looper()
DanAuhust 0:a9143c04e7ef 346 { float emg_value_biceps;
DanAuhust 0:a9143c04e7ef 347 float emg_value_triceps;
DanAuhust 0:a9143c04e7ef 348 float emg_value_flexoren;
DanAuhust 0:a9143c04e7ef 349 float emg_value_extensoren;
DanAuhust 0:a9143c04e7ef 350 float dy;
DanAuhust 0:a9143c04e7ef 351 static int sig_count=1;
DanAuhust 0:a9143c04e7ef 352
DanAuhust 0:a9143c04e7ef 353 switch(sig_count){
DanAuhust 0:a9143c04e7ef 354 case 1:
DanAuhust 0:a9143c04e7ef 355 emg_value_biceps=filter(1);
DanAuhust 0:a9143c04e7ef 356 sig_count=2;
DanAuhust 0:a9143c04e7ef 357 break;
DanAuhust 0:a9143c04e7ef 358 case 2:
DanAuhust 0:a9143c04e7ef 359 emg_value_triceps=filter(2);
DanAuhust 0:a9143c04e7ef 360 sig_count=1;
DanAuhust 0:a9143c04e7ef 361 break;
DanAuhust 0:a9143c04e7ef 362 case 3:
DanAuhust 0:a9143c04e7ef 363 emg_value_flexoren = filter (3);
DanAuhust 0:a9143c04e7ef 364 sig_count=4;
DanAuhust 0:a9143c04e7ef 365 break;
DanAuhust 0:a9143c04e7ef 366 case 4:
DanAuhust 0:a9143c04e7ef 367 emg_value_extensoren = filter(4);
DanAuhust 0:a9143c04e7ef 368 sig_count=1;
DanAuhust 0:a9143c04e7ef 369 break;
DanAuhust 0:a9143c04e7ef 370 }
DanAuhust 0:a9143c04e7ef 371
DanAuhust 0:a9143c04e7ef 372 dy = emg_value_biceps-emg_value_triceps;
DanAuhust 0:a9143c04e7ef 373
DanAuhust 0:a9143c04e7ef 374
DanAuhust 0:a9143c04e7ef 375 /*emg_value_flexoren = (100*filter(3)-44);
DanAuhust 0:a9143c04e7ef 376 emg_value_extensoren = (100*filter(4)-44);*/
DanAuhust 0:a9143c04e7ef 377
DanAuhust 0:a9143c04e7ef 378 /*if(emg_value_biceps < 0.10){
DanAuhust 0:a9143c04e7ef 379 emg_value_biceps=0;
DanAuhust 0:a9143c04e7ef 380 }
DanAuhust 0:a9143c04e7ef 381 else {
DanAuhust 0:a9143c04e7ef 382 emg_value_biceps = emg_value_biceps;
DanAuhust 0:a9143c04e7ef 383 }
DanAuhust 0:a9143c04e7ef 384 if(emg_value_triceps < 0.10){
DanAuhust 0:a9143c04e7ef 385 emg_value_triceps=0;
DanAuhust 0:a9143c04e7ef 386 }
DanAuhust 0:a9143c04e7ef 387 else {
DanAuhust 0:a9143c04e7ef 388 emg_value_triceps=emg_value_triceps;
DanAuhust 0:a9143c04e7ef 389 }
DanAuhust 0:a9143c04e7ef 390 */
DanAuhust 0:a9143c04e7ef 391 dy = emg_value_biceps-emg_value_triceps;
DanAuhust 0:a9143c04e7ef 392 if(pc.rxBufferGetSize(0)-pc.rxBufferGetCount() > 30)
DanAuhust 0:a9143c04e7ef 393 pc.printf("%.6f, %.6f, %.6f\n",emg_value_biceps, emg_value_triceps, dy);
DanAuhust 0:a9143c04e7ef 394 /**When not using the LED, the above could also have been done this way:
DanAuhust 0:a9143c04e7ef 395 * pc.printf("%.6\n", emg0.read());
DanAuhust 0:a9143c04e7ef 396 */
DanAuhust 0:a9143c04e7ef 397 }
DanAuhust 0:a9143c04e7ef 398
DanAuhust 0:a9143c04e7ef 399 int main()
DanAuhust 0:a9143c04e7ef 400 {
DanAuhust 0:a9143c04e7ef 401 /*setup baudrate. Choose the same in your program on PC side*/
DanAuhust 0:a9143c04e7ef 402 pc.baud(115200);
DanAuhust 0:a9143c04e7ef 403 /*set the period for the PWM to the red LED*/
DanAuhust 0:a9143c04e7ef 404 red.period_ms(2);
DanAuhust 0:a9143c04e7ef 405 /**Here you attach the 'void looper(void)' function to the Ticker object
DanAuhust 0:a9143c04e7ef 406 * The looper() function will be called every 0.001 seconds.
DanAuhust 0:a9143c04e7ef 407 * Please mind that the parentheses after looper are omitted when using attach.
DanAuhust 0:a9143c04e7ef 408 */
DanAuhust 0:a9143c04e7ef 409 timer.attach(looper,0.008); //invullen in seconde
DanAuhust 0:a9143c04e7ef 410 while(1) //Loop
DanAuhust 0:a9143c04e7ef 411 {
DanAuhust 0:a9143c04e7ef 412 /*Empty!*/
DanAuhust 0:a9143c04e7ef 413 /*Everything is handled by the interrupt routine now!*/
DanAuhust 0:a9143c04e7ef 414 }
DanAuhust 0:a9143c04e7ef 415 }