<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天內不再提示

三軸加速度計LIS2DUX12開發(3)----計步器

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

計步器

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

本文將介紹如何驅動和利用LIS2DUX12傳感器,實現計步器感應功能。
LIS2DUX12是一款數字式智能3軸線性加速度計,其MEMSASIC旨在將盡可能低的電流消耗與豐富的特性(如常開抗混疊濾波、有限狀態機 (FSM)、具有自適應自配置 (ASC) 的機器學習內核 (MLC))相結合。
FSM和MLC(帶有ASC)為LIS2DUX12提供了始終可用的出色邊緣處理能力。LIS2DUX12 MIPI I3C?從接口嵌入式128級FIFO緩沖區構成了一系列功能,這讓該加速度計在物料清單、處理能力和功耗上成為系統集成方面的參考。
LIS2DUX12具有±2g/±4g/±8g/±16g的用戶可選滿量程,并且可通過1.6 Hz到800 Hz的輸出數據速率測量加速度。
LIS2DUX12包含專用內部引擎,用于處理運動和加速度檢測,包括自由落體、喚醒、單/雙/三擊識別、活動/休止,以及6D/4D方向。
LIS2DUX12采用纖薄的小型塑料平面網格陣列封裝(LGA),可確保在更大的溫度范圍(-40°C至+85°C)內正常工作。

硬件準備

首先需要準備一個開發板,這里我準備的是自己繪制的開發板,需要的可以進行申請。 主控為STM32U073CC,加速度計為LIS2DUX12

視頻教學

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

樣品申請

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

源碼下載

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

步數檢測說明

LIS2DUX12 集成了一個高級步數計算法,該算法在超低功耗域中運行,確保在電池受限的應用中延長電池壽命。步數計以 25 Hz 運行,不受所選設備功率模式(超低功耗、低功耗、高性能)的影響,保證超低功耗體驗并與其他設備功能靈活結合。 步數計算法由以下四個階段組成:

  1. 計算加速度量級信號的峰值:檢測信號中的峰值以識別步數,獨立于設備的方向。
  2. FIR 濾波器:提取相關頻率成分并通過去除高頻信號來平滑信號。
  3. 峰值檢測器:找到波形的最大值和最小值并計算峰峰值。
  4. 步數計數:如果峰峰值大于設定的閾值,則計為一步。

通信模式

對于LIS2DW12,可以使用SPI或者IIC進行通訊。 最小系統圖如下所示。

在CS管腳為1的時候,為IIC模式

本文使用的板子原理圖如下所示。

管腳定義

IIC通信模式

在使用IIC通訊模式的時候,SA0是用來控制IIC的地址位的。
對于IIC的地址,可以通過SDO/SA0引腳修改。SDO/SA0引腳可以用來修改設備地址的最低有效位。如果SDO/SA0引腳連接到電源電壓,LSb(最低有效位)為’1’(地址0011001b);否則,如果SDO/SA0引腳連接到地線,LSb的值為’0’(地址0011000b)。

對應的IIC接口如下所示。 主要使用的管腳為CS、SCL、SDA、SA0。

速率

該模塊支持的速度為普通模式(100k)到快速模式+(1M)。

生成STM32CUBEMX

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

IIC配置

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

INT配置

INT1管腳為PB1。

配置如下所示。

開啟中斷。

配置LED指示燈。

stm32u0xx_it.c添加中斷觸發后LED翻轉電平的代碼,添加對應變量。

/* USER CODE BEGIN 0 */
extern uint8_t step_event ;
/* USER CODE END 0 */

添加中斷代碼。

/**
  * @brief This function handles EXTI line 0 and line 1 interrupts.
  */
void EXTI0_1_IRQHandler(void)
{
  /* USER CODE BEGIN EXTI0_1_IRQn 0 */
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_1);

            step_event = 1;

  /* USER CODE END EXTI0_1_IRQn 0 */
  HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1);
  /* USER CODE BEGIN EXTI0_1_IRQn 1 */

  /* USER CODE END EXTI0_1_IRQn 1 */
}

串口配置

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

配置串口。

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/lis2dux12-pid]

計步器參考

