驱动LSM6DS3TR-C实现高效运动检测与数据采集(3)----获取ID

news2024/11/20 12:25:57

概述

一旦传感器被正确初始化,可以通过SPI或I2C接口向传感器发送读取命令,并接收传感器返回的数据。这个读取过程包括获取LSM6DS3TR传感器提供的加速度计和陀螺仪数据,以及传感器对应的温度信息。

获取数据状态

STATUS_REG (1Eh)是该传感器的一个寄存器。在LSM6DS3TR中,STATUS_REG寄存器用于提供传感器的状态信息。
在这里插入图片描述

参考程序的获取状态代码如下所示。
在这里插入图片描述

对应的获取函数如下。
在这里插入图片描述

获取STATUS_REG (1Eh)函数如下所示。

#define LSM6DS3TRC_STATUS_REG	0x1E
/***************************************************************************************************************
LSM6DS3TRC Get data status
****************************************************************************************************************/
uint8_t LSM6DS3TRC_Get_Status(void)
{
	uint8_t buf[1] = {0};
	LSM6DS3TRC_ReadCommand(LSM6DS3TRC_STATUS_REG, buf, 1);
	return buf[0];
}

可以判断如下地址来判断温度,加速度,陀螺仪数据新的数据是否获取完毕。

#define LSM6DS3TRC_STATUS_TEMPERATURE	0x04
#define LSM6DS3TRC_STATUS_GYROSCOPE		0x02
#define LSM6DS3TRC_STATUS_ACCELEROMETER	0x01

获取加速度数据

加速度传感器中的"±2g"、“±4g”、“±8g”、“±16g"表示传感器的测量范围或量程,单位为"g”,代表重力加速度。
"g"是地球表面上的重力加速度,大约等于9.8米/秒²。因此,传感器的量程为"±2g"意味着它可以测量从-2g到+2g的加速度范围,即-19.6米/秒²到+19.6米/秒²。同样地,"±4g"的量程为-39.2米/秒²到+39.2米/秒²,"±8g"的量程为-78.4米/秒²到+78.4米/秒²,"±16g"的量程为-156.8米/秒²到+156.8米/秒²。
因此,这些不同的量程表示了传感器可以测量的加速度范围大小。选取适当的量程取决于应用的需求。如果预计测量的加速度值不会超过±2g,那么选择"±2g"的传感器就足够了,而如果需要测量更大范围的加速度,就需要选择具有更高量程的传感器。选择合适的量程可以确保传感器在测量过程中不会超出其最大测量范围,从而提供准确的测量结果。
在参考代码中,当STATUS_REG(0x1E)中的XLDA位为1时,表示已成功获取加速度数据,可以进行读取操作。
在这里插入图片描述

为了获取完整的加速度X轴、Y轴和Z轴数据,可以连续读取6个8位数据,这些数据来自线性加速度输出寄存器,其值表示为一个16位的二进制补码。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
需要注意的是X轴,Y轴,Z轴的加速度数据都是16位的数据。
同时需要乘以一个缩放因子,这个因子是根据传感器的灵敏度或灵敏度刻度确定的。
在这里插入图片描述

可以修改为如下所示的代码。

#define LSM6DS3TRC_OUTX_L_XL		0x28
/***************************************************************************************************************
LSM6DS3TRC Get Acceleration Value
****************************************************************************************************************/
void LSM6DS3TRC_Get_Acceleration(uint8_t fsxl, float *acc_float)
{
	uint8_t buf[6];
	int16_t acc[3];
	LSM6DS3TRC_ReadCommand(LSM6DS3TRC_OUTX_L_XL, buf, 6);
	acc[0] = buf[1] << 8 | buf[0];
	acc[1] = buf[3] << 8 | buf[2];
	acc[2] = buf[5] << 8 | buf[4];

	switch (fsxl)
	{
	case LSM6DS3TRC_ACC_FSXL_2G:
		acc_float[0] = ((float)acc[0] * 0.061f);
		acc_float[1] = ((float)acc[1] * 0.061f);
		acc_float[2] = ((float)acc[2] * 0.061f);
		break;

	case LSM6DS3TRC_ACC_FSXL_16G:
		acc_float[0] = ((float)acc[0] * 0.488f);
		acc_float[1] = ((float)acc[1] * 0.488f);
		acc_float[2] = ((float)acc[2] * 0.488f);
		break;

	case LSM6DS3TRC_ACC_FSXL_4G:
		acc_float[0] = ((float)acc[0] * 0.122f);
		acc_float[1] = ((float)acc[1] * 0.122f);
		acc_float[2] = ((float)acc[2] * 0.122f);
		break;

	case LSM6DS3TRC_ACC_FSXL_8G:
		acc_float[0] = ((float)acc[0] * 0.244f);
		acc_float[1] = ((float)acc[1] * 0.244f);
		acc_float[2] = ((float)acc[2] * 0.244f);
		break;
	}
}

