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ù)采集(6)----FIFO數(shù)據(jù)讀取與配置

嵌入式單片機MCU開發(fā) ? 來源:嵌入式單片機MCU開發(fā) ? 作者:嵌入式單片機MCU開 ? 2024-07-18 10:58 ? 次閱讀

概述

LSM6DS3TR-C是STMicroelectronics公司推出的iNEMO慣性模塊,集成了三軸加速度計和三軸陀螺儀,具備低功耗、強大的運動檢測功能。該傳感器支持多種操作模式,并內(nèi)置FIFO緩沖區(qū),用于批量處理和存儲傳感器數(shù)據(jù)。

FIFO(First In First Out)緩沖區(qū)在數(shù)據(jù)采集和處理過程中起著至關(guān)重要的作用。本文將介紹如何在LSM6DS3TR-C傳感器中配置和讀取FIFO數(shù)據(jù),包括配置FIFO模式、設(shè)置數(shù)據(jù)速率和讀取存儲的數(shù)據(jù)。

最近在弄ST和瑞薩RA的課程,需要樣片的可以加群申請:615061293 。

視頻教學(xué)

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

樣品申請

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

源碼下載

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

主要內(nèi)容

  1. 初始化LSM6DSV16X傳感器并檢查其設(shè)備ID
  2. 恢復(fù)傳感器默認(rèn)配置并設(shè)置必要的參數(shù)
  3. 配置FIFO模式和水印閾值
  4. 設(shè)置加速度計和陀螺儀的數(shù)據(jù)速率
  5. 連續(xù)讀取FIFO中的傳感器數(shù)據(jù)并解析輸出
    LSM6DS3TR-C支持多種FIFO模式,包括:
    ● Bypass模式:直接從寄存器讀取數(shù)據(jù),不使用FIFO。
    ● FIFO模式:數(shù)據(jù)寫入FIFO,直到緩沖區(qū)滿為止。
    ● Continuous模式:數(shù)據(jù)連續(xù)寫入FIFO,新的數(shù)據(jù)會覆蓋舊數(shù)據(jù)。
    ● Continuous-to-FIFO模式:初始階段為連續(xù)模式,當(dāng)特定條件滿足時切換為FIFO模式。
    ● Bypass-to-Continuous模式:初始階段為Bypass模式,當(dāng)特定條件滿足時切換為連續(xù)模式。

生成STM32CUBEMX

用STM32CUBEMX生成例程,這里使用MCU為STM32H503CB。

配置時鐘樹,配置時鐘為250M。

串口配置

查看原理圖,PA9和PA10設(shè)置為開發(fā)板的串口。

配置串口,速率為2000000。

IIC配置

LSM6DS3TR-C最大IIC通訊速率為400k。

配置IIC速度為400k

CS和SA0設(shè)置

由于還有一個磁力計,需要把該CS也使能。

ICASHE

修改堆棧

串口重定向

打開魔術(shù)棒,勾選MicroLIB

在main.c中,添加頭文件,若不添加會出現(xiàn) identifier "FILE" is undefined報錯。

/* USER CODE BEGIN Includes */
#include "stdio.h"
/* USER CODE END Includes */

函數(shù)聲明和串口重定向:

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

參考驅(qū)動程序

