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@3:9c5aea210f1d, 2017-10-16 (annotated)
- Committer:
- poephoofd
- Date:
- Mon Oct 16 08:01:54 2017 +0000
- Revision:
- 3:9c5aea210f1d
- Parent:
- 2:a08bff88216d
- Child:
- 5:4c27dea81e4c
New Version, added channel 4. Volatile doubles.
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 | 3:9c5aea210f1d | 10 | AnalogIn EMGData_4( A3 ); |
poephoofd | 0:2d9dae739559 | 11 | |
poephoofd | 1:50ae89200a53 | 12 | HIDScope scope(4); // 4 channels of data |
poephoofd | 0:2d9dae739559 | 13 | Ticker MainTicker; |
poephoofd | 0:2d9dae739559 | 14 | MODSERIAL pc(USBTX, USBRX); |
poephoofd | 0:2d9dae739559 | 15 | |
poephoofd | 0:2d9dae739559 | 16 | const double Ts= 0.002; //fs = 500Hz |
poephoofd | 0:2d9dae739559 | 17 | |
poephoofd | 3:9c5aea210f1d | 18 | volatile double EMG_MainsReject_1 = 0; |
poephoofd | 3:9c5aea210f1d | 19 | volatile double EMG_MainsReject_2 = 0; |
poephoofd | 3:9c5aea210f1d | 20 | volatile double EMG_MainsReject_3 = 0; |
poephoofd | 3:9c5aea210f1d | 21 | volatile double EMG_MainsReject_4 = 0; |
poephoofd | 3:9c5aea210f1d | 22 | |
poephoofd | 3:9c5aea210f1d | 23 | volatile double EMG_Filtered_1 = 0; |
poephoofd | 3:9c5aea210f1d | 24 | volatile double EMG_Filtered_2 = 0; |
poephoofd | 3:9c5aea210f1d | 25 | volatile double EMG_Filtered_3 = 0; |
poephoofd | 3:9c5aea210f1d | 26 | volatile double EMG_Filtered_4 = 0; |
poephoofd | 3:9c5aea210f1d | 27 | |
poephoofd | 3:9c5aea210f1d | 28 | volatile double EMG_Abs_1 = 0; |
poephoofd | 3:9c5aea210f1d | 29 | volatile double EMG_Abs_2 = 0; |
poephoofd | 3:9c5aea210f1d | 30 | volatile double EMG_Abs_3 = 0; |
poephoofd | 3:9c5aea210f1d | 31 | volatile double EMG_Abs_4 = 0; |
poephoofd | 3:9c5aea210f1d | 32 | |
poephoofd | 3:9c5aea210f1d | 33 | volatile double EMG_Envelope_1 = 0; |
poephoofd | 3:9c5aea210f1d | 34 | volatile double EMG_Envelope_2 = 0; |
poephoofd | 3:9c5aea210f1d | 35 | volatile double EMG_Envelope_3 = 0; |
poephoofd | 3:9c5aea210f1d | 36 | volatile double EMG_Envelope_4 = 0; |
poephoofd | 0:2d9dae739559 | 37 | |
poephoofd | 2:a08bff88216d | 38 | //High Pass Filter |
poephoofd | 2:a08bff88216d | 39 | double a_0_0=1, a_0_1=-1.475480443592646, a_0_2=0.586919508061190, |
poephoofd | 2:a08bff88216d | 40 | b_0_0=0.765599987913459, b_0_1=-1.531199975826918, b_0_2=0.765599987913459; |
poephoofd | 0:2d9dae739559 | 41 | |
poephoofd | 2:a08bff88216d | 42 | BiQuad HiPass(b_0_0, b_0_1, b_0_2, a_0_0, a_0_1, a_0_2); |
poephoofd | 2:a08bff88216d | 43 | /***********/ |
poephoofd | 0:2d9dae739559 | 44 | |
poephoofd | 2:a08bff88216d | 45 | //Low Pass Filter |
poephoofd | 2:a08bff88216d | 46 | double a_1_0=1, a_1_1=-1.307285028849324, a_1_2=0.491812237222575, |
poephoofd | 2:a08bff88216d | 47 | b_1_0=0.0009446918438401619, b_1_1=0.001889383687680, b_1_2=0.0009446918438401619; |
poephoofd | 0:2d9dae739559 | 48 | |
poephoofd | 2:a08bff88216d | 49 | BiQuad LoPass(b_1_0, b_1_1, b_1_2, a_1_0, a_1_1, a_1_2); |
poephoofd | 2:a08bff88216d | 50 | /***********/ |
poephoofd | 0:2d9dae739559 | 51 | |
poephoofd | 2:a08bff88216d | 52 | //Notch Filter |
poephoofd | 2:a08bff88216d | 53 | double a_2_0=1, a_2_1=-1.525271192436899, a_2_2=0.881618592363190, |
poephoofd | 2:a08bff88216d | 54 | b_2_0=0.940809296181595, b_2_1=-1.525271192436899, b_2_2=0.940809296181595; |
poephoofd | 2:a08bff88216d | 55 | |
poephoofd | 2:a08bff88216d | 56 | BiQuad MainsReject(b_2_0, b_2_1, b_2_2, a_2_0, a_2_1, a_2_2); |
poephoofd | 2:a08bff88216d | 57 | /***********/ |
poephoofd | 0:2d9dae739559 | 58 | |
poephoofd | 0:2d9dae739559 | 59 | void ReadAndFilterEMG() |
poephoofd | 0:2d9dae739559 | 60 | { |
poephoofd | 0:2d9dae739559 | 61 | //MainsReject Filter EMG Data |
poephoofd | 0:2d9dae739559 | 62 | EMG_MainsReject_1 = MainsReject.step(EMGData_1); |
poephoofd | 0:2d9dae739559 | 63 | EMG_MainsReject_2 = MainsReject.step(EMGData_2); |
poephoofd | 0:2d9dae739559 | 64 | EMG_MainsReject_3 = MainsReject.step(EMGData_3); |
poephoofd | 3:9c5aea210f1d | 65 | EMG_MainsReject_4 = MainsReject.step(EMGData_4); |
poephoofd | 0:2d9dae739559 | 66 | /*****/ |
poephoofd | 0:2d9dae739559 | 67 | |
poephoofd | 0:2d9dae739559 | 68 | //High Pass Filter EMG Data |
poephoofd | 0:2d9dae739559 | 69 | EMG_Filtered_1 = HiPass.step(EMG_MainsReject_1); |
poephoofd | 0:2d9dae739559 | 70 | EMG_Filtered_2 = HiPass.step(EMG_MainsReject_2); |
poephoofd | 0:2d9dae739559 | 71 | EMG_Filtered_3 = HiPass.step(EMG_MainsReject_3); |
poephoofd | 3:9c5aea210f1d | 72 | EMG_Filtered_4 = HiPass.step(EMG_MainsReject_4); |
poephoofd | 0:2d9dae739559 | 73 | /*****/ |
poephoofd | 0:2d9dae739559 | 74 | |
poephoofd | 0:2d9dae739559 | 75 | //Abs Filtered EMG Data |
poephoofd | 0:2d9dae739559 | 76 | EMG_Abs_1 = abs(EMG_Filtered_1); |
poephoofd | 0:2d9dae739559 | 77 | EMG_Abs_2 = abs(EMG_Filtered_2); |
poephoofd | 0:2d9dae739559 | 78 | EMG_Abs_3 = abs(EMG_Filtered_3); |
poephoofd | 3:9c5aea210f1d | 79 | EMG_Abs_4 = abs(EMG_Filtered_4); |
poephoofd | 0:2d9dae739559 | 80 | /*****/ |
poephoofd | 0:2d9dae739559 | 81 | |
poephoofd | 0:2d9dae739559 | 82 | //Low Pass Filter |
poephoofd | 0:2d9dae739559 | 83 | EMG_Envelope_1 = LoPass.step(EMG_Abs_1); |
poephoofd | 0:2d9dae739559 | 84 | EMG_Envelope_2 = LoPass.step(EMG_Abs_2); |
poephoofd | 0:2d9dae739559 | 85 | EMG_Envelope_3 = LoPass.step(EMG_Abs_3); |
poephoofd | 3:9c5aea210f1d | 86 | EMG_Envelope_4 = LoPass.step(EMG_Abs_4); |
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 | 2:a08bff88216d | 96 | /*****/ |
poephoofd | 2:a08bff88216d | 97 | } |
poephoofd | 2:a08bff88216d | 98 | |
poephoofd | 2:a08bff88216d | 99 | int main(void) |
poephoofd | 2:a08bff88216d | 100 | { |
poephoofd | 2:a08bff88216d | 101 | pc.baud(115200); //Set Baud rate for Serial communication |
poephoofd | 2:a08bff88216d | 102 | MainTicker.attach(&ReadAndFilterEMG, Ts); //Attach time based interrupt |
poephoofd | 0:2d9dae739559 | 103 | |
poephoofd | 2:a08bff88216d | 104 | /* |
poephoofd | 2:a08bff88216d | 105 | while(true) |
poephoofd | 2:a08bff88216d | 106 | { |
poephoofd | 2:a08bff88216d | 107 | |
poephoofd | 2:a08bff88216d | 108 | } |
poephoofd | 2:a08bff88216d | 109 | */ |
poephoofd | 2:a08bff88216d | 110 | |
poephoofd | 2:a08bff88216d | 111 | return 0; |
poephoofd | 0:2d9dae739559 | 112 | } |