/* * Copyright 2017, OYMotion Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH * DAMAGE. * */
EMGFilters myFilter; // discrete filters must works with fixed sample frequence // our emg filter only support "SAMPLE_FREQ_500HZ" or "SAMPLE_FREQ_1000HZ" // other sampleRate inputs will bypass all the EMG_FILTER int sampleRate = SAMPLE_FREQ_1000HZ; // For countries where power transmission is at 50 Hz // For countries where power transmission is at 60 Hz, need to change to // "NOTCH_FREQ_60HZ" // our emg filter only support 50Hz and 60Hz input // other inputs will bypass all the EMG_FILTER int humFreq = NOTCH_FREQ_50HZ;
// Calibration: // put on the sensors, and release your muscles; // wait a few seconds, and select the max value as the threshold; // any value under threshold will be set to zero staticint Threshold = 0;
// setup for time cost measure // using micros() timeBudget = 1e6 / sampleRate; // micros will overflow and auto return to zero every 70 minutes }
voidloop(){ /* add main program code here */ // In order to make sure the ADC sample frequence on arduino, // the time cost should be measured each loop /*------------start here-------------------*/ timeStamp = micros();
int Value = analogRead(SensorInputPin);
// filter processing int DataAfterFilter = myFilter.update(Value);
int envlope = sq(DataAfterFilter); // any value under threshold will be set to zero envlope = (envlope > Threshold) ? envlope : 0;
timeStamp = micros() - timeStamp; if (TIMING_DEBUG) { // Serial.print("Read Data: "); Serial.println(Value); // Serial.print("Filtered Data: ");Serial.println(DataAfterFilter); Serial.print("Squared Data: "); Serial.println(envlope); // Serial.print("Filters cost time: "); Serial.println(timeStamp); // the filter cost average around 520 us }
/*------------end here---------------------*/ // if less than timeBudget, then you still have (timeBudget - timeStamp) to // do your work delayMicroseconds(500); // if more than timeBudget, the sample rate need to reduce to // SAMPLE_FREQ_500HZ }