概述
最近在弄ST和瑞薩RA的課程,需要樣片的可以加群申請(qǐng):615061293 。
零偏是影響加速度計(jì)輸出精度的重要指標(biāo)之一,零偏可分為靜態(tài)零偏和動(dòng)態(tài)零偏 。靜態(tài)零偏也稱為固定零偏,通常經(jīng)標(biāo)定與補(bǔ)償減小靜態(tài)零偏。動(dòng)態(tài)零偏是由于加速度計(jì)自身的缺陷或環(huán)境因素(如溫度、振動(dòng)、電子干擾等)引起的,懸絲加速度計(jì)在運(yùn)動(dòng)過程中其精度會(huì)受到動(dòng)態(tài)零偏的影響,因此在投入使用前要先對(duì)加速度計(jì)的動(dòng)態(tài)零偏進(jìn)行測試。
硬件準(zhǔn)備
首先需要準(zhǔn)備一個(gè)開發(fā)板,這里我準(zhǔn)備的是自己繪制的開發(fā)板,需要的可以進(jìn)行申請(qǐng)。 主控為STM32U073CC,加速度計(jì)為LIS2DUX12
視頻教學(xué)
[https://www.bilibili.com/video/BV17J4m1W7Fb/]
樣品申請(qǐng)
[https://www.wjx.top/vm/OhcKxJk.aspx#]
源碼下載
[https://download.csdn.net/download/qq_24312945/89197967]
六位置法的標(biāo)定方案
本文在校準(zhǔn)三軸加速度計(jì)時(shí)使用六位置校準(zhǔn)法,該方法使用地球的重力力加速度在靜態(tài)下校準(zhǔn)三軸加速度傳感器,具體的校準(zhǔn)過程如下圖所示。具體校準(zhǔn)過程如下:
- 將傳感器的Y軸垂直水平面向下;
- 以X軸為基準(zhǔn)軸,繞其逆旋轉(zhuǎn)90°,使乙軸垂直水平面向上
- 以Y軸為基準(zhǔn)軸,繞其逆旋轉(zhuǎn)90°,使X軸垂直水平面向下
- 以Y軸為基準(zhǔn)軸,繞其逆時(shí)針旋轉(zhuǎn)90°使2軸垂直水平面向下
- 繞Y軸逆時(shí)針旋轉(zhuǎn)909、使X軸垂直水平面向上
- 繞Z軸順時(shí)針旋轉(zhuǎn)90°、使Y軸垂直水平面向上
在沒有精密設(shè)備的情況下。這種方法基本上是在試圖找到每個(gè)軸的偏移(zero-g offset)和靈敏度(scale factor)。這種方法通常稱為靜態(tài)校準(zhǔn)方法,因?yàn)樗恍枰獎(jiǎng)討B(tài)輸入,只需將設(shè)備置于靜態(tài)的已知方向即可。
旋轉(zhuǎn)加速度計(jì)以找到極值
將加速度計(jì)沿每個(gè)軸正向和反向?qū)R,使其盡可能地與地球重力向量對(duì)齊。在理想情況下,當(dāng)某一軸完全與地球的重力向量對(duì)齊時(shí),該軸應(yīng)顯示約 ±1g 的讀數(shù),而其他軸應(yīng)顯示 0g。
記錄每個(gè)軸在這六個(gè)方向(X+, X-, Y+, Y-, Z+, Z-)的輸出,即每個(gè)軸的最大值和最小值。
在未校準(zhǔn)情況下,讀出的數(shù)據(jù)會(huì)超過1g的數(shù)值,所以要進(jìn)行加速度計(jì)校準(zhǔn)。
計(jì)算偏移和靈敏度
偏移(Offset):可以通過計(jì)算每個(gè)軸最大值和最小值的平均值得到:
Offset=(Max value+Min value)/2
靈敏度(Scale factor):可以通過兩個(gè)極值之差與2g(因?yàn)閺?1g到-1g的總變化是2g)的比例來計(jì)算:
Scale factor=(Max value-Min value)/2g
應(yīng)用校準(zhǔn)參數(shù)
一旦計(jì)算得到每個(gè)軸的偏移量和靈敏度,校準(zhǔn)參數(shù)就可以應(yīng)用到新的加速度計(jì)測量數(shù)據(jù)中以修正這些數(shù)據(jù)。修正后的加速度值由下列公式計(jì)算得出:
Calibrated value= (Raw value?Offset)/Scale Factor
這個(gè)步驟實(shí)質(zhì)上是一個(gè)線性變換,它調(diào)整原始加速度讀數(shù)以反映真實(shí)的加速度。
這些算法步驟基于直接的數(shù)學(xué)操作,并不涉及復(fù)雜的統(tǒng)計(jì)算法或優(yōu)化算法。這些方法足以處理大多數(shù)基本應(yīng)用場景下的加速度計(jì)校準(zhǔn)需求,尤其是在資源受限的嵌入式系統(tǒng)中。如果環(huán)境變化大或加速度計(jì)的非理想特性影響較大(如高溫、機(jī)械應(yīng)力等),可能需要更復(fù)雜的算法來進(jìn)行動(dòng)態(tài)校準(zhǔn)或更高級(jí)的誤差補(bǔ)償。
注意事項(xiàng)
- 確保在靜態(tài)環(huán)境中進(jìn)行測試,避免任何震動(dòng)或移動(dòng)。
- 使用精確的水平儀確保加速度計(jì)的對(duì)齊。
- 可以通過多次測量和取平均值來增加校準(zhǔn)的準(zhǔn)確性。 這種校準(zhǔn)方法相對(duì)簡單,適合大多數(shù)基本應(yīng)用,但對(duì)于需要極高精度的應(yīng)用,可能需要更復(fù)雜的校準(zhǔn)技術(shù)和專業(yè)設(shè)備。
串口中斷
開啟串口中斷來接收數(shù)據(jù)。
要在主程序鐘開啟中斷接收。
HAL_UART_Receive_IT(&huart1, (uint8_t *)RxBuff, 1); //打開串口中斷接收
定義接收函數(shù)。
// 捕獲中斷回調(diào)函數(shù),每次捕獲到信號(hào)就會(huì)進(jìn)入這個(gè)回調(diào)函數(shù)
void HAL_UART_RxCpltCallback(UART_HandleTypeDef*UartHandle)
{
Rx_flag=RxBuff[0];
RxBuff[0]=0;
// printf("flag=%d",Rx_flag);
HAL_UART_Receive_IT(&huart1, (uint8_t *)RxBuff, 1); //每接收一個(gè)數(shù)據(jù),就打開一次串口中斷接收,否則只會(huì)接收一個(gè)數(shù)據(jù)就停止接收
}
變量定義
data_accx_min, data_accx_max, data_accy_min, data_accy_max, data_accz_min, data_accz_max:這些變量存儲(chǔ)加速度計(jì)在X、Y、Z軸上的最小值和最大值。這些極值通常是通過在特定時(shí)間內(nèi)收集加速度計(jì)數(shù)據(jù),然后從這些數(shù)據(jù)中找出最小值和最大值得到的。
Offset_x, Offset_y, Offset_z:這些是各軸的偏移值,計(jì)算方法是各軸最大值和最小值的算術(shù)平均值。偏移值用于調(diào)整每個(gè)軸的零點(diǎn)位置,使其在沒有運(yùn)動(dòng)時(shí)接近零。
Scale_factor_x, Scale_factor_y, Scale_factor_z:這些是各軸的靈敏度系數(shù),計(jì)算方法是各軸最大值和最小值的差除以2。這個(gè)系數(shù)用于調(diào)整每個(gè)軸的測量值,使其在已知加速度的情況下反映實(shí)際的物理加速度。
calibrated_x, calibrated_y, calibrated_z:這些變量用于存儲(chǔ)校準(zhǔn)后的加速度值,校準(zhǔn)的目的是確保加速度計(jì)輸出準(zhǔn)確反映實(shí)際加速度。
校準(zhǔn)參數(shù)計(jì)算函數(shù) calculate_calibration_params,此函數(shù)執(zhí)行以下操作:
計(jì)算偏移(Offset):通過取每個(gè)軸的最大值和最小值的平均值來計(jì)算偏移。這樣做是為了將未校準(zhǔn)的加速度計(jì)讀數(shù)的中心調(diào)整到0點(diǎn)附近,以補(bǔ)償傳感器的系統(tǒng)偏差。
計(jì)算靈敏度(Scale factor):通過取每個(gè)軸的最大值和最小值之差的一半來計(jì)算靈敏度。這個(gè)值表示了在理想條件下,傳感器輸出從最小到最大應(yīng)覆蓋的理想范圍(通常是±1g)。通過這種方式,您可以根據(jù)實(shí)際的傳感器響應(yīng)調(diào)整加速度計(jì)的讀數(shù)。
float data_accx_min=0,data_accx_max=0;//加速度計(jì)x軸極值
float data_accy_min=0,data_accy_max=0;//加速度計(jì)y軸極值
float data_accz_min=0,data_accz_max=0;//加速度計(jì)z軸極值
float Offset_x=0.0f;//x偏移
float Scale_factor_x=0.0f;//x靈敏度
float Offset_y=0.0f;//y偏移
float Scale_factor_y=0.0f;//y靈敏度
float Offset_z=0.0f;//z偏移
float Scale_factor_z=0.0f;//z靈敏度
float calibrated_x=0.0f;//校準(zhǔn)后加速度計(jì)x軸值
float calibrated_y=0.0f;//校準(zhǔn)后加速度計(jì)y軸值
float calibrated_z=0.0f;//校準(zhǔn)后加速度計(jì)z軸值
int acc_i=0;
uint8_t RxBuff[1]; //進(jìn)入中斷接收數(shù)據(jù)的數(shù)組
int Rx_flag=0; //接受到數(shù)據(jù)標(biāo)志
void calculate_calibration_params(void) {
Offset_x=(data_accx_max+data_accx_min)/2;
Offset_y=(data_accy_max+data_accy_min)/2;
Offset_z=(data_accz_max+data_accz_min)/2;
Scale_factor_x=(data_accx_max-data_accx_min)/2;
Scale_factor_y=(data_accy_max-data_accy_min)/2;
Scale_factor_z=(data_accz_max-data_accz_min)/2;
}
主程序流程
使用 lis2dux12_status_get 函數(shù)檢查新的加速度計(jì)數(shù)據(jù)是否已經(jīng)準(zhǔn)備好。如果status.drdy(數(shù)據(jù)就緒標(biāo)志)為真,這意味著有新數(shù)據(jù)可讀。
通過調(diào)用 lis2dux12_xl_data_get 函數(shù)讀取加速度計(jì)數(shù)據(jù)。這些數(shù)據(jù)被存儲(chǔ)在 data_xl.mg 數(shù)組中,分別對(duì)應(yīng) X、Y、Z 軸的加速度值。
根據(jù) Rx_flag 的值,更新對(duì)應(yīng)軸的最小值或最大值。每次更新后,調(diào)用 calculate_calibration_params 函數(shù)重新計(jì)算校準(zhǔn)參數(shù)。
Rx_flag == 1 和 Rx_flag == 2 分別更新 X 軸的最小和最大值。
Rx_flag == 3 和 Rx_flag == 4 分別更新 Y 軸的最小和最大值。
Rx_flag == 5 和 Rx_flag == 6 分別更新 Z 軸的最小和最大值。
使用更新后的校準(zhǔn)參數(shù)(偏移和靈敏度)來校準(zhǔn)讀取的加速度數(shù)據(jù)。校準(zhǔn)公式為:
Calibrated value= 1000*(Raw value?Offset)/Scale Factor
這里乘以1000是為了將結(jié)果轉(zhuǎn)換為毫重力單位(mg),常用于顯示加速度計(jì)的讀數(shù)。
/* 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);
if(Rx_flag==1)//X軸min
{
data_accx_min=data_xl.mg[0];
Rx_flag=0;
calculate_calibration_params();
}
else if(Rx_flag==2)//X軸max
{
data_accx_max=data_xl.mg[0];
Rx_flag=0;
calculate_calibration_params();
}
else if(Rx_flag==3)//Y軸min
{
data_accy_min=data_xl.mg[1];
Rx_flag=0;
calculate_calibration_params();
}
else if(Rx_flag==4)//Y軸max
{
data_accy_max=data_xl.mg[1];
Rx_flag=0;
calculate_calibration_params();
}
else if(Rx_flag==5)//Y軸min
{
data_accz_min=data_xl.mg[2];
Rx_flag=0;
calculate_calibration_params();
}
else if(Rx_flag==6)//Y軸max
{
data_accz_max=data_xl.mg[2];
Rx_flag=0;
calculate_calibration_params();
}
calibrated_x=1000*(data_xl.mg[0]-Offset_x)/Scale_factor_x;
calibrated_y=1000*(data_xl.mg[1]-Offset_y)/Scale_factor_y;
calibrated_z=1000*(data_xl.mg[2]-Offset_z)/Scale_factor_z;
printf("min_x=%4.2f,max_x=%4.2lf,min_y=%4.2f,max_y=%4.2f,min_z=%4.2f,max_z=%4.2frn",
data_accx_min,data_accx_max,data_accy_min,data_accy_max,data_accz_min,data_accz_max);
printf("校準(zhǔn)前acc[mg]:%4.2ft%4.2ft%4.2frn",
data_xl.mg[0], data_xl.mg[1], data_xl.mg[2]);
printf("校準(zhǔn)后acc[mg]:%4.2ft%4.2ft%4.2frn",
calibrated_x, calibrated_y, calibrated_z);
HAL_Delay(10);
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
串口發(fā)送定義
演示
審核編輯 黃宇
-
加速度計(jì)
+關(guān)注
關(guān)注
6文章
700瀏覽量
45891 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
5032瀏覽量
97371 -
stm32cubemx
+關(guān)注
關(guān)注
5文章
283瀏覽量
14791
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論