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

陀螺仪LSM6DSV16X与AI集成.6--检测自由落体

  • 概述
  • 视频教学
  • 样品申请
  • 源码下载
  • 主要内容
  • 生成STM32CUBEMX
  • 串口配置
  • IIC配置
  • CS和SA0设置
  • 串口重定向
  • 参考程序
  • 初始换管脚
  • 获取ID
  • 复位操作
  • BDU设置
  • 设置量程
  • 设置FIFO水印
  • 设置速率
  • 使用流模式
  • 设置FIFO时间戳批处理速率
  • 使能时间戳
  • FIFO状态寄存器
  • 演示

概述

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

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

在这里插入图片描述

视频教学

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

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

样品申请

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

源码下载

主要内容

  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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/32352.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Django数据驾驶舱

Django数据驾驶舱 1.项目介绍2.项目结构3.库表结构3.1 appcsdn的models3.2 appssq的models3.3 appweather的models3.4 appweibo的models 4.功能展示5.解决问题5.1 路由配置5.2 后端数据与前端echarts展示5.3 长图表丝滑滚动条 6.遗留问题7.资源分享 1.项目介绍 这里介绍本人最…

阿里云发送验证码流程

目录 1. 阿里云短信服务简介 2. 阿里云验证码发送流程 2.1 申请阿里云短信服务 2.2 短信模板及阿里云秘钥 1.开发者可以在自己的应用程序中集成短信发送功能。绑定发起测试的手机号,需要绑定的手机号才能成功发送验证码,其他的用户手机号发送的验…

如何在 Ubuntu 12.04 VPS 上安装和配置基本的 LDAP 服务器

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。 简介 LDAP(轻量级目录访问协议)是一种通过文件和目录层次结构管理相关信息的协议,它可以从集中位置管…

【4003】基于springboot实现的线上阅读系统

作者主页:Java码库 主营内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】:Java 【框架】:spring…

ARM裸机:基础了解

ARM的几种版本号 ARM内核版本号 ARMv7 ARM SoC版本号 Cortex-A8 芯片型号 S5PV210 ARM型号的发展历程 m microcontroller微控制器 就是单片机 a application应用级处理器 就是手机、平板、电脑的CPU r realtime实时处理器 响应速度快,主要用在工业、航天等领域 soc 、cpu、…

ubutu 18.04源码编译安装freeswitch 1.10.7支持视频通话——筑梦之路

软件版本说明 ubuntu版本18.04:https://releases.ubuntu.com/18.04.6/ubuntu-18.04.6-live-server-amd64.iso freeswitch 版本1.10.7:https://files.freeswitch.org/freeswitch-releases/freeswitch-1.10.7.-release.tar.gz spandsp包:https:…

VB计算圆柱体积和表面积

已知圆半径和圆柱的高,计算圆柱体积和表面积。 Public Class Form1Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.ClickConst PI 3.14159Dim r As Integer, h As IntegerDim t As Single, s As Singler Val(TextBox1.Text)h V…

免杀笔记 ---> C语言

这次的更新可能有点慢,因为这段时间也比较忙,加上C语言还得和汇编结合,导致小编一个知识点总是得反复揣摩(太菜了),所以免杀的更新篇幅长度可能会达到两个月和三个月,但是小编能保证&#xff0c…

动手学深度学习(Pytorch版)代码实践 -卷积神经网络-24深度卷积神经网络AlexNet

24深度卷积神经网络AlexNet import torch from torch import nn import liliPytorch as lp import liliPytorch as lp import matplotlib.pyplot as pltdropout1 0.5 #Alexnet架构 net nn.Sequential(nn.Conv2d(1, 96, kernel_size11, stride4, padding1),nn.ReLU(),nn.MaxPo…

智慧校园综合管理系统的优点有哪些

在当今这个信息化飞速发展的时代,智慧校园综合管理系统正逐步成为教育领域的一股革新力量,它悄然改变着我们对传统校园管理的认知。这套系统如同一个无形的桥梁,将先进的信息技术与学校的日常运作紧密相连,展现出多维度的优势。 …

训练营第四十五天 | 435. 无重叠区间763.划分字母区间56. 合并区间738.单调递增的数字968.监控二叉树

435. 无重叠区间 力扣题目链接(opens new window) 给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。 注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。 示例 1…

6/22 第四周 python操作word

学习到了word有四个段落,都可以通过python来操作。 并且课程的体系,只是一个启蒙,需要在公司的项目中熟悉,从而具备专项测试的能力。 后续每天的学习笔记也需要侧重于理解的部分。

【CPP】归并排序

目录 1.归并排序简介代码分析归并的非递归形式 1.归并排序 归并排序(MERGE-SORT) 是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide andConquer)的一个非常典型的应用。 将已有序的子序列合并,得到…

NXP实战笔记(十四):32K3xx基于RTD-SDK在S32DS实现HSE的安装。

目录 1、概述 1.1、什么是HSE? 1.2、如何实现HSE的OTA功能 1.3、S32K3放置HSE的地址 2、通过调试器安装HSE 3、通过IVT方式安装HSE 4、坑点慎重踩 4.1、优化等级 4.2、Flash放RAM 4.3、C40_Ip配置更改 4.4、程序烧录 5、测试结果 6、代码链接 1、概述 首…

“论SOA在企业集成架构设计中的应用”必过模板,软考高级,系统架构设计师论文

论文真题 企业应用集成(Enterprise Application Integration, EAI)是每个企业都必须要面对的实际问题。面向服务的企业应用集成是一种基于面向服务体系结构(Service-OrientedArchitecture,SOA)的新型企业应用集成技术,强调将企业和组织内部的资源和业务功能暴露为服务,实现…

vue-json-viewer组件 copyable失效,页面并不现实copy按钮

<json-viewer :value"props.row.param_detail.query" :expand-depth"10" copyable> </json-viewer> 官方文档中&#xff0c;说明&#xff0c;只要在json-viewer中加入 copyable属性&#xff0c;即可实现copy功能&#xff0c;如下图&#xff1…

yolov8环境搭建+训练自己数据集

一、yolov8环境搭建 1. 安装miniconda环境 地址&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda 选择Python3.8版本 最好安装在C盘 勾选自动添加环境变量 ***以下操作安装过程中关闭代理软件 *** 2. 创建虚拟环境 conda create -n yolov8 python3…

vue自建h5应用,接入企业微信JDK(WECOM-JSSDK),实现跳转添加好友功能

一、项目场景&#xff1a; 1、使用vue开发了一套h5页面的项目 2、这个h5链接是在企业微信里某个地方打开的 3、打开页面的时候有一个好友列表&#xff0c;点击好友列表某一条复制手机号跳转到企业微信添加好友页面 二、实现的效果图 博客只允许上传gif图&#xff0c;所以我只…

浙江工商大学24计算机考研数据,好几个专业都接收调剂,计专复试线284分!

浙江工商大学&#xff08;Zhejiang Gongshang University&#xff09;&#xff0c;简称“浙商大”&#xff08;ZJSU&#xff09;&#xff0c;坐落于浙江省杭州市&#xff0c;是中华人民共和国教育部、中华人民共和国商务部和浙江省人民政府共建的浙江省重点建设高校&#xff0c…

C#调用OpenCvSharp计算并显示带掩膜的图像直方图

之前的文章简要测试了调用OpenCvSharp的Cv2.CalcHist函数计算直方图的用法&#xff0c;不过使用过程中参数mask的值始终为null&#xff0c;也就是计算的整幅图像的直方图&#xff0c;如果mask不为空&#xff0c;则可以计算图像指定区域的直方图&#xff0c;本文学习掩膜的创建方…