[https://github.com/STMicroelectronics/lsm6ds3tr-c-pid]

FIFO參考程序

[https://github.com/STMicroelectronics/STMems_Standard_C_drivers/blob/master/lsm6ds3_STdC/examples/lsm6ds3_multi_read_fifo_simple.c]

初始化管腳

由于需要向LSM6DS3TR_C_I2C_ADD_L寫入以及為IIC模式。

所以使能CS為高電平,配置為IIC模式。 配置SA0為低電平。

printf("HELLO!n");
  HAL_GPIO_WritePin(CS1_GPIO_Port, CS1_Pin, GPIO_PIN_SET);
  HAL_GPIO_WritePin(SA0_GPIO_Port, SA0_Pin, GPIO_PIN_RESET);
  HAL_GPIO_WritePin(CS2_GPIO_Port, CS2_Pin, GPIO_PIN_SET);
    HAL_Delay(100);



  /* Initialize mems driver interface */
  stmdev_ctx_t dev_ctx;
  dev_ctx.write_reg = platform_write;
  dev_ctx.read_reg = platform_read;
  dev_ctx.mdelay = platform_delay;
  dev_ctx.handle = &SENSOR_BUS;
  /* Init test platform */
//  platform_init();
  /* Wait sensor boot time */
  platform_delay(BOOT_TIME);

獲取ID

可以向WHO_AM_I (0Fh)獲取固定值,判斷是否為0x6A

lsm6ds3tr_c_device_id_get為獲取函數(shù)。

對應(yīng)的獲取ID驅(qū)動程序,如下所示。

/* Check device ID */
  whoamI = 0;
  lsm6ds3tr_c_device_id_get(&dev_ctx, &whoamI);
    printf("LSM6DS3TR-C_ID=0x%x,whoamI=0x%x",LSM6DS3TR_C_ID,whoamI);
  if ( whoamI != LSM6DS3TR_C_ID )
    while (1); /*manage here device not found */

復(fù)位操作

可以向CTRL3 (12h)的SW_RESET寄存器寫入1進(jìn)行復(fù)位。

lsm6ds3tr_c_reset_set為重置函數(shù)。

對應(yīng)的驅(qū)動程序,如下所示。

/* Restore default configuration */
  lsm6ds3tr_c_reset_set(&dev_ctx, PROPERTY_ENABLE);

  do {
    lsm6ds3tr_c_reset_get(&dev_ctx, &rst);
  } while (rst);

設(shè)置量程

設(shè)置加速度量程可以配置CTRL1_XL (10h)寄存器的FS_XL,F(xiàn)S_XL [1:0]可以設(shè)置量程。

設(shè)置角速度量程可以配置CTRL2_G (11h)寄存器的FS_G,F(xiàn)S_G [1:0]可以設(shè)置量程。

/* Set full scale */
  lsm6ds3tr_c_xl_full_scale_set(&dev_ctx, LSM6DS3TR_C_2g);
  lsm6ds3tr_c_gy_full_scale_set(&dev_ctx, LSM6DS3TR_C_2000dps);

BDU設(shè)置

在很多傳感器中,數(shù)據(jù)通常被存儲在輸出寄存器中,這些寄存器分為兩部分:MSB和LSB。這兩部分共同表示一個完整的數(shù)據(jù)值。例如,在一個加速度計中,MSB和LSB可能共同表示一個加速度的測量值。
連續(xù)更新模式(BDU = ‘0’):在默認(rèn)模式下,輸出寄存器的值會持續(xù)不斷地被更新。這意味著在你讀取MSB和LSB的時候,寄存器中的數(shù)據(jù)可能會因為新的測量數(shù)據(jù)而更新。這可能導(dǎo)致一個問題:當(dāng)你讀取MSB時,如果寄存器更新了,接下來讀取的LSB可能就是新的測量值的一部分,而不是與MSB相對應(yīng)的值。這樣,你得到的就是一個“拼湊”的數(shù)據(jù),它可能無法準(zhǔn)確代表任何實際的測量時刻。
塊數(shù)據(jù)更新(BDU)模式(BDU = ‘1’):當(dāng)激活BDU功能時,輸出寄存器中的內(nèi)容不會在讀取MSB和LSB之間更新。這就意味著一旦開始讀取數(shù)據(jù)(無論是先讀MSB還是LSB),寄存器中的那一組數(shù)據(jù)就被“鎖定”,直到兩部分都被讀取完畢。這樣可以確保你讀取的MSB和LSB是同一測量時刻的數(shù)據(jù),避免了讀取到代表不同采樣時刻的數(shù)據(jù)。
簡而言之,BDU位的作用是確保在讀取數(shù)據(jù)時,輸出寄存器的內(nèi)容保持穩(wěn)定,從而避免讀取到拼湊或錯誤的數(shù)據(jù)。這對于需要高精度和穩(wěn)定性的應(yīng)用尤為重要。
可以向CTRL3 (12h)的BDU寄存器寫入1進(jìn)行開啟。

對應(yīng)的驅(qū)動程序,如下所示。

/* Enable Block Data Update */
  lsm6ds3tr_c_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);

設(shè)置速率

設(shè)置加速度速率可以配置CTRL1_XL (10h)寄存器,ODR_XL [3:0]可以設(shè)置速率。

設(shè)置角速度速率可以配置CTRL2_G (11h))寄存器,ODR_G [3:0]可以設(shè)置速率。

