概述
LSM6DS3TR-C是單芯片“3軸陀螺儀 + 3軸加速度計”的慣性 測量單元(IMU), 五種種可選滿量程的陀螺儀(125/250/500/1000/2000 dps)和加速度計(2/4/8/16 g)。
上述工程中選擇的加速度和陀螺儀對應的量程為2g和2000dps,對應的靈敏度如下所示,分別為0.061mg/LSB和70mdps/LSB。
最近在弄ST和瑞薩RA的課程,需要樣片的可以加群申請:615061293 。
視頻教學
[https://www.bilibili.com/video/BV14h4y1R7kc/]
樣品申請
[https://www.wjx.top/vm/OhcKxJk.aspx#]
完整代碼下載
[https://download.csdn.net/download/qq_24312945/87921267]
參考坐標系
測量加速度
LSM6DS3TR-C有一個片上加速度計,可以在 ±2g、±4g、±8g 和 ±16g 四個可編程滿量程范圍內測量加速度。
測量角速度
MPU6050 有一個片上陀螺儀,可以在 ±125°/s ±250°/s、±500°/s、±1000°/s 和 ±2000°/s 的四個可編程滿量程范圍內測量角度旋轉。
加速度計工作方式
假設立方體在外太空,那里的一切都是失重的,球會簡單地漂浮在立方體的中心。
現(xiàn)在,假設每面墻代表一個特定的軸。 如果我們突然以 1g 的加速度向左移動盒子(單個 G 力 1g 相當于重力加速度 9.8 m/s 2),球無疑會撞到墻壁 X。如果我們測量球對墻壁施加的力X,我們可以得到沿X軸的輸出值為1g。
讓我們看看當我們把那個立方體放在地球上時會發(fā)生什么。球將簡單地落在墻 Z 上,施加 1g 的力,如下圖所示:
在這種情況下,盒子沒有移動,但我們仍然在 Z 軸上得到 1g 的讀數(shù)。這是因為重力(實際上是加速度的一種形式)以 1g 的力向下拉球。
雖然此模型并不完全代表真實世界的加速度計傳感器是如何構建的,但它通常有助于理解為什么加速度計的輸出信號通常以 ±g 為單位指定,或者為什么加速度計在靜止時在 z 軸上讀數(shù)為 1g,或者您可以在不同方向上獲得什么樣的加速度計讀數(shù)。
上位機通訊
這里使用的是匿名助手的上位機
[https://gitee.com/anotc/AnoAssistant]
有專門的通訊協(xié)議
串口通訊協(xié)議格式如下所示,需要注意傳輸為小端模式傳輸。
對應的源地址和目標地址分別為0xFD和0xFE。
我們只需要上報加速度和陀螺儀數(shù)據(jù),所以功能碼為0x01,數(shù)據(jù)長度為0x0D,需要主要為小端模式傳輸。
加速度演示
實測移動模塊分別為X、Y、Z軸向下,可以看見數(shù)值基本上為1000mg。
陀螺儀工作方式
加速度計測量線性加速度,而陀螺儀測量角旋轉。為此,他們測量了科里奧利效應產(chǎn)生的力。
陀螺儀是一種運動傳感器,能夠感測物體在一軸或多軸上的旋轉角速度。它能夠精確地感測自由空間中復雜的移動動作,因此成為追蹤物體移動方位和旋轉動作的必要設備。與加速計和電子羅盤不同,陀螺儀不需要依賴外部力量(如重力或磁場),可以自主地發(fā)揮其功能。
因此,從理論上講,只使用陀螺儀就可以完成姿態(tài)導航的任務。
陀螺儀的每個通道檢測一個軸的旋轉。也就是說陀螺儀通過測量自身的旋轉狀態(tài),判斷出設備當前運動狀態(tài),是向前、向后、向上、向下、向左還是向右呢,是加速(角速度)還是減速(角速度)呢,都可以實現(xiàn),但是要判斷出設備的方位(東西南北),陀螺儀就沒有辦法。
MEMS陀螺儀主要利用科里奧利力(旋轉物體在有徑向運動時所受到的切向力)原理,公開的微機械陀螺儀均采用振動物體傳感角速度的概念,利用振動來誘導和探測科里奧利力。
MEMS陀螺儀的核心是一個微加工機械單元,在設計上按照一個音叉機制共振運動,通過科里奧利力原理把角速率轉換成一個特定感測結構的位移。
兩個相同的質量塊以方向相反的做水平震蕩。當外部施加一個角速率,就會出現(xiàn)一個科氏力,力的方向垂直于質量運動方向,如垂直方向箭頭所示。產(chǎn)生的科氏力使感測質量發(fā)生位移,位移大小與所施加的角速率大小成正比,科氏力引起的電容變化即可計算出角速率大小。 科里奧利效應指出,當質量 (m) 以速度 (v) 沿特定方向移動并施加外部角速率 (Ω)(紅色箭頭)時,科里奧利效應會產(chǎn)生一個力(黃色箭頭),導致質量垂直移動。該位移的值與應用的角速率直接相關。
上報源碼
/**
* @brief The application entry point.
* @retval int
*/
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_I2C1_Init();
MX_USART1_UART_Init();
/* USER CODE BEGIN 2 */
printf("hello");
if (LSM6DS3TRC_Init(LSM6DS3TRC_MODE_I2C) == false)
printf("LSM6DS3TRC initialize error.rn");
else
printf("LSM6DS3TRC initialize register finished.rn");
int16_t acc_int16[3] ={0,0,0};
int16_t gyr_int16[3] ={0,0,0};
float acc[3] = {0};
float gyr[3] = {0};
uint8_t data[21]={0};
data[0]=0xAB;//幀頭
data[1]=0xFD;//源地址
data[2]=0xFE;//目標地址
data[3]=0x01;//功能碼ID
data[4]=0x0D;//數(shù)據(jù)長度LEN
data[5]=0x00;//數(shù)據(jù)長度LEN 13
uint8_t sumcheck = 0;
uint8_t addcheck = 0;
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
uint8_t status;
status = LSM6DS3TRC_Get_Status();
if (status & LSM6DS3TRC_STATUS_ACCELEROMETER)
{
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)
{
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());
}
//匿名上位機
acc_int16[0]=(int16_t)(acc[0]);
acc_int16[1]=(int16_t)(acc[1]);
acc_int16[2]=(int16_t)(acc[2]);
gyr_int16[0]=(int16_t)(gyr[0])/1000;
gyr_int16[1]=(int16_t)(gyr[1])/1000;
gyr_int16[2]=(int16_t)(gyr[2])/1000;
data[7]=acc_int16[0] >>8;//ACC_X
data[6]=acc_int16[0];
data[9]=acc_int16[1] >>8;//ACC_Y
data[8]=acc_int16[1];
data[11]=acc_int16[2] >>8;//ACC_Z
data[10]=acc_int16[2];
data[13]=gyr_int16[0] >>8;//GYR_X
data[12]=gyr_int16[0];
data[15]=gyr_int16[1] >>8;//GYR_Y
data[14]=gyr_int16[1];
data[17]=gyr_int16[2] >>8;//GYR_Z
data[16]=gyr_int16[2];
data[18]=0;
sumcheck = 0;
addcheck = 0;
for(uint16_t i=0; i < 19; i++)
{
sumcheck += data[i]; //從幀頭開始,對每一字節(jié)進行求和,直到 DATA 區(qū)結束
addcheck += sumcheck; //每一字節(jié)的求和操作,進行一次 sumcheck 的累加
}
data[19]=sumcheck;
data[20]=addcheck;
HAL_UART_Transmit(&huart1 , (uint8_t *)&data, 21, 0xFFFF);
// printf("naccx=%d accy=%d accz=%d gyrx=%d gyry=%d gyrx=%d ",acc_int16[0],acc_int16[1],acc_int16[2],gyr_int16[0],gyr_int16[1],gyr_int16[2]);
HAL_Delay(100);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
審核編輯 黃宇
-
mems
+關注
關注
129文章
3949瀏覽量
190838 -
陀螺儀
+關注
關注
44文章
787瀏覽量
98814 -
數(shù)據(jù)采集
+關注
關注
39文章
6192瀏覽量
113820 -
上位機
+關注
關注
27文章
944瀏覽量
54903 -
運動檢測
+關注
關注
0文章
34瀏覽量
12627
發(fā)布評論請先 登錄
相關推薦
評論