概述
本文將介紹如何使用 LIS2MDL 傳感器來(lái)讀取數據來(lái)轉化為指南針。 地磁場(chǎng)強度范圍約為 23,000 至 66,000 nT ,并且可以建模為磁偶極子,其場(chǎng)線(xiàn)起源于地球地理南部附近的點(diǎn),并終止于磁場(chǎng)附近的點(diǎn)。磁場(chǎng)具有七個(gè)分量,如圖 所示。x,y和z分別表示北分量,東分量和垂直分量的磁場(chǎng)強度。H代表總水平強度,F代表磁場(chǎng)的總強度,而D和I分別代表磁偏角和磁傾角。
最近在弄ST和瑞薩RA的課程,需要樣片的可以加群申請:615061293 。
視頻教學(xué)
https://www.bilibili.com/video/BV1xG411a7cs/
樣品申請
https://www.wjx.top/vm/OhcKxJk.aspx#
源碼下載
https://download.csdn.net/download/qq_24312945/88634988
環(huán)境磁場(chǎng)建模
盡管可以選擇七個(gè)不同的元素來(lái)處理給定點(diǎn)的磁場(chǎng),但并非所有元素都是進(jìn)行定位的理想選擇。X,Y 和 Z 的三個(gè)元素是從磁力計獲得的基本值,而其他四個(gè)元素是使用這些元素來(lái)計算的。前三個(gè)元素隨移動(dòng)設備方位角的改變而偏離,因此,對于許多基于磁場(chǎng)的室內定位系統通常假設以固定方位工作,行人可以更改方向,但不能更改設備方位。
在大地坐標系的水平面上,假設磁北和x軸的夾角為a, x方向的磁分量是Mx,y方向的分量是My,則
ɑ=arctan(My/Mx)
這是電子羅盤(pán)定向的基本原理。實(shí)際應用中,電子羅盤(pán)不能總是保持在水平面上,如下圖所示一樣存在俯仰角和橫滾角。將羅盤(pán)坐標系下的 z軸向下, 3個(gè)軸的磁分量投影到水平面上可以得到Xh,Yh,相應的磁感應值:
Xh=Xcosф+Ysinфsinθ - Zsinфcosθ
Yh=Ycosθ + Zsinθ
相應的
ɑ=arctan(Yh/Xh)
Angle_XY=atan2( (magnetic_mG[1]-Xoffset),(magnetic_mG[0]-Yoffset) ) * (180/3.14159265)+180;//計算角度
Angle_XZ=atan2( (magnetic_mG[2]-Zoffset),(magnetic_mG[0]-Yoffset) ) * (180/3.14159265)+180;//計算角度
Angle_YZ=atan2( (magnetic_mG[2]-Zoffset),(magnetic_mG[1]-Yoffset) ) * (180/3.14159265)+180;//計算角度
消除硬鐵誤差
電子羅盤(pán)有兩種工作模式,一種是正常工作模式,另一種是出廠(chǎng)設置模式,這種出場(chǎng)設置模式就是為了消除硬鐵干擾。硬鐵干擾產(chǎn)生于永久磁鐵,和被磁化的金屬,或羅盤(pán)平臺上的鋼。這些干擾會(huì )保持大小恒定,與羅盤(pán)的相對位置固定,而與羅盤(pán)指向無(wú)關(guān)。所以當羅盤(pán)安裝好后,它周?chē)挠茶F干擾就幾乎不會(huì )改變了,只要對羅盤(pán)做一次準確的標定,就能很輕松的消除這項干擾。
硬鐵干擾在羅盤(pán)輸出的每個(gè)軸向加了一個(gè)定值,輸出曲線(xiàn)圖的圓心被移動(dòng)了,對于航向的影響則是一個(gè)周期性的誤差,如下圖所示在理想狀態(tài)時(shí),在 360 度范圍內,傳感器輸出極值分別為 ymax ymin xmax xmin 坐標原點(diǎn)為O,受到硬鐵干擾后,極值變?yōu)?y'max ,y'min , x'max , x'max , 坐標原點(diǎn)變?yōu)镺' 。要消除硬鐵干擾,可以將羅盤(pán)和平臺旋轉一周,得 到圓上的足夠的點(diǎn)再得到圓心偏移。
具體操作過(guò)程如下:接通電源后,將羅盤(pán)勻速旋轉,使微控制器采集 360 °范圍內的數據,通過(guò)數值比較,找出 x 、 y 方向的極值,得出偏移坐標 O’, 即電橋的偏置電壓,并將此電壓值保存,每次羅盤(pán)讀數時(shí)都會(huì )減去此偏移。實(shí)際上,本設計在方位角的計算過(guò)程就是此過(guò)程,所以在計算方位角的同時(shí)已經(jīng)消除了硬鐵干擾。這種方法也可以消除由于溫度漂移產(chǎn)生的誤差。
軟鐵干擾
軟鐵干擾來(lái)源于地球磁場(chǎng)和羅盤(pán)附近的任何磁性材料之間的相互作用,同硬鐵材料一樣,軟金屬也干擾地球的磁力線(xiàn),不同點(diǎn)是,軟磁的干擾程度,與羅盤(pán)的方向有關(guān)。對軟鐵干擾的校正,比較復雜,下面討論采用霍尼韋爾公司的 Michal.J.Caruso 提出橢圓假設的誤差補償原理進(jìn)行誤差補償的方法 。
根據 Michal.J.Caruso 的研究,羅盤(pán)在理想的沒(méi)有任何干擾的磁場(chǎng)水平面里作圓形旋轉時(shí),磁力計的顯示應該呈現上圖的狀態(tài),其中圓中心在 0,0 點(diǎn)處,每個(gè)計數代表 67微高斯,在 X 和 Y 平面中的地球磁場(chǎng)強度值讀到 2800 個(gè)計數,約為 190 毫高斯,根據下面公式可以對每個(gè)讀數確定一個(gè)方位角。
如果將磁力計安裝在有發(fā)動(dòng)機或者其他鐵磁材料的環(huán)境中,圓形旋轉時(shí),磁力計的顯示應該下圖的狀態(tài)。
這里的圖形不是一個(gè)圓 ( 有點(diǎn)橢圓 ) ,而它偏移 0,0 點(diǎn)為 -480 和 -795 個(gè)計數,這偏移和橢圓效應是干擾磁場(chǎng)對地球磁場(chǎng)作用的結果。通過(guò)確定兩個(gè)定標因數 Xsf 和 Ysf 可以將橢圓改為圓。隨后計算偏移值 Xoff 和 Yoff, 將圓中心定在 0,0 原點(diǎn),用下面公式來(lái)計算 Y,X 值。
X 值 =Xsf×X 讀數 +Xoff
Y 值 =Ysf×Y 讀數 +Yoff
這里的定標因數 Xsf 和 Ysf 可由下述方法獲得。
①將羅盤(pán)在水平面做旋轉運動(dòng)
②找出 X 和 Y 讀數的最大值和最小值
③用這四個(gè)數值確定 X 和 Y 定標因數 (Xsf , Ysf) ,以及零偏移值 (Xoff , Yoff)
Xsf=1 或 (Y 最大 -Y 最小 )/2(X 最大 -Y 最小 )
以較大的數值為準
Ysf=1 或 (X 最大 -Y 最小 )/2(Y 最大 -Y 最小 )
以較大的數值為準
Xoff=[(X 最大 -X 最小 ) /2-X 最大 ]×Xsf
Yoff=[(Y 最大 -Y 最小 ) /2-Y 最大 ]×Ysf
主程序
在主程序中添加開(kāi)機校準。
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
uint8_t reg;
/* Read output only if new value is available */
lis2mdl_mag_data_ready_get(&dev_ctx, ®);
if (reg) {
/* Read magnetic field data */
memset(data_raw_magnetic, 0x00, 3 * sizeof(int16_t));
lis2mdl_magnetic_raw_get(&dev_ctx, data_raw_magnetic);
magnetic_mG[0] = lis2mdl_from_lsb_to_mgauss(data_raw_magnetic[0]);
magnetic_mG[1] = lis2mdl_from_lsb_to_mgauss(data_raw_magnetic[1]);
magnetic_mG[2] = lis2mdl_from_lsb_to_mgauss(data_raw_magnetic[2]);
printf("i=%d,Magnetic field [mG]:%4.2ft%4.2ft%4.2frn",i,magnetic_mG[0], magnetic_mG[1], magnetic_mG[2]);
if(i< 500)
{
i++;
if(magnetic_mG[0]< Xmin)
Xmin=magnetic_mG[0];
else if(magnetic_mG[0] >Xmax)
Xmax=magnetic_mG[0];
if(magnetic_mG[1]< Ymin)
Ymin=magnetic_mG[1];
else if(magnetic_mG[1] >Ymax)
Ymax=magnetic_mG[1];
if(magnetic_mG[2]< Zmin)
Zmin=magnetic_mG[2];
else if(magnetic_mG[2] >Zmax)
Zmax=magnetic_mG[2];
}
else if(i==500)
{
i++;
Xsf = (Ymax - Ymin) / (Xmax - Xmin);
Ysf = (Xmax - Xmin) / (Ymax - Ymin);
if (Xsf < 1)
Xsf = 1;
if (Ysf < 1)
Ysf = 1;
Xoffset=( (Xmax-Xmin)/2 - Xmax) *Xsf;
Yoffset=( (Ymax-Ymin)/2 - Ymax) *Ysf;
// Zoffset=( (Zmax-Zmin)/2 - Zmax) *Xsf;
}
else
{
Angle_XY=atan2( (magnetic_mG[1]-Yoffset),(magnetic_mG[0]-Xoffset) ) * (180/3.14159265)+180;//計算角度
printf("Angle_XY=%3.2fn",Angle_XY);
// Angle_XZ=atan2( (magnetic_mG[2]-Zoffset),(magnetic_mG[0]-Xoffset) ) * (180/3.14159265)+180;//計算角度
// Angle_YZ=atan2( (magnetic_mG[2]-Zoffset),(magnetic_mG[1]-Yoffset) ) * (180/3.14159265)+180;//計算角度
// printf("Angle_XY=%3.2f,Angle_XZ=%3.2f,Angle_YZ=%3.2fn",Angle_XY,Angle_XZ,Angle_YZ);
}
}
HAL_Delay(10);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
審核編輯:湯梓紅
-
mems
+關(guān)注
關(guān)注
128文章
3773瀏覽量
189307 -
電子羅盤(pán)
+關(guān)注
關(guān)注
1文章
121瀏覽量
23167 -
指南針
+關(guān)注
關(guān)注
2文章
16瀏覽量
10815 -
磁力計
+關(guān)注
關(guān)注
1文章
60瀏覽量
20649
發(fā)布評論請先 登錄
相關(guān)推薦
磁力計LIS2MDL開(kāi)發(fā)(1)----輪詢(xún)獲取磁力計數據
![<b class='flag-5'>磁力計</b><b class='flag-5'>LIS2MDL</b><b class='flag-5'>開(kāi)發(fā)</b>(1)----輪詢(xún)獲取<b class='flag-5'>磁力計</b>數據](https://file1.elecfans.com/web2/M00/B7/D6/wKgZomV_tLCAQTwQAAyNsEWki3o098.png)
e2studio開(kāi)發(fā)磁力計LIS2MDL(1)----輪詢(xún)獲取磁力計數據
![e2studio<b class='flag-5'>開(kāi)發(fā)</b><b class='flag-5'>磁力計</b><b class='flag-5'>LIS2MDL</b>(1)----輪詢(xún)獲取<b class='flag-5'>磁力計</b>數據](https://file1.elecfans.com/web2/M00/B7/D6/wKgZomV_tLCAQTwQAAyNsEWki3o098.png)
有沒(méi)有辦法用LIS2MDL檢測溢出?
LSM9DS1磁力計的自檢是否與LIS3MDL相同
在LIS2MDL上設置新閾值后是否需要最少時(shí)間?
LIS2MDL偏移取消問(wèn)題
如何在LIS3MDL磁力計傳感器中禁用DRDY和INT輸出
無(wú)法將LIS2MDL置于低功耗模式
LIS3MDL三軸磁力計能滿(mǎn)足磁通密度為0.23高斯的應用程序嗎
用于生成每個(gè)輸出樣本的樣本數量而言LIS3mdl磁力計的操作模式有何不同?
LIS2MDL軸標簽是否指示正軸方向?
STLIS2MDL磁力計傳感器相關(guān)的使用信息和應用提示
LIS2MDL磁力計傳感器相關(guān)資料
e2studio開(kāi)發(fā)磁力計LIS2MDL(2)----電子羅盤(pán)
![e2studio<b class='flag-5'>開(kāi)發(fā)</b><b class='flag-5'>磁力計</b><b class='flag-5'>LIS2MDL</b>(2)----<b class='flag-5'>電子</b><b class='flag-5'>羅盤(pán)</b>](https://file1.elecfans.com/web2/M00/B7/D6/wKgZomV_tVSAUdVTAADJC7zbJQs124.png)
評論