/* Set XL and Gyro Output Data Rate:
   * in this example we set 12.5 Hz for Accelerometer and
   * 12.5 Hz for Gyroscope
   */
  lsm6ds3tr_c_xl_data_rate_set(&dev_ctx, LSM6DS3TR_C_XL_ODR_26Hz);
  lsm6ds3tr_c_gy_data_rate_set(&dev_ctx, LSM6DS3TR_C_GY_ODR_26Hz);

FIFO讀取程序

FIFO中的數(shù)據(jù)組織如下:

  1. 第1組FIFO數(shù)據(jù):陀螺儀數(shù)據(jù)
  2. 第2組FIFO數(shù)據(jù):加速度計數(shù)據(jù)
  3. 第3組FIFO數(shù)據(jù):外部傳感器數(shù)據(jù)
  4. 第4組FIFO數(shù)據(jù):外部傳感器數(shù)據(jù)或步數(shù)計和時間戳信息,或溫度傳感器數(shù)據(jù)

文檔中提到,每個數(shù)據(jù)集由6個字節(jié)組成:

● 陀螺儀數(shù)據(jù):6字節(jié)

● 加速度計數(shù)據(jù):6字節(jié)

● 外部傳感器數(shù)據(jù):6字節(jié)

● 步數(shù)計和時間戳信息:6字節(jié)(包含時間戳)

設(shè)置FIFO水印

FIFO水印閾值的配置在寄存器FIFO_CTRL1和FIFO_CTRL2中,具體的設(shè)置如下:
● FIFO_CTRL1寄存器(0x06h):
○ 包含低8位的水印閾值FTH_[7:0],每一位代表2個字節(jié)(1個字)的FIFO數(shù)據(jù)。
● FIFO_CTRL2寄存器(0x07h):
○ 包含高3位的水印閾值FTH_[10:8],與FIFO_CTRL1一起使用時,可以設(shè)置更高的水印閾值。
在LSM6DS3TR-C傳感器中,F(xiàn)IFO的最小分辨率是1個最低有效位(LSB),對應(yīng)于2個字節(jié)(1個字)。這意味著每次寫入FIFO的數(shù)據(jù)塊的最小單位是2個字節(jié)。
當(dāng)配置FIFO時,用戶需要確保所設(shè)置的水印閾值和讀取操作符合這個最小分辨率。例如,如果設(shè)置了水印閾值為2410,這意味著當(dāng)FIFO中存儲了2410*2個字節(jié)的數(shù)據(jù)時,就會觸發(fā)相應(yīng)的水印事件(如中斷)。根據(jù)這個最小分辨率,每個數(shù)據(jù)塊的大小是2個字節(jié),因此,240個數(shù)據(jù)塊相當(dāng)于480個數(shù)據(jù)。

/* Set FIFO watermark to a multiple of a pattern
   * in this example we set watermark to 10 pattern
   * which means ten sequence of:
   * (GYRO + XL) = 12 bytes
   * (external sensor+timestamp) = 12 bytes
   */ 

    lsm6ds3tr_c_int1_route_t int_1_reg;
  uint16_t pattern_len = 24;  // 每個數(shù)據(jù)集由6個字節(jié)組成,4*6=24,每個數(shù)據(jù)塊的大小是2個字節(jié)
  lsm6ds3tr_c_fifo_watermark_set(&dev_ctx, 10 * pattern_len);

使用流模式

FIFO模式的設(shè)置在寄存器FIFO_CTRL5中,具體的設(shè)置如下:
● FIFO_MODE_[2:0]: 控制FIFO的工作模式。
○ 000: Bypass模式,F(xiàn)IFO禁用。
○ 001: FIFO模式,當(dāng)FIFO滿時停止收集數(shù)據(jù)。
○ 011: 連續(xù)模式,直到觸發(fā)器解除,然后切換為FIFO模式。
○ 100: Bypass模式,直到觸發(fā)器解除,然后切換為連續(xù)模式。
○ 110: 連續(xù)模式,如果FIFO滿,新樣本會覆蓋舊樣本。

