概述
最近在弄ST和瑞薩RA的課程,需要樣片的可以加群申請:615061293 。
本文將介紹如何驅動和利用LIS2DUX12傳感器,實現精確的運動感應功能。
LIS2DUX12是一款數字式智能3軸線性加速度計,其MEMS和ASIC旨在將盡可能低的電流消耗與豐富的特性(如常開抗混疊濾波、有限狀態機 (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/BV1sr421G7ED/]
樣品申請
[https://www.wjx.top/vm/OhcKxJk.aspx#]
源碼下載
[https://download.csdn.net/download/qq_24312945/89197799]
通信模式
對于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。
串口配置
查看原理圖,PA9和PA10設置為開發板的串口。
配置串口。
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/lis2dux12-pid]
初始換管腳
由于需要向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;
stmdev_ctx_t dev_ctx;
uint8_t id;
lis2dux12_md_t md;
/* 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);
復位操作
可以向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);
輪詢獲取加速度
檢查新數據是否可用:
lis2dux12_status_get(&dev_ctx, &status);這個函數調用檢查加速度計是否有新的數據可讀。如果有新數據,status.drdy變量將被設置為非零值。
主要為讀取STATUS (25h)的DRDY位。
如果status.drdy是非零的,說明有新的加速度數據可讀。
lis2dux12_xl_data_get(&dev_ctx, &md, &data_xl);這個函數調用實際讀取加速度計的原始數據,并存儲在 data_xl 數組中。
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* Read output only if new values are available */
lis2dux12_status_get(&dev_ctx, &status);
if (status.drdy) {
lis2dux12_xl_data_get(&dev_ctx, &md, &data_xl);
/* print Accel data */
printf("Acceleration [mg]:%4.2ft%4.2ft%4.2frn",
data_xl.mg[0], data_xl.mg[1], data_xl.mg[2]);
lis2dux12_outt_data_get(&dev_ctx, &md, &data_temp);
/* print Temp data */
printf("Temp[degC]:%3.2frn",
data_temp.heat.deg_c);
}
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
演示
審核編輯 黃宇
-
傳感器
+關注
關注
2541文章
49582瀏覽量
745961 -
加速度計
+關注
關注
6文章
690瀏覽量
45672 -
stm32cubemx
+關注
關注
5文章
278瀏覽量
14583
發布評論請先 登錄
相關推薦
評論