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

概述

一旦传感器被正确初始化,可以通过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://xiahunao.cn/news/254132.html

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

相关文章

chatgpt赋能python:Python中构造方法的介绍与应用

Python中构造方法的介绍与应用 在Python编程语言中&#xff0c;构造方法通常是类中的一个特殊方法&#xff0c;用于在对象创建时初始化其属性。构造方法使用__init__关键字来定义&#xff0c;而且通常会包含self参数&#xff0c;用于引用创建的新对象。在本文中&#xff0c;我…

木工专用计算机,木工做多功能电脑台带书柜架一体图片 自己打造电脑桌用实木还是生态木颗粒板...

黑色十字条纹状的书架&#xff0c;给人带来一种与众不同的感觉&#xff0c;褐色的实木地板铺贴在地面上&#xff0c;褐色的地面与整个橱柜形成了鲜明的对比。褐色给人一种灰溜溜的感觉&#xff0c;但是这种颜色很有古典美&#xff0c;而且褐色的地面又特别的耐脏&#xff0c;这…

python爬虫大众点评字体反爬

字形相同的字体反爬问题解析 问题所在&#xff1a;部分数据加载时使用网站自定义的字体&#xff0c;浏览器访问网页时字体文件会加载到浏览器中&#xff0c;爬虫访问时没有对应的自定义字体&#xff0c;所以就得不到那部分数据&#xff0c;如图1&#xff0c;加密的这部分数据在…

五笔字根语法口决

一、字根助记词 11G   王旁青头戋五一 12F   土士二干十寸雨 13D   大犬三&#xff08;羊&#xff09;古石厂 (“羊”指羊字底) 14S   木丁西 15A   工戈草头右框七   (“右框”即“匚”) 21H   目具上止卜虎皮   (“具”指具字的上部) 22J   日早…

字体反爬案例解析:大众点评

文章目录 字体反爬简介发送请求&#xff0c;获取网页源码提取字体信息&#xff0c;并将字体文件下载到本地建立基准字典引例提取需要字体反爬处理的信息提取不需要字体反爬的信息整理提取到的所有信息&#xff0c;并存入excel 字体反爬简介 什么是字体反爬&#xff1f; …

作文 我眼中的计算机1000字,我眼中的自己作文范文1000字(精选6篇)

我眼中的自己作文范文1000字(精选6篇) 在日常生活或是工作学习中&#xff0c;许多人都有过写作文的经历&#xff0c;对作文都不陌生吧&#xff0c;作文根据写作时限的不同可以分为限时作文和非限时作文。还是对作文一筹莫展吗&#xff1f;以下是小编为大家整理的我眼中的自己作…

基于深度学习的高精度家禽猪检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度家禽猪检测识别系统可用于日常生活中或野外来检测与定位家禽猪目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的家禽猪目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检…

智能管理PoE交换机

在这个万物互联的时代&#xff0c;数据与数据之间的相互传输交流&#xff0c;显得尤为重要。那么要怎样才能使计算机与传统的物联设备相连接呢&#xff1f;这时&#xff0c;串口服务器这一媒介的作用就凸显出来了。那么&#xff0c;你知道什么是串口服务器吗&#xff1f;串口服…

chatgpt赋能python:Python中构造函数的名称

Python中构造函数的名称 作为一名有10年Python编程经验的工程师&#xff0c;我深知Python语言中构造函数的重要性。在本文中&#xff0c;我将着重介绍Python中构造函数的名称&#xff0c;并阐述其在Python编程中的作用。 什么是构造函数&#xff1f; 构造函数是一种特殊类型…

C++ stack容器介绍

&#x1f914;stack容器介绍&#xff1a; &#x1f4d6; stack是一种数据结构&#xff0c;也可以被称为堆栈。它是一个容器&#xff0c;只允许在最顶层进行插入和删除&#xff0c;并且只能访问最后一个插入的元素。这个元素称为栈顶。所有新插入的元素都被放置在栈顶上面&#…

Mysql source命令报错

Mysql source命令报错 情况一&#xff1a;目录包含中文 放到没有中文的路径再执行 情况二&#xff1a;不小心加了分号 mysql会将分号当做文件名的一部分 固然报错 情况三&#xff1a;没有选择数据库 使用 use加数据库名 选择数据库后再执行 执行成功画面

Linux中的source命令

Linux中的source命令 1、source命令是什么&#xff1f; source命令也称为“点命令”&#xff0c;也就是一个点符号&#xff08;.&#xff09;&#xff0c;是bash的内部命令。 注意&#xff1a;该命令通常用命令“.”来替代 2、source命令 功能&#xff08;能干什么&#xff0…

qsort函数排序举例

使用qsort函数快速排序应用举例 这篇博客是用qsort函数来快速排列float型数据&#xff0c;分别按照年龄&#xff08;int型&#xff09;、姓名&#xff08;char型&#xff09;排列结构体。看懂就看懂&#xff0c;看不懂我也不想解释了。 简略解释一下qsort函数&#xff1a; v…

C语言qsort函数详解

目录 一、qsort函数的使用 二、qsort函数的模拟 一、qsort函数的使用 快排函数qsort是C的库函数&#xff0c;它可以对输入的任何类型的数组排序&#xff0c;通过该函数的函数声明我们可以看出它的使用方法&#xff1a; 举个栗子&#xff1a; #include<stdio.h> #inclu…

C语言 - qsort函数详解

文章目录 一.qsort函数简介1.qsort函数是C标准库<stdlib.h>库中的函数&#xff0c;使用时引入#include <stdlib.h>。**2.它的函数原型是 void qsort(void* base, size_t num, size_t width, int (*compare)(const void*, const void*))3.这些参数都是什么意思&…

qsort函数详解

上篇文章&#xff0c;笔者讲解了冒泡排序的方法&#xff0c;原文链接为&#xff1a;一个典列来带领大家了解冒泡排序思想_念君思宁的博客-CSDN博客&#xff0c;有意者请参考一下&#xff01; 最近笔者又浅学关于qsort函数的排序方法&#xff01;下面且听笔者一一道来&#xff…

C语言函数——qsort函数的使用

目录 一、qsort函数&#xff1a; 1、定义&#xff1a; 2、参数&#xff1a; &#xff08;1&#xff09;.基础 &#xff08;2&#xff09;.数字 &#xff08;3&#xff09;.大小 &#xff08;4&#xff09;.比较 二、总代码&#xff1a; 1、整型比较&#xff1a; 2、浮…

利用qsort函数快速排序

一.qsort函数的类型及参数 void qsort(void *base,size_t num,size_t width,int (*compare)(const void* elem1),const void* elem2)1.第一个参数base&#xff1a;待排序数组的首元素的地址&#xff0c;数据类型为void*。 2.第二个参数 num&#xff1a;待排序数组的元素个数&…

详解c语言中的qsort函数(有图)

目录 目录 一、qsort函数是什么 1、自定义冒泡函数时遇到的问题 2、qsort函数的作用 &#xff08;1&#xff09;int整形数组排序&#xff08;2&#xff09;浮点型数组排序&#xff08;3&#xff09;字符数组排序 &#xff08;4&#xff09;结构体排序 二、qsort函数…

qsort函数详情

文章目录 一.qsort函数的使用1.qsort函数定义&#xff1a;2.使用 二.qsort函数的模拟实现 一.qsort函数的使用 1.qsort函数定义&#xff1a; qsort函数实现的功能为&#xff1a;对一组数据进行排序。 表现形式&#xff1a; void qsort(void *base, size_t num, size_t size,…