使用流模式有以下優(yōu)點

持續(xù)數(shù)據(jù)采集:適用于需要連續(xù)監(jiān)控的場景,如運動跟蹤和實時監(jiān)控應(yīng)用。

數(shù)據(jù)最新性:始終獲取到最新的數(shù)據(jù),避免數(shù)據(jù)滯后。

無需等待FIFO清空:當(dāng)FIFO填滿時,新數(shù)據(jù)自動覆蓋舊數(shù)據(jù),無需手動清空FIFO。

/* Set FIFO mode to Stream mode */
  lsm6ds3tr_c_fifo_mode_set(&dev_ctx, LSM6DS3TR_C_STREAM_MODE);
//  /* Enable FIFO watermark interrupt generation on INT1 pin */
//  lsm6ds3tr_c_pin_int1_route_get(&dev_ctx, &int_1_reg);
//  int_1_reg.int1_fth = PROPERTY_ENABLE;
//  lsm6ds3tr_c_pin_int1_route_set(&dev_ctx, int_1_reg);

啟用時間戳計數(shù)功能

通過設(shè)置 CTRL10_C 寄存器中的 timer_en 和 func_en 位來啟用 LSM6DS3TR-C 傳感器的時間戳計數(shù)功能。時間戳計數(shù)功能允許傳感器記錄事件發(fā)生的時間,便于時間同步和數(shù)據(jù)記錄分析。

/* Enable timestamp and add it to FIFO */
  lsm6ds3tr_c_timestamp_set(&dev_ctx, PROPERTY_ENABLE);

設(shè)置時間戳寫入FIFO

LSM6DS3TR-C傳感器的時間戳批處理速率、溫度數(shù)據(jù)批處理速率、增強的EIS陀螺儀輸出批處理,以及FIFO的工作模式。這些配置確保傳感器數(shù)據(jù)能夠以適當(dāng)?shù)乃俾屎湍J竭M(jìn)行批處理和存儲,以滿足不同的應(yīng)用需求。

FIFO_CTRL2寄存器中,timer_pedo_fifo_en位用于控制是否將步數(shù)計數(shù)器和時間戳數(shù)據(jù)作為第四個FIFO數(shù)據(jù)集。具體含義如下:
● 0: 禁用步數(shù)計數(shù)器和時間戳數(shù)據(jù)作為第四個FIFO數(shù)據(jù)集。
○ 當(dāng)timer_pedo_fifo_en位設(shè)置為0時,步數(shù)計數(shù)器和時間戳數(shù)據(jù)不會被存儲在FIFO中。
● 1: 啟用步數(shù)計數(shù)器和時間戳數(shù)據(jù)作為第四個FIFO數(shù)據(jù)集。
○ 當(dāng)timer_pedo_fifo_en位設(shè)置為1時,步數(shù)計數(shù)器和時間戳數(shù)據(jù)將被存儲在FIFO中,作為第四個數(shù)據(jù)集。

lsm6ds3tr_c_fifo_pedo_and_timestamp_batch_set(&dev_ctx,PROPERTY_ENABLE);

設(shè)置時間戳分辨率

將 WAKE_UP_DUR 寄存器中的 TIMER_HR 位設(shè)置為特定的值,以改變時間戳寄存器的分辨率。

時間戳數(shù)據(jù)為24位的大小。

/* Set the timestamp resolution to 25 μs (TIMER_HR bit in WAKE_UP_DUR register) */
    lsm6ds3tr_c_timestamp_res_set(&dev_ctx, LSM6DS3TR_C_LSB_25us);

FIFO存儲時間戳設(shè)置

通過配置FIFO_CTRL4寄存器中的DEC_DS4_FIFO[2:0]字段來選擇第4組FIFO數(shù)據(jù)集的降采樣因子。

lsm6ds3tr_c_fifo_dataset_3_batch_set(&dev_ctx, LSM6DS3TR_C_FIFO_DS3_NO_DEC);    

    //FIFO_CTRL4 (09h)- >DEC_DS4_FIFO[2:0]
        lsm6ds3tr_c_fifo_dataset_4_batch_set(&dev_ctx, LSM6DS3TR_C_FIFO_DS4_NO_DEC);

