|
气压传感器是健身追踪等可穿戴设备和其他应用中的关键组件,可以准确测量高度。BMP585气压传感器是博世传感器公司推出的最新一代传感器。它精度卓越、功耗超低,适用于健身追踪、室内定位等诸多环境,为高度追踪应用提供卓越精度。BMP585气压传感器占位面积较小,具有出色的设计灵活性,是一种单一封装解决方案,客户可以轻松集成到多种设备中,如智能手表、可穿戴设备、耳戴式设备、家用电器、智能家居和工业产品中。
在本篇文章中,我们将使用STM32 NUCLEO开发板通过SPI方式连接YBX-BMP585气压传感器模块,实现读取当前的气压值和温度值。
所需的组件 ● NUCLEO-G070RB开发板(淘宝链接) ● YBX-BMP585大气压力传感器模块(淘宝链接) ● 连接跳线 ● Micro USB线缆
YBX-BMP585大气压力传感器模块
该模块采用博世传感器的最新一代气压传感器BMP585。该气压传感器具有300hPa至1250hPa的宽测量范围和±30Pa的绝对精度。 BMP585针对高性能应用进行了优化,如±6Pa的适应测量。这一特性相当于±50cm的高度差和0.5Pa/K的偏移温度系数(TCO)。BMP585传感器提供极高的精度,可测量仅有几厘米的高度变化。它还可以检测健身训练中的动作,甚至可以检测到个人引体向上或俯卧撑的水平。同时,由于其极其坚固耐用,用户不必担心环境条件。BMP585具有凝胶填充腔体,通过合适的集成概念,可以最大程度地防止水和其他液体(如化学品)进入。
YBX-BMP585模块板载一颗电压LDO,支持3.3V-5V电源输入。模块支持SPI和I2C接口连接,并通过8针2.54mm间距的排针引出。该模块默认的I2C地址是0x47,可以将SDO(ADR引脚)拉高IC地址变成0x46。
硬件连接方式 NUCLEO-G070RB开发板可以通过SPI和I2C两种方式连接至YBX-BMP585大气压力传感器模块。本篇文章主要介绍SPI方式,以下是SPI连接方式:
BMP585模块连接到NUCLEO-G070RB的SPI1接口,对应的引脚分别是PA5(SCK)、PA6(MISO)和PA7(MOSI),片选引脚CS连接到PB0。BMP585模块的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);
复制代码在主函数中读取当前的大气压力值: - /* Initialize all configured peripherals */
- MX_GPIO_Init();
- MX_USART2_UART_Init();
- MX_SPI1_Init();
- /* USER CODE BEGIN 2 */
-
- printf("\nBMP585 SPI Test\n");
- printf("Bolgen Studio\n");
-
- /* Interface reference is given as a parameter
- * For I2C : BMP5_I2C_INTF
- * For SPI : BMP5_SPI_INTF
- */
- rslt = bmp5_interface_init(&dev, BMP5_SPI_INTF);
- bmp5_error_codes_print_result("bmp5_interface_init", rslt);
-
- if (rslt == BMP5_OK)
- {
- rslt = bmp5_init(&dev);
- bmp5_error_codes_print_result("bmp5_init", rslt);
- if (rslt == BMP5_OK)
- {
- rslt = set_config(&osr_odr_press_cfg, &dev);
- bmp5_error_codes_print_result("set_config", rslt);
- }
- if (rslt == BMP5_OK)
- {
- rslt = get_sensor_data(&osr_odr_press_cfg, &dev);
- bmp5_error_codes_print_result("get_sensor_data", rslt);
- }
- }
- /* USER CODE END 2 */
- /* Infinite loop */
- /* USER CODE BEGIN WHILE */
- while (1)
- {
- /* USER CODE END WHILE */
- /* USER CODE BEGIN 3 */
-
- HAL_Delay(50);
- }
复制代码
编译并上传至STM32 NUCLEO开发板中。
测试结果 使用串口工具打开对应的虚拟串口,接收数据如下:
|