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

news2025/1/10 2:53:04

概述

本文将介绍如何驱动和利用LSM6DS3TR-C传感器,实现精确的运动感应功能。LSM6DS3TR-C是一款先进的6轴惯性测量单元(IMU),集成了三轴加速度计和三轴陀螺仪,可用于测量和检测设备的加速度、姿态和运动。
本文将提供LSM6DS3TR-C的基本介绍,包括其技术规格和主要特性。接下来,我们将详细讨论如何驱动LSM6DS3TR-C传感器,包括硬件连接和软件配置。我们将介绍常见的驱动方法和库,以帮助读者快速上手并实现基本的运动感应功能。
通过阅读本文,读者将获得全面的指导,以驱动和利用LSM6DS3TR-C传感器,实现准确、可靠的运动感应功能。
参考文档:
https://github.com/STMicroelectronics/STMems_Standard_C_drivers/tree/master/lsm6ds3tr-c_STdC
https://github.com/STMicroelectronics/STMems_Standard_C_drivers/blob/master/lsm6ds3tr-c_STdC/examples/lsm6ds3tr_c_read_data_polling.c

在这里插入图片描述

通信模式

对于LSM6DS3TR-C,有两种模式mode1和mode2,这两种模式都可以使用SPI或者IIC进行通讯。
其中mode2可以通过IIC控制其他的从设备传感器。
在这里插入图片描述

管脚定义

在这里插入图片描述
在这里插入图片描述

IIC通信模式

上图可以得知,在使用IIC通讯模式的时候,SA0是用来控制IIC的地址位的。
对应的IIC接口如下所示。
主要使用的管脚为CS、SCL、SDA、SA0。
在这里插入图片描述
对于IIC的地址,可以通过SDO/SA0引脚修改。SDO/SA0引脚可以用来修改设备地址的最低有效位。如果SDO/SA0引脚连接到电源电压,LSb(最低有效位)为’1’(地址1101011b);否则,如果SDO/SA0引脚连接到地线,LSb的值为’0’(地址1101010b)。
在这里插入图片描述
具体地址如下所示。
在这里插入图片描述

速率

该模块支持的速度为普通模式(100k)和快速模式(400k)。
在这里插入图片描述

LSM6DS3TR-C在Mode 1下参考图

在这里插入图片描述

生成STM32CUBEMX

用STM32CUBEMX生成例程,这里使用MCU为STM32G030C8。
配置时钟树,配置时钟为64M。
在这里插入图片描述

串口配置

查看原理图,PA9和PA10设置为开发板的串口。
在这里插入图片描述

配置串口。
在这里插入图片描述

IIC配置

在这里插入图片描述

配置IIC为快速模式,速度为400k。
在这里插入图片描述

串口重定向

打开魔术棒,勾选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 */

IIC读函数

参考例程序中对应的驱动程序为platform_read(),如下所示。
在这里插入图片描述

由上面表格可以得知,地址为 0x6A(‭0110 1010‬),如果是读操作,那么具体的地址为D5(1101 0101)。

#define LSM6DS3TRC_I2CADDR 0x6A
/***************************************************************************************************************
LSM6DS3TRC Read Command
****************************************************************************************************************/
void LSM6DS3TRC_ReadCommand(uint8_t reg_addr, uint8_t *rev_data, uint8_t length)
{
	if (lsm6ds3trc_mode == LSM6DS3TRC_MODE_I2C)
	{
		HAL_I2C_Mem_Read(&hi2c1, LSM6DS3TRC_I2CADDR << 0x01, reg_addr, 1, rev_data, length, 100);
	}

}

IIC写函数

参考例程序中对应的驱动程序为platform_write(),如下所示。
在这里插入图片描述
由上面表格可以得知,地址为 0x6A(‭0110 1010‬),如果是写操作,那么具体的地址为D4(1101 0100)。

