a
Dependencies: X_NUCLEO_IKS01A1 mbed
Fork of HelloWorld_IKS01A1 by
Revision 11:4a74fda2b9b7, committed 2017-05-22
- Comitter:
- rendek4
- Date:
- Mon May 22 18:42:40 2017 +0000
- Parent:
- 10:211cd9c27d5e
- Commit message:
- qqq
Changed in this revision
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
diff -r 211cd9c27d5e -r 4a74fda2b9b7 main.cpp --- a/main.cpp Fri Mar 24 10:14:11 2017 +0000 +++ b/main.cpp Mon May 22 18:42:40 2017 +0000 @@ -4,7 +4,7 @@ * @author AST / EST * @version V0.0.1 * @date 14-August-2015 - * @brief Simple Example application for using the X_NUCLEO_IKS01A1 + * @brief Simple Example application for using the X_NUCLEO_IKS01A1 * MEMS Inertial & Environmental Sensor Nucleo expansion board. ****************************************************************************** * @attention @@ -34,7 +34,7 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** -*/ +*/ /* Includes */ #include "mbed.h" @@ -52,83 +52,188 @@ static TempSensor *temp_sensor1 = mems_expansion_board->ht_sensor; static TempSensor *temp_sensor2 = mems_expansion_board->pt_sensor; +double pX; + /* Helper function for printing floats & doubles */ static char *printDouble(char* str, double v, int decimalDigits=2) { - int i = 1; - int intPart, fractPart; - int len; - char *ptr; + int i = 1; + int intPart, fractPart; + int len; + char *ptr; + + /* prepare decimal digits multiplicator */ + for (; decimalDigits!=0; i*=10, decimalDigits--); + + /* calculate integer & fractinal parts */ + intPart = (int)v; + fractPart = (int)((v-(double)(int)v)*i); - /* prepare decimal digits multiplicator */ - for (;decimalDigits!=0; i*=10, decimalDigits--); + /* fill in integer part */ + sprintf(str, "%i.", intPart); + + /* prepare fill in of fractional part */ + len = strlen(str); + ptr = &str[len]; - /* calculate integer & fractinal parts */ - intPart = (int)v; - fractPart = (int)((v-(double)(int)v)*i); + /* fill in leading fractional zeros */ + for (i/=10; i>1; i/=10, ptr++) { + if(fractPart >= i) break; + *ptr = '0'; + } - /* fill in integer part */ - sprintf(str, "%i.", intPart); + /* fill in (rest of) fractional part */ + sprintf(ptr, "%i", fractPart); - /* prepare fill in of fractional part */ - len = strlen(str); - ptr = &str[len]; + return str; +} + +double dolno (double data) +{ + float Fc=0.1; + float alfa=0.1; + double x= (1- alfa) *pX+alfa*data; + pX=x; + return x; + + - /* fill in leading fractional zeros */ - for (i/=10;i>1; i/=10, ptr++) { - if(fractPart >= i) break; - *ptr = '0'; - } +} +double pasmo (double in) +{ + double hc = 0.02; + double lc = 0.7; + double lk = 0; + double hk = 0; + double out; + lk = lk + lc * (in - lk); + hk = hk + hc * (lk - hk); + out = lk - hk; - /* fill in (rest of) fractional part */ - sprintf(ptr, "%i", fractPart); - return str; + return out; } /* Simple main function */ -int main() { - uint8_t id; - float value1, value2; - char buffer1[32], buffer2[32]; - int32_t axes[3]; - - printf("\r\n--- Starting new run ---\r\n"); +int main() +{ + uint8_t id; + float value1, value2; + char buffer1[32], buffer2[32]; + + + printf("\r\n--- Starting new run ---\r\n"); + + humidity_sensor->read_id(&id); + printf("HTS221 humidity & temperature = 0x%X\r\n", id); + + wait(3); + + while(1) { + //printf("\r\n"); + + temp_sensor1->get_temperature(&value1); + humidity_sensor->get_humidity(&value2); + printf("%s%;\t",printDouble(buffer2, value2)); + // printf("\r\n"); + double filtered=dolno(value2); + printf( "%6.5lf;\t", filtered ); + double p=pasmo(value2); + printf( "%6.5lf\r\n", p ); - humidity_sensor->read_id(&id); - printf("HTS221 humidity & temperature = 0x%X\r\n", id); - pressure_sensor->read_id(&id); - printf("LPS25H pressure & temperature = 0x%X\r\n", id); - magnetometer->read_id(&id); - printf("LIS3MDL magnetometer = 0x%X\r\n", id); - gyroscope->read_id(&id); - printf("LSM6DS0 accelerometer & gyroscope = 0x%X\r\n", id); - - wait(3); - - while(1) { - printf("\r\n"); + wait(0.5); + } +} + +/////////////////////////////////////////////////////////////////////////////////////// +/* +#include <iostream> +#include <cmath> +#include <iomanip> + +using namespace std; + +void createFilter(double gKernel[][5]) +{ + // set standard deviation to 1.0 + double sigma = 1.0; + double r, s = 2.0 * sigma * sigma; + + // sum is for normalization + double sum = 0.0; + + // generate 5x5 kernel + for (int x = -2; x <= 2; x++) + { + for(int y = -2; y <= 2; y++) + { + r = sqrt(x*x + y*y); + gKernel[x + 2][y + 2] = (exp(-(r*r)/s))/(M_PI * s); + sum += gKernel[x + 2][y + 2]; + } + } - temp_sensor1->get_temperature(&value1); - humidity_sensor->get_humidity(&value2); - printf("HTS221: [temp] %7s°C, [hum] %s%%\r\n", printDouble(buffer1, value1), printDouble(buffer2, value2)); - - temp_sensor2->get_fahrenheit(&value1); - pressure_sensor->get_pressure(&value2); - printf("LPS25H: [temp] %7s°F, [press] %smbar\r\n", printDouble(buffer1, value1), printDouble(buffer2, value2)); + // normalize the Kernel + for(int i = 0; i < 5; ++i) + for(int j = 0; j < 5; ++j) + gKernel[i][j] /= sum; + +} - printf("---\r\n"); +int main() +{ + double gKernel[5][5]; + createFilter(gKernel); + for(int i = 0; i < 5; ++i) + { + for (int j = 0; j < 5; ++j) + cout<<gKernel[i][j]<<"\t"; + cout<<endl; + } +} +*/ + + + + +/* Thanks, that's obvious after reading it :) The high pass filter is just +the input minus the output of the low pass filter. + +What I really need is a bandpass filter. I've combined the two filters like +this: - magnetometer->get_m_axes(axes); - printf("LIS3MDL [mag/mgauss]: %7ld, %7ld, %7ld\r\n", axes[0], axes[1], axes[2]); - - accelerometer->get_x_axes(axes); - printf("LSM6DS0 [acc/mg]: %7ld, %7ld, %7ld\r\n", axes[0], axes[1], axes[2]); +hc = 0.02; +lc = 0.4; +lk = 0; +hk = 0; +loop { +in = nextSensorValue(); +lk = lk + lc * (in - lk); +hk = hk + hc * (lk - hk); +out = lk - hk; +writeOut(out); +} - gyroscope->get_g_axes(axes); - printf("LSM6DS0 [gyro/mdps]: %7ld, %7ld, %7ld\r\n", axes[0], axes[1], axes[2]); +This is already very simple and looks like it does what I want, but I +wonder if I can reduce the number of multiplications and additions even +further, because I want to implement it on a microcontroller, with the +additional complication that it doesn't support floating points. But I +think I can convert it to fixed point math. */ + + + +//highpass - wait(1.5); - } -} +/*Sure... +x(k+1) = (1-c)*x(k) + c*u(k) +y(k) = u(k) - x(k) +c sets the cutoff frequency. There's a zero at z=1 and a pole at z=1- +c. +u(k) is the input; y(k) the output. x is a variable internal to the +filter. +Note that x(k) by itself as an output is just a low-pass function. +This is a first-order filter. */ + + +