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) 封装。
YBX-BMP581模块板载一颗电压LDO,支持3.3V-5V电源输入。模块支持SPI和I2C接口连接,并通过8针2.51mm间距的排针引出。该模块默认的I2C地址是0x47,可以将SDO(ADR引脚)拉高IC地址变成0x46。
硬件连接方式 NUCLEO-G070RB开发板可以通过SPI和I2C两种方式连接至YBX-BMP581大气压力传感器模块。
以下是I2C连接方式:
BMP581模块连接到NUCLEO-G070RB的I2C1接口,对应的引脚分别是PB9(SDA)和PB8(SCL)。BMP581模块的VCC连接到+5V引脚,GND引脚连接到NUCLEO-G070RB开发板的任意GND引脚。
以下是SPI连接方式:
BMP581模块连接到NUCLEO-G070RB的SPI1接口,对应的引脚分别是PA5(SCK)、PA6(MISO)和PA7(MOSI),片选引脚CS连接到PB0。BMP581模块的VCC连接到+5V引脚,GND引脚连接到NUCLEO-G070RB的任意GND引脚。
代码 本文使用的代码基于博世提供的驱动BMP5-Sensor-API,该文件可以从GitHub下载。
使用STM32CubeMX工具根据硬件连接配置具体的引脚和接口参数,然后进行代码移植。需要重新编写以下函数的实现内容: - static int8_t get_sensor_data(const struct bmp5_osr_odr_press_config *osr_odr_press_cfg, struct bmp5_dev *dev);
- BMP5_INTF_RET_TYPE bmp5_spi_read(uint8_t reg_addr, uint8_t *reg_data, uint32_t length, void *intf_ptr);
- BMP5_INTF_RET_TYPE bmp5_i2c_read(uint8_t reg_addr, uint8_t *reg_data, uint32_t length, void *intf_ptr);
- BMP5_INTF_RET_TYPE bmp5_spi_write(uint8_t reg_addr, const uint8_t *reg_data, uint32_t length, void *intf_ptr);
- BMP5_INTF_RET_TYPE bmp5_i2c_write(uint8_t reg_addr, const uint8_t *reg_data, uint32_t length, void *intf_ptr);
- void bmp5_delay_us(uint32_t period_us, void *intf_ptr);
- int8_t bmp5_interface_init(struct bmp5_dev *bmp5_dev, uint8_t intf);
复制代码在主函数中读取当前的大气压力值: - int8_t rslt = 0;
- uint8_t idx = 0;
- uint8_t int_status;
- struct bmp5_sensor_data sensor_data;
- printf("\nOutput :\n\n");
- printf("Data, Pressure (Pa), Temperature (deg C)\n");
- while (idx < 50)
- {
- rslt = bmp5_get_interrupt_status(&int_status, dev);
- bmp5_error_codes_print_result("bmp5_get_interrupt_status", rslt);
- if (int_status & BMP5_INT_ASSERTED_DRDY)
- {
- rslt = bmp5_get_sensor_data(&sensor_data, osr_odr_press_cfg, dev);
- bmp5_error_codes_print_result("bmp5_get_sensor_data", rslt);
- if (rslt == BMP5_OK)
- {
- #ifdef BMP5_USE_FIXED_POINT
- printf("%d, %lu, %ld\n", idx, (long unsigned int)sensor_data.pressure,
- (long int)sensor_data.temperature);
- #else
- printf("%d, %f, %f\n", idx, sensor_data.pressure, sensor_data.temperature);
- #endif
- idx++;
- }
- }
- }
复制代码
|