通過設(shè)置FIFO_CTRL2寄存器中的TIMER_PEDO_FIFO_EN和TIMER_PEDO_FIFO_DRDY位來啟用和配置步數(shù)計數(shù)和時間戳數(shù)據(jù)存儲。

// 啟用時間戳寫入FIFO第四數(shù)據(jù)集
    //FIFO_CTRL2 (07h)- >TIMER_PEDO_FIFO_EN
  lsm6ds3tr_c_fifo_pedo_and_timestamp_batch_set(&dev_ctx, PROPERTY_ENABLE);

設(shè)置FIFO速率

LSM6DS3TR-C傳感器的FIFO控制寄存器3(FIFO_CTRL3)的內(nèi)容,該寄存器用于選擇陀螺儀和加速度計數(shù)據(jù)寫入FIFO的批處理數(shù)據(jù)速率(BDR,Batch Data Rate)。以下是詳細(xì)描述:
FIFO_CTRL3寄存器(地址09h),該寄存器包含兩個主要字段:
● DEC_FIFO_GYRO [2:0]:選擇陀螺儀數(shù)據(jù)的批處理速率。
● DEC_FIFO_XL [2:0]:選擇加速度計數(shù)據(jù)的批處理速率。

FIFO_CTRL3寄存器的DEC_FIFO_XL字段用于設(shè)置加速度計數(shù)據(jù)的FIFO去采樣率,具體配置如下:
● DEC_FIFO_XL [2:0]: 加速度計FIFO去采樣率設(shè)置。
○ 000: 加速度計傳感器不在FIFO中。
○ 001: 不進(jìn)行去采樣。
○ 010: 去采樣因子為2。
○ 011: 去采樣因子為3。
○ 100: 去采樣因子為4。
○ 101: 去采樣因子為8。
○ 110: 去采樣因子為16。
○ 111: 去采樣因子為32。
001表示“不進(jìn)行去采樣”,即加速度計數(shù)據(jù)寫入FIFO的速率與加速度計的輸出數(shù)據(jù)速率(ODR)相同。因此,如果DEC_FIFO_XL的值設(shè)置為001,則加速度計數(shù)據(jù)的FIFO寫入速率直接等于加速度計的ODR。

/* Set FIFO batch XL/Gyro ODR to 12.5Hz */
    lsm6ds3tr_c_fifo_xl_batch_set(&dev_ctx,LSM6DS3TR_C_FIFO_XL_NO_DEC);
    lsm6ds3tr_c_fifo_gy_batch_set(&dev_ctx,LSM6DS3TR_C_FIFO_GY_NO_DEC);

設(shè)置FIFO數(shù)據(jù)可以通過FIFO_CTRL5 寄存器,可以配置傳感器的 FIFO 模式和數(shù)據(jù)輸出速率,以滿足不同應(yīng)用的需求。

/* Set ODR FIFO */
  lsm6ds3tr_c_fifo_data_rate_set(&dev_ctx, LSM6DS3TR_C_FIFO_26Hz);

初始化

/* USER CODE BEGIN 2 */
    printf("HELLO!n");
  HAL_GPIO_WritePin(CS1_GPIO_Port, CS1_Pin, GPIO_PIN_SET);
  HAL_GPIO_WritePin(SA0_GPIO_Port, SA0_Pin, GPIO_PIN_RESET);
  HAL_GPIO_WritePin(CS2_GPIO_Port, CS2_Pin, GPIO_PIN_SET);
    HAL_Delay(100);


  /* Initialize mems driver interface */
  stmdev_ctx_t dev_ctx;
  dev_ctx.write_reg = platform_write;
  dev_ctx.read_reg = platform_read;
  dev_ctx.mdelay = platform_delay;
  dev_ctx.handle = &SENSOR_BUS;
  /* Init test platform */
