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

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

3天內不再提示

陀螺儀LSM6DSV16X與AI集成(5)----6D方向檢測功能

嵌入式單片機MCU開發 ? 來源:嵌入式單片機MCU開發 ? 作者:嵌入式單片機MCU開 ? 2024-01-09 16:14 ? 次閱讀

概述

陀螺儀通??梢宰x取三個方向上的旋轉,即繞X軸、Y軸和Z軸的旋轉。每個方向上的旋轉包括正向旋轉和反向旋轉,因此一共有六個位置。這六個位置分別是:1.X軸正向旋轉、2.X軸反向旋轉、3.Y軸正向旋轉、4.Y軸反向旋轉、5.Z軸正向旋轉、6.Z軸反向旋轉 通過檢測陀螺儀在每個方向上的旋轉,可以確定物體的旋轉姿態和方向,從而用于導航、飛行控制等應用。

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

視頻教學

[https://www.bilibili.com/video/BV1jw41137Zo/

樣品申請

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

源碼下載

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

生成STM32CUBEMX

用STM32CUBEMX生成例程,這里使用MCU為STM32WB55RG。 配置時鐘樹,配置時鐘為32M。

串口配置

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

配置串口。

IIC配置

配置IIC為快速模式,速度為400k。

CS和SA0設置

串口重定向

打開魔術棒,勾選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/lsm6dsv16x-pid/tree/main]

初始換管腳

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

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

printf("123123123");
  lsm6dsv16x_reset_t rst;
  stmdev_ctx_t dev_ctx;
  /* Initialize mems driver interface */
  dev_ctx.write_reg = platform_write;
  dev_ctx.read_reg = platform_read;
  dev_ctx.handle = &SENSOR_BUS;


  HAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET);
  HAL_GPIO_WritePin(SA0_GPIO_Port, SA0_Pin, GPIO_PIN_RESET);

獲取ID

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

lsm6dsv16x_device_id_get為獲取函數。

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

/* Wait sensor boot time */
  platform_delay(BOOT_TIME);
  /* Check device ID */
  lsm6dsv16x_device_id_get(&dev_ctx, &whoamI);
    printf("LSM6DSV16X_ID=0x%x,whoamI=0x%x",LSM6DSV16X_ID,whoamI);
  if (whoamI != LSM6DSV16X_ID)
    while (1);

復位操作

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

lsm6dsv16x_reset_set為重置函數。

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

/* Restore default configuration */
  lsm6dsv16x_reset_set(&dev_ctx, LSM6DSV16X_RESTORE_CTRL_REGS);
  do {
    lsm6dsv16x_reset_get(&dev_ctx, &rst);
  } while (rst != LSM6DSV16X_READY);

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 */
  lsm6dsv16x_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);

6D方向檢測功能配置

1.使能六維位置檢測功能,配置陀螺儀模塊的中斷引腳,使得當六維傳感器檢測到某種運動時,能夠通過中斷方式通知主控制器。

可以通過使能MD1_CFG (5Eh)中的INT1_6D開啟6D事件。

pin_int.sixd = PROPERTY_ENABLE;
lsm6dsv16x_pin_int1_route_set(&dev_ctx, &pin_int);

2.使能中斷,將中斷配置應用到LSM6DSV16X模塊上。 FUNCTIONS_ENABLE (50h)可以開啟6D中斷。

在 LSM6DSV16X 傳感器的 TAP_CFG0 (56h) 寄存器中,LIR(Latched Interrupt Request)位用于控制中斷請求的鎖存。如果將 LIR 設為 0(默認值),則表示中斷請求不鎖存;如果設為 1,則中斷請求被鎖存。鎖存中斷意味著一旦中斷被觸發,它會保持其激活狀態直到被明確地通過軟件讀取或清除。這通常用于確保不會錯過任何中斷事件,特別是在多任務環境中,其中一個中斷可能會在處理另一個中斷時發生。

irq.enable = 1;
irq.lir = 1;
lsm6dsv16x_interrupt_enable_set(&dev_ctx, irq);

選擇濾波和角度閾值

濾波可以通過 TAP_CFG0 (56h) 設置低通濾波。

角度閾值可以通過 TAP_THS_6D (59h) 設置為60度,用于檢測姿態變化。

設置濾波和角度閾值可用以下函數:

lsm6dsv16x_filt_sixd_feed_set(&dev_ctx, LSM6DSV16X_SIXD_FEED_LOW_PASS);
lsm6dsv16x_6d_threshold_set(&dev_ctx, LSM6DSV16X_DEG_60);

設置量程和速率

速率可以通過CTRL1 (10h)設置加速度速率。

設置加速度量程可以通過CTRL8 (17h)進行設置。

設置加速度的量程和速率可以使用如下函數。

/* Set Output Data Rate.*/
  lsm6dsv16x_xl_data_rate_set(&dev_ctx, LSM6DSV16X_ODR_AT_120Hz);
  /* Set full scale */
  lsm6dsv16x_xl_full_scale_set(&dev_ctx, LSM6DSV16X_2g);

