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

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

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

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

嵌入式單片機(jī)MCU開(kāi)發(fā) ? 來(lái)源:嵌入式單片機(jī)MCU開(kāi)發(fā) ? 作者:嵌入式單片機(jī)MCU開(kāi) ? 2024-01-09 16:14 ? 次閱讀

概述

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

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

視頻教學(xué)

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

樣品申請(qǐng)

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

源碼下載

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

生成STM32CUBEMX

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

串口配置

查看原理圖,PB6和PB7設(shè)置為開(kāi)發(fā)板的串口。

配置串口。

IIC配置

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

CS和SA0設(shè)置

串口重定向

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

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

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

參考程序

[https://github.com/STMicroelectronics/lsm6dsv16x-pid/tree/main]

初始換管腳

由于需要向LSM6DSV16X_I2C_ADD_L寫(xiě)入以及為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為獲取函數(shù)。

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

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

復(fù)位操作

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

lsm6dsv16x_reset_set為重置函數(shù)。

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

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

BDU設(shè)置

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

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

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

6D方向檢測(cè)功能配置

1.使能六維位置檢測(cè)功能,配置陀螺儀模塊的中斷引腳,使得當(dāng)六維傳感器檢測(cè)到某種運(yùn)動(dòng)時(shí),能夠通過(guò)中斷方式通知主控制器。

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

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

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

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

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

選擇濾波和角度閾值

濾波可以通過(guò) TAP_CFG0 (56h) 設(shè)置低通濾波。

角度閾值可以通過(guò) TAP_THS_6D (59h) 設(shè)置為60度,用于檢測(cè)姿態(tài)變化。

設(shè)置濾波和角度閾值可用以下函數(shù):

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

設(shè)置量程和速率

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

設(shè)置加速度量程可以通過(guò)CTRL8 (17h)進(jìn)行設(shè)置。

設(shè)置加速度的量程和速率可以使用如下函數(shù)。

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

獲取所有中斷源的狀態(tài)

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

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

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

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

通過(guò) int32_t lsm6dsv16x_all_sources_get(stmdev_ctx_t *ctx, lsm6dsv16x_all_sources_t *val) 函數(shù)可以獲取所有中斷源的狀態(tài)。

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

發(fā)送相應(yīng)信息

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

根據(jù)sixd_event_catched的具體數(shù)值,通過(guò)switch語(yǔ)句匹配不同的情況。每個(gè)情況對(duì)應(yīng)著不同的六維傳感器位置,并且針對(duì)每種情況都會(huì)生成相應(yīng)的消息并調(diào)用tx_com函數(shù)發(fā)送消息。

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

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

演示

審核編輯 黃宇

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

    關(guān)注

    44

    文章

    768

    瀏覽量

    98173
  • stm32cubemx
    +關(guān)注

    關(guān)注

    5

    文章

    278

    瀏覽量

    14618
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    陀螺儀LSM6DSV16XAI集成(11)----融合磁力計(jì)進(jìn)行姿態(tài)解算

    MotionFX庫(kù)包含用于校準(zhǔn)陀螺儀、加速度計(jì)和磁力計(jì)傳感器的例程。 將磁力計(jì)的數(shù)據(jù)與加速度計(jì)和陀螺儀的數(shù)據(jù)融合,可以大幅提高姿態(tài)估計(jì)的精度。三軸加速度計(jì)提供設(shè)備的傾斜信息,陀螺儀提供角速度信息,而磁力計(jì)提供方位信息,三者結(jié)合可
    的頭像 發(fā)表于 09-06 16:57 ?1320次閱讀
    <b class='flag-5'>陀螺儀</b><b class='flag-5'>LSM6DSV16X</b>與<b class='flag-5'>AI</b><b class='flag-5'>集成</b>(11)----融合磁力計(jì)進(jìn)行姿態(tài)解算

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

    本文檔旨在詳細(xì)介紹如何配置和讀取LSM6DSOW傳感器的FIFO數(shù)據(jù)。LSM6DSOW是一款高性能的6軸IMU(慣性測(cè)量單元),集成了三軸加速度計(jì)和三軸
    的頭像 發(fā)表于 08-05 10:03 ?1134次閱讀
    <b class='flag-5'>陀螺儀</b><b class='flag-5'>LSM6</b>DSOW開(kāi)發(fā)(3)----FIFO數(shù)據(jù)讀取與配置

    意法半導(dǎo)體新款MEMS IMU LSM6DSV32X實(shí)現(xiàn)精確姿態(tài)識(shí)別應(yīng)用

    憑借3核、6軸傳感架構(gòu),意法半導(dǎo)體新款MEMS IMU LSM6DSV32X能夠進(jìn)行卓越的邊緣計(jì)算處理,是智能手機(jī)的高精度感測(cè)和3D地圖、筆記本電腦和平板電腦的情境感知、AR和VR的精確姿態(tài)識(shí)別,以及可穿戴設(shè)備的全天候跟蹤等應(yīng)用
    的頭像 發(fā)表于 08-01 10:15 ?519次閱讀

    陀螺儀LSM6DSV16XAI集成(8)----MotionFX庫(kù)解析空間坐標(biāo)

    本文將探討如何使用MotionFX庫(kù)解析空間坐標(biāo)。MotionFX庫(kù)是一種用于傳感器融合的強(qiáng)大工具,可以將加速度計(jì)、陀螺儀和磁力計(jì)的數(shù)據(jù)融合在一起,實(shí)現(xiàn)精確的姿態(tài)和位置估計(jì)。本文將介紹如何初始化
    的頭像 發(fā)表于 07-18 10:43 ?768次閱讀
    <b class='flag-5'>陀螺儀</b><b class='flag-5'>LSM6DSV16X</b>與<b class='flag-5'>AI</b><b class='flag-5'>集成</b>(8)----MotionFX庫(kù)解析空間坐標(biāo)

    陀螺儀LSM6DSV16XAI集成(7)----FIFO數(shù)據(jù)讀取與配置

    LSM6DSV16X是一款高性能、低功耗的6軸IMU傳感器,集成了3軸加速度計(jì)和3軸陀螺儀。本文將詳細(xì)介紹如何配置和讀取LSM6DSV16X
    的頭像 發(fā)表于 07-18 10:40 ?903次閱讀
    <b class='flag-5'>陀螺儀</b><b class='flag-5'>LSM6DSV16X</b>與<b class='flag-5'>AI</b><b class='flag-5'>集成</b>(7)----FIFO數(shù)據(jù)讀取與配置

    請(qǐng)問(wèn)lsm6dsv16x可以直接讀取觸摸手勢(shì)嗎?

    已經(jīng)讀出來(lái)了LSM6DSV16x的QVRmv值,也寫(xiě)出了單擊的狀態(tài)機(jī)。但是在寫(xiě)觸摸滑動(dòng)手勢(shì)時(shí)沒(méi)有找到好的計(jì)算方式。請(qǐng)問(wèn)是不是有直接讀出這些手勢(shì)的函數(shù)?
    發(fā)表于 07-02 08:14

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

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

    意法半導(dǎo)體發(fā)布LSM6DSV32X 6軸慣性模塊

    意法半導(dǎo)體近日發(fā)布了其最新的LSM6DSV32X 6軸慣性模塊(IMU),該模塊集成了高性能的加速度計(jì)和陀螺儀。加速度計(jì)的最大量程達(dá)到32g,而陀螺
    的頭像 發(fā)表于 05-13 09:59 ?500次閱讀

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

    意法半導(dǎo)體的LSM6DSV32X 6軸慣性模塊(IMU)集成一個(gè)滿量程32g的大加速度計(jì)和一個(gè)滿量程4000度每秒(dps)的陀螺儀,可測(cè)量高強(qiáng)度的運(yùn)動(dòng)和撞擊,包括自由落體高度估算。
    的頭像 發(fā)表于 05-09 10:35 ?581次閱讀

    陀螺儀x軸和y軸的應(yīng)用

    陀螺儀是一種用于測(cè)量和感應(yīng)物體旋轉(zhuǎn)和轉(zhuǎn)動(dòng)的設(shè)備,它通常由三個(gè)軸組成:x軸、y軸和z軸。在陀螺儀中,x軸和y軸通常成對(duì)出現(xiàn),關(guān)于它們的比例可以因具體應(yīng)用而異。首先,我們先了解一下
    發(fā)表于 04-17 15:42 ?0次下載

    陀螺儀x和y比例是多少 陀螺儀x軸和y軸是指什么

    陀螺儀是一種用于測(cè)量和感應(yīng)物體旋轉(zhuǎn)和轉(zhuǎn)動(dòng)的設(shè)備,它通常由三個(gè)軸組成:x軸、y軸和z軸。在陀螺儀中,x軸和y軸通常成對(duì)出現(xiàn),關(guān)于它們的比例可以因具體應(yīng)用而異。 首先,我們先了解一下
    的頭像 發(fā)表于 01-17 11:10 ?1614次閱讀

    陀螺儀LSM6DSV16XAI集成(4)----Qvar觸摸電容配置

    Qvar,全稱為電荷變化檢測(cè)(Qvar stands for "Quasi-static VARiation"),是一種用于檢測(cè)電荷變化的技術(shù)。這種技術(shù)通常用于傳感器和其他
    的頭像 發(fā)表于 12-18 10:55 ?860次閱讀
    <b class='flag-5'>陀螺儀</b><b class='flag-5'>LSM6DSV16X</b>與<b class='flag-5'>AI</b><b class='flag-5'>集成</b>(4)----Qvar觸摸電容配置

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

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

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

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

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

    本文將介紹如何使用 LSM6DSV16X 傳感器來(lái)讀取數(shù)據(jù)。主要步驟包括初始化傳感器接口、驗(yàn)證設(shè)備ID、配置傳感器的數(shù)據(jù)輸出率和濾波器,以及通過(guò)輪詢方式持續(xù)讀取加速度、角速率和溫度數(shù)據(jù)。讀取到的數(shù)據(jù)
    的頭像 發(fā)表于 12-18 10:49 ?1256次閱讀
    <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>數(shù)據(jù)