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

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

3天内不再提示

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

嵌入式单片机MCU开发 来源:嵌入式单片机MCU开发 作者:嵌入式单片机MCU开 2023-11-13 15:45 次阅读

概述

本文将介绍如何驱动和利用LSM6DS3TR-C传感器,实现精确的运动感应功能。LSM6DS3TR-C是一款先进的6轴惯性测量单元(IMU),集成了三轴加速度计和三轴陀螺仪,可用于测量和检测设备的加速度、姿态和运动。

本文将提供LSM6DS3TR-C的基本介绍,包括其技术规格和主要特性。接下来,我们将详细讨论如何驱动LSM6DS3TR-C传感器,包括硬件连接和软件配置。我们将介绍常见的驱动方法和库,以帮助读者快速上手并实现基本的运动感应功能。

通过阅读本文,读者将获得全面的指导,以驱动和利用LSM6DS3TR-C传感器,实现准确、可靠的运动感应功能。

最近在弄ST和瑞萨RA的课程,需要样片的可以加群申请:6_15061293 。
参考文档:
[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]

在这里插入图片描述

视频教学

[https://www.bilibili.com/video/BV19P411Q7fP/

样品申请

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

完整代码下载

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

通信模式

对于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);
}

具体波形如下所示。

在这里插入图片描述

审核编辑 黄宇

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

    关注

    2526

    文章

    48110

    浏览量

    740114
  • 陀螺仪
    +关注

    关注

    44

    文章

    729

    浏览量

    97671
  • 数据采集
    +关注

    关注

    38

    文章

    4530

    浏览量

    112316
  • 运动检测
    +关注

    关注

    0

    文章

    25

    浏览量

    12522
  • stm32cubemx
    +关注

    关注

    5

    文章

    260

    浏览量

    14448