//  platform_init();
  /* Wait sensor boot time */
  platform_delay(BOOT_TIME);
  /* Check device ID */
  whoamI = 0;
  lsm6ds3tr_c_device_id_get(&dev_ctx, &whoamI);
    printf("LSM6DS3TR-C_ID=0x%x,whoamI=0x%x",LSM6DS3TR_C_ID,whoamI);
  if ( whoamI != LSM6DS3TR_C_ID )
    while (1); /*manage here device not found */

  /* Restore default configuration */
  lsm6ds3tr_c_reset_set(&dev_ctx, PROPERTY_ENABLE);

  do {
    lsm6ds3tr_c_reset_get(&dev_ctx, &rst);
  } while (rst);



  /* 設(shè)置加速度計和陀螺儀的滿量程范圍 */
  lsm6ds3tr_c_xl_full_scale_set(&dev_ctx, LSM6DS3TR_C_2g);
  lsm6ds3tr_c_gy_full_scale_set(&dev_ctx, LSM6DS3TR_C_2000dps);
  /* 啟用塊數(shù)據(jù)更新(BDU),當(dāng)FIFO支持時 */
  lsm6ds3tr_c_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);

  /* 設(shè)置加速度計和陀螺儀的輸出數(shù)據(jù)速率:
   * 在本例中,我們將加速度計和陀螺儀的速率設(shè)置為26 Hz
   */
  lsm6ds3tr_c_xl_data_rate_set(&dev_ctx, LSM6DS3TR_C_XL_ODR_26Hz);
  lsm6ds3tr_c_gy_data_rate_set(&dev_ctx, LSM6DS3TR_C_GY_ODR_26Hz);


  /* 設(shè)置FIFO水印為模式的倍數(shù)
   * 在本例中,我們將水印設(shè)置為10個模式
   * 這意味著10個序列:
   * (陀螺儀 + 加速度計) = 12字節(jié)
   * (外部傳感器 + 時間戳) = 12字節(jié)
   */
    lsm6ds3tr_c_int1_route_t int_1_reg;
  uint16_t pattern_len = 24;  // 每個數(shù)據(jù)集由6個字節(jié)組成,4*6=24
  lsm6ds3tr_c_fifo_watermark_set(&dev_ctx, 10 * pattern_len);


  /* 將FIFO模式設(shè)置為流模式 */
    //FIFO_CTRL5(0x0A)- >STREAM_MODE
  lsm6ds3tr_c_fifo_mode_set(&dev_ctx, LSM6DS3TR_C_STREAM_MODE);

  /* 啟用時間戳并將其添加到FIFO */
    //CTRL10_C (19h)- >TIMER_EN
  lsm6ds3tr_c_timestamp_set(&dev_ctx, PROPERTY_ENABLE);
    //CTRL10_C (19h)- >PEDO_EN    
    lsm6ds3tr_c_pedo_sens_set(&dev_ctx, PROPERTY_ENABLE); // 根據(jù)需求配置步數(shù)計數(shù)


  /* 將時間戳分辨率設(shè)置為25 μs (WAKE_UP_DUR寄存器中的TIMER_HR位) */
    //WAKE_UP_DUR (5Ch)- >TIMER_HR
    lsm6ds3tr_c_timestamp_res_set(&dev_ctx, LSM6DS3TR_C_LSB_25us);

    //設(shè)置第3數(shù)據(jù)集(Dataset 3)的降采樣因子
        lsm6ds3tr_c_fifo_dataset_3_batch_set(&dev_ctx, LSM6DS3TR_C_FIFO_DS3_NO_DEC);    
    //設(shè)置第4數(shù)據(jù)集(Dataset 4)的降采樣因子
    //FIFO_CTRL4 (09h)- >DEC_DS4_FIFO[2:0]
        lsm6ds3tr_c_fifo_dataset_4_batch_set(&dev_ctx, LSM6DS3TR_C_FIFO_DS4_NO_DEC);


    // 啟用時間戳寫入FIFO第四數(shù)據(jù)集
    //FIFO_CTRL2 (07h)- >TIMER_PEDO_FIFO_EN
  lsm6ds3tr_c_fifo_pedo_and_timestamp_batch_set(&dev_ctx, PROPERTY_ENABLE);            


  /* 設(shè)置FIFO傳感器的降采樣因子 */
  lsm6ds3tr_c_fifo_xl_batch_set(&dev_ctx, LSM6DS3TR_C_FIFO_XL_NO_DEC);
  lsm6ds3tr_c_fifo_gy_batch_set(&dev_ctx, LSM6DS3TR_C_FIFO_GY_NO_DEC);

  /* 設(shè)置FIFO的輸出數(shù)據(jù)速率 */
    //FIFO_CTRL5 (0Ah)
  lsm6ds3tr_c_fifo_data_rate_set(&dev_ctx, LSM6DS3TR_C_FIFO_26Hz);


  /* USER CODE END 2 */