獲取所有中斷源的狀態

判斷是否發生了六維傳感器事件,如果有發生,則將不同方向的事件標志位按位組合起來,其中包括了傳感器的各種狀態,比如 FIFO 狀態、自由落體、喚醒、六維方向、數據就緒等狀態。然后通過一系列的操作和寄存器讀寫,獲取嵌入式功能執行狀態、傳感器中樞狀態等信息,并將這些信息也保存,最后將這些信息返回給主控。這些數據可以通過以下寄存器進行設置。

ALL_INT_SRC (1Dh) 為所有中斷的源寄存器,D6D_IA變量包含了自由落體狀態的信息。

D6D_SRC (47h) 用于六維方向識別,該寄存器包含了用于檢測設備方向的相關信息。

每個位都對應一個方向,用于表示設備是否在相應的方向上運動。例如,如果XH位和YL位都被置位,則表示設備正在以X軸正方向向上運動,并且Y軸負方向朝下。通過讀取D6D_SRC寄存器的值,可以了解設備當前的運動方向,從而進行相應的處理。LSM6DSV16X傳感器中的方向檢測是基于重力加速度和線性加速度的,因此需要在使用之前進行校準和配置,以適應不同的應用場景。

通過 int32_t lsm6dsv16x_all_sources_get(stmdev_ctx_t *ctx, lsm6dsv16x_all_sources_t *val) 函數可以獲取所有中斷源的狀態。

lsm6dsv16x_all_sources_t status;

    /* Read output only if new xl value is available */
    lsm6dsv16x_all_sources_get(&dev_ctx, &status);

    if (status.six_d) {
            sixd_event_catched = (status.six_d    < < 6) |
                                 (status.six_d_zh < < 5) |
                                 (status.six_d_zl < < 4) |
                                 (status.six_d_yh < < 3) |
                                 (status.six_d_yl < < 2) |
                                  (status.six_d_xh < < 1) |
                                 (status.six_d_xl < < 0);
        }

發送相應信息

檢查sixd_event_catched的第7位是否為1,如果第7位為1,表示檢測到了六維傳感器事件。

根據sixd_event_catched的具體數值,通過switch語句匹配不同的情況。每個情況對應著不同的六維傳感器位置,并且針對每種情況都會生成相應的消息并調用tx_com函數發送消息。

最后,在處理完六維傳感器事件后,將sixd_event_catched重置為0,以便下一次事件的檢測。

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
        /* wait forever (6D event handle in irq handler) */
        lsm6dsv16x_all_sources_t status;

        /* Read output only if new xl value is available */
        lsm6dsv16x_all_sources_get(&dev_ctx, &status);

        if (status.six_d) {
            sixd_event_catched = (status.six_d    < < 6) |
                                                     (status.six_d_zh < < 5) |
                                                     (status.six_d_zl < < 4) |
                                                     (status.six_d_yh < < 3) |
                                                     (status.six_d_yl < < 2) |
                                                     (status.six_d_xh < < 1) |
                                                     (status.six_d_xl < < 0);
        }
        if (sixd_event_catched & 0x40) {

      switch (sixd_event_catched) {
      case 0x48:
        printf("6D Position A Y↑rn");
        break;
      case 0x41:
        printf("6D Position B X↓rn");
        break;
      case 0x42:
        printf("6D Position C X↑rn");
        break;
      case 0x44:
        printf("6D Position D Y↓rn");
        break;
      case 0x60:
        printf("6D Position E Z↑rn");
        break;
      case 0x50:
        printf("6D Position F Z↓rn");
        break;
      }
      sixd_event_catched = 0;
        }


    /* USER CODE END WHILE */

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

演示

審核編輯 黃宇

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

    關注

    44

    文章

    741

    瀏覽量

    97833
  • stm32cubemx
    +關注

    關注

    5

    文章

    269

    瀏覽量

    14484
