0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

驅(qū)動LSM6DS3TR-C實現(xiàn)高效運動檢測與數(shù)據(jù)采集(3)----獲取傳感器數(shù)據(jù)

嵌入式單片機MCU開發(fā) ? 來源:嵌入式單片機MCU開發(fā) ? 作者:嵌入式單片機MCU開 ? 2023-11-14 09:59 ? 次閱讀

概述

一旦傳感器被正確初始化,可以通過SPI或I2C接口向傳感器發(fā)送讀取命令,并接收傳感器返回的數(shù)據(jù)。這個讀取過程包括獲取LSM6DS3TR傳感器提供的加速度計和陀螺儀數(shù)據(jù),以及傳感器對應(yīng)的溫度信息。
最近在弄ST和瑞薩RA的課程,需要樣片的可以加群申請:615061293 。

視頻教學(xué)

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

樣品申請

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

完整代碼下載

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

獲取數(shù)據(jù)狀態(tài)

STATUS_REG (1Eh)是該傳感器的一個寄存器。在LSM6DS3TR中,STATUS_REG寄存器用于提供傳感器的狀態(tài)信息。

參考程序的獲取狀態(tài)代碼如下所示。

對應(yīng)的獲取函數(shù)如下。

獲取STATUS_REG (1Eh)函數(shù)如下所示。

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

可以判斷如下地址來判斷溫度,加速度,陀螺儀數(shù)據(jù)新的數(shù)據(jù)是否獲取完畢。

#define LSM6DS3TRC_STATUS_TEMPERATURE    0x04
#define LSM6DS3TRC_STATUS_GYROSCOPE        0x02
#define LSM6DS3TRC_STATUS_ACCELEROMETER    0x01

獲取加速度數(shù)據(jù)

加速度傳感器中的"+-2g"、"+-4g"、"+-8g"、"+-16g"表示傳感器的測量范圍或量程,單位為"g",代表重力加速度。

"g"是地球表面上的重力加速度,大約等于9.8米/秒2。因此,傳感器的量程為"+-2g"意味著它可以測量從-2g到+2g的加速度范圍,即-19.6米/秒2到+19.6米/秒2。同樣地,"+-4g"的量程為-39.2米/秒2到+39.2米/秒2,"+-8g"的量程為-78.4米/秒2到+78.4米/秒2,"+-16g"的量程為-156.8米/秒2到+156.8米/秒2。

因此,這些不同的量程表示了傳感器可以測量的加速度范圍大小。選取適當(dāng)?shù)牧砍倘Q于應(yīng)用的需求。如果預(yù)計測量的加速度值不會超過+-2g,那么選擇"+-2g"的傳感器就足夠了,而如果需要測量更大范圍的加速度,就需要選擇具有更高量程的傳感器。選擇合適的量程可以確保傳感器在測量過程中不會超出其最大測量范圍,從而提供準(zhǔn)確的測量結(jié)果。

在參考代碼中,當(dāng)STATUS_REG(0x1E)中的XLDA位為1時,表示已成功獲取加速度數(shù)據(jù),可以進(jìn)行讀取操作。

為了獲取完整的加速度X軸、Y軸和Z軸數(shù)據(jù),可以連續(xù)讀取6個8位數(shù)據(jù),這些數(shù)據(jù)來自線性加速度輸出寄存器,其值表示為一個16位的二進(jìn)制補碼。

需要注意的是X軸,Y軸,Z軸的加速度數(shù)據(jù)都是16位的數(shù)據(jù)。

同時需要乘以一個縮放因子,這個因子是根據(jù)傳感器的靈敏度或靈敏度刻度確定的。

可以修改為如下所示的代碼。

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

獲取陀螺儀數(shù)據(jù)

在參考代碼中,當(dāng)STATUS_REG(0x1E)中的GDA位為1時,表示已成功獲取陀螺儀數(shù)據(jù),可以進(jìn)行讀取操作。

為了獲取完整的陀螺儀X軸、Y軸和Z軸數(shù)據(jù),可以連續(xù)讀取6個8位數(shù)據(jù),這些數(shù)據(jù)來自陀螺儀輸出寄存器,其值表示為一個16位的二進(jìn)制補碼。

需要注意的是X軸,Y軸,Z軸的陀螺儀數(shù)據(jù)都是16位的數(shù)據(jù)。 同時需要乘以一個縮放因子,這個因子是根據(jù)傳感器的靈敏度或靈敏度刻度確定的。

可以修改為如下所示的代碼。

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

獲取溫度數(shù)據(jù)

在參考代碼中,當(dāng)STATUS_REG(0x1E)中的TDA位為1時,表示已成功獲取陀螺儀數(shù)據(jù),可以進(jìn)行讀取操作。

為了獲取完整的溫度數(shù)據(jù),可以連續(xù)讀取2個8位數(shù)據(jù)。

對應(yīng)的寄存器為OUT_TEMP_L (20h), OUT_TEMP_H (21h)。

