在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

驅動LSM6DS3TR-C實現高效運動檢測與數據采集(6)----FIFO數據讀取與配置

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

概述

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

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

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

視頻教學

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

樣品申請

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

源碼下載

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

主要內容

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

生成STM32CUBEMX

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

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

串口配置

查看原理圖,PA9和PA10設置為開發板的串口。

配置串口,速率為2000000。

IIC配置

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

配置IIC速度為400k

CS和SA0設置

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

ICASHE

修改堆棧

串口重定向

打開魔術棒,勾選MicroLIB

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

參考驅動程序

[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為獲取函數。

對應的獲取ID驅動程序,如下所示。

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

復位操作

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

lsm6ds3tr_c_reset_set為重置函數。

對應的驅動程序,如下所示。

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

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

設置量程

設置加速度量程可以配置CTRL1_XL (10h)寄存器的FS_XL,FS_XL [1:0]可以設置量程。

設置角速度量程可以配置CTRL2_G (11h)寄存器的FS_G,FS_G [1:0]可以設置量程。

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

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

對應的驅動程序,如下所示。

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

設置速率

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

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

/* 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中的數據組織如下:

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

文檔中提到,每個數據集由6個字節組成:

● 陀螺儀數據:6字節

● 加速度計數據:6字節

● 外部傳感器數據:6字節

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

設置FIFO水印

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

/* 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;  // 每個數據集由6個字節組成,4*6=24,每個數據塊的大小是2個字節
  lsm6ds3tr_c_fifo_watermark_set(&dev_ctx, 10 * pattern_len);

使用流模式

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

使用流模式有以下優點

持續數據采集:適用于需要連續監控的場景,如運動跟蹤和實時監控應用。

數據最新性:始終獲取到最新的數據,避免數據滯后。

無需等待FIFO清空:當FIFO填滿時,新數據自動覆蓋舊數據,無需手動清空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);

啟用時間戳計數功能

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

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

設置時間戳寫入FIFO

LSM6DS3TR-C傳感器的時間戳批處理速率、溫度數據批處理速率、增強的EIS陀螺儀輸出批處理,以及FIFO的工作模式。這些配置確保傳感器數據能夠以適當的速率和模式進行批處理和存儲,以滿足不同的應用需求。

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

lsm6ds3tr_c_fifo_pedo_and_timestamp_batch_set(&dev_ctx,PROPERTY_ENABLE);

設置時間戳分辨率

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

時間戳數據為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存儲時間戳設置

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

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);

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

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

設置FIFO速率

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

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

設置FIFO數據可以通過FIFO_CTRL5 寄存器,可以配置傳感器的 FIFO 模式和數據輸出速率,以滿足不同應用的需求。

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



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

  /* 設置加速度計和陀螺儀的輸出數據速率:
   * 在本例中,我們將加速度計和陀螺儀的速率設置為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);


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


  /* 將FIFO模式設置為流模式 */
    //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); // 根據需求配置步數計數


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

    //設置第3數據集(Dataset 3)的降采樣因子
        lsm6ds3tr_c_fifo_dataset_3_batch_set(&dev_ctx, LSM6DS3TR_C_FIFO_DS3_NO_DEC);    
    //設置第4數據集(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第四數據集
    //FIFO_CTRL2 (07h)- >TIMER_PEDO_FIFO_EN
  lsm6ds3tr_c_fifo_pedo_and_timestamp_batch_set(&dev_ctx, PROPERTY_ENABLE);            


  /* 設置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);

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


  /* USER CODE END 2 */

獲取FIFO數據

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

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

/* 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的水印標志 */
    lsm6ds3tr_c_fifo_wtm_flag_get(&dev_ctx, &waterm);        
    if (waterm) {
      /* 讀取FIFO中的字數 */
      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++;
        /* 根據傳感器的ODR配置,FIFO模式由以下樣本序列組成: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]);
                //外部傳感器數據                
        lsm6ds3tr_c_fifo_raw_data_get(&dev_ctx,
                                  data_raw_none.u8bit,
                                  3 * sizeof(int16_t));        
        // 打印外部傳感器數據
        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]);


        /* 讀取時間戳數據 */
        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 */

演示

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

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 陀螺儀
    +關注

    關注

    44

    文章

    784

    瀏覽量

    98712
  • 數據采集
    +關注

    關注

    39

    文章

    6108

    瀏覽量

    113653
  • fifo
    +關注

    關注

    3

    文章

    388

    瀏覽量

    43679
收藏 人收藏

    評論

    相關推薦

    驅動LSM6DS3TR-C實現高效運動檢測數據采集(1)----獲取ID

    本文將介紹如何驅動和利用LSM6DS3TR-C傳感器,實現精確的運動感應功能。LSM6DS3TR-C是一款先進的
    的頭像 發表于 11-13 15:45 ?2278次閱讀
    <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)----獲取ID

    驅動LSM6驅動LSM6DS3TR-C實現高效運動檢測數據采集(7)----MotionFX庫解析空間坐標DS3TR-C實現高效運動檢測數據

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

    陀螺儀LSM6DSOW開發(3)----FIFO數據讀取配置

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

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

    _FUNC_CFG_ACCESS, 0x80, 2);//第一外部I2C從接口的地址,寫0x58,讀0x59bsp_spi_write(LSM6DS3TR_SLV0_ADD, 0x58, 2);//即將寫入_讀取的寄存器
    發表于 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.
    發表于 03-19 08:15

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

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

    LSM6DS3TR-C角速度輸出為0是什么原因導致的?

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

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

    使用LSM6DS3TR-CFIFO,先獲取了FIFO的WaterM標志,該標志置位之后再去獲取當前存在FIFO緩存的數據長度,再去
    發表于 03-27 06:05

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

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

    驅動LSM6DS3TR-C實現高效運動檢測數據采集(2)----配置濾波器

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

    一旦傳感器被正確初始化,可以通過SPI或I2C接口向傳感器發送讀取命令,并接收傳感器返回的數據。這個讀取過程包括獲取LSM6DS3TR傳感器
    的頭像 發表于 11-14 09:59 ?873次閱讀
    <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'>3</b>)----獲取傳感器<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 ?911次閱讀
    <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 ?835次閱讀
    <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)----姿態解算
    主站蜘蛛池模板: 色多多·com| 久久婷婷五综合一区二区| 噜噜噜色噜噜噜久久| 一级片在线观看视频| 午夜看黄| 婷婷四房综合激情五月性色| 激情五月婷婷丁香| 两人性潮高免费视频看| 1000部啪啪未满十八勿入中国| 久久久免费观看| 在线视频亚洲欧美| 黄色片网站日本| 九色综合网| 97爱sese| 色视频在线| 亚洲综合五月天欧美| 91av视频网站| 日本三级成人午夜视频网| 五月天婷婷基地| 成人免费一区二区三区| 亚洲福利二区| freesexvideo性欧美tv | 特黄特黄一级高清免费大片 | 六月丁香婷婷天天在线| 欧美四色| 亚洲国产香蕉视频欧美| 艹逼视频免费看| 中文字幕在线一区| 欧美ab在线| 国产久热精品| 色综合网址| 色橹橹| 在线播放12p| www.黄网| 日本一区视频在线播放| 久久观看视频| 日本免费黄色录像| 一级毛片日韩| 五月天狠狠操| 一级中文字幕乱码免费| free性欧美69高清|