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

88 篇文章 3 订阅
68 篇文章 23 订阅

概述

一旦传感器被正确初始化,可以通过SPI或I2C接口向传感器发送读取命令,并接收传感器返回的数据。这个读取过程包括获取LSM6DS3TR传感器提供的加速度计和陀螺仪数据,以及传感器对应的温度信息。
最近在弄ST和瑞萨RA的课程,需要样片的可以加群申请:6_15061293 。

视频教学

https://www.bilibili.com/video/BV1CW4y197Zi/

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

样品申请

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

完整代码下载

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

获取数据状态

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 */
  }

演示

在这里插入图片描述

  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
LSM6DS3TR-C是一种集成了加速度计和陀螺仪功能的传感器芯片,可以用于实现运动检测数据采集。为了实现高效运动检测,我们可以采取以下措施: 首先,我们需要配置传感器的寄存器以适应我们的要求。我们可以使用芯片手册提供的配置寄存器的详细信息来设置传感器的采样率、灵敏度等参数。通过设置适当的参数,我们可以提高运动检测的准确性和灵敏度。 其次,为了高效地进行数据采集,我们可以使用中断机制来触发数据采集的操作。传感器芯片支持外部中断引脚,我们可以将其连接到微控制器或处理器的中断引脚上。当传感器检测运动或达到预设的数据阈值时,会触发中断,然后我们的程序可以立即进行相应的数据采集操作,而无需轮询传感器。 此外,我们还可以利用传感器芯片提供的FIFO(First In First Out)缓冲区来存储传感器数据。FIFO缓冲区可以在传感器运动数据的采样过程中,按先进先出的原则存储数据。这样,我们可以在传感器检测运动后立即进行数据采集,并且可以在适当的时候通过读取FIFO缓冲区中的数据来进行后续的处理和分析。 最后,为了实现高效数据采集和处理,我们可以利用传感器芯片提供的SPI或I2C接口与微控制器或处理器进行通信。通过使用这些接口,我们可以快速地将传感器数据传输到微控制器或处理器,并进行实时的数据处理和分析。 综上所述,驱动LSM6DS3TR-C实现高效运动检测数据采集的关键在于合理配置传感器参数、利用中断机制触发数据采集、利用FIFO缓冲区存储数据以及利用SPI或I2C接口进行高速数据传输和处理。通过这些措施,我们可以有效地实现高效运动检测数据采集的功能。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

记帖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值