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

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

3天内不再提示

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

嵌入式单片机MCU开发 来源:嵌入式单片机MCU开发 作者:嵌入式单片机MCU开 2023-11-14 09:59 次阅读

概述

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

视频教学

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

样品申请

[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("rnacc:X:%2f,tY:%2f,tZ:%2fr", 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.2fr", gyr[0], gyr[1], gyr[2]);
    }
    if (status & LSM6DS3TRC_STATUS_TEMPERATURE)
    {
      printf("rtemp:%2frn", LSM6DS3TRC_Get_Temperature());
    }
    HAL_Delay(100);                
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }

演示

审核编辑 黄宇

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

    关注

    2545

    文章

    50439

    浏览量

    750964
  • mems
    +关注

    关注

    129

    文章

    3885

    浏览量

    190211
  • 陀螺仪
    +关注

    关注

    44

    文章

    776

    浏览量

    98474
  • 数据采集
    +关注

    关注

    38

    文章

    5806

    浏览量

    113417
  • 运动检测
    +关注

    关注

    0

    文章

    34

    浏览量

    12603
收藏 人收藏

    评论

    相关推荐

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

    本文将介绍如何驱动和利用LSM6DS3TR-C传感器实现精确的运动感应功能。LSM6DS3TR-C
    的头像 发表于 11-13 15:45 2033次阅读
    <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>(1)----<b class='flag-5'>获取</b>ID

    驱动LSM6DS3TR-C实现高效运动检测数据采集(6)----FIFO数据读取与配置

    LSM6DS3TR-C是STMicroelectronics公司推出的iNEMO惯性模块,集成了三轴加速度计和三轴陀螺仪,具备低功耗、强大的运动检测功能。该传感器支持多种操作模式,并内置FIFO
    的头像 发表于 07-18 10:58 1153次阅读
    <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>(<b class='flag-5'>6</b>)----FIFO<b class='flag-5'>数据</b>读取与配置

    驱动LSM6驱动LSM6DS3TR-C实现高效运动检测数据采集(7)----MotionFX库解析空间坐标DS3TR-C实现高效运动检测数据

    本文将探讨如何使用MotionFX库解析空间坐标。MotionFX库是一种用于传感器融合的强大工具,可以将加速度计、陀螺仪和磁力计的数据融合在一起,实现精确的姿态和位置估计。本文将介绍如何初始化
    的头像 发表于 07-18 11:02 1003次阅读
    <b class='flag-5'>驱动</b><b class='flag-5'>LSM6</b><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>(7)----MotionFX库解析空间坐标<b class='flag-5'>DS3TR-C</b><b class='flag-5'>实现</b><b class='flag-5'>高效</b><b class='flag-5'>运动检测</b>与<b class='flag-5'>数据</b>采

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

    (LSM6DS3TR_SLV0_ADD, 0x59, 2);//即将写入_读取的寄存bsp_spi_write(LSM6DS3TR_SLV0_SUBADD, 0x01, 2);//无抽取,1个外部
    发表于 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在长时间休眠后(6小时以上),角速度输出为0,短时间休眠输出正常,这是什么问题?
    发表于 03-21 06:27

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

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

    请问LSM6DS3TR-C有没有windows下的测试工具?

    LSM6DS3TR-C有没有windows下的测试工具
    发表于 05-20 06:22

    供应LSM6DSLTR LSM6DSL 传感器 LSM6DSMTR LSM6DSM

    。相比目前最新的 LSM6DS3LSM6DS3H 器件,这些器件的功耗减少多达 50%。 符合最常见的创新型操作系统要求,可帮助开发人员实现常见移动平台的个性化和省电功能的价值最大化。 这些
    发表于 07-15 11:46

    LSM6DS3的应用笔记

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

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

    LSM6DS3TR-C中,加速度计和陀螺仪可以独立地开启/关闭,并且可以拥有不同的ODR和功耗模式。 LSM6DS3TR-C有三种可用的操作模式: ● 仅加速度计活动,陀螺仪处于断电状态 ● 仅陀螺仪活动,加速度计处于断电状态 ● 加速度计和陀螺仪
    的头像 发表于 11-14 09:45 905次阅读
    <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)----配置滤波<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 811次阅读
    <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 736次阅读
    <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)----姿态解算