获取陀螺仪数据

在参考代码中,当STATUS_REG(0x1E)中的GDA位为1时,表示已成功获取陀螺仪数据,可以进行读取操作。
在这里插入图片描述

为了获取完整的陀螺仪X轴、Y轴和Z轴数据,可以连续读取6个8位数据,这些数据来自陀螺仪输出寄存器,其值表示为一个16位的二进制补码。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
需要注意的是X轴,Y轴,Z轴的陀螺仪数据都是16位的数据。
同时需要乘以一个缩放因子,这个因子是根据传感器的灵敏度或灵敏度刻度确定的。
在这里插入图片描述

可以修改为如下所示的代码。

#define LSM6DS3TRC_OUTX_L_G		0x22
/***************************************************************************************************************
LSM6DS3TRC Get Gyroscope Value
****************************************************************************************************************/
void LSM6DS3TRC_Get_Gyroscope(uint8_t fsg, float *gry_float)
{
	uint8_t buf[6];
	int16_t gry[3];
	LSM6DS3TRC_ReadCommand(LSM6DS3TRC_OUTX_L_G, buf, 6);
	gry[0] = buf[1] << 8 | buf[0];
	gry[1] = buf[3] << 8 | buf[2];
	gry[2] = buf[5] << 8 | buf[4];
	switch (fsg)
	{
	case LSM6DS3TRC_GYR_FSG_250:
		gry_float[0] = ((float)gry[0] * 8.750f);
		gry_float[1] = ((float)gry[1] * 8.750f);
		gry_float[2] = ((float)gry[2] * 8.750f);
		break;
	case LSM6DS3TRC_GYR_FSG_500:
		gry_float[0] = ((float)gry[0] * 17.50f);
		gry_float[1] = ((float)gry[1] * 17.50f);
		gry_float[2] = ((float)gry[2] * 17.50f);
		break;
	case LSM6DS3TRC_GYR_FSG_1000:
		gry_float[0] = ((float)gry[0] * 35.00f);
		gry_float[1] = ((float)gry[1] * 35.00f);
		gry_float[2] = ((float)gry[2] * 35.00f);
		break;
	case LSM6DS3TRC_GYR_FSG_2000:
		gry_float[0] = ((float)gry[0] * 70.00f);
		gry_float[1] = ((float)gry[1] * 70.00f);
		gry_float[2] = ((float)gry[2] * 70.00f);
		break;
	}
}

获取温度数据

在参考代码中,当STATUS_REG(0x1E)中的TDA位为1时,表示已成功获取陀螺仪数据,可以进行读取操作。
在这里插入图片描述

为了获取完整的温度数据,可以连续读取2个8位数据。
在这里插入图片描述

对应的寄存器为OUT_TEMP_L (20h), OUT_TEMP_H (21h)。
在这里插入图片描述
对应温度转换如下所示。

在这里插入图片描述
所以获取到的数据需要除以256在加上25度,可以修改为如下所示的代码。

#define LSM6DS3TRC_OUT_TEMP_L	0x20
float LSM6DS3TRC_Get_Temperature(void)
{
	uint8_t buf[2];
	int16_t temp;
	LSM6DS3TRC_ReadCommand(LSM6DS3TRC_OUT_TEMP_L, buf, 2);
	temp = buf[1] << 8 | buf[0];
	return (((float)temp / 256.0) + 25.0);
}

