旧乡故客
发表于: 2024-9-18 21:48:00 | 显示全部楼层

近年来,智能可穿戴设备离普通人的生活越来越近,智能手环、智能手表、智能耳机等一系列的产品逐渐走进了人们的生活中。这些设备通过数据交互、云端交互等方式提供了强大的功能,对我们的生活、感知带来很大的转变。可穿戴设备中的MEMS传感器能够精确捕捉数据,并进行实时更新反馈。惯性测量单元作为一种MEMS传感器,可以用来测量方位、运动或者手势。


博世公司推出的低功耗智能传感器BMI270可以用于穿戴设备,该传感器基于博世的MEMS工艺技术,而且大大提升了加速度计的偏移和灵敏度性能。在本篇文章中,我们将介绍如何基于NUCLEO-G070开发板通过SPI接口读取BMI270的加速度计和陀螺仪数据。


所需的组件

●  NUCLEO-G070RB开发板

●  YBX-BMI270惯性测量单元传感器模块(淘宝链接

●  连接跳线

●  USB线缆

●  友善串口调试助手


YBX-BMI270传感器模块

YBX-BMI270模块采用博世传感器的超低功耗智能惯性测量单元BMI270。该IMU针对可穿戴设备进行了优化,提供精确的加速度、角速率测量和智能片上运动触发中断功能,同时该传感器集成了16位三轴陀螺仪和16位三轴加速度计。该模块支持SPI和I2C接口进行系统集成,可以快速实现与Arduino和STM32等控制器直接相连。该模块板载一颗电源芯片,支持3.3-5V供电。


BMI270包含直观的手势、情景和活动识别功能,并集成了针对腕戴式设备专门进行优化的即插即用计步器。该IMU也非常适合其他类型的可穿戴设备,如耳戴式设备、智能服装、智能鞋、智能眼镜和脚踝带。


Bosch的独特静止组件重新调整 (CRT) 功能可提供内置陀螺仪自校准功能,无需旋转激励,从而在测试和制造过程中为OEM节省宝贵的时间和成本。BMI270的嵌入式即插即用功能有助于缩短产品上市时间。

YBX-BMI270惯性测量单元模块.jpg


主要特性

●  采用Bosch超低功耗智能惯性测量单元BMI270

    ●  16位数字三轴加速度计

    ●  16位数字三轴陀螺仪

    ●  电流消耗:685µA(典型值)

    ●  灵敏度误差:± 0.4%

    ●  通过静止CRT功能实现自校准陀螺仪:

●  SPI和I2C接口

●  2个独立的可编程I/O引脚,用于中断和同步事件

●  板载一颗高精度DC-DC芯片

●  LED电源指示灯

●  支持Arduino和STM32等微控制器

●  外形尺寸:24mm x 24mm x 5mm


硬件连接

YBX-BMI270模块连接到NUCLEO-G070RB的SPI1接口,对应的引脚分别是PA5(SCK)、PA6(MISO)和PA7(MOSI),片选引脚CSB连接到PB0。YBX-BMI270模块的VCC连接到3V3引脚,GND引脚连接到NUCLEO-G070RB的任意GND引脚。


驱动文件

Bosch博世传感器官方提供了基于BMI270的驱动文件BMI270_SensorAPI,该源码可以在GitHub进行下载。下载地址:BMI270_SensorAPI


代码

首先我们使用STM32CubeMX工具生成工程文件,根据硬件连接方式选择引脚的功能,然后启用SPI1通讯。SPI1选择全双工主机模式(Full-Duplex Master),硬件NSS信号选择Disable。在参数设置中,数据位大小选择8位,MSB优先。选择合适的分频系数。在无法进行通讯的情况下,可以适当降低SPI1外设的频率。


生成KEIL工程后,接下来我们需要将BOSCH官方提供的BMI270_SensorAPI驱动集成到工程里面。


首先,将下载的整个驱动文件复制到工程所在的目录,然后将bmi2.cbmi270.ccommon.c添加到工程中。在common.c中重载以下两个函数:bmi2_spi_read和bmi2_spi_write。


在主函数main中,首先初始化BMI270,然后对加速度计和陀螺仪的参数进行配置。在while循环中,读取寄存器的数据,并打印输出到串口。

  1. printf("\nBMI270 SPI Test\n");
  2.   printf("Bolgen Studio\n");

  3.   /* Assign accel sensor to variable. */
  4.   uint8_t sensor_list[2] = { BMI2_ACCEL, BMI2_GYRO };

  5.   /* Sensor initialization configuration. */
  6.   struct bmi2_dev bmi;

  7.   /* Structure to define type of sensor and their respective data. */
  8.   struct bmi2_sens_data sensor_data  = { { 0 } };

  9.   uint8_t indx = 0;
  10.   float acc_x = 0, acc_y = 0, acc_z = 0;
  11.   float gyr_x = 0, gyr_y = 0, gyr_z = 0;
  12.   struct bmi2_sens_config config;
  13.   /* Interface reference is given as a parameter
  14.   * For I2C : BMI2_I2C_INTF
  15.   * For SPI : BMI2_SPI_INTF
  16.   */
  17.   rslt = bmi2_interface_init(&bmi, BMI2_SPI_INTF);
  18.   bmi2_error_codes_print_result(rslt);

  19.   /* Initialize bmi270. */
  20.   rslt = bmi270_init(&bmi);
  21.   bmi2_error_codes_print_result(rslt);

  22.   if (rslt == BMI2_OK)
  23.   {
  24.                 /* Accel and gyro configuration settings. */
  25.                 rslt = set_accel_gyro_config(&bmi);
  26.                 bmi2_error_codes_print_result(rslt);

  27.     if (rslt == BMI2_OK)
  28.     {
  29.       /* NOTE:
  30.        * Accel and Gyro enable must be done after setting configurations
  31.        */
  32.       rslt = bmi2_sensor_enable(sensor_list, 2, &bmi);
  33.       bmi2_error_codes_print_result(rslt);

  34.       if (rslt == BMI2_OK)
  35.       {
  36.         config.type = BMI2_ACCEL;

  37.         /* Get the accel configurations. */
  38.         rslt = bmi2_get_sensor_config(&config, 1, &bmi);
  39.         bmi2_error_codes_print_result(rslt);

  40.         printf(
  41.           "\nData set, Accel Range, Acc_Raw_X, Acc_Raw_Y, Acc_Raw_Z, Acc_ms2_X, Acc_ms2_Y, Acc_ms2_Z, Gyr_Raw_X, Gyr_Raw_Y, Gyr_Raw_Z, Gyro_DPS_X, Gyro_DPS_Y, Gyro_DPS_Z\n\n");
  42.       }
  43.     }
  44.   }
复制代码

输出结果

将程序下载到NUCLEO-G070开发板中,运行程序,打开友善串口调试助手,选择正确的串口号,稍后将显示接收到的数据:

串口输出.jpg

注意:由于BMI270传感器需要进行配置的参数较多,因此第一组数据出现的时间会比较慢,请多等待一段时间。


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

本版积分规则

主题 9 | 回复: 9



手机版|

GMT+8, 2024-10-7 05:19 , Processed in 0.053498 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

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

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