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