woshi_ziyu
发表于: 2023-7-29 12:02:45 | 显示全部楼层

BMP581气压传感器是Bosch博世公司推出的最新一代传感器。BMP581精度卓越、功耗超低,适用于健身追踪、室内定位等诸多功,为高度追踪应用提供卓越精度。它具有出色的设计灵活性,提供单一封装解决方案,客户可以轻松集成到多种设备中,例如GPS模块、可穿戴设备、可听设备、智能家居、物联网和工业产品。


在本篇文章中,我们将使用NUCLEO开发板通过SPI和I2C方式连接YBX-BMP581模块,实现读取当前的气压值和温度值。


所需的组件

●  NUCLEO-G070RB开发板(淘宝链接

●  YBX-BMP581大气压力传感器模块(淘宝链接

●  连接跳线

●  Micro USB线缆


YBX-BMP581大气压力传感器模块

该模块采用博世的BMP581传感器。该气压传感器具有300hPa至1250hPa的宽测量范围和±30Pa的绝对精度。 BMP581针对高性能应用进行了优化,如±6Pa的适应测量。这一特性相当于±50cm的高度差和0.5Pa/K的偏移温度系数(TCO)。采用2.0mm x 2.0mm紧凑型金属盖焊盘栅格阵列 (LGA) 封装。

BMP581.png


YBX-BMP581模块板载一颗电压LDO,支持3.3V-5V电源输入。模块支持SPI和I2C接口连接,并通过8针2.51mm间距的排针引出。该模块默认的I2C地址是0x47,可以将SDO(ADR引脚)拉高IC地址变成0x46。

YBX-BMP581大气压力传感器模块.jpg


硬件连接方式

NUCLEO-G070RB开发板可以通过SPI和I2C两种方式连接至YBX-BMP581大气压力传感器模块。

以下是I2C连接方式:

YBX-BMP581大气压力传感器模块 - I2C硬件连接.jpg

BMP581模块连接到NUCLEO-G070RB的I2C1接口,对应的引脚分别是PB9(SDA)和PB8(SCL)。BMP581模块的VCC连接到+5V引脚,GND引脚连接到NUCLEO-G070RB开发板的任意GND引脚。


以下是SPI连接方式:

YBX-BMP581大气压力传感器模块 - SPI硬件连接.jpg

BMP581模块连接到NUCLEO-G070RB的SPI1接口,对应的引脚分别是PA5(SCK)、PA6(MISO)和PA7(MOSI),片选引脚CS连接到PB0。BMP581模块的VCC连接到+5V引脚,GND引脚连接到NUCLEO-G070RB的任意GND引脚。


代码

本文使用的代码基于博世提供的驱动BMP5-Sensor-API,该文件可以从GitHub下载。


使用STM32CubeMX工具根据硬件连接配置具体的引脚和接口参数,然后进行代码移植。需要重新编写以下函数的实现内容:

  1. static int8_t get_sensor_data(const struct bmp5_osr_odr_press_config *osr_odr_press_cfg, struct bmp5_dev *dev);
  2. BMP5_INTF_RET_TYPE bmp5_spi_read(uint8_t reg_addr, uint8_t *reg_data, uint32_t length, void *intf_ptr);
  3. BMP5_INTF_RET_TYPE bmp5_i2c_read(uint8_t reg_addr, uint8_t *reg_data, uint32_t length, void *intf_ptr);
  4. BMP5_INTF_RET_TYPE bmp5_spi_write(uint8_t reg_addr, const uint8_t *reg_data, uint32_t length, void *intf_ptr);
  5. BMP5_INTF_RET_TYPE bmp5_i2c_write(uint8_t reg_addr, const uint8_t *reg_data, uint32_t length, void *intf_ptr);
  6. void bmp5_delay_us(uint32_t period_us, void *intf_ptr);
  7. int8_t bmp5_interface_init(struct bmp5_dev *bmp5_dev, uint8_t intf);
复制代码

在主函数中读取当前的大气压力值:

  1.     int8_t rslt = 0;
  2.     uint8_t idx = 0;
  3.     uint8_t int_status;
  4.     struct bmp5_sensor_data sensor_data;

  5.     printf("\nOutput :\n\n");
  6.     printf("Data, Pressure (Pa), Temperature (deg C)\n");

  7.     while (idx < 50)
  8.     {
  9.         rslt = bmp5_get_interrupt_status(&int_status, dev);
  10.         bmp5_error_codes_print_result("bmp5_get_interrupt_status", rslt);

  11.         if (int_status & BMP5_INT_ASSERTED_DRDY)
  12.         {
  13.             rslt = bmp5_get_sensor_data(&sensor_data, osr_odr_press_cfg, dev);
  14.             bmp5_error_codes_print_result("bmp5_get_sensor_data", rslt);

  15.             if (rslt == BMP5_OK)
  16.             {
  17. #ifdef BMP5_USE_FIXED_POINT
  18.                 printf("%d, %lu, %ld\n", idx, (long unsigned int)sensor_data.pressure,
  19.                        (long int)sensor_data.temperature);
  20. #else
  21.                 printf("%d, %f, %f\n", idx, sensor_data.pressure, sensor_data.temperature);
  22. #endif

  23.                 idx++;
  24.             }
  25.         }
  26.     }
复制代码

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 11 | 回复: 23



手机版|

GMT+8, 2024-5-21 21:40 , Processed in 0.058941 second(s), 9 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表