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 biquadFilter mbed
Fork of frdm_calibratie_maximum by
Diff: main.cpp
- Revision:
- 0:4d69864f1002
- Child:
- 1:278677bb6b99
diff -r 000000000000 -r 4d69864f1002 main.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Thu Oct 20 20:44:51 2016 +0000
@@ -0,0 +1,229 @@
+#include "mbed.h"
+#include <stdio.h>
+#define SERIAL_BAUD 115200
+
+AnalogIn emg0( A0 );
+AnalogIn emg1( A1 );
+Serial pc(USBTX,USBRX);
+
+//HIDScope scope( 6 );
+
+
+/*int main() {
+ pc.baud(115200);
+ int array[10], maximum, size, c, location = 1;
+
+ for (int i=0;i<10;i++)
+ {
+ double EMGright = emg0.read();
+ EMGright = array[i];
+ }
+
+ printf("Enter the number of elements in array\n");
+ scanf("%d", &size);
+
+ printf("Enter %d integers\n", size);
+
+ for (c = 0; c < size; c++)
+ scanf("%d", &array[c]);
+
+ maximum = array[0];
+
+ for (c = 1; c < size; c++)
+ {
+ if (array[c] > maximum)
+ {
+ maximum = array[c];
+ location = c+1;
+ }
+ }
+
+ printf("Maximum element is present at location %d and it's value is %d.\n", location, maximum);
+ return 0;
+}*/
+/*
+#include "mbed.h"
+#include "HIDScope.h"
+#include "BiQuad.h"
+#include <stdio.h>
+
+//Define objects
+AnalogIn emg0( A0 );
+AnalogIn emg1( A1 );*/
+
+Ticker sample_timer, average_timer, filter_timer, t;
+//HIDScope scope( 6 );
+DigitalOut led1(LED_RED);
+DigitalOut led2(LED_BLUE);
+
+volatile int time_passed = 0;
+volatile bool filter_timer_go=false;
+//average_timer_go=false,
+ // Activates go-flags
+//void average_timer_act(){average_timer_go=true;};
+/*void filter_timer_act(){filter_timer_go=true;};
+
+BiQuadChain bcq;
+// Notch filter wo=50; bw=wo/35
+BiQuad bq1(9.7805e-01,-1.1978e-16,9.7805e-01,1.0000e+00,-1.1978e-16,9.5610e-01);
+// High pass Butterworth filter 2nd order, Fc=10;
+BiQuad bq2(9.8239e-01,-1.9648e+00,9.8239e-01,1.0000e+00,-1.9645e+00,9.6508e-01);
+// Low pass Butterworth filter 2nd order, Fc = 8;
+BiQuad bq3(5.6248e-05,1.1250e-04,5.6248e-05,1.0000e+00,-1.9787e+00,9.7890e-01);
+// Low pass Butterworth filter 4th order, Fc = 450; plited up in 2x2nd order
+BiQuad bq4(1.0000e+00,2.0000e+00,1.0000e+00,1.0000e+00,-4.6382e-01,8.9354e-02);
+BiQuad bq5(1.0000e+00,2.0000e+00,1.0000e+00,1.0000e+00,-6.3254e-01,4.8559e-01);*/
+
+void KeepTrackOfTime()
+{
+ time_passed++;
+}
+
+/*void sample()
+{
+ scope.set(0, emg0.read() );
+ scope.set(1, emg1.read() );
+
+ scope.send();
+
+ led1 = 0;
+ wait(0.5f);
+ led1 = 1;
+ wait(0.5f);
+}*/
+
+// In the following: R is used for right arm, L is used for left arm!
+/*void FilteredSample()
+{
+ double inR = emg0.read();
+ double inL = emg1.read();
+ //double inLcal = inL-averageL(sumL,size);
+ double outRnotch = bq1.step(inR);
+ double outRhigh = bq2.step(outRnotch);
+ double outRrect = fabs(outRhigh);
+ double outRlow = bcq.step(outRrect);
+ double outLnotch = bq1.step(inL);
+ double outLhigh = bq2.step(outLnotch);
+ double outLrect = fabs(outLhigh);
+ double outLlow = bcq.step(outLrect);
+
+ scope.set(0, inR);
+ scope.set(1, inL);
+ scope.set(2, outRlow);
+ scope.set(3, outLlow);
+
+
+ scope.send();
+ // To indicate that the function is working, the LED is toggled
+ led2 = !led2;
+}*/
+
+
+/*
+void average(double averageR, double averageL)
+{
+ int averageR(int,int);
+ int averageL(int,int);
+ int size = 5000; //10/0.002
+ int arrayR[size]; //declaring array
+ int arrayL[size];
+ int sumR = 0;
+ int sumL = 0;
+
+ for (int i=0;i<size;i++)
+ {
+ double EMGright = emg0.read();
+ double EMGleft = emg1.read();
+ EMGright = arrayR[i];
+ EMGleft = arrayL[i];
+ sumL = sumL+arrayR[i];
+ sumR=sumR+arrayR[i];
+ //double averageR = sumR/arrayR;
+ //double averageL = sumL/arrayL;
+ }
+ return averageR=sumR/sizeR;
+ return averageL(sumL,sizeL);*/
+
+double averageR(int sumR, int size)
+{
+ return (double) sumR/size;
+}
+
+double averageL(int sumL, int size)
+{
+ return (double) sumL/size;
+}
+
+
+int main()
+{
+ pc.baud(115200);
+ led1=1;
+ led2=1;
+ t.attach(&KeepTrackOfTime,1.0); //taking the time in seconds
+
+ for (;;) {
+ if (time_passed<=30)
+ {
+ led1 =!led1;
+ wait(0.5f);//sample_timer.attach(&sample, 0.002); //500Hz
+
+ double averageR(int,int);
+ double averageL(int,int);
+ int size = 500; //10/0.002
+ int arrayR[size]; //declaring array
+ int arrayL[size];
+ int sumR = 0;
+ int sumL = 0;
+ double EMGright = emg0.read();
+ double EMGleft = emg1.read();
+
+ for (int i=0;i<size;i++)
+ {
+ EMGright = arrayR[i];
+ EMGleft = arrayL[i];
+ sumL = sumL+arrayR[i];
+ sumR = sumR+arrayR[i];
+ }
+ // Calibration step with the gained averages
+ //double CalibrationFactorR = 0.5/averageR(sumR,size);
+ //double CalibrationFactorL = 0.5/averageL(sumL,size);
+ double averageEMGr = sumR/size;
+ double averageEMGl = sumL/size;
+ double InRcal = emg0.read()-averageR(sumR,size);
+ double InLcal = emg1.read()-averageL(sumL,size);
+
+ /*scope.set(0, emg0.read() );
+ scope.set(1, 1 );
+ scope.set(2, averageEMGr);
+ scope.set(3, averageL(sumL,size));
+ scope.set(5, InRcal );
+ scope.set(6, InLcal );
+
+ scope.send();*/
+ pc.printf("EMG-signal = %f\n\r",emg0.read());
+ pc.printf("averageR = %f\n\r",averageEMGr);
+ pc.printf("averageRvoid = %f\n\r",averageR(sumR,size));
+ pc.printf("Detrend EMG = %f\n\r",InRcal);
+ }
+
+ else
+ {
+
+ led1 = 1;
+ led2=!led2;
+
+ /*bcq.add(&bq3).add(&bq4).add(&bq5);
+
+ filter_timer.attach(&filter_timer_act, 0.0004); //2500Hz (same as with filter coefficients on matlab!!! Thus adjust!)
+
+ while(1)
+ {
+ if (filter_timer_go){
+ filter_timer_go=false;
+ FilteredSample();}
+ }*/
+
+ }
+}
+}
\ No newline at end of file
