Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: HIDScope MODSERIAL mbed-dsp mbed
Fork of emg_filter2 by
Revision 22:dc630dbb1dcd, committed 2014-10-10
- Comitter:
- s1340735
- Date:
- Fri Oct 10 09:54:49 2014 +0000
- Parent:
- 21:133e9390a42a
- Child:
- 23:1c51af8386c9
- Commit message:
- poging 1 bicep tricep filter
Changed in this revision
| EMGfilter.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/EMGfilter.cpp Fri Oct 10 09:54:49 2014 +0000
@@ -0,0 +1,107 @@
+#include "mbed.h"
+#include "HIDScope.h"
+
+#include "arm_math.h"
+
+//Define objects
+AnalogIn emgB(PTB0); //Analog input bicep
+AnalogIn emgT(PTB1); //Analog input tricep
+
+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 filtered_emgB;
+ 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!*/
+
+
+//filtered_emgB
+//filtered_emgT
+
+ /*Everything is handled by the interrupt routine now!*/
+ }
+}
\ No newline at end of file
