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

概述

本文将介绍如何驱动和利用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/

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

样品申请

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

通信模式

对于LSM6DS3TR-C,有两种模式mode1和mode2,这两种模式都可以使用SPI或者IIC进行通讯。
其中mode2可以通过IIC控制其他的从设备传感器。
驱动LSM6DS3TR-C实现高效运动检测与数据采集(1)----获取ID_第1张图片

管脚定义

驱动LSM6DS3TR-C实现高效运动检测与数据采集(1)----获取ID_第2张图片
驱动LSM6DS3TR-C实现高效运动检测与数据采集(1)----获取ID_第3张图片

IIC通信模式

上图可以得知,在使用IIC通讯模式的时候,SA0是用来控制IIC的地址位的。
对应的IIC接口如下所示。
主要使用的管脚为CS、SCL、SDA、SA0。
驱动LSM6DS3TR-C实现高效运动检测与数据采集(1)----获取ID_第4张图片
对于IIC的地址,可以通过SDO/SA0引脚修改。SDO/SA0引脚可以用来修改设备地址的最低有效位。如果SDO/SA0引脚连接到电源电压,LSb(最低有效位)为’1’(地址1101011b);否则,如果SDO/SA0引脚连接到地线,LSb的值为’0’(地址1101010b)。
驱动LSM6DS3TR-C实现高效运动检测与数据采集(1)----获取ID_第5张图片
具体地址如下所示。
驱动LSM6DS3TR-C实现高效运动检测与数据采集(1)----获取ID_第6张图片

速率

该模块支持的速度为普通模式(100k)和快速模式(400k)。
驱动LSM6DS3TR-C实现高效运动检测与数据采集(1)----获取ID_第7张图片

LSM6DS3TR-C在Mode 1下参考图

驱动LSM6DS3TR-C实现高效运动检测与数据采集(1)----获取ID_第8张图片

生成STM32CUBEMX

用STM32CUBEMX生成例程,这里使用MCU为STM32G030C8。
配置时钟树,配置时钟为64M。
驱动LSM6DS3TR-C实现高效运动检测与数据采集(1)----获取ID_第9张图片

串口配置

查看原理图,PA9和PA10设置为开发板的串口。
驱动LSM6DS3TR-C实现高效运动检测与数据采集(1)----获取ID_第10张图片

配置串口。
驱动LSM6DS3TR-C实现高效运动检测与数据采集(1)----获取ID_第11张图片

IIC配置

驱动LSM6DS3TR-C实现高效运动检测与数据采集(1)----获取ID_第12张图片

配置IIC为快速模式,速度为400k。
驱动LSM6DS3TR-C实现高效运动检测与数据采集(1)----获取ID_第13张图片

串口重定向

打开魔术棒,勾选MicroLIB
驱动LSM6DS3TR-C实现高效运动检测与数据采集(1)----获取ID_第14张图片

在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(),如下所示。
驱动LSM6DS3TR-C实现高效运动检测与数据采集(1)----获取ID_第15张图片

由上面表格可以得知,地址为 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(),如下所示。
驱动LSM6DS3TR-C实现高效运动检测与数据采集(1)----获取ID_第16张图片
由上面表格可以得知,地址为 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);

}

参考程序初始化

驱动LSM6DS3TR-C实现高效运动检测与数据采集(1)----获取ID_第17张图片

获取ID

参考例程序中对应的获取ID驱动程序,如下所示。
驱动LSM6DS3TR-C实现高效运动检测与数据采集(1)----获取ID_第18张图片

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

驱动LSM6DS3TR-C实现高效运动检测与数据采集(1)----获取ID_第19张图片

读取函数如下所示。

#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;
}

具体波形如下所示。
驱动LSM6DS3TR-C实现高效运动检测与数据采集(1)----获取ID_第20张图片

系统复位

系统复位可以操作寄存器CTRL3_C (12h)。
驱动LSM6DS3TR-C实现高效运动检测与数据采集(1)----获取ID_第21张图片
由下面的文档说明可以得知,重置的话可以将BOOT置为1,之后等待15ms,如果设置为高性能模式的话,需要将CTRL3_C寄存器的SW_RESET位设为1,等待50微秒(或等到CTRL3_C寄存器的SW_RESET位返回0),为了避免冲突,重启和软件重置不能同时执行(不要同时将CTRL3_C寄存器的BOOT位和SW_RESET位设为1)。上述流程必须按顺序执行,所以需要多次操作CTRL3_C (12h)。

驱动LSM6DS3TR-C实现高效运动检测与数据采集(1)----获取ID_第22张图片
参考例程序中对应的复位驱动程序和等待复位成功函数,如下所示。
驱动LSM6DS3TR-C实现高效运动检测与数据采集(1)----获取ID_第23张图片

复位代码如下所示。

#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
}

具体波形如下所示。
驱动LSM6DS3TR-C实现高效运动检测与数据采集(1)----获取ID_第24张图片
驱动LSM6DS3TR-C实现高效运动检测与数据采集(1)----获取ID_第25张图片

设置BDU

如果读取加速度计/陀螺仪数据特别慢,建议在CTRL3_C寄存器中将BDU(块数据更新)位设置为1。建议在CTRL3_C寄存器中将BDU(块数据更新)位设置为1。
驱动LSM6DS3TR-C实现高效运动检测与数据采集(1)----获取ID_第26张图片
驱动LSM6DS3TR-C实现高效运动检测与数据采集(1)----获取ID_第27张图片
参考例程序中对应的设置BDU程序函数,如下所示。
驱动LSM6DS3TR-C实现高效运动检测与数据采集(1)----获取ID_第28张图片
设置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);
}

具体波形如下所示。
驱动LSM6DS3TR-C实现高效运动检测与数据采集(1)----获取ID_第29张图片

你可能感兴趣的:(#STM32,传感器,stm32cube,LSM6DS3TRC,加速度,陀螺仪,角速度,MPU6050)