test
Dependencies: HIDScope MODSERIAL mbed-dsp mbed
Fork of emg_filter2 by
EMGfilter.cpp
- Committer:
- s1340735
- Date:
- 2014-10-15
- Revision:
- 24:553707c8ebf8
- Parent:
- 23:1c51af8386c9
- Child:
- 25:cfd6db9b4b5d
File content as of revision 24:553707c8ebf8:
#include "mbed.h" #include "HIDScope.h" #include "MODSERIAL.h" #include "arm_math.h" //Define objects AnalogIn emgB(PTB0); //Analog input bicep AnalogIn emgT(PTB1); //Analog input tricep float filtered_emgB; MODSERIAL pc(USBTX,USBRX); HIDScope scope(2);//WHAT IS THIS arm_biquad_casd_df1_inst_f32 lowpass; //constants for 50Hz lowpass float lowpass_const[] = {-0.2924 , 0.1085 , 0 , 0.5587 , 0.2573};//{a1 a2 b0 b1 b2} normalized coefficients (a0=1) //state values float lowpass_states[4];//WHAT IS THIS arm_biquad_casd_df1_inst_f32 highpass; //constants for 10Hz highpass float highpass_const[] = {-1.562, 0.6413, 1, -1.958 , 0.9576};//{a1 a2 b0 b1 b2} normalized coefficients (a0=1) //state values float highpass_states[4];//WHAT IS THIS /** Looper function * functions used for Ticker and Timeout should be of type void <name>(void) * i.e. no input arguments, no output arguments. * if you want to change a variable that you use in other places (for example in main) * you will have to make that variable global in order to be able to reach it both from * the function called at interrupt time, and in the main function. * To make a variable global, define it under the includes. * variables that are changed in the interrupt routine (written to) should be made * 'volatile' to let the compiler know that those values may change outside the current context. * i.e.: "volatile uint16_t emg_value;" instead of "uint16_t emg_value" * in the example below, the variable is not re-used in the main function, and is thus declared * local in the looper function only. **/ //BICEP EMG LEZEN void looperB() { /*variable to store value in*/ uint16_t emg_valueB; float emg_value_f32B; /*put raw emg value both in red and in emg_value*/ emg_valueB = emgB.read_u16(); // read direct ADC result, converted to 16 bit integer (0..2^16 = 0..65536 = 0..3.3V) emg_value_f32B = emgB.read(); //process emg arm_biquad_cascade_df1_f32(&highpass, &emg_value_f32B, &filtered_emgB, 1 ); filtered_emgB = fabs(filtered_emgB); arm_biquad_cascade_df1_f32(&lowpass, &filtered_emgB, &filtered_emgB, 1 ); /*send value to PC. */ scope.set(0,emg_valueB); //uint value scope.set(1,filtered_emgB); //processed float scope.send(); } void looperT() { /*variable to store value in*/ uint16_t emg_valueT; float filtered_emgT; float emg_value_f32T; /*put raw emg value both in red and in emg_value*/ emg_valueT = emgT.read_u16(); // read direct ADC result, converted to 16 bit integer (0..2^16 = 0..65536 = 0..3.3V) emg_value_f32T = emgT.read(); //process emg arm_biquad_cascade_df1_f32(&highpass, &emg_value_f32T, &filtered_emgT, 1 ); filtered_emgT = fabs(filtered_emgT); arm_biquad_cascade_df1_f32(&lowpass, &filtered_emgT, &filtered_emgT, 1 ); /*send value to PC. */ scope.set(0,emg_valueT); //uint value scope.set(1,filtered_emgT); //processed float scope.send(); } int main() { Ticker log_timer; //set up filters. Use external array for constants arm_biquad_cascade_df1_init_f32(&lowpass,1 , lowpass_const, lowpass_states); arm_biquad_cascade_df1_init_f32(&highpass,1 ,highpass_const, highpass_states); /**Here you attach the 'void looper(void)' function to the Ticker object * The looper() function will be called every 0.01 seconds. * Please mind that the parentheses after looper are omitted when using attach. */ log_timer.attach(looperB, 0.005);//?? log_timer.attach(looperT, 0.005);//?? while(1) { //Loop /*Empty!*/ /*Everything is handled by the interrupt routine now!*/ } } //filtered_emgB //filtered_emgT void Antwoord() { float drempelwaarde=4.99; if (filtered_emgB > drempelwaarde) { int y=1; } else { int y=0; } if (int y=1) { pc.printf("Motor 1 beweegt"); } else { pc.printf("Motor 1 beweegt niet"); } } \\drempelwaarde.....