Module 9 Super Team
/
EMG
emg
Fork of EMG by
Diff: main.cpp
- Revision:
- 19:34c129b055b6
- Parent:
- 18:e753220c7ba6
--- a/main.cpp Mon Oct 19 11:44:19 2015 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,81 +0,0 @@ -#include "mbed.h" -#include "HIDScope.h" - -#define MOV_AVG_NUM 100 - -//Define objects -AnalogIn emg(A0); //Analog input -Ticker sample_timer; -HIDScope scope(2); - -double highV[4]; -double lowV[4]; -double lastOutputs[MOV_AVG_NUM-1]; - -double filter(double input, double coeff_input[], double coeff_output[], double prev_outputs[]) -{ - double new_input = input; - for(int i=1; i<5; i++) - new_input -= coeff_input[i] * prev_outputs[i-1]; - - double new_output = coeff_output[0] * new_input; - for(int i=1; i<5; i++) - new_output += coeff_output[i] * prev_outputs[i-1]; - - // Set the new output as the first value of the 'recent outputs' - for(int i = 3; i > 0; i--) - prev_outputs[i] = prev_outputs[i-1]; - prev_outputs[0] = new_input; - return new_output; -} - -double fh_b[]= {0.7602, -3.0406, 4.5609, -3.0406, 0.7602}; -double fh_a[]= {1, -3.4532, 4.5041, -2.6273, 0.5778}; -double highpass_filter(double u) -{ - return filter(u, fh_a, fh_b, highV); -} - -double fl_b[]= {0.00000658, 0.00002631, 0.00003947, 0.00002631, 0.00000658}; -double fl_a[]= {1.0000, -3.7264, 5.2160, -3.2500, 0.7605}; -double lowpass_filter(double u) -{ - return filter(u, fl_a, fl_b, lowV); -} - -/** Sample function - * this function samples the emg and sends it to HIDScope - **/ -void sample() -{ - double input = emg.read(); - double output1 = highpass_filter(input); - double output2 = fabs(output1); - double output3 = lowpass_filter(output2); - - double tot = output3; - for(int i=0; i<MOV_AVG_NUM-1; i++) { - tot += lastOutputs[i]; - if(i != 0) lastOutputs[i] = lastOutputs[i-1]; - } - lastOutputs[0] = output3; - output3 = tot/MOV_AVG_NUM; - - /* Second, set the sampled emg value in channel zero (the first channel) in the 'HIDScope' variable named 'scope' */ - scope.set(0,input); - scope.set(1,output3); - /* Repeat the step above if required for more channels (channel 0 up to 5 = 6 channels) */ - /* Finally, send all channels to the PC at once */ - scope.send(); -} - -int main() -{ - /**Attach the 'sample' function to the timer 'sample_timer'. - * this ensures that 'sample' is executed every... 0.002 seconds - */ - sample_timer.attach(&sample, 0.002); - - /*empty loop, sample() is executed periodically*/ - while(1) {} -} \ No newline at end of file