0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

陀螺仪LSM6DSV16X与AI集成(7)----FIFO数据读取与配置

嵌入式单片机MCU开发 来源:嵌入式单片机MCU开发 作者:嵌入式单片机MCU开 2024-07-18 10:40 次阅读

概述

LSM6DSV16X是一款高性能、低功耗的6轴IMU传感器,集成了3轴加速度计和3轴陀螺仪。本文将详细介绍如何配置和读取LSM6DSV16X传感器的FIFO数据,包括初始化、配置以及数据处理的完整流程, 以实现数据的批量处理和传输,减少系统功耗,提高应用的响应速度和数据处理效率。

最近在弄ST和瑞萨RA的课程,需要样片的可以加群申请:615061293 。

视频教学

[https://www.bilibili.com/video/BV12s421T73k/]

样品申请

[https://www.wjx.top/vm/OhcKxJk.aspx#]

源码下载

[https://download.csdn.net/download/qq_24312945/89471311]

主要内容

  1. 初始化LSM6DSV16X传感器并检查其设备ID
  2. 恢复传感器默认配置并设置必要的参数
  3. 配置FIFO模式和水印阈值
  4. 设置加速度计和陀螺仪的数据速率
  5. 连续读取FIFO中的传感器数据并解析输出

LSM6DSV16X传感器包含一个FIFO缓冲区,能够存储不同类型的数据,以节省系统功耗。主处理器不需要连续轮询传感器数据,而是可以在需要时唤醒并从FIFO中读取重要数据 。
FIFO缓冲区可以存储以下类型的数据:
● 陀螺仪数据
● 加速度计数据
● 外部传感器数据(最多4个)
● 计步器数据
● 时间戳
● 温度
机器学习核心(MLC)特征和过滤数据
● 低功耗传感器融合算法输出数据(如四元数、陀螺仪偏差、重力向量等)

生成STM32CUBEMX

用STM32CUBEMX生成例程,这里使用MCU为STM32H503CB。 配置时钟树,配置时钟为250M。

串口配置

查看原理图,PB6和PB7设置为开发板的串口。

配置串口。

IIC配置

配置IIC速度为1M。

CS和SA0设置

串口重定向

打开魔术棒,勾选MicroLIB

在main.c中,添加头文件,若不添加会出现 identifier "FILE" is undefined报错。

/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */

函数声明和串口重定向:

/* USER CODE BEGIN PFP */
int fputc(int ch, FILE *f){
    HAL_UART_Transmit(&huart1 , (uint8_t *)&ch, 1, 0xFFFF);
    return ch
}
/* USER CODE END PFP */

参考程序

[https://github.com/STMicroelectronics/lsm6dsv16x-pid/tree/main](

初始换管脚

由于需要向LSM6DSV16X_I2C_ADD_L写入以及为IIC模式。

所以使能CS为高电平,配置为IIC模式。 配置SA0为高电平。

printf("HELLO!n");
  HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);
  HAL_GPIO_WritePin(SA0_GPIO_Port, SA0_Pin, GPIO_PIN_RESET);
    HAL_Delay(100);


  lsm6dsv16x_fifo_status_t fifo_status;
  stmdev_ctx_t dev_ctx;
  lsm6dsv16x_reset_t rst;

  /* Initialize mems driver interface */
  dev_ctx.write_reg = platform_write;
  dev_ctx.read_reg = platform_read;
  dev_ctx.mdelay = platform_delay;
  dev_ctx.handle = &SENSOR_BUS;

  /* Init test platform */
//  platform_init(dev_ctx.handle);
  /* Wait sensor boot time */
  platform_delay(BOOT_TIME);

获取ID

可以向WHO_AM_I (0Fh)获取固定值,判断是否为0x70。

lsm6dsv16x_device_id_get为获取函数。

对应的获取ID驱动程序,如下所示。

/* Check device ID */
  lsm6dsv16x_device_id_get(&dev_ctx, &whoamI);
    printf("LSM6DSV16X_ID=0x%x,whoamI=0x%x",LSM6DSV16X_ID,whoamI);
  if (whoamI != LSM6DSV16X_ID)
    while (1);

复位操作

可以向CTRL3 (12h)的SW_RESET寄存器写入1进行复位。

lsm6dsv16x_reset_set为重置函数。

对应的驱动程序,如下所示。

/* Restore default configuration */
  lsm6dsv16x_reset_set(&dev_ctx, LSM6DSV16X_RESTORE_CTRL_REGS);
  do {
    lsm6dsv16x_reset_get(&dev_ctx, &rst);
  } while (rst != LSM6DSV16X_READY);

BDU设置

在很多传感器中,数据通常被存储在输出寄存器中,这些寄存器分为两部分:MSB和LSB。这两部分共同表示一个完整的数据值。例如,在一个加速度计中,MSB和LSB可能共同表示一个加速度的测量值。
连续更新模式(BDU = ‘0’):在默认模式下,输出寄存器的值会持续不断地被更新。这意味着在你读取MSB和LSB的时候,寄存器中的数据可能会因为新的测量数据而更新。这可能导致一个问题:当你读取MSB时,如果寄存器更新了,接下来读取的LSB可能就是新的测量值的一部分,而不是与MSB相对应的值。这样,你得到的就是一个“拼凑”的数据,它可能无法准确代表任何实际的测量时刻。
块数据更新(BDU)模式(BDU = ‘1’):当激活BDU功能时,输出寄存器中的内容不会在读取MSB和LSB之间更新。这就意味着一旦开始读取数据(无论是先读MSB还是LSB),寄存器中的那一组数据就被“锁定”,直到两部分都被读取完毕。这样可以确保你读取的MSB和LSB是同一测量时刻的数据,避免了读取到代表不同采样时刻的数据。
简而言之,BDU位的作用是确保在读取数据时,输出寄存器的内容保持稳定,从而避免读取到拼凑或错误的数据。这对于需要高精度和稳定性的应用尤为重要。
可以向CTRL3 (12h)的BDU寄存器写入1进行开启。

对应的驱动程序,如下所示。

/* Enable Block Data Update */
  lsm6dsv16x_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);

设置量程

速率可以通过CTRL1 (10h)设置加速度速率和CTRL2 (11h)进行设置角速度速率。

设置加速度量程可以通过CTRL8 (17h)进行设置。 设置角速度量程可以通过CTRL6 (15h)进行设置。

设置加速度和角速度的量程和速率可以使用如下函数。

/* Set full scale */
  lsm6dsv16x_xl_full_scale_set(&dev_ctx, LSM6DSV16X_2g);
  lsm6dsv16x_gy_full_scale_set(&dev_ctx, LSM6DSV16X_2000dps);

设置FIFO水印

FIFO控制寄存器1 (FIFO_CTRL1):这个寄存器用于设置FIFO的水印阈值。
● WTM_[7:0]:FIFO水印阈值。当FIFO中写入的字节数大于或等于这个阈值时,水印标志位会被置高。
具体描述如下:
● 1 LSb = TAG (1 Byte) + 1 sensor (6 Bytes) written in FIFO:
○ 每个LSb表示一个TAG(1字节)和一个传感器的数据(6字节)被写入FIFO。
○ 因此,每个水印阈值单位对应的大小是7字节(1字节的TAG加上6字节的传感器数据)。

下面代码设置了FIFO的水印阈值。当FIFO中存储的数据达到该阈值时,传感器会产生一个中断信号,以通知主处理器读取数据。水印值是未读传感器数据TAG和6个字节的数据样本总数。

lsm6dsv16x_fifo_watermark_set(&dev_ctx, FIFO_WATERMARK);

在配置LSM6DSV16X传感器的FIFO功能时,每个传感器数据样本的大小为6字节。这是因为加速度计和陀螺仪的每个数据样本都包含三个轴向的数据,每个轴向的数据用2字节表示。具体来说:
● 加速度计数据:包含X、Y、Z三个轴向的数据,每个轴向的数据大小为2字节。因此,加速度计的一个完整数据样本大小为3轴 * 2字节 = 6字节。
● 陀螺仪数据:同样包含X、Y、Z三个轴向的数据,每个轴向的数据大小也是2字节。因此,陀螺仪的一个完整数据样本大小也是3轴 * 2字节 = 6字节。
#define FIFO_WATERMARK 64的定义是为了在FIFO中存储64个样本后触发中断。因为每个样本大小为7字节(1字节的TAG和6字节的传感器数据),所以当FIFO中存储的数据达到448字节(64 * 7字节)时,会触发中断通知主处理器读取数据。
这可以通过以下公式计算:
水印阈值字节数=64×(1字节的TAG+6字节的传感器数据)=448字节
这个设置可以确保在适当的时间间隔内读取数据,既避免了频繁中断带来的开销,又不会因为FIFO溢出而丢失数据。

设置速率

LSM6DSV16X传感器的FIFO控制寄存器3(FIFO_CTRL3)的内容,该寄存器用于选择陀螺仪和加速度计数据写入FIFO的批处理数据速率(BDR,Batch Data Rate)。以下是详细描述:
FIFO_CTRL3寄存器(地址09h),该寄存器包含两个主要字段:
● BDR_GY_[3:0]:选择陀螺仪数据的批处理速率。
● BDR_XL_[3:0]:选择加速度计数据的批处理速率。

将加速度计的数据速率(Output Data Rate, ODR)设置为60Hz。这意味着加速度计的数据将以每秒60次的频率批量写入FIFO。

将陀螺仪的数据速率设置为15Hz。这意味着陀螺仪的数据将以每秒15次的频率批量写入FIFO。

/* Set FIFO batch XL/Gyro ODR to 12.5Hz */
  lsm6dsv16x_fifo_xl_batch_set(&dev_ctx, LSM6DSV16X_XL_BATCHED_AT_60Hz);
  lsm6dsv16x_fifo_gy_batch_set(&dev_ctx, LSM6DSV16X_GY_BATCHED_AT_15Hz);

使用流模式

FIFO控制寄存器4(FIFO_CTRL4)用于选择FIFO模式,并提供以下选项:
FIFO_MODE_[2:0] 字段用于选择FIFO模式,详细描述如下:
000: 旁路模式(FIFO禁用,默认)
001: FIFO模式(当FIFO满时停止收集数据)
010: 连续模式直到水印标志被设置为满模式(FIFO水印标志设置为满模式之前,连续模式)
011: 连续模式直到解除触发,之后为FIFO模式
100: 旁路到连续模式(旁路模式直到解除触发,之后为连续模式)
101: 保留
110: 连续模式(如果FIFO满了,新样本将覆盖旧的样本)
111: 旁路到FIFO模式(旁路模式直到解除触发,之后为FIFO模式)

使用流模式有以下优点:
持续数据采集:适用于需要连续监控的场景,如运动跟踪和实时监控应用。
数据最新性:始终获取到最新的数据,避免数据滞后。
无需等待FIFO清空:当FIFO填满时,新数据自动覆盖旧数据,无需手动清空FIFO。

/* Set FIFO mode to Stream mode (aka Continuous Mode) */
  lsm6dsv16x_fifo_mode_set(&dev_ctx, LSM6DSV16X_STREAM_MODE);

设置FIFO时间戳批处理速率

LSM6DSV16X传感器的时间戳批处理速率、温度数据批处理速率、增强的EIS陀螺仪输出批处理,以及FIFO的工作模式。这些配置确保传感器数据能够以适当的速率和模式进行批处理和存储,以满足不同的应用需求。

/* Set Output Data Rate */
  lsm6dsv16x_xl_data_rate_set(&dev_ctx, LSM6DSV16X_ODR_AT_60Hz);
  lsm6dsv16x_gy_data_rate_set(&dev_ctx, LSM6DSV16X_ODR_AT_15Hz);
  lsm6dsv16x_fifo_timestamp_batch_set(&dev_ctx, LSM6DSV16X_TMSTMP_DEC_8);

使能时间戳

FUNCTIONS_ENABLE寄存器(地址50h) 的TIMESTAMP_EN可以使能时间戳计数器。计数器的值可以从TIMESTAMP0(40h),TIMESTAMP1(41h),TIMESTAMP2(42h)和TIMESTAMP3(43h)寄存器读取。

lsm6dsv16x_timestamp_set(&dev_ctx, PROPERTY_ENABLE);

FIFO状态寄存器

LSM6DSV16X传感器的FIFO状态寄存器FIFO_STATUS2 (1Ch)的FIFO_WTM_IA可以判断FIFO水印状态。
0:FIFO填充量低于水印。
1:FIFO填充量等于或大于水印。
DIFF_FIFO包括DIFF_FIFO_[7:0]和DIFF_FIFO_8,总共9位,用于精确表示未读数据样本的数量。

FIFO_DATA_OUT_TAG寄存器(地址78h)用于标识存储在FIFO中的传感器数据类型。以下是详细解释:
字段:
TAG_SENSOR_[4:0]:用于标识存储在FIFO中的传感器数据类型。
TAG_CNT_[1:0]:用于标识传感器时间槽的2位计数器。

LSM6DSV16X传感器的FIFO数据输出寄存器用于读取FIFO中的X轴、Y轴和Z轴数据。以下是详细解释:
FIFO_DATA_OUT_X_L (79h) 和 FIFO_DATA_OUT_X_H (7Ah) 寄存器
功能:读取FIFO中X轴的数据。
寄存器描述:
FIFO_DATA_OUT_X_L (低字节):包含X轴数据的低8位。
FIFO_DATA_OUT_X_H (高字节):包含X轴数据的高8位。
组合读取16位X轴数据:D[15:0]。
FIFO_DATA_OUT_Y_L (7Bh) 和 FIFO_DATA_OUT_Y_H (7Ch) 寄存器
功能:读取FIFO中Y轴的数据。
寄存器描述:
FIFO_DATA_OUT_Y_L (低字节):包含Y轴数据的低8位。
FIFO_DATA_OUT_Y_H (高字节):包含Y轴数据的高8位。
组合读取16位Y轴数据:D[15:0]。
FIFO_DATA_OUT_Z_L (7Dh) 和 FIFO_DATA_OUT_Z_H (7Eh) 寄存器
功能:读取FIFO中Z轴的数据。
寄存器描述:
FIFO_DATA_OUT_Z_L (低字节):包含Z轴数据的低8位。
FIFO_DATA_OUT_Z_H (高字节):包含Z轴数据的高8位。
组合读取16位Z轴数据:D[15:0]。

其中时间戳速度单位为21.75us。

演示

实际测试如下所示,数据为64个数据。
加速度速率为60Hz,角速度速率为15Hz,所以数据输出基本上为4个ACC数据一个GYR数据。
时间戳速率60Hz/8为7.5Hz(133.33ms),大概8个ACC数据之后出现一个时间戳数据。
下图中的2个时间戳数据为81998618和81992474,81998618-81992474=6144*21.75us=133.632ms

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 陀螺仪
    +关注

    关注

    44

    文章

    768

    浏览量

    98106
  • fifo
    +关注

    关注

    3

    文章

    382

    浏览量

    43360
  • AI
    AI
    +关注

    关注

    87

    文章

    28698

    浏览量

    265959
收藏 人收藏

    评论

    相关推荐

    陀螺仪LSM6DSV16XAI集成(1)----轮询获取陀螺仪数据

    本文将介绍如何使用 LSM6DSV16X 传感器来读取数据。主要步骤包括初始化传感器接口、验证设备ID、配置传感器的数据输出率和滤波器,以及
    的头像 发表于 12-18 10:49 1179次阅读
    <b class='flag-5'>陀螺仪</b><b class='flag-5'>LSM6DSV16X</b>与<b class='flag-5'>AI</b><b class='flag-5'>集成</b>(1)----轮询获取<b class='flag-5'>陀螺仪</b><b class='flag-5'>数据</b>

    陀螺仪LSM6DSV16XAI集成(2)----姿态解算

    LSM6DSV16X包含三轴陀螺仪与三轴加速度计。
    的头像 发表于 12-18 10:51 1566次阅读
    <b class='flag-5'>陀螺仪</b><b class='flag-5'>LSM6DSV16X</b>与<b class='flag-5'>AI</b><b class='flag-5'>集成</b>(2)----姿态解算

    陀螺仪LSM6DSV16XAI集成(3)----读取融合算法输出的四元数

    LSM6DSV16X 特性涉及到的是一种低功耗的传感器融合算法(Sensor Fusion Low Power, SFLP). 低功耗传感器融合(SFLP)算法:
    的头像 发表于 12-18 10:53 893次阅读
    <b class='flag-5'>陀螺仪</b><b class='flag-5'>LSM6DSV16X</b>与<b class='flag-5'>AI</b><b class='flag-5'>集成</b>(3)----<b class='flag-5'>读取</b>融合算法输出的四元数

    陀螺仪LSM6DSV16XAI集成(8)----MotionFX库解析空间坐标

    配置MotionFX库,使用FIFO读取传感器数据FIFO可以作为数据缓冲区,存储传感器的临
    的头像 发表于 07-18 10:43 683次阅读
    <b class='flag-5'>陀螺仪</b><b class='flag-5'>LSM6DSV16X</b>与<b class='flag-5'>AI</b><b class='flag-5'>集成</b>(8)----MotionFX库解析空间坐标

    陀螺仪LSM6DSV16XAI集成(9)----中断获取FIFO数据并应用MotionFX库解析空间坐标

    本文将探讨如何使用中断机制获取FIFO数据并应用MotionFX库解析空间坐标。MotionFX库是一种用于传感器融合的强大工具,可以将加速度计、陀螺仪和磁力计的数据融合在一起,实现精
    的头像 发表于 07-18 10:46 682次阅读
    <b class='flag-5'>陀螺仪</b><b class='flag-5'>LSM6DSV16X</b>与<b class='flag-5'>AI</b><b class='flag-5'>集成</b>(9)----中断获取<b class='flag-5'>FIFO</b><b class='flag-5'>数据</b>并应用MotionFX库解析空间坐标

    驱动LSM6DS3TR-C实现高效运动检测与数据采集(6)----FIFO数据读取配置

    LSM6DS3TR-C是STMicroelectronics公司推出的iNEMO惯性模块,集成了三轴加速度计和三轴陀螺仪,具备低功耗、强大的运动检测功能。该传感器支持多种操作模式,并内置FIF
    的头像 发表于 07-18 10:58 714次阅读
    驱动<b class='flag-5'>LSM6</b>DS3TR-C实现高效运动检测与<b class='flag-5'>数据</b>采集(<b class='flag-5'>6</b>)----<b class='flag-5'>FIFO</b><b class='flag-5'>数据</b><b class='flag-5'>读取</b>与<b class='flag-5'>配置</b>

    陀螺仪LSM6DSOW开发(3)----FIFO数据读取配置

    本文档旨在详细介绍如何配置读取LSM6DSOW传感器的FIFO数据LSM6DSOW是一款高性
    的头像 发表于 08-05 10:03 1044次阅读
    <b class='flag-5'>陀螺仪</b><b class='flag-5'>LSM6</b>DSOW开发(3)----<b class='flag-5'>FIFO</b><b class='flag-5'>数据</b><b class='flag-5'>读取</b>与<b class='flag-5'>配置</b>

    陀螺仪LSM6DSV16XAI集成(11)----融合磁力计进行姿态解算

    MotionFX库包含用于校准陀螺仪、加速度计和磁力计传感器的例程。 将磁力计的数据与加速度计和陀螺仪数据融合,可以大幅提高姿态估计的精度。三轴加速度计提供设备的倾斜信息,
    的头像 发表于 09-06 16:57 509次阅读
    <b class='flag-5'>陀螺仪</b><b class='flag-5'>LSM6DSV16X</b>与<b class='flag-5'>AI</b><b class='flag-5'>集成</b>(11)----融合磁力计进行姿态解算

    请问lsm6dsv16x可以直接读取触摸手势吗?

    已经读出来了LSM6DSV16x的QVRmv值,也写出了单击的状态机。但是在写触摸滑动手势时没有找到好的计算方式。请问是不是有直接读出这些手势的函数?
    发表于 07-02 08:14

    IKS01A2板上的LSM6DSL不会将陀螺仪数据放入FIFO

    陀螺仪数据总是* 0x7FFF(即int16_t的MAX_INT)。我已经搜索了数据表和LSM6
    发表于 11-22 10:28

    求助,是否有在LSM6DSV16X中使用传感器融合低功耗算法的示例

    你好我想知道是否有在 LSM6DSV16X 中使用传感器融合低功耗算法的示例。我想检索当前的 Heading、Pitch 和 Roll 信息。或者我也很高兴有一个例子解释如何从 SFLP 中获取四元
    发表于 02-03 09:12

    新品情报|STMicroelectronics全新LSM6DSV16BX运动+骨传导传感器

    。以下是本周新品情报,请及时查收: 运动/骨传导二合一 STMicroelectronics LSM6DSV16BX iNEMO三轴加速度计和陀螺仪 贸泽电子即日起
    的头像 发表于 05-17 10:35 925次阅读
    新品情报|STMicroelectronics全新<b class='flag-5'>LSM6DSV16</b>BX运动+骨传导传感器

    ST LSM6DSV16X iNEMO惯性模块相关的使用信息和应用提示

    AN5763,LSM6DSV16X是一款ST的3 轴加速度计和 3 轴陀螺仪LSM6DSV16X 是系统级封装的 3 轴数字加速度计和 3 轴数字陀螺仪,具有数字 I²C、SPI
    发表于 08-31 11:12 0次下载

    陀螺仪LSM6DSV16XAI集成(5)----6D方向检测功能

    陀螺仪通常可以读取三个方向上的旋转,即绕X轴、Y轴和Z轴的旋转。每个方向上的旋转包括正向旋转和反向旋转,因此一共有六个位置。这六个位置分别是:1.X轴正向旋转、2.
    的头像 发表于 01-09 16:14 760次阅读
    <b class='flag-5'>陀螺仪</b><b class='flag-5'>LSM6DSV16X</b>与<b class='flag-5'>AI</b><b class='flag-5'>集成</b>(5)----<b class='flag-5'>6</b>D方向检测功能

    意法半导体发布LSM6DSV32X 6轴惯性模块

    意法半导体近日发布了其最新的LSM6DSV32X 6轴惯性模块(IMU),该模块集成了高性能的加速度计和陀螺仪。加速度计的最大量程达到32g,而陀螺
    的头像 发表于 05-13 09:59 476次阅读