精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

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

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

概述

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

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

視頻教學

[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設置為開發板的串口。

配置串口。

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

寄存器地址自動遞增

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

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

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

關閉FIFO

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

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

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

設置量程

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

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

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

關閉角速度量程

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

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

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

輸出數據設置

輸出數據率范圍從1.875 Hz到7.68 kHz不等,允許用戶根據應用的需求來調整加速度計的性能和功耗。

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

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

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

設置自由落體功能的持續時間

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

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

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

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

中斷設置

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

INT1_SLEEP_CHANGE:活動/靜止狀態變化的中斷事件路由到 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:傳感器集線器通信結束的中斷路由到 INT1。
每個功能旁邊的 0 和 1 表示該功能的中斷是否被禁用 (0) 或啟用 (1)。默認值是 0,表示中斷被禁用。如果將相應位設置為 1,則當相應的事件發生時,INT1 引腳將觸發中斷。

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

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

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

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

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

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

獲取所有中斷源的狀態

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

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


        }

演示

審核編輯 黃宇

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

    關注

    44

    文章

    763

    瀏覽量

    98061
  • AI
    AI
    +關注

    關注

    87

    文章

    28461

    瀏覽量

    265729
  • stm32cubemx
    +關注

    關注

    5

    文章

    278

    瀏覽量

    14581
收藏 人收藏

    評論

    相關推薦

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

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

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

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

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

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

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

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

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

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

    請問MPU6050做自由落體時速度數據是怎么反應?

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

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

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

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

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

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

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

    LSM6DSO的應用筆記

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

    新品情報|STMicroelectronics全新LSM6DSV16BX運動+骨傳導傳感器

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

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

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

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

    、4.Y軸反向旋轉、5.Z軸正向旋轉、6.Z軸反向旋轉 通過檢測陀螺儀在每個方向上的旋轉,可以確定物體的旋轉姿態和方向,從而用于導航、飛行控制等應用。
    的頭像 發表于 01-09 16:14 ?705次閱讀
    <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>功能

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

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

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

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