概述
一旦傳感器被正確初始化,可以通過SPI或I2C接口向傳感器發送讀取命令,并接收傳感器返回的數據。這個讀取過程包括獲取LSM6DS3TR傳感器提供的加速度計和陀螺儀數據,以及傳感器對應的溫度信息。
最近在弄ST和瑞薩RA的課程,需要樣片的可以加群申請:615061293 。
視頻教學
[https://www.bilibili.com/video/BV1CW4y197Zi/]
樣品申請
[https://www.wjx.top/vm/OhcKxJk.aspx#]
完整代碼下載
[https://download.csdn.net/download/qq_24312945/87921267]
獲取數據狀態
STATUS_REG (1Eh)是該傳感器的一個寄存器。在LSM6DS3TR中,STATUS_REG寄存器用于提供傳感器的狀態信息。
參考程序的獲取狀態代碼如下所示。
對應的獲取函數如下。
獲取STATUS_REG (1Eh)函數如下所示。
#define LSM6DS3TRC_STATUS_REG 0x1E
/***************************************************************************************************************
LSM6DS3TRC Get data status
****************************************************************************************************************/
uint8_t LSM6DS3TRC_Get_Status(void)
{
uint8_t buf[1] = {0};
LSM6DS3TRC_ReadCommand(LSM6DS3TRC_STATUS_REG, buf, 1);
return buf[0];
}
可以判斷如下地址來判斷溫度,加速度,陀螺儀數據新的數據是否獲取完畢。
#define LSM6DS3TRC_STATUS_TEMPERATURE 0x04
#define LSM6DS3TRC_STATUS_GYROSCOPE 0x02
#define LSM6DS3TRC_STATUS_ACCELEROMETER 0x01
獲取加速度數據
加速度傳感器中的"+-2g"、"+-4g"、"+-8g"、"+-16g"表示傳感器的測量范圍或量程,單位為"g",代表重力加速度。
"g"是地球表面上的重力加速度,大約等于9.8米/秒2。因此,傳感器的量程為"+-2g"意味著它可以測量從-2g到+2g的加速度范圍,即-19.6米/秒2到+19.6米/秒2。同樣地,"+-4g"的量程為-39.2米/秒2到+39.2米/秒2,"+-8g"的量程為-78.4米/秒2到+78.4米/秒2,"+-16g"的量程為-156.8米/秒2到+156.8米/秒2。
因此,這些不同的量程表示了傳感器可以測量的加速度范圍大小。選取適當的量程取決于應用的需求。如果預計測量的加速度值不會超過+-2g,那么選擇"+-2g"的傳感器就足夠了,而如果需要測量更大范圍的加速度,就需要選擇具有更高量程的傳感器。選擇合適的量程可以確保傳感器在測量過程中不會超出其最大測量范圍,從而提供準確的測量結果。
在參考代碼中,當STATUS_REG(0x1E)中的XLDA位為1時,表示已成功獲取加速度數據,可以進行讀取操作。
為了獲取完整的加速度X軸、Y軸和Z軸數據,可以連續讀取6個8位數據,這些數據來自線性加速度輸出寄存器,其值表示為一個16位的二進制補碼。
需要注意的是X軸,Y軸,Z軸的加速度數據都是16位的數據。
同時需要乘以一個縮放因子,這個因子是根據傳感器的靈敏度或靈敏度刻度確定的。
可以修改為如下所示的代碼。
#define LSM6DS3TRC_OUTX_L_XL 0x28
/***************************************************************************************************************
LSM6DS3TRC Get Acceleration Value
****************************************************************************************************************/
void LSM6DS3TRC_Get_Acceleration(uint8_t fsxl, float *acc_float)
{
uint8_t buf[6];
int16_t acc[3];
LSM6DS3TRC_ReadCommand(LSM6DS3TRC_OUTX_L_XL, buf, 6);
acc[0] = buf[1] < < 8 | buf[0];
acc[1] = buf[3] < < 8 | buf[2];
acc[2] = buf[5] < < 8 | buf[4];
switch (fsxl)
{
case LSM6DS3TRC_ACC_FSXL_2G:
acc_float[0] = ((float)acc[0] * 0.061f);
acc_float[1] = ((float)acc[1] * 0.061f);
acc_float[2] = ((float)acc[2] * 0.061f);
break;
case LSM6DS3TRC_ACC_FSXL_16G:
acc_float[0] = ((float)acc[0] * 0.488f);
acc_float[1] = ((float)acc[1] * 0.488f);
acc_float[2] = ((float)acc[2] * 0.488f);
break;
case LSM6DS3TRC_ACC_FSXL_4G:
acc_float[0] = ((float)acc[0] * 0.122f);
acc_float[1] = ((float)acc[1] * 0.122f);
acc_float[2] = ((float)acc[2] * 0.122f);
break;
case LSM6DS3TRC_ACC_FSXL_8G:
acc_float[0] = ((float)acc[0] * 0.244f);
acc_float[1] = ((float)acc[1] * 0.244f);
acc_float[2] = ((float)acc[2] * 0.244f);
break;
}
}
獲取陀螺儀數據
在參考代碼中,當STATUS_REG(0x1E)中的GDA位為1時,表示已成功獲取陀螺儀數據,可以進行讀取操作。
為了獲取完整的陀螺儀X軸、Y軸和Z軸數據,可以連續讀取6個8位數據,這些數據來自陀螺儀輸出寄存器,其值表示為一個16位的二進制補碼。
需要注意的是X軸,Y軸,Z軸的陀螺儀數據都是16位的數據。 同時需要乘以一個縮放因子,這個因子是根據傳感器的靈敏度或靈敏度刻度確定的。
可以修改為如下所示的代碼。
#define LSM6DS3TRC_OUTX_L_G 0x22
/***************************************************************************************************************
LSM6DS3TRC Get Gyroscope Value
****************************************************************************************************************/
void LSM6DS3TRC_Get_Gyroscope(uint8_t fsg, float *gry_float)
{
uint8_t buf[6];
int16_t gry[3];
LSM6DS3TRC_ReadCommand(LSM6DS3TRC_OUTX_L_G, buf, 6);
gry[0] = buf[1] < < 8 | buf[0];
gry[1] = buf[3] < < 8 | buf[2];
gry[2] = buf[5] < < 8 | buf[4];
switch (fsg)
{
case LSM6DS3TRC_GYR_FSG_250:
gry_float[0] = ((float)gry[0] * 8.750f);
gry_float[1] = ((float)gry[1] * 8.750f);
gry_float[2] = ((float)gry[2] * 8.750f);
break;
case LSM6DS3TRC_GYR_FSG_500:
gry_float[0] = ((float)gry[0] * 17.50f);
gry_float[1] = ((float)gry[1] * 17.50f);
gry_float[2] = ((float)gry[2] * 17.50f);
break;
case LSM6DS3TRC_GYR_FSG_1000:
gry_float[0] = ((float)gry[0] * 35.00f);
gry_float[1] = ((float)gry[1] * 35.00f);
gry_float[2] = ((float)gry[2] * 35.00f);
break;
case LSM6DS3TRC_GYR_FSG_2000:
gry_float[0] = ((float)gry[0] * 70.00f);
gry_float[1] = ((float)gry[1] * 70.00f);
gry_float[2] = ((float)gry[2] * 70.00f);
break;
}
}
獲取溫度數據
在參考代碼中,當STATUS_REG(0x1E)中的TDA位為1時,表示已成功獲取陀螺儀數據,可以進行讀取操作。
為了獲取完整的溫度數據,可以連續讀取2個8位數據。
對應的寄存器為OUT_TEMP_L (20h), OUT_TEMP_H (21h)。
對應溫度轉換如下所示。
所以獲取到的數據需要除以256在加上25度,可以修改為如下所示的代碼。
#define LSM6DS3TRC_OUT_TEMP_L 0x20
float LSM6DS3TRC_Get_Temperature(void)
{
uint8_t buf[2];
int16_t temp;
LSM6DS3TRC_ReadCommand(LSM6DS3TRC_OUT_TEMP_L, buf, 2);
temp = buf[1] < < 8 | buf[0];
return (((float)temp / 256.0) + 25.0);
}
主程序代碼
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
uint8_t status;
status = LSM6DS3TRC_Get_Status();
if (status & LSM6DS3TRC_STATUS_ACCELEROMETER)
{
float acc[3] = {0};
LSM6DS3TRC_Get_Acceleration(LSM6DS3TRC_ACC_FSXL_2G, acc);
printf("rnacc:X:%2f,tY:%2f,tZ:%2fr", acc[0], acc[1], acc[2]);
}
if (status & LSM6DS3TRC_STATUS_GYROSCOPE)
{
float gyr[3] = {0};
LSM6DS3TRC_Get_Gyroscope(LSM6DS3TRC_GYR_FSG_2000, gyr);
printf("rgyr:X:%4.2f,tY:%4.2f,tZ:%4.2fr", gyr[0], gyr[1], gyr[2]);
}
if (status & LSM6DS3TRC_STATUS_TEMPERATURE)
{
printf("rtemp:%2frn", LSM6DS3TRC_Get_Temperature());
}
HAL_Delay(100);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
演示
審核編輯 黃宇
-
傳感器
+關注
關注
2560文章
52068瀏覽量
760850 -
mems
+關注
關注
129文章
4013瀏覽量
192286 -
陀螺儀
+關注
關注
44文章
803瀏覽量
99470 -
數據采集
+關注
關注
39文章
6704瀏覽量
115070 -
運動檢測
+關注
關注
0文章
37瀏覽量
12691
發布評論請先 登錄
相關推薦
驅動LSM6DS3TR-C實現高效運動檢測與數據采集(6)----FIFO數據讀取與配置

驅動LSM6驅動LSM6DS3TR-C實現高效運動檢測與數據采集(7)----MotionFX庫解析空間坐標DS3TR-C實現高效運動檢測與數據采

lsm6ds3tr-c傳感器集合模式無法使用的原因?
LSM6DS3TR-C使用時工作電流比datasheet上大很多是什么原因?
請問LSM6DS3TR和LSM6DS3TR-C兩個型號能否完全兼容?
LSM6DS3TR-C數據讀取異常是安利的問題?怎么處理?
LSM6DS3TR-C的FIFO讀取數據出錯是什么原因造成的?怎么解決?
供應LSM6DSLTR LSM6DSL 傳感器 LSM6DSMTR LSM6DSM
LSM6DS3的應用筆記
驅動LSM6DS3TR-C實現高效運動檢測與數據采集(2)----配置濾波器

驅動LSM6DS3TR-C實現高效運動檢測與數據采集(4)----上報匿名上位機實現可視化

驅動LSM6DS3TR-C實現高效運動檢測與數據采集(5)----姿態解算

評論