獲取FIFO數(shù)據(jù)

當(dāng)對FIFO輸出寄存器FIFO_DATA_OUT_L (3Eh)和FIFO_DATA_OUT_H (3Fh)進(jìn)行多次讀取操作時,舍入功能會自動啟用。

對LSM6DS3TR-C傳感器的配置,并從FIFO中讀取加速度、角速度、時間戳和外部傳感器數(shù)據(jù)。

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    uint16_t num = 0,num1=0;
    uint16_t num_pattern = 0;
    uint8_t waterm = 0;
    /* 讀取LSM6DS3TR-C的水印標(biāo)志 */
    lsm6ds3tr_c_fifo_wtm_flag_get(&dev_ctx, &waterm);        
    if (waterm) {
      /* 讀取FIFO中的字?jǐn)?shù) */
      lsm6ds3tr_c_fifo_data_level_get(&dev_ctx, &num);
      num_pattern = num / 24*2;
            printf("num=%dn",num);
      while (num_pattern-- > 0) {
                printf ("num1=%dn",num1);
                num1++;
        /* 根據(jù)傳感器的ODR配置,F(xiàn)IFO模式由以下樣本序列組成:GYRO, XL 外部傳感器 時間戳*/
        lsm6ds3tr_c_fifo_raw_data_get(&dev_ctx,
                                  data_raw_angular_rate.u8bit,
                                  3 * sizeof(int16_t));
        angular_rate_mdps[0] =
          lsm6ds3tr_c_from_fs2000dps_to_mdps(data_raw_angular_rate.i16bit[0]);
        angular_rate_mdps[1] =
          lsm6ds3tr_c_from_fs2000dps_to_mdps(data_raw_angular_rate.i16bit[1]);
        angular_rate_mdps[2] =
          lsm6ds3tr_c_from_fs2000dps_to_mdps(data_raw_angular_rate.i16bit[2]);
        printf(
                "Angular rate [mdps]:%4.2ft%4.2ft%4.2frn",
                angular_rate_mdps[0], angular_rate_mdps[1], angular_rate_mdps[2]);
        lsm6ds3tr_c_fifo_raw_data_get(&dev_ctx,
                                  data_raw_acceleration.u8bit,
                                  3 * sizeof(int16_t));
        acceleration_mg[0] =
          lsm6ds3tr_c_from_fs2g_to_mg(data_raw_acceleration.i16bit[0]);
        acceleration_mg[1] =
          lsm6ds3tr_c_from_fs2g_to_mg(data_raw_acceleration.i16bit[1]);
        acceleration_mg[2] =
          lsm6ds3tr_c_from_fs2g_to_mg(data_raw_acceleration.i16bit[2]);
        printf("Acc [mg]:%4.2ft%4.2ft%4.2frn",
                acceleration_mg[0], acceleration_mg[1], acceleration_mg[2]);
                //外部傳感器數(shù)據(jù)                
        lsm6ds3tr_c_fifo_raw_data_get(&dev_ctx,
                                  data_raw_none.u8bit,
                                  3 * sizeof(int16_t));        
        // 打印外部傳感器數(shù)據(jù)
        printf("External sensor data: %02x %02x %02x %02x %02x %02xrn",
               data_raw_none.u8bit[0], data_raw_none.u8bit[1], data_raw_none.u8bit[2],
               data_raw_none.u8bit[3], data_raw_none.u8bit[4], data_raw_none.u8bit[5]);


        /* 讀取時間戳數(shù)據(jù) */
        uint32_t timestamp=0;
        lsm6ds3tr_c_fifo_raw_data_get(&dev_ctx,
                                      data_raw_Timestamp.u8bit,
                                      3*sizeof(int16_t));//
                for(int i=0;i< 6;i++)
                {
                    printf("t[%d]=%d ",i,data_raw_Timestamp.u8bit[i]);

                }
                    timestamp=(data_raw_Timestamp.u8bit[1]< 16)|(data_raw_Timestamp.u8bit[0]< 8)
                        |(data_raw_Timestamp.u8bit[3]);
        printf("Timestamp: %urn", timestamp);                                

      }
    }        


    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