#define LSM6DS3TRC_I2CADDR 0x6A
/***************************************************************************************************************
LSM6DS3TRC Write Command
****************************************************************************************************************/
void LSM6DS3TRC_WriteCommand(uint8_t reg_addr, uint8_t *send_data, uint16_t length)
{
	if (lsm6ds3trc_mode == LSM6DS3TRC_MODE_I2C)
		HAL_I2C_Mem_Write(&hi2c1, LSM6DS3TRC_I2CADDR << 0x01, reg_addr, 1, send_data, length, 100);

}

参考程序初始化

在这里插入图片描述

获取ID

参考例程序中对应的获取ID驱动程序,如下所示。
在这里插入图片描述

可以通过获取WHO_AM_I(0Fh)地址的值来判断是否为LSM6DS3TR-C,如果正确,那么读取的值应该为6A(‭01101010‬)。

在这里插入图片描述

读取函数如下所示。

#define LSM6DS3TRC_WHO_AM_I		0x0F
/***************************************************************************************************************
LSM6DS3TRC Get id
****************************************************************************************************************/
bool LSM6DS3TRC_GetChipID(void)
{
	uint8_t buf = 0;

	LSM6DS3TRC_ReadCommand(LSM6DS3TRC_WHO_AM_I, &buf, 1);
	if (buf == 0x6a)
		return true;
	else
		return false;
}

具体波形如下所示。
在这里插入图片描述

系统复位

系统复位可以操作寄存器CTRL3_C (12h)。
在这里插入图片描述
由下面的文档说明可以得知,重置的话可以将BOOT置为1,之后等待15ms,如果设置为高性能模式的话,需要将CTRL3_C寄存器的SW_RESET位设为1,等待50微秒(或等到CTRL3_C寄存器的SW_RESET位返回0),为了避免冲突,重启和软件重置不能同时执行(不要同时将CTRL3_C寄存器的BOOT位和SW_RESET位设为1)。上述流程必须按顺序执行,所以需要多次操作CTRL3_C (12h)。

在这里插入图片描述
参考例程序中对应的复位驱动程序和等待复位成功函数,如下所示。
在这里插入图片描述

复位代码如下所示。

#define LSM6DS3TRC_CTRL3_C		0x12
/***************************************************************************************************************
LSM6DS3TRC reboot and reset register
****************************************************************************************************************/
void LSM6DS3TRC_Reset(void)
{
	uint8_t buf[1] = {0};
	//reboot modules
	buf[0] = 0x80;
	LSM6DS3TRC_WriteCommand(LSM6DS3TRC_CTRL3_C, buf, 1);//BOOT->1
	HAL_Delay(15);

	//reset register
	LSM6DS3TRC_ReadCommand(LSM6DS3TRC_CTRL3_C, buf, 1);//读取SW_RESET 状态
	buf[0] |= 0x01;
	LSM6DS3TRC_WriteCommand(LSM6DS3TRC_CTRL3_C, buf, 1);//将CTRL3_C寄存器的SW_RESET位设为1 
	while (buf[0] & 0x01)
		LSM6DS3TRC_ReadCommand(LSM6DS3TRC_CTRL3_C, buf, 1);//等到CTRL3_C寄存器的SW_RESET位返回0
}

具体波形如下所示。
在这里插入图片描述
在这里插入图片描述

设置BDU

如果读取加速度计/陀螺仪数据特别慢,建议在CTRL3_C寄存器中将BDU(块数据更新)位设置为1。建议在CTRL3_C寄存器中将BDU(块数据更新)位设置为1。
在这里插入图片描述
在这里插入图片描述
参考例程序中对应的设置BDU程序函数,如下所示。
在这里插入图片描述
设置BDU代码如下所示。

#define LSM6DS3TRC_CTRL3_C		0x12
/***************************************************************************************************************
LSM6DS3TRC Set Block Data Update
****************************************************************************************************************/
void LSM6DS3TRC_Set_BDU(bool flag)
{
	uint8_t buf[1] = {0};
	LSM6DS3TRC_ReadCommand(LSM6DS3TRC_CTRL3_C, buf, 1);

	if (flag == true)
	{
		buf[0] |= 0x40;
		LSM6DS3TRC_WriteCommand(LSM6DS3TRC_CTRL3_C, buf, 1);
	}
	else
	{
		buf[0] &= 0xbf;
		LSM6DS3TRC_WriteCommand(LSM6DS3TRC_CTRL3_C, buf, 1);
	}

	LSM6DS3TRC_ReadCommand(LSM6DS3TRC_CTRL3_C, buf, 1);
}

