BMP280气压传感器

 

气压传感器

    气压传感器是用来测量空气(或者其他气体)气压的传感器。将压力值转换为电信号输出,以直接的电压信号或者数字信号协议输出。常用于航空、气象、医疗等方面。

    在无人机测高的方案中,激光测距的成本极高并且会受阻碍物影响。GPS的精度受信号影响。气压高度计无疑是一个成本低廉,精度较高的选择。

    在理想条件下(假设温度保持不变),气压与高度的关系可以通过指数公式来近似表示:

 

9e8c7b9c0e62d2c3896dd57e9df983fd.png

P(h) 是高度 h 处的气压。

P₀ 是海平面处的标准气压,约为 101325 Pa(或 1013.25 hPa)。

h 是相对于海平面的高度(单位:米)。

L 是温度梯度(国际标准大气中为 0.0065 K/m)。

T₀ 是海平面上的温度,通常为 288.15 K(15°C)。

g₀ 是地球表面重力加速度,约为 9.80665 m/s²。

M 是空气的摩尔质量,约为 0.0289644 kg/mol。

R 是气体常数,约为 8.314 J/(mol·K)。

    利用这些数据我们可以根据气压值获取一个近似的高度值。

 

3f6f027d1a3c8a20d4c2599db753005e.png

    BMP180/280是目前比较通用的,成本较低的气压传感器。气压测量范围为:300 hPa 到 1100 hPa(海拔从-500m到9000m)。

    模块输出接口为标准I2C协议。本期我们利用STM32实现气压数据获取并转化为高度。

    实验使用STM32F103C8T6最小系统板,气压传感器采用BMP280(买错了买成280了)

2

 

CubeMX配置

    

 

21a4f2954cbe8130c2effa1f2033764f.png

 

 

fcccadef3a407c7213045a7117e26271.png

 

16485ddd398b08b001c35c737041afc8.png

    开启时钟和I2C即可,接着创建工程。这里别忘记开启Debug调试。

3

 

代码实现

#define BMP280_REG_ID                 0xD0  // 芯片ID寄存器#define BMP280_REG_RESET              0xE0  // 软复位寄存器#define BMP280_REG_STATUS             0xF3  // 状态寄存器#define BMP280_REG_CTRL_MEAS          0xF4  // 测量控制寄存器#define BMP280_REG_CONFIG             0xF5  // 配置寄存器#define BMP280_REG_PRESS_MSB          0xF7  // 压力数据高字节#define BMP280_REG_PRESS_LSB          0xF8  // 压力数据中字节#define BMP280_REG_PRESS_XLSB         0xF9  // 压力数据低字节#define BMP280_REG_TEMP_MSB           0xFA  // 温度数据高字节#define BMP280_REG_TEMP_LSB           0xFB  // 温度数据中字节#define BMP280_REG_TEMP_XLSB          0xFC  // 温度数据低字节

    从BMP280的芯片手册中添加关于寄存器的宏定义,之后我们为BMP280的功能定义成结构体。

typedef struct BMP280_Device BMP280_Device;typedef uint8_t (*BMP280_Init_Func)(BMP280_Device* dev, I2C_HandleTypeDef *hi2c);typedef void (*BMP280_SetConfig_Func)(BMP280_Device* dev, BMP280_Oversampling tempOS,                                     BMP280_Oversampling pressOS, BMP280_Mode mode,                                     BMP280_Filter filter, uint8_t standbyTime);typedef float (*BMP280_ReadTemp_Func)(BMP280_Device* dev);typedef float (*BMP280_ReadPress_Func)(BMP280_Device* dev);typedef float (*BMP280_ReadAlt_Func)(BMP280_Device* dev, float seaLevel);struct BMP280_Device {// BMP280设备结构体struct BMP280_Device {    // 硬件相关    I2C_HandleTypeDef *hi2c;    uint8_t devAddr;    BMP280_CalibData calibData;    // 传感器数据    BMP280_Data data;    // 校准参数    struct {        float knownAltitude;        float knownPressure;        float calibrationError;    } calibration;    // 采样设置    struct {        uint8_t samplesCount;        uint32_t sampleDelay;    } sampling;    // 函数指针    BMP280_Init_Func Init;    BMP280_SetConfig_Func SetConfig;    BMP280_Update_Func Update;    BMP280_Calibrate_Func Calibrate;};

    我们在正常的结构体基础上用函数指针来封装入结构体。

 

4b45cf496b061327f1c6b5af775c379e.png

    实现接口统一到结构体中。

 

90308e0f2f83dbb13b7c23e0096e1ce6.png

    这样子我们就实现了BMP280的数据读取,具体代码会上传到交流群里面,大家可以从主页获取群号。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值