主程序代码

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    uint8_t status;
    status = LSM6DS3TRC_Get_Status();

    if (status & LSM6DS3TRC_STATUS_ACCELEROMETER)
    {
      float acc[3] = {0};
      LSM6DS3TRC_Get_Acceleration(LSM6DS3TRC_ACC_FSXL_2G, acc);
      printf("\r\nacc:X:%2f,\tY:%2f,\tZ:%2f\r", acc[0], acc[1], acc[2]);
    }
    if (status & LSM6DS3TRC_STATUS_GYROSCOPE)
    {
      float gyr[3] = {0};
      LSM6DS3TRC_Get_Gyroscope(LSM6DS3TRC_GYR_FSG_2000, gyr);
      printf("\rgyr:X:%4.2f,\tY:%4.2f,\tZ:%4.2f\r", gyr[0], gyr[1], gyr[2]);
    }
    if (status & LSM6DS3TRC_STATUS_TEMPERATURE)
    {
      printf("\rtemp:%2f\r\n", LSM6DS3TRC_Get_Temperature());
    }
    HAL_Delay(100);				
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

演示

在这里插入图片描述

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

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

相关文章

破解mysql用户的密码

假如mysql数据库中有一个 prod_blb 用户&#xff0c;你作为root管理员&#xff0c;想知道它的密码&#xff0c;又不想修改它的密码。这个时候就只能通过获取到 prod_blb 用户加密的密码进程破译 1、MYSQL加密方式 MYSQL数据库的认证密码有两种方式&#xff0c;MYSQL 4.1版本之…

python笔记16_实例练习_二手车折旧分析p1

python数据分析练习&#xff0c;具体数据不放出。 分析实践很简单。目的不是做完&#xff0c;而是讲清楚每一步的目的和连带的知识点&#xff08;所以才叫学习笔记&#xff09; 0.数据准备 原始数据格式&#xff1a;csv文件 原始数据结构&#xff1a; 数据格式 字段名 int…

使用Python处理PDF文件的简介与实践

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

ol中不同区域加载不同底图

概述 写一篇水文&#xff0c;讲讲如果在openlayers中实现不同的区域加载不同的底图。 效果 实现 通过tileUrlFunction实现不同切片地址的请求。 <!DOCTYPE html> <html><head><title>XYZ</title><link rel"stylesheet" href&qu…

从源码学习Transformer

Transformer总体结构 近几年NLP领域有了突飞猛进的发展&#xff0c;预训练模型功不可没。当前利用预训练模型&#xff08;pretrain models&#xff09;在下游任务中进行fine-tune&#xff0c;已经成为了大部分NLP任务的固定范式。Transformer摒弃了RNN的序列结构&#xff0c;完…

chatgpt赋能python:Python中捕获异常

Python中捕获异常 什么是异常&#xff1f; 在Python编程中&#xff0c;异常&#xff08;Exceptions&#xff09;是程序执行时发生的错误或意外情况。这些异常可能导致程序崩溃或不能正常运行。为了避免这种情况的发生&#xff0c;我们需要捕获异常并在程序执行时进行相应的错…

SAP-MM-发票校验基本功能详解

一、MIRO抬头数据 1、基本数据 发票日期&#xff1a;一般是指凭证日期&#xff0c;对应FI中的凭证日期&#xff1b; 过账日期&#xff1a;发票和FI凭证的过账日期&#xff1b;这两个日期都可以作为付款条件的计算日期&#xff1b; 金额、税额&#xff1a;这个是指实际发票的…

【探索】机器指令翻译成 JavaScript

前言 前些时候研究脚本混淆时&#xff0c;打算先学一些「程序流程」相关的概念。为了不因太枯燥而放弃&#xff0c;决定想一个有趣的案例&#xff0c;可以边探索边学。 于是想了一个话题&#xff1a;尝试将机器指令 1:1 翻译 成 JavaScript&#xff0c;这样就能在浏览器中&am…

chatgpt赋能python:Python中按下某个按键的实现方法

Python中按下某个按键的实现方法 Python是一种广泛应用于各种领域的高级编程语言&#xff0c;可以用于编写各种类型的应用程序和工具。其中&#xff0c;它在游戏开发方面有着广泛的应用。而在游戏开发过程中&#xff0c;按键响应是至关重要的一个组成部分。本文将带领读者了解…

【测试基础01】

