#ifndef __BMI088_H__ // 防止重复包含 #define __BMI088_H__ #include "bsp_spi.h" #include "bsp_gpio.h" #include "controller.h" #include "bsp_pwm.h" #include "stdint.h" // bmi088工作模式枚举 typedef enum { BMI088_BLOCK_PERIODIC_MODE = 0, // 阻塞模式,周期性读取 BMI088_BLOCK_TRIGGER_MODE, // 阻塞模式,触发读取(中断) } BMI088_Work_Mode_e; // bmi088标定方式枚举,若使用预设标定参数,注意修改预设参数 typedef enum { BMI088_CALIBRATE_ONLINE_MODE = 0, // 初始化时进行标定 BMI088_LOAD_PRE_CALI_MODE, // 使用预设标定参数, } BMI088_Calibrate_Mode_e; #pragma pack(1) // 1字节对齐 /* BMI088数据*/ typedef struct { float gyro[3]; // 陀螺仪数据,xyz float acc[3]; // 加速度计数据,xyz float temperature; // 温度 // uint32_t timestamp; // 时间戳 // uint32_t count; } BMI088_Data_t; #pragma pack() // 恢复默认对齐,需要传输的结构体务必开启1字节对齐 /* BMI088实例结构体定义 */ typedef struct { // 传输模式和工作模式控制 BMI088_Work_Mode_e work_mode; BMI088_Calibrate_Mode_e cali_mode; // SPI接口 SPIInstance *spi_gyro; // 注意,SPIInstnace内部也有一个GPIOInstance,用于控制片选CS SPIInstance *spi_acc; // 注意,SPIInstnace内部也有一个GPIOInstance,用于控制片选CS // EXTI GPIO,如果BMI088工作在中断模式,则需要配置中断引脚(有数据产生时触发解算) GPIOInstance *gyro_int; GPIOInstance *acc_int; // 温度控制 PIDInstance *heat_pid; // 恒温PID PWMInstance *heat_pwm; // 加热PWM // IMU数据 float gyro[3]; // 陀螺仪数据,xyz float acc[3]; // 加速度计数据,xyz float temperature; // 温度 // 标定数据 float gyro_offset[3]; // 陀螺仪零偏 float gNorm; // 重力加速度模长,从标定获取 float acc_coef; // 加速度计原始数据转换系数 // 传感器灵敏度,用于计算实际值(regNdef.h中定义) float BMI088_ACCELL_SEN; float BMI088_GYRO_SEN; // 用于计算两次采样的时间间隔 uint32_t bias_dwt_cnt; // 数据更新标志位 struct // 位域,节省空间提高可读性 { uint8_t gyro : 1; // 1:有新数据,0:无新数据 uint8_t acc : 1; uint8_t temp : 1; uint8_t gyro_overrun : 1; // 1:数据溢出,0:无溢出 uint8_t acc_overrun : 1; uint8_t temp_overrun : 1; uint8_t imu_ready : 1; // 1:IMU数据准备好,0:IMU数据未准备好(gyro+acc) // 后续可添加其他标志位 } update_flag; } BMI088Instance; /* BMI088初始化配置 */ typedef struct { SPI_Init_Config_s spi_gyro_config; SPI_Init_Config_s spi_acc_config; GPIO_Init_Config_s gyro_int_config; GPIO_Init_Config_s acc_int_config; BMI088_Work_Mode_e work_mode; BMI088_Calibrate_Mode_e cali_mode; PID_Init_Config_s heat_pid_config; PWM_Init_Config_s heat_pwm_config; } BMI088_Init_Config_s; /** * @brief 初始化BMI088,返回BMI088实例指针 * @note 一般一个开发板只有一个BMI088,所以这里就叫BMI088Init而不是Register * * @param config bmi088初始化配置 * @return BMI088Instance* 实例指针 */ BMI088Instance *BMI088Register(BMI088_Init_Config_s *config); /** * @brief 读取BMI088数据 * @todo 7个float数据开销较大,后续考虑使用DMA或双缓冲区直接传递指针 * @param bmi088 BMI088实例指针 * @return BMI088_Data_t 读取到的数据 */ BMI088_Data_t BMI088Acquire(BMI088Instance *bmi088); #endif // !__BMI088_H__