對應(yīng)溫度轉(zhuǎn)換如下所示。

所以獲取到的數(shù)據(jù)需要除以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 */
  }

演示

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 傳感器
    +關(guān)注

    關(guān)注

    2551

    文章

    51097

    瀏覽量

    753527
  • mems
    +關(guān)注

    關(guān)注

    129

    文章

    3931

    瀏覽量

    190622
  • 陀螺儀
    +關(guān)注

    關(guān)注

    44

    文章

    784

    瀏覽量

    98709
  • 數(shù)據(jù)采集
    +關(guān)注

    關(guān)注

    39

    文章

    6100

    瀏覽量

    113652
  • 運動檢測
    +關(guān)注

    關(guān)注

    0

    文章

    34

    瀏覽量

    12614
收藏 人收藏

    評論

    相關(guān)推薦

    驅(qū)動LSM6DS3TR-C實現(xiàn)高效運動檢測數(shù)據(jù)采集(1)----獲取ID

    本文將介紹如何驅(qū)動和利用LSM6DS3TR-C傳感器,實現(xiàn)精確的運動感應(yīng)功能。LSM6DS3TR-C
    的頭像 發(fā)表于 11-13 15:45 ?2278次閱讀
    <b class='flag-5'>驅(qū)動</b><b class='flag-5'>LSM6DS3TR-C</b><b class='flag-5'>實現(xiàn)</b><b class='flag-5'>高效</b><b class='flag-5'>運動檢測</b>與<b class='flag-5'>數(shù)據(jù)采集</b>(1)----<b class='flag-5'>獲取</b>ID

    驅(qū)動LSM6DS3TR-C實現(xiàn)高效運動檢測數(shù)據(jù)采集(6)----FIFO數(shù)據(jù)讀取與配置

    LSM6DS3TR-C是STMicroelectronics公司推出的iNEMO慣性模塊,集成了三軸加速度計和三軸陀螺儀,具備低功耗、強大的運動檢測功能。該傳感器支持多種操作模式,并內(nèi)置FIFO
    的頭像 發(fā)表于 07-18 10:58 ?1551次閱讀
    <b class='flag-5'>驅(qū)動</b><b class='flag-5'>LSM6DS3TR-C</b><b class='flag-5'>實現(xiàn)</b><b class='flag-5'>高效</b><b class='flag-5'>運動檢測</b>與<b class='flag-5'>數(shù)據(jù)采集</b>(<b class='flag-5'>6</b>)----FIFO<b class='flag-5'>數(shù)據(jù)</b>讀取與配置

    驅(qū)動LSM6驅(qū)動LSM6DS3TR-C實現(xiàn)高效運動檢測數(shù)據(jù)采集(7)----MotionFX庫解析空間坐標(biāo)DS3TR-C實現(xiàn)高效運動檢測數(shù)據(jù)

    本文將探討如何使用MotionFX庫解析空間坐標(biāo)。MotionFX庫是一種用于傳感器融合的強大工具,可以將加速度計、陀螺儀和磁力計的數(shù)據(jù)融合在一起,實現(xiàn)精確的姿態(tài)和位置估計。本文將介紹如何初始化
    的頭像 發(fā)表于 07-18 11:02 ?1127次閱讀
    <b class='flag-5'>驅(qū)動</b><b class='flag-5'>LSM6</b><b class='flag-5'>驅(qū)動</b><b class='flag-5'>LSM6DS3TR-C</b><b class='flag-5'>實現(xiàn)</b><b class='flag-5'>高效</b><b class='flag-5'>運動檢測</b>與<b class='flag-5'>數(shù)據(jù)采集</b>(7)----MotionFX庫解析空間坐標(biāo)<b class='flag-5'>DS3TR-C</b><b class='flag-5'>實現(xiàn)</b><b class='flag-5'>高效</b><b class='flag-5'>運動檢測</b>與<b class='flag-5'>數(shù)據(jù)</b>采

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

    (LSM6DS3TR_SLV0_ADD, 0x59, 2);//即將寫入_讀取的寄存bsp_spi_write(LSM6DS3TR_SLV0_SUBADD, 0x01, 2);//無抽取,1個外部
    發(fā)表于 03-07 06:26

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

    使用場景是LSM6DS3TR-C通過SPI一拖四連接單片機,一共有四路這樣的一拖四。 測試時發(fā)現(xiàn)電流很大,感覺有點不對,編寫程序使LSM6DS3TR-C間隔5s一個一個使能,會發(fā)現(xiàn)穩(wěn)壓源的輸出電流從
    發(fā)表于 03-07 08:08

    請問LSM6DS3TRLSM6DS3TR-C兩個型號能否完全兼容?

    LSM6DS3TR停產(chǎn)買不到了,準(zhǔn)備切換LSM6DS3TR-C型號使用。 請問兩者有什么差別?能否直接替換?有成功替換案例嗎?
    發(fā)表于 03-14 06:40

    LSM6DS3TR-C數(shù)據(jù)讀取異常是安利的問題?怎么處理?

    我在使用lsm6ds3tr-c 6傳感器時發(fā)現(xiàn),讀取的溫度以及角速度值異常,配置為官方lsm6ds3tr_c_read_data_polling.c文件中
    發(fā)表于 03-19 08:15

    LSM6DS3TR-C角速度輸出為0是什么原因?qū)е碌模?/a>

    LSM6DS3TR-C在長時間休眠后(6小時以上),角速度輸出為0,短時間休眠輸出正常,這是什么問題?
    發(fā)表于 03-21 06:27

    LSM6DS3TR-C的FIFO讀取數(shù)據(jù)出錯是什么原因造成的?怎么解決?

    使用LSM6DS3TR-C的FIFO,先獲取了FIFO的WaterM標(biāo)志,該標(biāo)志置位之后再去獲取當(dāng)前存在FIFO緩存的數(shù)據(jù)長度,再去讀取FIFO中對應(yīng)長度的
    發(fā)表于 03-27 06:05

    請問LSM6DS3TR-C有沒有windows下的測試工具?

    LSM6DS3TR-C有沒有windows下的測試工具
    發(fā)表于 05-20 06:22

    供應(yīng)LSM6DSLTR LSM6DSL 傳感器 LSM6DSMTR LSM6DSM

    。相比目前最新的 LSM6DS3LSM6DS3H 器件,這些器件的功耗減少多達(dá) 50%。 符合最常見的創(chuàng)新型操作系統(tǒng)要求,可幫助開發(fā)人員實現(xiàn)常見移動平臺的個性化和省電功能的價值最大化。 這些
    發(fā)表于 07-15 11:46

    LSM6DS3的應(yīng)用筆記

    專門設(shè)計,可在硬件上實現(xiàn)大幅運動檢測、傾斜度檢測、硬件計步功能、時間戳,并支持對外部磁力計的數(shù)據(jù)采集,且支持鐵磁校準(zhǔn) (硬鐵修正,軟鐵修正)。LSM
    發(fā)表于 09-13 08:23

    驅(qū)動LSM6DS3TR-C實現(xiàn)高效運動檢測數(shù)據(jù)采集(2)----配置濾波

    LSM6DS3TR-C中,加速度計和陀螺儀可以獨立地開啟/關(guān)閉,并且可以擁有不同的ODR和功耗模式。 LSM6DS3TR-C有三種可用的操作模式: ● 僅加速度計活動,陀螺儀處于斷電狀態(tài) ● 僅陀螺儀活動,加速度計處于斷電狀態(tài) ● 加速度計和陀螺儀
    的頭像 發(fā)表于 11-14 09:45 ?1055次閱讀
    <b class='flag-5'>驅(qū)動</b><b class='flag-5'>LSM6DS3TR-C</b><b class='flag-5'>實現(xiàn)</b><b class='flag-5'>高效</b><b class='flag-5'>運動檢測</b>與<b class='flag-5'>數(shù)據(jù)采集</b>(2)----配置濾波<b class='flag-5'>器</b>

    驅(qū)動LSM6DS3TR-C實現(xiàn)高效運動檢測數(shù)據(jù)采集(4)----上報匿名上位機實現(xiàn)可視化

    LSM6DS3TR-C是單芯片“3軸陀螺儀 + 3軸加速度計”的慣性 測量單元(IMU), 五種種可選滿量程的陀螺儀(125/250/500/1000/2000 dps)和加速度計(2/4/8/16
    的頭像 發(fā)表于 11-14 10:05 ?911次閱讀
    <b class='flag-5'>驅(qū)動</b><b class='flag-5'>LSM6DS3TR-C</b><b class='flag-5'>實現(xiàn)</b><b class='flag-5'>高效</b><b class='flag-5'>運動檢測</b>與<b class='flag-5'>數(shù)據(jù)采集</b>(4)----上報匿名上位機<b class='flag-5'>實現(xiàn)</b>可視化

    驅(qū)動LSM6DS3TR-C實現(xiàn)高效運動檢測數(shù)據(jù)采集(5)----姿態(tài)解算

    lsm6ds3trc包含三軸陀螺儀與三軸加速度計。 姿態(tài)有多種數(shù)學(xué)表示方式,常見的是四元數(shù),歐拉角,矩陣和軸角。他們各自有其自身的優(yōu)點,在不同的領(lǐng)域使用不同的表示方式。在四軸飛行中使用到了四元數(shù)
    的頭像 發(fā)表于 11-14 10:11 ?833次閱讀
    <b class='flag-5'>驅(qū)動</b><b class='flag-5'>LSM6DS3TR-C</b><b class='flag-5'>實現(xiàn)</b><b class='flag-5'>高效</b><b class='flag-5'>運動檢測</b>與<b class='flag-5'>數(shù)據(jù)采集</b>(5)----姿態(tài)解算