本期参考文献: 链接 一、安装mysql 1、安装mysql可以参考链接: 文章 2、安装mysql与python的工具 进行校验&#xff0c;查看是否安装成功 二、创建库 mycursor mydb.cursor() mycursor.execute("CREATE DATABASE ck") 执行语句创建库在mysql库里可以看到…

String字符串

文章目录 String类String常用的字符串处理方法StringBuffer类 StringBufferStringBuffer类中常用的方法StringBuilder类&#xff08;了解为主&#xff09;StringTokenzier类&#xff08;了解为主&#xff09; final属性&#xff0c;不可扩展&#xff0c;不可子类&#xff0c;不…

C++ list类成员函数介绍

目录 &#x1f914;list模板介绍&#xff1a; &#x1f914;特点&#xff1a; &#x1f914;list内存结构图解&#xff1a; &#x1f914; list的成员函数&#xff1a; &#x1f60a;list构造函数&#xff1a; &#x1f50d;代码示例&#xff1a; &#x1f50d;运行结果&…

python图像处理实战(二)—二值化图像与线性变换

&#x1f680;写在前面&#x1f680; &#x1f58a;个人主页&#xff1a;https://blog.csdn.net/m0_52051577?typeblog &#x1f381;欢迎各位大佬支持点赞收藏&#xff0c;三连必回&#xff01;&#xff01; &#x1f508;本人新开系列专栏—python图像处理 ❀愿每一个骤雨初…

什么是时间复杂度?

时间复杂度定义&#xff1a;在计算机科学中&#xff0c;时间复杂性&#xff0c;又称时间复杂度&#xff0c;算法的时间复杂度是一个函数&#xff0c;它定性描述该算法的运行时间。这是一个代表算法输入值的的长度的函数。时间复杂度常用大O符号表述&#xff0c;不包括这个函数的…

Python篇——数据结构与算法(第四部分:希尔排序及其讨论、计数排序、桶排序、基数排序)

1、希尔排序 希尔排序&#xff08;shell sort&#xff09;是一种分组插入排序算法首先取一个整数d1n/2&#xff0c;将元素分为d1个组&#xff0c;每组相邻两元素之间距离为d1&#xff0c;在各组内进行直接插入排序取第二个整数d2d1/2&#xff0c;重复上述分组排序过程&#xf…

SpringCloud Alibaba Seata 工作机制

SpringCloud Alibaba Seata Seata 工作机制 说明 之所以放在后面说工作机制是因为如果一开始就说的话理解困难 所以我们有了前面的列子和说明我们在结合本节内容会收获的多理解相对容易点 分布式事务过程分析 Seata 分布式事务处理过程-ID三组件模型 debug 梳理: 术语 先…

C++ deque类成员函数介绍

目录 &#x1f914;deque模板介绍&#xff1a; &#x1f914;deque特点&#xff1a; &#x1f914;deque内存结构图解&#xff1a; &#x1f914;deque各操作地址指向&#xff1a; &#x1f914; deque的成员函数&#xff1a; deque构造函数&#xff1a; &#x1f50d;代…

C++ 常见集合算法

目录 &#x1f914;常见集合算法&#xff1a; &#x1f642;1.set_intersection 容器交集 代码示例&#xff1a; 运行结果&#xff1a; &#x1f642;2.set_union 容器并集 图解&#xff1a; 代码示例&#xff1a; 运行结果&#xff1a; &#x1f642; 3.set_differe…

高速缓存(cache)的原理: 了解计算机架构与性能优化

计基之存储器层次结构 Author&#xff1a; Once Day Date&#xff1a; 2023年5月9日 长路漫漫&#xff0c;而今才刚刚启程&#xff01; 本内容收集整理于《深入理解计算机系统》一书。 参看文档: 捋一捋Cache - 知乎 (zhihu.com)iCache和dCache一致性 - 知乎 (zhihu.com)C…

【SpringCloud——Elasticsearch(上)】

一、什么是Elasticsearch elasticsearch是一款非常强大的开源搜索引擎&#xff0c;可以帮助我们从海量数据中快速找到需要的内容。 二、倒排索引 1、正向索引 2、倒排索引 3、总结 三、ES和MySQL的区别 四、操作索引库 1、基于Kibana&#xff08;WEB界面&#xff09; 以下操作…