#ifndef __SHAKE_DETECT_H #define __SHAKE_DETECT_H #include #define LIS3DSH_I2C_MASTER_NUM 0 #define LIS3DSH_I2C_SEL_IO 11 // 地址选择 #define LIS3DSH_I2C_MASTER_SDA_IO 12 #define LIS3DSH_I2C_MASTER_SCL_IO 13 #define LIS3DSH_I2C_MASTER_FREQ_HZ 400000 #define LIS3DSH_I2C_SALVE_ADDR_L 0x18 // 7bit地址0b0011000 #define LIS3DSH_I2C_MASTER_TIMEOUT_MS 1000 #define ACK_CHECK_EN 0x1 #define ACK_CHECK_DIS 0x0 #define LIS3DSH_INT1_IO 9 // 数据就绪信号 #define LIS3DSH_CS_IO 10 // SPI I2C模式选择,1-I2C #define LIS3DSH_LED_IO 3 #define BOOT_TIME 10 #define N_SAMPLES 1024 #define ANGLE_N_SAMPLES 128 // 需能整除N_SAMPLES // 三轴加速度,已经过解析,单位g typedef struct { float a[3]; // x,y,z } lis3dsh_a_data_t; typedef struct { int feq_min_id; // 注意,单位并不是HZ,为: 1600/N_SAMPLES HZ int feq_max_id; float enter_amplitude_th; float exit_amplitude_th; uint8_t channel1; // FFT可以同时计算两轴的频谱图,选择[1,2,3]->[x,y,z] uint8_t channel2; uint8_t select; // 选择进行震动检测的是频谱图,选择[1,2,3]->[ch1,ch2,both] } shake_detect_cfg_t; typedef struct { float wind[N_SAMPLES]; float y_cf[N_SAMPLES * 2]; float *y1_cf; float *y2_cf; float sum_y[N_SAMPLES / 2]; int is_shake; } fft_data_t; typedef struct { float x; float y; float z; } angle_data_t; void shake_detect_init(void); void lis3dsh_calculating_angle(float ax, float ay, float az, float *pitch, float *roll, float *yaw); #endif