首次提交

This commit is contained in:
2026-05-17 21:07:34 +08:00
commit bc5bd0c72e
1493 changed files with 1059050 additions and 0 deletions

151
A-Driver/BMI088driver.h Normal file
View File

@@ -0,0 +1,151 @@
#ifndef BMI088DRIVER_H
#define BMI088DRIVER_H
#include <stdint.h>
#include "main.h" // 包含 HAL 库等基础定义
// 温度计算参数(来自 BMI088 数据手册)
#define BMI088_TEMP_FACTOR 0.125f // 温度分辨率0.125°C/LSB
#define BMI088_TEMP_OFFSET 23.0f // 温度偏移0 LSB 对应 23°C
// 配置寄存器数量(用于初始化校验)
#define BMI088_WRITE_ACCEL_REG_NUM 6 // 加速度计需配置的寄存器个数
#define BMI088_WRITE_GYRO_REG_NUM 6 // 陀螺仪需配置的寄存器个数
// 数据就绪状态位(用于多传感器同步)
#define BMI088_GYRO_DATA_READY_BIT 0 // 陀螺仪数据就绪标志位
#define BMI088_ACCEL_DATA_READY_BIT 1 // 加速度计数据就绪标志位
#define BMI088_ACCEL_TEMP_DATA_READY_BIT 2 // 加速度计温度数据就绪标志位
// 延时参数(单位:毫秒 / 微秒)
#define BMI088_LONG_DELAY_TIME 80 // 软件复位后所需长延时ms
#define BMI088_COM_WAIT_SENSOR_TIME 150 // 寄存器写入后等待传感器响应时间us
// I²C 地址(实际使用 SPI此处可能为遗留定义或备用
// 注意BMI088 通常通过 SPI 通信I²C 地址在此驱动中未使用
#define BMI088_ACCEL_IIC_ADDRESSE (0x18 << 1) // 加速度计 I²C 地址7-bit 左移1位
#define BMI088_GYRO_IIC_ADDRESSE (0x68 << 1) // 陀螺仪 I²C 地址
// 量程选择(取消注释以切换量程,当前启用 3G / 2000°/s
// 注意灵敏度SEN必须与量程匹配
#define BMI088_ACCEL_RANGE_3G
// #define BMI088_ACCEL_RANGE_6G
// #define BMI088_ACCEL_RANGE_12G
// #define BMI088_ACCEL_RANGE_24G
#define BMI088_GYRO_RANGE_2000
// #define BMI088_GYRO_RANGE_1000
// #define BMI088_GYRO_RANGE_500
// #define BMI088_GYRO_RANGE_250
// #define BMI088_GYRO_RANGE_125
// 灵敏度系数单位转换LSB → 物理单位)
// 根据所选量程自动使用对应的 SEN 值
// - 加速度单位m/s² (注意:部分系统用 g需确认
// - 角速度单位rad/s (若需 °/s需额外转换
// 加速度计灵敏度m/s² per LSB
#define BMI088_ACCEL_3G_SEN 0.0008974358974f // ±3g 量程
#define BMI088_ACCEL_6G_SEN 0.00179443359375f // ±6g
#define BMI088_ACCEL_12G_SEN 0.0035888671875f // ±12g
#define BMI088_ACCEL_24G_SEN 0.007177734375f // ±24g
// 陀螺仪灵敏度rad/s per LSB
#define BMI088_GYRO_2000_SEN 0.00106526443603169529841533860381f // ±2000°/s
#define BMI088_GYRO_1000_SEN 0.00053263221801584764920766930190693f // ±1000°/s
#define BMI088_GYRO_500_SEN 0.00026631610900792382460383465095346f // ±500°/s
#define BMI088_GYRO_250_SEN 0.00013315805450396191230191732547673f // ±250°/s
#define BMI088_GYRO_125_SEN 0.000066579027251980956150958662738366f // ±125°/s
// 原始数据结构体直接从传感器读取的16位整型数据
// 使用 __packed 防止编译器对齐填充,确保内存布局紧凑
typedef __packed struct BMI088_RAW_DATA
{
uint8_t status; // 状态字节(如数据就绪标志)
int16_t accel[3]; // 加速度原始值 [X, Y, Z]
int16_t temp; // 温度原始值
int16_t gyro[3]; // 陀螺仪原始值 [X, Y, Z]
} bmi088_raw_data_t;
// 物理数据结构体(转换后的浮点型物理量)
typedef struct BMI088_REAL_DATA
{
uint8_t status; // 状态字节
float accel[3]; // 加速度 (m/s²)
float temp; // 温度 (°C)
float gyro[3]; // 角速度 (rad/s)
float time; // 时间戳(秒,可由 HAL_GetTick() 转换)
} bmi088_real_data_t;
// 错误码定义(用于初始化返回值)
// 高位用于标识模块,低位用于具体错误
enum
{
BMI088_NO_ERROR = 0x00, // 无错误
// 加速度计配置错误
BMI088_ACC_PWR_CTRL_ERROR = 0x01,
BMI088_ACC_PWR_CONF_ERROR = 0x02,
BMI088_ACC_CONF_ERROR = 0x03,
BMI088_ACC_SELF_TEST_ERROR = 0x04,
BMI088_ACC_RANGE_ERROR = 0x05,
BMI088_INT1_IO_CTRL_ERROR = 0x06,
BMI088_INT_MAP_DATA_ERROR = 0x07,
// 陀螺仪配置错误
BMI088_GYRO_RANGE_ERROR = 0x08,
BMI088_GYRO_BANDWIDTH_ERROR = 0x09,
BMI088_GYRO_LPM1_ERROR = 0x0A,
BMI088_GYRO_CTRL_ERROR = 0x0B,
BMI088_GYRO_INT3_INT4_IO_CONF_ERROR = 0x0C,
BMI088_GYRO_INT3_INT4_IO_MAP_ERROR = 0x0D,
// 自检错误(高位标志)
BMI088_SELF_TEST_ACCEL_ERROR = 0x80, // 加速度计自检失败
BMI088_SELF_TEST_GYRO_ERROR = 0x40, // 陀螺仪自检失败
// 严重错误
BMI088_NO_SENSOR = 0xFF, // 未检测到传感器ID 不匹配)
};
// 公共函数声明
/**
* @brief 初始化 BMI088加速度计 + 陀螺仪)
* @return 错误码0 表示成功非0表示具体错误
*/
uint8_t BMI088_init(void);
/**
* @brief 单独初始化加速度计
* @return 错误码
*/
unsigned char bmi088_accel_init(void);
/**
* @brief 单独初始化陀螺仪
* @return 错误码
*/
unsigned char bmi088_gyro_init(void);
/**
* @brief 读取 BMI088 传感器数据
* @param gyro[3] 输出:陀螺仪角速度(单位由 BMI088_GYRO_xxx_SEN 决定,通常为 rad/s
* @param accel[3] 输出:加速度(单位由 BMI088_ACCEL_xxx_SEN 决定,通常为 m/s²
* @param temperate 输出温度°C
*
* @note 此函数内部已处理片选、SPI 通信、数据解析
*/
void BMI088_read(float gyro[3], float accel[3], float *temperate);
#endif // BMI088DRIVER_H