esp32_shock/components/lis3dsh/shake_detect.h

104 lines
3.2 KiB
C
Raw Normal View History

2024-04-27 09:15:55 +08:00
#ifndef __SHAKE_DETECT_H
#define __SHAKE_DETECT_H
#include <stdint.h>
#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
2024-04-29 17:35:50 +08:00
#define ACK_CHECK_EN 0x1
#define ACK_CHECK_DIS 0x0
2024-04-27 09:15:55 +08:00
2024-04-29 17:35:50 +08:00
#define LIS3DSH_INT1_IO 9 // 数据就绪信号
#define LIS3DSH_CS_IO 10 // SPI I2C模式选择1-I2C
#define LIS3DSH_LED_IO 3
#define BOOT_TIME 10
2024-04-27 09:15:55 +08:00
2024-04-29 17:35:50 +08:00
#define N_SAMPLES 1024
#define ANGLE_N_SAMPLES 128 // 需能整除N_SAMPLES
2024-04-27 09:15:55 +08:00
2024-04-29 17:35:50 +08:00
#define LIS3DSH_CONFIG_FS_NVS_KAY "l_cfg_fs"
#define LIS3DSH_CONFIG_ODR_NVS_KAY "l_cfg_odr"
#define SHAKE_CONFIG_FMIN_NVS_KAY "s_cfg_fmin"
#define SHAKE_CONFIG_FMAX_NVS_KAY "s_cfg_fmax"
#define SHAKE_CONFIG_INATH_NVS_KAY "s_cfg_inath"
#define SHAKE_CONFIG_OUTATH_NVS_KAY "s_cfg_outath"
#define SHAKE_CONFIG_CH1_NVS_KAY "s_cfg_ch1"
#define SHAKE_CONFIG_CH2_NVS_KAY "s_cfg_ch2"
#define SHAKE_CONFIG_SEL_NVS_KAY "s_cfg_sel"
typedef float fft_type_t;
typedef struct
{
uint8_t fscale; // 寄存器配置的参数
uint8_t odr;
int fscale_v; // 实际值
int odr_v;
} lis3dsh_config_t;
// 三轴加速度,经过单位转换,g
2024-04-27 09:15:55 +08:00
typedef struct
{
2024-04-29 17:35:50 +08:00
fft_type_t a[3]; // x,y,z
} lis3dsh_adata_t;
2024-04-27 09:15:55 +08:00
typedef struct
{
2024-04-29 17:35:50 +08:00
uint16_t feq_min_id; // 注意单位并不是HZ为: 1600/N_SAMPLES HZ
uint16_t feq_max_id;
fft_type_t enter_amplitude_th;
fft_type_t exit_amplitude_th;
2024-04-27 09:15:55 +08:00
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
{
2024-04-29 17:35:50 +08:00
uint16_t count;
uint8_t is_shake;
2024-04-27 09:15:55 +08:00
float wind[N_SAMPLES];
2024-04-29 17:35:50 +08:00
fft_type_t y_cf[N_SAMPLES * 2];
fft_type_t *y1_cf;
fft_type_t *y2_cf;
fft_type_t sum_y[N_SAMPLES / 2];
2024-04-27 09:15:55 +08:00
} fft_data_t;
typedef struct
{
2024-04-29 17:35:50 +08:00
uint16_t count;
2024-04-27 09:15:55 +08:00
float x;
float y;
float z;
} angle_data_t;
2024-04-29 17:35:50 +08:00
extern int buf_r;
extern shake_detect_cfg_t shake_cfg;
extern lis3dsh_adata_t lis3dsh_data[N_SAMPLES * 2];
extern fft_data_t fft_data;
extern angle_data_t angle_data;
void shake_detect_init(void);
void lis3dsh_calculating_angle(float ax, float ay, float az, float *pitch, float *roll, float *yaw);
int lis3dsh_set_fscale(uint8_t fscale);
int lis3dsh_set_odr(uint8_t odr);
uint8_t lis3dsh_get_fscale(void);
uint8_t lis3dsh_get_odr(void);
int lis3dsh_config_restore_default(void);
int lis3dsh_config_nvs_load(void);
int lis3dsh_config_nvs_save(void);
int shake_config_restore_default(void);
int shake_config_nvs_load(void);
int shake_config_nvs_save(void);
2024-04-27 09:15:55 +08:00
#endif