具体波形如下所示。
在这里插入图片描述

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

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

相关文章

车载软件架构 —— 闲聊几句AUTOSAR OS(二)

我是穿拖鞋的汉子,魔都中坚持长期主义的工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 在最艰难的时候,自己就别去幻想太远的将来,只要鼓励自己过好今天就行了! 这世间有太多的猝不及防,有些东西根本不配占有自己的情绪,人生就是一场体验,…

牛客HJ43迷宫问题 - 创建智能体通过策略自己找路

文章目录 问题描述思路代码C 问题描述 描述 定义一个二维数组 N*M &#xff0c;如 5 5 数组下所示&#xff1a; int maze[5][5] { 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫&#xff0c;其中的1表示墙壁&#xff0…

SPA首屏加载速度慢的怎么解决?

SPA首屏加载速度慢的怎么解决&#xff1f; 加载慢的原因 网络延时问题资源文件体积是否过大资源是否重复发送请求去加载了加载脚本的时候&#xff0c;渲染内容堵塞了 解决方案 1.减小入口文件体积 常用的手段是路由懒加载&#xff0c;把不同路由对应的组件分割成不同的代码…

如何在华为OD机试中获得满分?Java实现【水仙花数】一文详解!

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述4. Java算法源码5. 测试6.解题思路1. 题目描述 所谓水仙花数,是指一个…

LeetCode高频算法刷题记录10

文章目录 1. 旋转图像【中等】1.1 题目描述1.2 解题思路1.3 代码实现 2. 组合总和【中等】2.1 题目描述2.2 解题思路2.3 代码实现 3. 回文链表【简单】3.1 题目描述3.2 解题思路3.3 代码实现 4. 字符串解码【中等】4.1 题目描述4.2 解题思路4.3 代码实现 5. 多数元素【简单】5.…

高压功率放大器ATA4014VS高压功率放大器HSA42014

高压功率放大器ATA4014VS高压功率放大器HSA42014 一、企业背景&#xff1a; Aigtek是一家来自中国的专业从事测量仪器研发、生产和销售的高科技企业。公司主要研发和生产功率放大器、功率放大器模块、功率信号源、计量校准源等产品。核心团队主要是来自西安交通大学及西北工业大…

ERP系统介绍

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、ERP系统概述&#xff1f;1.什么是ERP2.主流ERP系统介绍3.用友ERP4.部署用友ERP畅捷通T6软件系统环境要求4.用友ERP畅捷通T6软件用户管理4.用友ERP畅捷通T6软…

简单的UDP网络程序

目录 准备工作 makefile udpServer.hpp udpServer.cc 细节1 服务端部署 创建套接字 接口认识1 socket 协议家族 绑定套接字 认识接口2 bind sockaddr_in结构体类型 细节2 bzero inet_addr 服务器启动(初启动) udpServer.hpp udpServer.cc 细节3 本地回环通…

跑通NeRF-SLAM代码记录

前言 Install 原文章github链接 下载代码 git clone https://github.com/ToniRV/NeRF-SLAM.git --recurse-submodules git submodule update --init --recursive因为有相关依赖&#xff0c;所以尽量使用命令下载代码。 2. 新建nerf-slam环境&#xff0c;github上也没提到p…

从sftp下载大文件到浏览器

从sftp下载大文件到浏览器 问题方案相关依赖包相关代码片段&#xff08;后端&#xff09;文件信息缓存工具类-FileChunkCache文件信息对象-FileDetailsftp传输进度监控-FileProgressMonitor切片工具类-ChunkService文件下载服务-AsyncDownloadService 问题 近期遇到直接使用sf…

Dubbo与SpringBoot整合