[https://github.com/stm32duino/LIS2DUXS12/tree/main/examples]

初始換管腳

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

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

HAL_GPIO_WritePin(GPIOC, CS_Pin, GPIO_PIN_SET);
  HAL_GPIO_WritePin(GPIOC, SA0_Pin, GPIO_PIN_SET);

獲取ID

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

lis2dux12_device_id_get為獲取函數。

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

printf("HELLOn");

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

  lis2dux12_status_t status;
  uint8_t id;
  lis2dux12_md_t md;
  uint16_t steps = 0;
  lis2dux12_int_config_t int_mode;

  /* Initialize mems driver interface */
  dev_ctx.write_reg = platform_write;
  dev_ctx.read_reg = platform_read;
  dev_ctx.mdelay = platform_delay;
  dev_ctx.handle = &SENSOR_BUS;

  /* Wait sensor boot time */
  platform_delay(BOOT_TIME);    

  lis2dux12_exit_deep_power_down(&dev_ctx);// 退出深度休眠模式

  /* Check device ID */
  lis2dux12_device_id_get(&dev_ctx, &id);
    printf("LIS2DUX12_ID=0x%x,id=0x%xn",LIS2DUX12_ID,id);
  if (id != LIS2DUX12_ID)
    while(1);

  /* Restore default configuration */
  lis2dux12_init_set(&dev_ctx, LIS2DUX12_RESET);// 重置設備
  do {
    lis2dux12_status_get(&dev_ctx, &status);// 獲取設備狀態
  } while (status.sw_reset);// 獲取設備狀態

復位操作

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

lis2dux12_init_set為重置函數。 對應的驅動程序,如下所示。

/* Restore default configuration */
  lis2dux12_init_set(&dev_ctx, LIS2DUX12_RESET);
  do {
    lis2dux12_status_get(&dev_ctx, &status);
  } while (status.sw_reset);

BDU設置

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

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

/* Set bdu and if_inc recommended for driver usage */
  lis2dux12_init_set(&dev_ctx, LIS2DUX12_SENSOR_ONLY_ON);

設置傳感器的量程

FS[1:0] - 全量程選擇:這兩個位用于設置傳感器的量程。量程決定了傳感器可以測量的最大加速度值。例如,量程可以設置為±2g、±4g、±8g或±16g。這允許用戶根據應用的特定需求調整傳感器的靈敏度。

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

/* Set Output Data Rate */
  md.fs =  LIS2DUX12_4g;
  md.odr = LIS2DUX12_25Hz_LP;
  lis2dux12_mode_set(&dev_ctx, &md);

啟用步數計和嵌入式功能

EMB_FUNC_EN 是一個寄存器位,用于啟用 LIS2DUX12 傳感器的嵌入式功能。這些嵌入式功能可能包括傳感器的各種高級特性,如步數計、活動檢測、自由落體檢測等。這些功能通過內部算法處理傳感器數據,而不需要主機處理器進行復雜計算,從而減輕了主機處理器的負擔。

if_add_inc 是一個控制寄存器位,用于啟用或禁用自動地址遞增功能。在多字節訪問模式下,當你讀取或寫入多個連續的寄存器時,啟用地址遞增功能可以使得寄存器地址自動增加。這在讀取或寫入一系列數據時非常有用,因為它可以減少通信開銷并簡化代碼。

// Enable Pedometer.    
    /* 啟用傳感器的嵌入式功能(例如,步數計),這通常推薦用于驅動程序 */
  lis2dux12_init_set(&dev_ctx, LIS2DUX12_SENSOR_EMB_FUNC_ON);// 啟用嵌入式功能
  platform_delay(10);

PEDO_EN 是一個用于啟用步數檢測功能的控制位。啟用此功能后,傳感器可以進行步數計數。這在運動檢測和健康監控應用中非常重要,因為它可以記錄用戶的步數數據。

lis2dux12_stpcnt_mode_t mode;
    lis2dux12_stpcnt_mode_get(&dev_ctx, &mode);// 獲取步數計模式
  /* Enable pedometer algorithm. */
  mode.step_counter_enable = PROPERTY_ENABLE;// 啟用步數計
  mode.false_step_rej = PROPERTY_DISABLE;// 禁用誤步拒絕功能
  mode.step_counter_in_fifo = PROPERTY_DISABLE;    // 禁用步數計 FIFO
  /* Turn on embedded features */
    lis2dux12_stpcnt_mode_set(&dev_ctx, mode) ;// 設置步數計模式

配置步數檢測中斷引腳

INT1_STEP_DET 是一個用于步數檢測中斷的寄存器位。當啟用這個中斷位時,LIS2DUX12 傳感器在檢測到步數事件時會觸發中斷信號,并將該信號輸出到指定的中斷引腳(如 INT1)。這使得主機微控制器可以通過中斷響應步數檢測事件,而不需要不斷輪詢傳感器的狀態。

INT1_EMB_FUNC 是一個用于配置 LIS2DUX12 傳感器的嵌入式功能中斷的寄存器位。當該位啟用時,傳感器會在嵌入式功能(例如步數檢測、活動檢測等)觸發事件時通過 INT1 引腳發出中斷信號。這個功能使得主機微控制器可以通過中斷快速響應傳感器的嵌入式功能事件,而不需要持續輪詢傳感器狀態。

lis2dux12_emb_pin_int_route_t emb_pin_int;
    lis2dux12_emb_pin_int1_route_get(&dev_ctx, &emb_pin_int);// 設置步數計模式
    emb_pin_int.step_det = PROPERTY_ENABLE;// 設置步數計模式
    lis2dux12_emb_pin_int1_route_set(&dev_ctx, &emb_pin_int);// 設置嵌入式中斷引腳

中斷檢測步數

可以通過判斷 INT1_STEP_DET 位來確定步數事件是否產生。根據您提供的截圖,INT1_STEP_DET 位位于 EMB_FUNC_INT1 寄存器中。當這個位被設置為 1 時,表示步數檢測中斷被路由到 INT1 引腳。因此,您可以通過讀取該寄存器來判斷步數事件是否產生。

EMB_FUNC_REG_ACCESS 是用于訪問和配置 LIS2DUX12 傳感器的嵌入式功能寄存器的寄存器位。啟用 EMB_FUNC_REG_ACCESS 后,可以訪問和配置與嵌入式功能相關的寄存器。這對于啟用步數檢測、活動檢測、自由落體檢測等功能非常重要。

獲取步數可以通過STEP_COUNTER_L (28h) 和 STEP_COUNTER_H (29h)進行獲取。

獲取完畢之后關閉EMB_FUNC_REG_ACCESS 。

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    if (step_event) {
            lis2dux12_emb_pin_int_route_t emb_pin_int1;
            lis2dux12_emb_pin_int1_route_get(&dev_ctx, &emb_pin_int1);
            if (emb_pin_int1.step_det) 
            {
                lis2dux12_stpcnt_steps_get(&dev_ctx, &steps);
                /* print number of steps  */
                printf("Steps: %drn", steps);
                }        
      step_event = 0;
    }        

        HAL_Delay(10);
    /* USER CODE END WHILE */

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

演示

審核編輯 黃宇

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

    關注

    2532

    文章

    48534

    瀏覽量

    742307
  • 加速度計
    +關注

    關注

    6

    文章

    679

    瀏覽量

    45528
  • 計步器
    +關注

    關注

    4

    文章

    76

    瀏覽量

    19798
  • stm32cubemx
    +關注

    關注

    5

    文章

    269

    瀏覽量

    14484
收藏 人收藏

    評論

    相關推薦

    AI增強型智能加速度計

    。 以下是本周新品情報,請及時查收: 第三代MEMS技術 STMicroelectronics LIS2DUX12LIS2DUXS12 AI增強型智能加速度計 貿澤電子即日起
    的頭像 發表于 07-12 08:10 ?571次閱讀
    AI增強型智能<b class='flag-5'>加速度計</b>

    三軸加速度計LIS2DUX12開發(1)----輪詢獲取加速度數據

    本文將介紹如何驅動和利用LIS2DUX12傳感器,實現精確的運動感應功能。 LIS2DUX12是一款數字式智能3軸線性加速度計,其MEMS和ASIC旨在將盡可能低的電流消耗與豐富的特性(如常
    的頭像 發表于 05-17 15:22 ?668次閱讀
    三軸<b class='flag-5'>加速度計</b><b class='flag-5'>LIS2DUX12</b><b class='flag-5'>開發</b>(1)----輪詢獲取<b class='flag-5'>加速度</b>數據

    加速度計加速度計的使用區別?

    有個問題請教一下:在靜態測量的情況下,兩加速度計在測得X、Y上的加速度后,是不是就可以根據這兩個值和重力加速度g算出Z
    發表于 12-29 06:06

    求助,關于LIS2HH12TR讀加速度計的疑問求解

    大家好: 我在使用LIS2HH123 “pico”加速度計時遇到了 讀數不準的問題,請大家看一下。 首先我的應用場景:安裝在設備上,FPGA通過IIC時刻讀出當前的位置,不會有突
    發表于 03-18 07:08

    MSP430F5508對LIS2DH12加速度計的驅動設計

    MSP430F5508對LIS2DH12加速度計的驅動設計,見附件
    發表于 09-23 10:46

    請問兩加速度計加速度計的使用區別是什么?

    有個問題請教一下:在靜態測量的情況下,兩加速度計在測得X、Y上的加速度后,是不是就可以根據這兩個值和重力加速度g算出Z
    發表于 08-08 09:12

    LIS2DH12加速度計如何工作

    你好 如何從LIS2DH12加速度計編程開始,是否有任何關于寄??存器的初學者教程,它們如何工作以及如何為它們編寫程序? 請求幫助#加速度計lis2dh12-配置以上來自于谷歌
    發表于 09-18 16:45

    利用3數字加速度計實現功能全面的計步器設計

    、小尺寸和低功耗的特點,因此越來越多的便攜式消費電子設備開始集成計步器功能,如音樂播放器和手機等。ADI公司的3加速度計ADXL335, ADXL345和 ADXL346 小巧纖薄,
    發表于 10-24 10:37

    STMEMS加速度計LIS344AHH

    最新的高性能3MEMS加速度計LIS344AHH.新產品擁有達±18g的滿量程、高帶寬、低噪聲、高機械穩定性和熱穩定性,可提升游戲、用戶界面和增強實境的用戶體驗,以及工業控制和碰撞監
    發表于 11-06 16:09

    加速度計讀數問題

    你好, 我正在使用帶有STM(stm32l432kb)控制器的STM加速度計LIS2DE12)。從加速度計獲取讀數時,它會持續提供隨機值。即使它在穩定的位置顯示虛假價值。在某些方面我是如何面對
    發表于 04-03 13:15

    2476-100加速度計

    `SDI的高級型號2470和2476高性能MEMS可變電容式加速度計堅固耐用,即插即用適用于各種苛刻要求的測量設備應用程序。兩種型號的性能均優于在零至中頻應用中使用的溫度經歷大的或快速的溫度變化
    發表于 05-27 19:18

    2460-010加速度計

    的噪聲和長期穩定性是絕對要求。2460包含3英尺長的集成電纜,并且在操作上與2466相同,它具有一個連接器,可輕松定制電纜的長度和位置。每個SDI加速度計均具有
    發表于 05-28 14:41

    設計具有成本效益的加速度計

    描述LIS3DSH 評估板我正在為地震目的設計具有成本效益的加速度計(MEMS 加速度計 + 數字化儀)。如今,我們可以找到幾個使用 SBC(如 Raspberry Pi 和其他 MEMS
    發表于 08-23 06:20

    關于LIS2HH12TR讀加速度計的問題求解

    大家好: 我在使用LIS2HH123 “pico”加速度計時遇到了 讀數不準的問題,請大家看一下。 首先我的應用場景:安裝在設備上,FPGA通過IIC時刻讀出當前的位置,不會有突
    發表于 08-07 14:45

    貿澤開售面向可穿戴和始終感知應用的STMicroelectronics LIS2DUX12LIS2DUXS12智能加速度計

    LIS2DUX12LIS2DUXS12 AI增強型智能加速度計。這些加速度計采用STMicroelectronics的第三代MEMS技術,能夠以高精度、低功耗準確地檢測事件和手勢。
    發表于 06-02 17:43 ?697次閱讀
    貿澤開售面向可穿戴和始終感知應用的STMicroelectronics <b class='flag-5'>LIS2DUX12</b>和<b class='flag-5'>LIS2DUXS12</b>智能<b class='flag-5'>加速度計</b>
    亚洲欧美日韩精品久久_久久精品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>