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 mbed MODSERIAL QEI
main.cpp@2:a08bff88216d, 2017-10-13 (annotated)
- Committer:
- poephoofd
- Date:
- Fri Oct 13 10:16:31 2017 +0000
- Revision:
- 2:a08bff88216d
- Parent:
- 1:50ae89200a53
- Child:
- 3:9c5aea210f1d
Code Compiles now
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
poephoofd | 0:2d9dae739559 | 1 | #include "mbed.h" |
poephoofd | 2:a08bff88216d | 2 | #include"BiQuad.h" |
poephoofd | 0:2d9dae739559 | 3 | #include "HIDScope.h" |
poephoofd | 2:a08bff88216d | 4 | #include "MODSERIAL.h" |
poephoofd | 0:2d9dae739559 | 5 | |
poephoofd | 0:2d9dae739559 | 6 | //Initialize Analog EMG inputs |
poephoofd | 0:2d9dae739559 | 7 | AnalogIn EMGData_1( A0 ); |
poephoofd | 0:2d9dae739559 | 8 | AnalogIn EMGData_2( A1 ); |
poephoofd | 0:2d9dae739559 | 9 | AnalogIn EMGData_3( A2 ); |
poephoofd | 0:2d9dae739559 | 10 | |
poephoofd | 1:50ae89200a53 | 11 | HIDScope scope(4); // 4 channels of data |
poephoofd | 0:2d9dae739559 | 12 | Ticker MainTicker; |
poephoofd | 0:2d9dae739559 | 13 | MODSERIAL pc(USBTX, USBRX); |
poephoofd | 0:2d9dae739559 | 14 | |
poephoofd | 0:2d9dae739559 | 15 | const double Ts= 0.002; //fs = 500Hz |
poephoofd | 0:2d9dae739559 | 16 | |
poephoofd | 0:2d9dae739559 | 17 | double EMG_MainsReject_1 = 0; |
poephoofd | 0:2d9dae739559 | 18 | double EMG_MainsReject_2 = 0; |
poephoofd | 2:a08bff88216d | 19 | double EMG_MainsReject_3 = 0; |
poephoofd | 0:2d9dae739559 | 20 | double EMG_Filtered_1 = 0; |
poephoofd | 0:2d9dae739559 | 21 | double EMG_Filtered_2 = 0; |
poephoofd | 0:2d9dae739559 | 22 | double EMG_Filtered_3 = 0; |
poephoofd | 0:2d9dae739559 | 23 | double EMG_Abs_1 = 0; |
poephoofd | 0:2d9dae739559 | 24 | double EMG_Abs_2 = 0; |
poephoofd | 0:2d9dae739559 | 25 | double EMG_Abs_3 = 0; |
poephoofd | 0:2d9dae739559 | 26 | double EMG_Envelope_1 = 0; |
poephoofd | 0:2d9dae739559 | 27 | double EMG_Envelope_2 = 0; |
poephoofd | 0:2d9dae739559 | 28 | double EMG_Envelope_3 = 0; |
poephoofd | 0:2d9dae739559 | 29 | |
poephoofd | 2:a08bff88216d | 30 | //High Pass Filter |
poephoofd | 2:a08bff88216d | 31 | double a_0_0=1, a_0_1=-1.475480443592646, a_0_2=0.586919508061190, |
poephoofd | 2:a08bff88216d | 32 | b_0_0=0.765599987913459, b_0_1=-1.531199975826918, b_0_2=0.765599987913459; |
poephoofd | 0:2d9dae739559 | 33 | |
poephoofd | 2:a08bff88216d | 34 | BiQuad HiPass(b_0_0, b_0_1, b_0_2, a_0_0, a_0_1, a_0_2); |
poephoofd | 2:a08bff88216d | 35 | /***********/ |
poephoofd | 0:2d9dae739559 | 36 | |
poephoofd | 2:a08bff88216d | 37 | //Low Pass Filter |
poephoofd | 2:a08bff88216d | 38 | double a_1_0=1, a_1_1=-1.307285028849324, a_1_2=0.491812237222575, |
poephoofd | 2:a08bff88216d | 39 | b_1_0=0.0009446918438401619, b_1_1=0.001889383687680, b_1_2=0.0009446918438401619; |
poephoofd | 0:2d9dae739559 | 40 | |
poephoofd | 2:a08bff88216d | 41 | BiQuad LoPass(b_1_0, b_1_1, b_1_2, a_1_0, a_1_1, a_1_2); |
poephoofd | 2:a08bff88216d | 42 | /***********/ |
poephoofd | 0:2d9dae739559 | 43 | |
poephoofd | 2:a08bff88216d | 44 | //Notch Filter |
poephoofd | 2:a08bff88216d | 45 | double a_2_0=1, a_2_1=-1.525271192436899, a_2_2=0.881618592363190, |
poephoofd | 2:a08bff88216d | 46 | b_2_0=0.940809296181595, b_2_1=-1.525271192436899, b_2_2=0.940809296181595; |
poephoofd | 2:a08bff88216d | 47 | |
poephoofd | 2:a08bff88216d | 48 | BiQuad MainsReject(b_2_0, b_2_1, b_2_2, a_2_0, a_2_1, a_2_2); |
poephoofd | 2:a08bff88216d | 49 | /***********/ |
poephoofd | 0:2d9dae739559 | 50 | |
poephoofd | 0:2d9dae739559 | 51 | void ReadAndFilterEMG() |
poephoofd | 0:2d9dae739559 | 52 | { |
poephoofd | 0:2d9dae739559 | 53 | //MainsReject Filter EMG Data |
poephoofd | 0:2d9dae739559 | 54 | EMG_MainsReject_1 = MainsReject.step(EMGData_1); |
poephoofd | 0:2d9dae739559 | 55 | EMG_MainsReject_2 = MainsReject.step(EMGData_2); |
poephoofd | 0:2d9dae739559 | 56 | EMG_MainsReject_3 = MainsReject.step(EMGData_3); |
poephoofd | 0:2d9dae739559 | 57 | /*****/ |
poephoofd | 0:2d9dae739559 | 58 | |
poephoofd | 0:2d9dae739559 | 59 | //High Pass Filter EMG Data |
poephoofd | 0:2d9dae739559 | 60 | EMG_Filtered_1 = HiPass.step(EMG_MainsReject_1); |
poephoofd | 0:2d9dae739559 | 61 | EMG_Filtered_2 = HiPass.step(EMG_MainsReject_2); |
poephoofd | 0:2d9dae739559 | 62 | EMG_Filtered_3 = HiPass.step(EMG_MainsReject_3); |
poephoofd | 0:2d9dae739559 | 63 | /*****/ |
poephoofd | 0:2d9dae739559 | 64 | |
poephoofd | 0:2d9dae739559 | 65 | //Abs Filtered EMG Data |
poephoofd | 0:2d9dae739559 | 66 | EMG_Abs_1 = abs(EMG_Filtered_1); |
poephoofd | 0:2d9dae739559 | 67 | EMG_Abs_2 = abs(EMG_Filtered_2); |
poephoofd | 0:2d9dae739559 | 68 | EMG_Abs_3 = abs(EMG_Filtered_3); |
poephoofd | 0:2d9dae739559 | 69 | /*****/ |
poephoofd | 0:2d9dae739559 | 70 | |
poephoofd | 0:2d9dae739559 | 71 | //Low Pass Filter |
poephoofd | 0:2d9dae739559 | 72 | EMG_Envelope_1 = LoPass.step(EMG_Abs_1); |
poephoofd | 0:2d9dae739559 | 73 | EMG_Envelope_2 = LoPass.step(EMG_Abs_2); |
poephoofd | 0:2d9dae739559 | 74 | EMG_Envelope_3 = LoPass.step(EMG_Abs_3); |
poephoofd | 0:2d9dae739559 | 75 | /*****/ |
poephoofd | 0:2d9dae739559 | 76 | |
poephoofd | 0:2d9dae739559 | 77 | //Send scope data |
poephoofd | 1:50ae89200a53 | 78 | scope.set(0, EMGData_1); //Raw Data |
poephoofd | 1:50ae89200a53 | 79 | scope.set(1, EMG_Filtered_1); //Notch and High Pass Filtered |
poephoofd | 1:50ae89200a53 | 80 | scope.set(2, EMG_Abs_1); //Absolute value |
poephoofd | 1:50ae89200a53 | 81 | scope.set(3, EMG_Envelope_1); //Envelope Detected output |
poephoofd | 0:2d9dae739559 | 82 | |
poephoofd | 0:2d9dae739559 | 83 | scope.send(); |
poephoofd | 2:a08bff88216d | 84 | /*****/ |
poephoofd | 2:a08bff88216d | 85 | } |
poephoofd | 2:a08bff88216d | 86 | |
poephoofd | 2:a08bff88216d | 87 | int main(void) |
poephoofd | 2:a08bff88216d | 88 | { |
poephoofd | 2:a08bff88216d | 89 | pc.baud(115200); //Set Baud rate for Serial communication |
poephoofd | 2:a08bff88216d | 90 | MainTicker.attach(&ReadAndFilterEMG, Ts); //Attach time based interrupt |
poephoofd | 0:2d9dae739559 | 91 | |
poephoofd | 2:a08bff88216d | 92 | /* |
poephoofd | 2:a08bff88216d | 93 | while(true) |
poephoofd | 2:a08bff88216d | 94 | { |
poephoofd | 2:a08bff88216d | 95 | |
poephoofd | 2:a08bff88216d | 96 | } |
poephoofd | 2:a08bff88216d | 97 | */ |
poephoofd | 2:a08bff88216d | 98 | |
poephoofd | 2:a08bff88216d | 99 | return 0; |
poephoofd | 0:2d9dae739559 | 100 | } |