演示

實際測試如下所示,數(shù)據(jù)為20個數(shù)據(jù)。
加速度速率為26Hz,角速度速率為26Hz。
時間戳速率26Hz為38.46ms。
下圖中的2個時間戳數(shù)據(jù)為5825473和5823931,5825473-5823931=1542*25us=38.550ms

審核編輯 黃宇

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

    關(guān)注

    44

    文章

    768

    瀏覽量

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

    關(guān)注

    38

    文章

    5504

    瀏覽量

    113103
  • fifo
    +關(guān)注

    關(guān)注

    3

    文章

    382

    瀏覽量

    43400
收藏 人收藏

    評論

    相關(guān)推薦

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

    本文將介紹如何驅(qū)動和利用LSM6DS3TR-C傳感器,實現(xiàn)精確的運動感應(yīng)功能。LSM6DS3TR-C是一款先進(jìn)的
    的頭像 發(fā)表于 11-13 15:45 ?1772次閱讀
    <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)----獲取ID

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

    配置MotionFX庫,使用FIFO讀取傳感器數(shù)據(jù),FIFO可以作為數(shù)據(jù)緩沖區(qū),存儲傳感器的臨
    的頭像 發(fā)表于 07-18 11:02 ?826次閱讀
    <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>采

    陀螺儀LSM6DSOW開發(fā)(3)----FIFO數(shù)據(jù)讀取配置

    本文檔旨在詳細(xì)介紹如何配置讀取LSM6DSOW傳感器的FIFO數(shù)據(jù)。LSM6DSOW是一款高性
    的頭像 發(fā)表于 08-05 10:03 ?1133次閱讀
    陀螺儀<b class='flag-5'>LSM6</b>DSOW開發(fā)(<b class='flag-5'>3</b>)----<b class='flag-5'>FIFO</b><b class='flag-5'>數(shù)據(jù)</b><b class='flag-5'>讀取</b>與<b class='flag-5'>配置</b>

    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.
    發(fā)表于 03-19 08:15

    LSM6DS3TR-C長時間讀取后角速度輸出為0是什么原因造成的?

    LSM6DS3TR-C 長時間讀取后角速度輸出為0
    發(fā)表于 03-20 06:28

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

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

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

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

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

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

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

    LSM6DS3TR-C中,加速度計和陀螺儀可以獨立地開啟/關(guān)閉,并且可以擁有不同的ODR和功耗模式。 LSM6DS3TR-C有三種可用的操作模式: ● 僅加速度計活動,陀螺儀處于斷電狀態(tài) ● 僅陀螺儀活動,加速度計處于斷電狀態(tài) ● 加速度計和陀螺儀傳感器同時活動
    的頭像 發(fā)表于 11-14 09:45 ?770次閱讀
    <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ù)采集(3)----獲取傳感器數(shù)據(jù)

    一旦傳感器被正確初始化,可以通過SPI或I2C接口向傳感器發(fā)送讀取命令,并接收傳感器返回的數(shù)據(jù)。這個讀取過程包括獲取LSM6DS3TR傳感器
    的頭像 發(fā)表于 11-14 09:59 ?634次閱讀
    <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'>3</b>)----獲取傳感器<b class='flag-5'>數(shù)據(jù)</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 ?698次閱讀
    <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 ?629次閱讀
    <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)解算

    驅(qū)動LSM6DS3TR-C實現(xiàn)高效運動檢測數(shù)據(jù)采集(8)----中斷獲取FIFO數(shù)據(jù)并應(yīng)用MotionFX庫解析空間坐標(biāo)

    估計。本文將介紹如何初始化和配置MotionFX庫,使用中斷機制讀取FIFO中的傳感器數(shù)據(jù)。FIFO可以作為
    的頭像 發(fā)表于 07-21 10:02 ?395次閱讀
    <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>(8)----中斷獲取<b class='flag-5'>FIFO</b><b class='flag-5'>數(shù)據(jù)</b>并應(yīng)用MotionFX庫解析空間坐標(biāo)