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

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

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

陀螺儀LSM6DSV16X與AI集成(6)----檢測自由落體

嵌入式單片機MCU開發(fā) ? 來源:嵌入式單片機MCU開發(fā) ? 作者:嵌入式單片機MCU開 ? 2024-05-17 15:12 ? 次閱讀

概述

本文介紹如何初始化傳感器并配置其參數(shù),以便在檢測到自由落體事件時發(fā)送通知。

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

視頻教學(xué)

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

樣品申請

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

源碼下載

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

生成STM32CUBEMX

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

串口配置

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

配置串口。

IIC配置

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

CS和SA0設(shè)置

串口重定向

打開魔術(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 */

參考程序

[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為獲取函數(shù)。

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

/* 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寄存器寫入1進行復(fù)位。

lsm6dsv16x_reset_set為重置函數(shù)。

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

/* 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ù)通常被存儲在輸出寄存器中,這些寄存器分為兩部分: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進行開啟。

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

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

寄存器地址自動遞增

IF_INC (Register Address Auto-Increment):
當(dāng)使用串行接口(如I2C, MIPI I3C, 或 SPI)進行多字節(jié)訪問時,此位用于自動增加寄存器地址。默認(rèn)值是1(啟用),這樣在連續(xù)讀取多個寄存器時,地址會自動遞增

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

/* Enable register address automatically incremented during a multiple byte
  access with a serial interface. */
  lsm6dsv16x_auto_increment_set(&dev_ctx, PROPERTY_ENABLE) ;

關(guān)閉FIFO

可以通過FIFO_CTRL4 (0Ah)關(guān)閉FIFO模式。

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

/* FIFO mode selection */
    lsm6dsv16x_fifo_mode_set(&dev_ctx, LSM6DSV16X_BYPASS_MODE);

設(shè)置量程

加速度量程可以通過CTRL8 (17h)的CTRL8 (17h)設(shè)置。

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

/* Full scale selection. */
    lsm6dsv16x_xl_full_scale_set(&dev_ctx, LSM6DSV16X_2g);

關(guān)閉角速度量程

陀螺儀的輸出數(shù)據(jù)率選擇可以通過CTRL2 (11h) 陀螺儀控制寄存器進行配置。由于不需要用到陀螺儀數(shù)據(jù),所以可以關(guān)閉。

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

/* Output data rate selection - power down. */
    lsm6dsv16x_gy_data_rate_set(&dev_ctx, LSM6DSV16X_ODR_OFF);

輸出數(shù)據(jù)設(shè)置

輸出數(shù)據(jù)率范圍從1.875 Hz到7.68 kHz不等,允許用戶根據(jù)應(yīng)用的需求來調(diào)整加速度計的性能和功耗。

CTRL1 (10h) 加速度計控制寄存器的配置選項。

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

/* Output data rate selection. */
    lsm6dsv16x_xl_data_rate_set(&dev_ctx, LSM6DSV16X_ODR_AT_120Hz);

設(shè)置自由落體功能的持續(xù)時間

WAKE_UP_DUR (5Ch) 寄存器用于設(shè)置自由落體、喚醒和睡眠模式功能的持續(xù)時間。具體字段如下:
FF_DUR_5:與自由落體持續(xù)時間事件相關(guān)。完整的自由落體配置需要參考 FREE_FALL 寄存器。
WAKE_DUR [1:0]:定義喚醒事件的持續(xù)時間,默認(rèn)值為00。
SLEEP_DUR [3:0]:定義進入睡眠模式前的持續(xù)時間,默認(rèn)值為0000。

FREE_FALL (5Dh) 寄存器用于設(shè)置自由落體功能的持續(xù)時間和閾值。具體字段如下:
FF_DUR [4:0]:定義自由落體事件的持續(xù)時間,需要與 WAKE_UP_DUR 寄存器的 FF_DUR_5 位一起配置以設(shè)置完整的持續(xù)時間。
FF_THS [2:0]:定義自由落體檢測的閾值,默認(rèn)值為000。

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

/*  Set free fall duration.*/
    lsm6dsv16x_ff_time_windows_set(&dev_ctx, 0x06);

中斷設(shè)置

MD1_CFG (5Eh) 這個寄存器用于配置哪些功能的中斷信號會被路由到 INT1 引腳。每個位的設(shè)置決定了特定事件是否會觸發(fā) INT1 引腳的中斷。具體功能如下:

INT1_SLEEP_CHANGE:活動/靜止?fàn)顟B(tài)變化的中斷事件路由到 INT1。
INT1_SINGLE_TAP:單次敲擊識別的中斷事件路由到 INT1。
INT1_WU:喚醒事件的中斷路由到 INT1。
INT1_FF:自由落體事件的中斷路由到 INT1。
INT1_DOUBLE_TAP:雙次敲擊識別的中斷事件路由到 INT1。
INT1_6D:6D(方向改變)事件的中斷路由到 INT1。
INT1_EMB_FUNC:嵌入式功能事件的中斷路由到 INT1。
INT1_SHUB:傳感器集線器通信結(jié)束的中斷路由到 INT1。
每個功能旁邊的 0 和 1 表示該功能的中斷是否被禁用 (0) 或啟用 (1)。默認(rèn)值是 0,表示中斷被禁用。如果將相應(yīng)位設(shè)置為 1,則當(dāng)相應(yīng)的事件發(fā)生時,INT1 引腳將觸發(fā)中斷。

通過這個寄存器,開發(fā)者可以根據(jù)需要配置傳感器,以確定在發(fā)生如敲擊、喚醒、自由落體或方向改變等事件時是否生成中斷信號,從而允許外部微控制器處理器相應(yīng)地響應(yīng)這些事件。

FUNCTIONS_ENABLE(50h)這個寄存器用于控制不同的中斷功能是否啟用。具體功能包括:

INTERRUPTS_ENABLE:啟用或禁用基本中斷(6D/4D定向、自由落體、喚醒、敲擊、活動/靜止)。默認(rèn)值為0,表示中斷禁用。 TIMESTAMP_EN:啟用或禁用時間戳計數(shù)器。如果啟用,時間戳計數(shù)器的值可以在TIMESTAMP0(40h)、TIMESTAMP1(41h)和TIMESTAMP3(43h)寄存器中讀取。默認(rèn)值為0,表示禁用。 DIS_RST_LIR_ALL_INT:當(dāng)此位設(shè)置為1時,讀取ALL_INT_SRC(1Dh)寄存器不會重置鎖存的中斷信號。這在讀取狀態(tài)寄存器之前不重置某些狀態(tài)標(biāo)志時很有用。默認(rèn)值為0。 INACT_EN [1:0]:啟用活動/靜止(睡眠)功能。根據(jù)設(shè)置,這可以配置加速度計進入不同的低功耗模式,并通過INACTIVITY_DUR(54h)寄存器選擇加速度計的輸出數(shù)據(jù)速率(ODR)。陀螺儀的配置也可能相應(yīng)變化,例如進入睡眠模式或關(guān)閉電源模式。

這個寄存器讓用戶可以根據(jù)應(yīng)用需求,靈活地選擇哪些中斷事件應(yīng)該被監(jiān)控,以及加速度計和陀螺儀的功耗管理策略。這些設(shè)置對于優(yōu)化設(shè)備電池壽命和確保及時響應(yīng)傳感器事件非常重要。

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

/* Enable free fall event on either INT1 or INT2 pin */
    lsm6dsv16x_md1_cfg_t val1;
    lsm6dsv16x_functions_enable_t functions_enable;

    lsm6dsv16x_read_reg(&dev_ctx, LSM6DSV16X_MD1_CFG, (uint8_t *)&val1, 1);
    val1.int1_ff = PROPERTY_ENABLE;
    lsm6dsv16x_write_reg(&dev_ctx, LSM6DSV16X_MD1_CFG, (uint8_t *)&val1, 1);

    lsm6dsv16x_read_reg(&dev_ctx, LSM6DSV16X_FUNCTIONS_ENABLE, (uint8_t *)&functions_enable, 1);
    functions_enable.interrupts_enable = PROPERTY_ENABLE;
    lsm6dsv16x_write_reg(&dev_ctx, LSM6DSV16X_FUNCTIONS_ENABLE, (uint8_t *)&functions_enable, 1);

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

可以通過ALL_INT_SRC (1Dh)寄存器的FF_IA判斷是否產(chǎn)生自由落體事件。

/* wait forever (6D event handle in irq handler) */
        lsm6dsv16x_all_sources_t status;
        if(HAL_GPIO_ReadPin(INT1_GPIO_Port,INT1_Pin)==0)
        {
            /* Read output only if new xl value is available */
            lsm6dsv16x_all_sources_get(&dev_ctx, &status);
            if (status.free_fall) {
                printf("Free Fall Detected!n");
            }            


        }

演示

審核編輯 黃宇

聲明:本文內(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
  • AI
    AI
    +關(guān)注

    關(guān)注

    87

    文章

    28862

    瀏覽量

    266183
  • stm32cubemx
    +關(guān)注

    關(guān)注

    5

    文章

    278

    瀏覽量

    14618
收藏 人收藏

    評論

    相關(guān)推薦

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

    本文將介紹如何使用 LSM6DSV16X 傳感器來讀取數(shù)據(jù)。主要步驟包括初始化傳感器接口、驗證設(shè)備ID、配置傳感器的數(shù)據(jù)輸出率和濾波器,以及通過輪詢方式持續(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ù)

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

    LSM6DSV16X包含三軸陀螺儀與三軸加速度計。
    的頭像 發(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集成(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集成(7)----FIFO數(shù)據(jù)讀取與配置

    LSM6DSV16X是一款高性能、低功耗的6軸IMU傳感器,集成了3軸加速度計和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ù)讀取與配置

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

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

    請問lsm6dsv16x可以直接讀取觸摸手勢嗎?

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

    請問MPU6050做自由落體時速度數(shù)據(jù)是怎么反應(yīng)?

    現(xiàn)在做的產(chǎn)品是利用陀螺儀做一個開關(guān),在掉落時做自由落體,當(dāng)作關(guān)閉。第一次接觸6050,不太懂,如果做自由落體時,是不是應(yīng)該六個壁面都沒受到壓力,加速度計采樣回來的數(shù)據(jù)都是零么?
    發(fā)表于 05-17 00:34

    LSM6DSO中的ID無法檢測自由落體示例代碼是什么原因呢

    可以獲得 LSM6DSO 的 ID,所以我認(rèn)為 I2C 接口工作正常,我嘗試做一些自由落體測試(從我手中掉落)但是 FF_IA在 WAKE_UP_SRC 中保持為 0),因此無法檢測自由落體
    發(fā)表于 12-19 07:42

    lsm6dsl寄存器自由落體檢測位未設(shè)置怎么辦呢

    DSH_write_reg(LSM6DSL_ACC_GYRO_FREE_FALL,0x33);/* 啟用自由落體事件 */LIS6DSH_write_reg(
    發(fā)表于 12-21 06:23

    求助,是否有在LSM6DSV16X中使用傳感器融合低功耗算法的示例

    你好我想知道是否有在 LSM6DSV16X 中使用傳感器融合低功耗算法的示例。我想檢索當(dāng)前的 Heading、Pitch 和 Roll 信息。或者我也很高興有一個例子解釋如何從 SFLP 中獲取四元
    發(fā)表于 02-03 09:12

    新品情報|STMicroelectronics全新LSM6DSV16BX運動+骨傳導(dǎo)傳感器

    。以下是本周新品情報,請及時查收: 運動/骨傳導(dǎo)二合一 STMicroelectronics?LSM6DSV16BX iNEMO三軸加速度計和陀螺儀 貿(mào)澤電子即日起
    的頭像 發(fā)表于 05-17 10:35 ?949次閱讀
    新品情報|STMicroelectronics全新<b class='flag-5'>LSM6DSV16</b>BX運動+骨傳導(dǎo)傳感器

    ST LSM6DSV16X iNEMO慣性模塊相關(guān)的使用信息和應(yīng)用提示

    AN5763,LSM6DSV16X是一款ST的3 軸加速度計和 3 軸陀螺儀; LSM6DSV16X 是系統(tǒng)級封裝的 3 軸數(shù)字加速度計和 3 軸數(shù)字陀螺儀,具有數(shù)字 I2C、SPI
    發(fā)表于 08-31 11:12 ?0次下載

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

    、4.Y軸反向旋轉(zhuǎn)、5.Z軸正向旋轉(zhuǎn)、6.Z軸反向旋轉(zhuǎn) 通過檢測陀螺儀在每個方向上的旋轉(zhuǎn),可以確定物體的旋轉(zhuǎn)姿態(tài)和方向,從而用于導(dǎo)航、飛行控制等應(yīng)用。
    的頭像 發(fā)表于 01-09 16:14 ?809次閱讀
    <b class='flag-5'>陀螺儀</b><b class='flag-5'>LSM6DSV16X</b>與<b class='flag-5'>AI</b><b class='flag-5'>集成</b>(5)----<b class='flag-5'>6</b>D方向<b class='flag-5'>檢測</b>功能

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

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

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

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