1.注意starter版本适配 2.服务提供者 创建Maven项目 boot-user-service-provider 服务提供者 2.1.通用模块依旧照用 2.2.POM <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</a…

如何在华为OD机试中获得满分?Java实现【IPv4地址转换成整数】一文详解!

✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: Java华为OD机试真题(2022&2023) 文章目录 1. 题目描述2. 输入描述3. 输出描述4. Java算法源码5. 测试6.解题思路1. 题目描述 存在一种虚拟 IPv4<

本地创建的项目托管到git

本地创建的项目托管到git 这里的情况是本地先通过命令在电脑上指定文件夹创建好项目后&#xff0c;需要托管到git上&#xff0c;这里以gitee为例 打开gitee&#xff0c;登录滑动到右上方&#xff0b;&#xff0c;点击新建仓库&#xff0c;跳转到新建仓库页面 填写仓库信息&am…

Ubuntu18.04+RTX3060+TensorFlow2.12.0(GPU版)+Cuda11.1+CuDNN8.6.0安装

前情提要 可以跳过 我在Ubuntu18.04上安装了pytorch的相关环境&#xff0c;配置如图。 Ubuntu18.04RTX3060显卡配置pytorch、cuda、cudnn和miniconda_Toblerone_Wind的博客-CSDN博客之前已经安装成功了&#xff0c;也发了篇博客梳理了整套流程如下。ubuntu18.04安装pytorch、c…

回归预测 | MATLAB实现实现FOA-BP果蝇算法优化BP神经网络多变量输入回归预测模型

回归预测 | MATLAB实现实现FOA-BP果蝇算法优化BP神经网络多变量输入回归预测模型 目录 回归预测 | MATLAB实现实现FOA-BP果蝇算法优化BP神经网络多变量输入回归预测模型效果一览基本介绍程序设计参考资料 效果一览 基本介绍 果蝇算法(FOA)优化BP神经网络回归预测,FOA-BP回归预测…

springboot3.0集成nacos2.2.1(一)

本章节内容是没有开启nacos校验方式进行接入 集成环境&#xff1a; java版本&#xff1a;JDK17 springboot版本&#xff1a;3.0.2 创建spring项目&#xff0c;我这里用到的是spring-cloud全家桶 首先是jar包依赖&#xff1a; <properties><maven.compiler.so…

HTB-Forest(PowerView.ps1使用、嵌套组解析、了解帐户操作员组)

目录 扫描 枚举特定于域控制器的服务 AS-REP烘焙服务帐户svc-alfresco 使用Hashcat破解AS-REP哈希 作为svc-alfresco获得立足点 攻击后的枚举和权限提升 查找指向“Account Operators”组的嵌套组 使用PowerView.ps1枚举组 了解帐户操作员组 寻找有价值的ACE 在Exc…

IDE装上ChatGPT,这款编辑器真的做到可以自动写代码了!

ChatGPT狂飙160天&#xff0c;世界已经不是之前的样子。 我新建了人工智能中文站https://ai.weoknow.com 每天给大家更新可用的国内可用chatGPT资源 Cursor 是集成了 GPT-4 的 IDE 工具&#xff0c;目前免费并且无需 API Key&#xff0c;支持 Win、Mac、Linux 平台&#xff0c;…

C# | 凸包算法之Graham,快速找到一组点最外侧的凸多边形

C#实现凸包算法之Graham 文章目录 C#实现凸包算法之Graham前言示例代码实现思路测试结果结束语 前言 这篇关于凸包算法的文章&#xff0c;本文使用C#和Graham算法来实现凸包算法。 首先消除两个最基本的问题&#xff1a; 什么是凸包呢&#xff1f; 凸包是一个包围一组点的凸多…

IIC协议

1.认识IIC 1、IIC协议概述&#xff1a; IIC&#xff08;Inter-Integrated Circuit&#xff0c;集成电路总线&#xff09;是一种串行通信协议&#xff0c;也被称为I2C协议。它是由荷兰的PHILIPS公司&#xff08;现在philips公司将其半导体部门拆分出来并更名为NXP半导体公司&a…