收藏 人收藏

    評論

    相關推薦

    陀螺儀LSM6DSV16XAI集成(6)----檢測自由落體

    本文介紹如何初始化傳感器并配置其參數,以便在檢測到自由落體事件時發送通知。
    的頭像 發表于 05-17 15:12 ?1235次閱讀
    <b class='flag-5'>陀螺儀</b><b class='flag-5'>LSM6DSV16X</b>與<b class='flag-5'>AI</b><b class='flag-5'>集成</b>(6)----<b class='flag-5'>檢測</b>自由落體

    意法半導體發布LSM6DSV32X 6軸慣性模塊

    意法半導體近日發布了其最新的LSM6DSV32X 6軸慣性模塊(IMU),該模塊集成了高性能的加速度計和陀螺儀。加速度計的最大量程達到32g,而陀螺儀則具備高達4000度每秒(dps)
    的頭像 發表于 05-13 09:59 ?201次閱讀

    意法半導體推出一款LSM6DSV32X 6軸慣性模塊(IMU)

    意法半導體的LSM6DSV32X 6軸慣性模塊(IMU)集成一個滿量程32g的大加速度計和一個滿量程4000度每秒(dps)的陀螺儀,可測量高強度的運動和撞擊,包括自由落體高度估算。
    的頭像 發表于 05-09 10:35 ?262次閱讀

    陀螺儀LSM6DSV16XAI集成(3)----讀取融合算法輸出的四元數

    LSM6DSV16X 特性涉及到的是一種低功耗的傳感器融合算法(Sensor Fusion Low Power, SFLP). 低功耗傳感器融合(SFLP)算法:
    的頭像 發表于 12-18 10:53 ?681次閱讀
    <b class='flag-5'>陀螺儀</b><b class='flag-5'>LSM6DSV16X</b>與<b class='flag-5'>AI</b><b class='flag-5'>集成</b>(3)----讀取融合算法輸出的四元數

    陀螺儀LSM6DSV16XAI集成(2)----姿態解算

    LSM6DSV16X包含三軸陀螺儀與三軸加速度計。
    的頭像 發表于 12-18 10:51 ?869次閱讀
    <b class='flag-5'>陀螺儀</b><b class='flag-5'>LSM6DSV16X</b>與<b class='flag-5'>AI</b><b class='flag-5'>集成</b>(2)----姿態解算

    陀螺儀LSM6DSV16XAI集成(1)----輪詢獲取陀螺儀數據

    本文將介紹如何使用 LSM6DSV16X 傳感器來讀取數據。主要步驟包括初始化傳感器接口、驗證設備ID、配置傳感器的數據輸出率和濾波器,以及通過輪詢方式持續讀取加速度、角速率和溫度數據。讀取到的數據
    的頭像 發表于 12-18 10:49 ?798次閱讀
    <b class='flag-5'>陀螺儀</b><b class='flag-5'>LSM6DSV16X</b>與<b class='flag-5'>AI</b><b class='flag-5'>集成</b>(1)----輪詢獲取<b class='flag-5'>陀螺儀</b>數據

    LSM6DS3的應用筆記

    本文檔旨在提供 ST LSM6DS3 iNEMO 六軸慣性傳感器模塊相關的使用信息和應用提示。LSM6DS3 是系統級封裝的 3D 數字加速度計和 3D 數字
    發表于 09-13 08:23

    LSM6DSL應用筆記

    本文檔旨在提供 ST LSM6DSL iNEMO 六軸慣性傳感器模塊相關的使用信息和應用提示。LSM6DSL 是系統級封裝的 3D 數字加速度計和 3D 數字
    發表于 09-13 08:17

    LSM6DSO的應用筆記

    本文檔旨在提供 ST LSM6DSO iNEMO 六軸慣性傳感器模塊相關的使用信息和應用提示。LSM6DSO 是系統級封裝的 3D 數字加速度計和 3D 數字
    發表于 09-13 08:05

    LSM6DSR iNEMO六軸慣性傳感器模塊相關資料

    本文檔旨在提供 ST LSM6DSR iNEMO 六軸慣性傳感器模塊相關的使用信息和應用提示。LSM6DSR 是系統級封裝的 3D 數字加速度計和 3D 數字
    發表于 09-13 07:11

    LSM6DSM的應用筆記

    本文檔旨在提供 ST LSM6DSM iNEMO 六軸慣性傳感器模塊相關的使用信息和應用提示。LSM6DSM 是系統級封裝的 3D 數字加速度計和 3D 數字
    發表于 09-13 06:15

    LSM6DS3 iNEMO六軸慣性傳感器模塊相關的使用信息和應用提示

    LSM6DS3:始終開啟的 3D 加速度計和 3D 陀螺儀LSM6DS3 是系統級封裝的 3D
    發表于 09-06 06:57

    LSM6DSL iNEMO六軸慣性傳感器模塊相關的使用信息和應用提示

    LSM6DSL 是系統級封裝的 3D 數字加速度計和 3D 數字陀螺儀,具有數字 I2C/SPI 串口標準輸出,在組合高性能工作模式下 6
    發表于 09-06 06:12

    LSM6DSM iNEMO六軸慣性傳感器模塊相關的使用信息和應用提示

    LSM6DSM 是系統級封裝的 3D 數字加速度計和 3D 數字陀螺儀,具有數字 I2C/SPI 串口標準輸出,組合工作在高性能模式下功耗只要 0.65mA。由于
    發表于 09-06 06:03

    ST LSM6DSV16X iNEMO慣性模塊相關的使用信息和應用提示

    AN5763,LSM6DSV16X是一款ST的3 軸加速度計和 3 軸陀螺儀; LSM6DSV16X 是系統級封裝的 3 軸數字加速度計和 3 軸數字陀螺儀,具有數字 I2C、SPI
    發表于 08-31 11:12 ?0次下載
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>