收藏 人收藏

    评论

    相关推荐

    lsm6ds3tr-c传感器集合模式无法使用的原因?

    _FUNC_CFG_ACCESS, 0x80, 2);//第一外部I2C从接口的地址,写0x58,读0x59bsp_spi_write(LSM6DS3TR_SLV0_ADD, 0x58, 2);//即将写入_读取的寄存器
    发表于 03-07 06:26

    LSM6DS3TR-C使用时工作电流比datasheet上大很多是什么原因?

    使用场景是LSM6DS3TR-C通过SPI一拖四连接单片机,一共有四路这样的一拖四。 测试时发现电流很大,感觉有点不对,编写程序使LSM6DS3TR-C间隔5s一个一个使能,会发现稳压源的输出电流从
    发表于 03-07 08:08

    请问LSM6DS3TRLSM6DS3TR-C两个型号能否完全兼容?

    LSM6DS3TR停产买不到了,准备切换LSM6DS3TR-C型号使用。 请问两者有什么差别?能否直接替换?有成功替换案例吗?
    发表于 03-14 06:40

    LSM6DS3TR-C数据读取异常是安利的问题?怎么处理?

    我在使用lsm6ds3tr-c 6轴传感器时发现,读取的温度以及角速度值异常,配置为官方lsm6ds3tr_c_read_data_polling.c文件中
    发表于 03-19 08:15

    LSM6DS3TR-C长时间读取后角速度输出为0是什么原因造成的?

    LSM6DS3TR-C 长时间读取后角速度输出为0
    发表于 03-20 06:28

    LSM6DS3TR-C角速度输出为0是什么原因导致的?

    LSM6DS3TR-C在长时间休眠后(6小时以上),角速度输出为0,短时间休眠输出正常,这是什么问题?
    发表于 03-21 06:27

    LSM6DS3TR-C的FIFO读取数据出错是什么原因造成的?怎么解决?

    使用LSM6DS3TR-C的FIFO,先获取了FIFO的WaterM标志,该标志置位之后再去获取当前存在FIFO缓存的数据长度,再去读取FIFO中对应长度的
    发表于 03-27 06:05

    怎么使用LSM6DS3进行活动检测

    事件时,SLEEP_STATE_IA的值设置为1,但即使检测到活动,该值仍保持不变)你能建议修复这个问题吗?或提供活动检测的替代方案以上来自于谷歌翻译以下为原文 HiI'm using LS
    发表于 05-10 15:11

    LSM6DS3TR-C的低功耗模式和高性能模式有什么区别

    如果我只在 12.5Hz 下操作加速度计,LSM6DS3TR-C 的低功耗模式和高性能模式有什么区别?
    发表于 12-09 06:47

    MEMS LSM6DSD/LSM6DS3/LSM6DSO是否比LSM6DSR具有更好的“抗冲击性”?

    DSO数据表中“对机械冲击的高鲁棒性使得LSM6DS3TR-C 系统首选设计师创造和制造可靠的产品..”测试时,我们观察到 LSM6DSD 和 LSM6DS3 的“抗冲击性”优于
    发表于 02-02 09:21

    LSM6DS3的应用笔记

    专门设计,可在硬件上实现大幅运动检测、倾斜度检测、硬件计步功能、时间戳,并支持对外部磁力计的数据采集,且支持铁磁校准 (硬铁修正,软铁修正)。LSM
    发表于 09-13 08:23

    驱动LSM6DS3TR-C实现高效运动检测数据采集(2)----配置滤波器

    LSM6DS3TR-C中,加速度计和陀螺仪可以独立地开启/关闭,并且可以拥有不同的ODR和功耗模式。 LSM6DS3TR-C有三种可用的操作模式: ● 仅加速度计活动,陀螺仪处于断电状态 ● 仅陀螺仪活动,加速度计处于断电状态 ● 加速度计和陀螺仪传感器同时活动
    的头像 发表于 11-14 09:45 385次阅读
    <b class='flag-5'>驱动</b><b class='flag-5'>LSM6DS3TR-C</b><b class='flag-5'>实现</b><b class='flag-5'>高效</b><b class='flag-5'>运动检测</b>与<b class='flag-5'>数据采集</b>(2)----配置滤波器

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

    一旦传感器被正确初始化,可以通过SPI或I2C接口向传感器发送读取命令,并接收传感器返回的数据。这个读取过程包括获取LSM6DS3TR传感器提供的加速度计和陀螺仪数据,以及传感器对应的
    的头像 发表于 11-14 09:59 294次阅读
    <b class='flag-5'>驱动</b><b class='flag-5'>LSM6DS3TR-C</b><b class='flag-5'>实现</b><b class='flag-5'>高效</b><b class='flag-5'>运动检测</b>与<b class='flag-5'>数据采集</b>(3)----<b class='flag-5'>获取</b>传感器<b class='flag-5'>数据</b>

    驱动LSM6DS3TR-C实现高效运动检测数据采集(4)----上报匿名上位机实现可视化

    LSM6DS3TR-C是单芯片“3轴陀螺仪 + 3轴加速度计”的惯性 测量单元(IMU), 五种种可选满量程的陀螺仪(125/250/500/1000/2000 dps)和加速度计(2/4/8/16
    的头像 发表于 11-14 10:05 375次阅读
    <b class='flag-5'>驱动</b><b class='flag-5'>LSM6DS3TR-C</b><b class='flag-5'>实现</b><b class='flag-5'>高效</b><b class='flag-5'>运动检测</b>与<b class='flag-5'>数据采集</b>(4)----上报匿名上位机<b class='flag-5'>实现</b>可视化

    驱动LSM6DS3TR-C实现高效运动检测数据采集(5)----姿态解算

    lsm6ds3trc包含三轴陀螺仪与三轴加速度计。 姿态有多种数学表示方式,常见的是四元数,欧拉角,矩阵和轴角。他们各自有其自身的优点,在不同的领域使用不同的表示方式。在四轴飞行器中使用到
    的头像 发表于 11-14 10:11 349次阅读
    <b class='flag-5'>驱动</b><b class='flag-5'>LSM6DS3TR-C</b><b class='flag-5'>实现</b><b class='flag-5'>高效</b><b class='flag-5'>运动检测</b>与<b class='flag-5'>数据采集</b>(5)----姿态解算