RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

磁力計LIS2MDL開發(fā)(4)----MotionMC 執(zhí)行磁力計校準(zhǔn)

嵌入式單片機(jī)MCU開發(fā) ? 來源:嵌入式單片機(jī)MCU開發(fā) ? 作者:嵌入式單片機(jī)MCU開 ? 2024-08-26 10:56 ? 次閱讀

概述

磁力計測量結(jié)果容易受到周圍環(huán)境中的硬鐵(Hard Iron)和軟鐵(Soft Iron)效應(yīng)的干擾,從而影響精度。為了解決這一問題,磁力計校準(zhǔn)變得至關(guān)重要。STMicroelectronics提供的MotionMC庫是一個高效的中間件解決方案,專門用于實(shí)時校準(zhǔn)磁力計數(shù)據(jù),以消除這些誤差。
MotionMC庫能夠通過測量不同方向的磁場數(shù)據(jù),自動計算并補(bǔ)償硬鐵和比例因子效應(yīng)。它集成了在嵌入式系統(tǒng)中運(yùn)行的輕量級算法,能夠在系統(tǒng)運(yùn)行期間進(jìn)行動態(tài)校準(zhǔn),確保磁力計的輸出數(shù)據(jù)始終準(zhǔn)確可靠。
在本文中,將介紹如何使用LIS2MDL磁力計與MotionMC庫執(zhí)行磁力計校準(zhǔn)。我們將探討從傳感器初始化、數(shù)據(jù)采集到最終應(yīng)用校準(zhǔn)參數(shù)的整個流程,并提供相應(yīng)的代碼示例,以幫助開發(fā)者更好地集成和利用MotionMC庫提升系統(tǒng)的磁力測量精度。

需要樣片的可以加群申請:615061293 。

視頻教學(xué)

[https://www.bilibili.com/video/BV1PE421A7iu/]

樣品申請

[https://www.wjx.top/vm/OhcKxJk.aspx#]

源碼下載

[https://download.csdn.net/download/qq_24312945/89653033]

硬件準(zhǔn)備

首先需要準(zhǔn)備一個開發(fā)板,這里我準(zhǔn)備的是自己繪制的開發(fā)板,需要的可以進(jìn)行申請。

主控為STM32H503CB,陀螺儀為LSM6DS3TR-C,磁力計為LIS2MDL。

開啟CRC

串口設(shè)置

設(shè)置串口速率為2000000。

開啟X-CUBE-MEMS1

速率選擇

磁力計數(shù)據(jù)最大可以設(shè)置100Hz。

參考程序

這里參考 IKS01A3_MagnetometerCalibration 。

磁力計校準(zhǔn)過程

MotionMC 是一個用于校準(zhǔn)磁力計傳感器的庫。校準(zhǔn)過程旨在消除硬鐵效應(yīng)(由于設(shè)備內(nèi)部或附近的磁性材料引起的誤差)和軟鐵效應(yīng)(由于設(shè)備內(nèi)部或附近的導(dǎo)電材料引起的誤差),從而提高磁力計的精度。

建議在三維空間中緩慢旋轉(zhuǎn)。這個動作的重點(diǎn)在于它不是一個簡單的平面運(yùn)動,而是需要在不同的空間角度進(jìn)行傾斜和旋轉(zhuǎn),以覆蓋盡可能多的三維空間位置。

初始化定義

/* USER CODE BEGIN 2 */
    printf("HELLO!n");
  HAL_GPIO_WritePin(CS1_GPIO_Port, CS1_Pin, GPIO_PIN_SET);
  HAL_GPIO_WritePin(CS2_GPIO_Port, CS2_Pin, GPIO_PIN_SET);
    HAL_Delay(100);


  /* Initialize mems driver interface */
  stmdev_ctx_t dev_ctx;
  dev_ctx.write_reg = platform_write;
  dev_ctx.read_reg = platform_read;
  dev_ctx.mdelay = platform_delay;
  dev_ctx.handle = &SENSOR_BUS;
  /* Initialize platform specific hardware */
//  platform_init();
  /* Wait sensor boot time */
  platform_delay(BOOT_TIME);

  /* Check device ID */
  lis2mdl_device_id_get(&dev_ctx, &whoamI);
    printf("LIS2MDL_ID=0x%x,whoamI=0x%xn",LIS2MDL_ID,whoamI);
  if (whoamI != LIS2MDL_ID)
    while (1) {
      /* manage here device not found */
    }

  /* Restore default configuration */
  lis2mdl_reset_set(&dev_ctx, PROPERTY_ENABLE);

  do {
    lis2mdl_reset_get(&dev_ctx, &rst);
  } while (rst);

  /* Enable Block Data Update */
  lis2mdl_block_data_update_set(&dev_ctx, PROPERTY_ENABLE);
  /* Set Output Data Rate */
  lis2mdl_data_rate_set(&dev_ctx, LIS2MDL_ODR_50Hz);
  /* Set / Reset sensor mode */
  lis2mdl_set_rst_mode_set(&dev_ctx, LIS2MDL_SENS_OFF_CANC_EVERY_ODR);
  /* Enable temperature compensation */
  lis2mdl_offset_temp_comp_set(&dev_ctx, PROPERTY_ENABLE);
  /* Set device in continuous mode */
  lis2mdl_operating_mode_set(&dev_ctx, LIS2MDL_CONTINUOUS_MODE);    


    MX_MEMS_Init();

  /* USER CODE END 2 */

MotionMC文件

主要包含app_mems.c和app_mems.h, 它們提供了一些與MEMS傳感器相關(guān)的初始化、處理和管理函數(shù)。這些文件在磁力計校準(zhǔn)、數(shù)據(jù)處理以及傳感器初始化等方面發(fā)揮著重要作用。
● MX_MEMS_Init(void) 和 MX_MEMS_Process(void):這些函數(shù)用于初始化和處理MEMS傳感器的操作。
● MotionMC_manager_init(int sampletime, unsigned short int enable):初始化MotionMC庫。
● MotionMC_manager_update(MMC_Input_t *data_in):使用新的傳感器數(shù)據(jù)更新MotionMC庫。
● MotionMC_manager_get_params(MMC_Output_t *data_out):獲取校準(zhǔn)后的參數(shù)。
● MotionMC_manager_compensate(MOTION_SENSOR_Axes_t *data_raw, MOTION_SENSOR_Axes_t *data_comp):對傳感器數(shù)據(jù)應(yīng)用校準(zhǔn)補(bǔ)償。

MotionMC_Initialize

MotionMC_manager_init中主要執(zhí)行MotionMC_Initialize,MotionMC_Initialize用途主要初始化MotionMC庫并設(shè)置內(nèi)部機(jī)制。這個函數(shù)在使用磁力計校準(zhǔn)庫之前必須調(diào)用。
參數(shù):
sampletime: 設(shè)置更新函數(shù)調(diào)用之間的時間間隔(以毫秒為單位)。
enable: 啟用(1)或禁用(0)該庫。

MotionMC_manager_get_version

MotionMC_manager_get_version中主要執(zhí)行MotionMC_GetLibVersion,MotionMC_GetLibVersion用途主要是檢索庫的版本信息。
參數(shù):
version: 一個指向字符數(shù)組的指針,用于存儲版本字符串。
返回值: 版本字符串中的字符數(shù)量。

MotionMC_manager_update

MotionMC_manager_update中主要執(zhí)行MotionMC_Update,MotionMC_Update用途主要是運(yùn)行磁力計校準(zhǔn)算法。這個函數(shù)需要周期性地調(diào)用,其周期與初始化函數(shù)中設(shè)置的sampletime參數(shù)相同。
參數(shù):
data_in: 指向包含輸入數(shù)據(jù)的結(jié)構(gòu)體的指針。這個結(jié)構(gòu)體包含了當(dāng)前的磁力計傳感器數(shù)據(jù)和時間戳。

MotionMC_manager_get_params

MotionMC_manager_get_params中主要執(zhí)行MotionMC_GetCalParams,MotionMC_GetCalParams用途主要是獲取磁力計的硬鐵(HI)和比例因子(SF)校準(zhǔn)系數(shù)。
參數(shù):
data_out: 指向包含輸出數(shù)據(jù)的結(jié)構(gòu)體的指針。這個結(jié)構(gòu)體包括了HI偏置、SF矩陣和校準(zhǔn)質(zhì)量因子。

CalQuality = 0:校準(zhǔn)參數(shù)的準(zhǔn)確性未知。
CalQuality = 1:校準(zhǔn)參數(shù)的準(zhǔn)確性較差,不能被信任。
CalQuality = 2:校準(zhǔn)參數(shù)的準(zhǔn)確性尚可。
CalQuality = 3:校準(zhǔn)參數(shù)的準(zhǔn)確性良好。

MotionMC_manager_compensate

MotionMC_manager_compensate 的主要作用是對磁力計數(shù)據(jù)進(jìn)行硬鐵(Hard Iron)和軟鐵(Soft Iron)校準(zhǔn),從而補(bǔ)償磁力計測量中的誤差。

/**
 * @brief  Do hard & soft iron calibration
 * @param  data_raw  Raw magnetometer data [mGauss]
 * @param  data_comp  Calibrated (compensated) data (hard & soft iron calibration) [mGauss]
 * @retval None
 */
void MotionMC_manager_compensate(MOTION_SENSOR_Axes_t *data_raw, MOTION_SENSOR_Axes_t *data_comp)
{
  MMC_Output_t data_out;
  MotionMC_GetCalParams(&data_out);

  float mag_raw_mG[3];
  float mag_comp_mG[3];

  mag_raw_mG[0] = (float)data_raw- >x;
  mag_raw_mG[1] = (float)data_raw- >y;
  mag_raw_mG[2] = (float)data_raw- >z;

  /* Compensate magnetometer data */
  /* NOTE: Convert hard iron coefficients [uT] to [mGauss] */
  for (int i = 0; i < 3; i++)
  {
    mag_comp_mG[i] = 0.0f;
    for (int j = 0; j < 3; j++)
    {
      mag_comp_mG[i] += (mag_raw_mG[j]  -  data_out.HI_Bias[j] * 10.0f)  *  data_out.SF_Matrix[i][j];
    }

    mag_comp_mG[i] += (mag_comp_mG[i] >= 0.0f) ? 0.5f : -0.5f;
  }

  data_comp- >x = (int32_t)mag_comp_mG[0];
  data_comp- >y = (int32_t)mag_comp_mG[1];
  data_comp- >z = (int32_t)mag_comp_mG[2];
}

● 硬鐵效應(yīng):由設(shè)備內(nèi)部或附近的永久磁鐵或磁性材料引起的偏移,會導(dǎo)致測量結(jié)果出現(xiàn)恒定的誤差。
● 軟鐵效應(yīng):由設(shè)備內(nèi)部或附近的導(dǎo)磁材料(如鐵)引起的誤差,會影響測量結(jié)果的方向和幅度。
● 補(bǔ)償計算:
● 對每個軸(X, Y, Z)進(jìn)行硬鐵和軟鐵效應(yīng)的補(bǔ)償計算。計算過程中:
○ 硬鐵效應(yīng)補(bǔ)償:從原始數(shù)據(jù)中減去硬鐵偏置,單位從微特斯拉(uT)轉(zhuǎn)換為毫高斯(mGauss),即乘以10。
○ 軟鐵效應(yīng)補(bǔ)償:通過乘以校正矩陣 SF_Matrix,對軟鐵效應(yīng)進(jìn)行補(bǔ)償。
● 結(jié)果修正和輸出:
● 補(bǔ)償后的磁力計數(shù)據(jù) mag_comp_mG 進(jìn)行四舍五入,然后轉(zhuǎn)換為整數(shù)并存儲到 data_comp 中。

主程序執(zhí)行流程

/* 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]);
            MX_MEMS_Process();


//      printf("Magnetic field [mG]:%4.2ft%4.2ft%4.2frn",
//              magnetic_mG[0], magnetic_mG[1], magnetic_mG[2]);
//      /* Read temperature data */
//      memset(&data_raw_temperature, 0x00, sizeof(int16_t));
//      lis2mdl_temperature_raw_get(&dev_ctx, &data_raw_temperature);
//      temperature_degC = lis2mdl_from_lsb_to_celsius(data_raw_temperature);
//      printf("Temperature [degC]:%6.2frn",
//              temperature_degC);
    }        


    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */

演示

未校準(zhǔn)成功時未0。

校準(zhǔn)成功時為3。

指向北數(shù)據(jù)。

指向南數(shù)據(jù)。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 傳感器
    +關(guān)注

    關(guān)注

    2550

    文章

    51035

    瀏覽量

    753063
  • 嵌入式系統(tǒng)
    +關(guān)注

    關(guān)注

    41

    文章

    3587

    瀏覽量

    129433
  • 磁力計
    +關(guān)注

    關(guān)注

    1

    文章

    71

    瀏覽量

    20851
收藏 人收藏

    評論

    相關(guān)推薦

    e2studio開發(fā)磁力計LIS2MDL(1)----輪詢獲取磁力計數(shù)據(jù)

    本文將介紹如何使用 LIS2MDL 傳感器來讀取數(shù)據(jù)。主要步驟包括初始化傳感器接口、驗證設(shè)備ID、配置傳感器的數(shù)據(jù)輸出率和濾波器,以及通過輪詢方式持續(xù)讀取磁力數(shù)據(jù)和溫度數(shù)據(jù)。讀取到的數(shù)據(jù)會被轉(zhuǎn)換
    的頭像 發(fā)表于 08-09 15:14 ?1805次閱讀
    e<b class='flag-5'>2</b>studio<b class='flag-5'>開發(fā)</b><b class='flag-5'>磁力計</b><b class='flag-5'>LIS2MDL</b>(1)----輪詢獲取<b class='flag-5'>磁力計</b>數(shù)據(jù)

    磁力計LIS2MDL開發(fā)(1)----輪詢獲取磁力計數(shù)據(jù)

    本文將介紹如何使用 LIS2MDL 傳感器來讀取數(shù)據(jù)。主要步驟包括初始化傳感器接口、驗證設(shè)備ID、配置傳感器的數(shù)據(jù)輸出率和濾波器,以及通過輪詢方式持續(xù)讀取磁力數(shù)據(jù)和溫度數(shù)據(jù)。讀取到的數(shù)據(jù)會被轉(zhuǎn)換為適當(dāng)?shù)膯挝徊⑼ㄟ^串行通信輸出。
    的頭像 發(fā)表于 12-18 10:56 ?1458次閱讀
    <b class='flag-5'>磁力計</b><b class='flag-5'>LIS2MDL</b><b class='flag-5'>開發(fā)</b>(1)----輪詢獲取<b class='flag-5'>磁力計</b>數(shù)據(jù)

    磁力計LIS2MDL開發(fā)(2)----電子羅盤

    本文將介紹如何使用 LIS2MDL 傳感器來讀取數(shù)據(jù)來轉(zhuǎn)化為指南針。
    的頭像 發(fā)表于 12-18 11:01 ?1355次閱讀
    <b class='flag-5'>磁力計</b><b class='flag-5'>LIS2MDL</b><b class='flag-5'>開發(fā)</b>(<b class='flag-5'>2</b>)----電子羅盤

    e2studio開發(fā)磁力計LIS2MDL(1)----輪詢獲取磁力計數(shù)據(jù)

    本文將介紹如何使用 LIS2MDL 傳感器來讀取數(shù)據(jù)。主要步驟包括初始化傳感器接口、驗證設(shè)備ID、配置傳感器的數(shù)據(jù)輸出率和濾波器,以及通過輪詢方式持續(xù)讀取磁力數(shù)據(jù)和溫度數(shù)據(jù)。讀取到的數(shù)據(jù)會被轉(zhuǎn)換
    的頭像 發(fā)表于 05-16 16:54 ?1212次閱讀
    e<b class='flag-5'>2</b>studio<b class='flag-5'>開發(fā)</b><b class='flag-5'>磁力計</b><b class='flag-5'>LIS2MDL</b>(1)----輪詢獲取<b class='flag-5'>磁力計</b>數(shù)據(jù)

    MotionEC和MotionMC的庫在磁力計校準(zhǔn)后為什么不調(diào)用MotionMC_SaveCalInNVM函數(shù)?

    MotionEC和MotionMC的庫在磁力計校準(zhǔn)后為啥不調(diào)用MotionMC_SaveCalInNVM這個函數(shù)
    發(fā)表于 04-02 08:05

    磁力計

    磁力計最新資料,全心奉獻(xiàn)
    發(fā)表于 09-01 18:16

    如何在LIS3MDL磁力計傳感器中禁用DRDY和INT輸出

    你好,如何在LIS3MDL磁力計傳感器中禁用DRDY和INT輸出。 #lis3mdl以上來自于谷歌翻譯以下為原文 Hello,How to disable DRDY and INT outputs in
    發(fā)表于 04-17 14:17

    LIS3MDL三軸磁力計能滿足磁通密度為0.23高斯的應(yīng)用程序嗎

    我正在研究在具有高頻振蕩磁場的應(yīng)用中使用 LIS3MDL 3 軸磁力計。我查看了 LIS3MDL 的數(shù)據(jù)表,它似乎滿足我檢查過的大多數(shù)要求。我的應(yīng)用程序的磁通密度為 0.23 高斯,處于磁力計
    發(fā)表于 12-14 08:31

    用于生成每個輸出樣本的樣本數(shù)量而言LIS3mdl磁力計的操作模式有何不同?

    就用于生成每個輸出樣本的樣本數(shù)量而言,LIS3mdl 磁力計的操作模式有何不同?例如,我發(fā)現(xiàn)在 ISM303DAC 中,用于生成的樣本數(shù)輸出樣本在低功耗模式下比在低功耗模式下使用的數(shù)量少四倍高分辨率
    發(fā)表于 01-06 07:31

    LIS2MDL軸標(biāo)簽是否指示正軸方向?

    LIS2MDL 數(shù)據(jù)表的圖 2 顯示了磁力計軸方向的下圖。但是,完全不清楚它們是否標(biāo)記了軸的正方向。如果他們確實(shí)用 X/Y/Z 標(biāo)簽標(biāo)記了正方向,它就會有一個左手方向(違反所有慣例)。軸標(biāo)簽是否指示正軸方向?這是左手坐標(biāo)系嗎?
    發(fā)表于 01-09 08:56

    STLIS2MDL磁力計傳感器相關(guān)的使用信息和應(yīng)用提示

    LIS2MDL是系統(tǒng)級封裝的3D數(shù)字磁力計,具有數(shù)字I2C和3線SPI串口標(biāo)準(zhǔn)輸出,在高分辨率模式下功耗200 μA,在低功耗模式下功耗不超過50 μA(在20 Hz輸出數(shù)據(jù)速率下)。由于磁力計具有超低噪聲性能,始終具有低功耗特
    發(fā)表于 09-06 08:24

    LIS2MDL磁力計傳感器相關(guān)資料

    LIS2MDL進(jìn)行配置,使其產(chǎn)生用于磁場檢測的中斷信號,并自動補(bǔ)償由較高應(yīng)用層提供的硬鐵偏移。LIS2MDL的ST軟件支持包括驅(qū)動、傾斜補(bǔ)償?shù)碾娮恿_盤、動態(tài)磁力計校準(zhǔn)和6軸或9軸傳感
    發(fā)表于 09-13 07:48

    怎樣隨時重新校準(zhǔn)磁力計

     在校準(zhǔn)中使用的45度傾斜沒有什么特別之處,但是它確實(shí)大大簡化了數(shù)學(xué)運(yùn)算。原則上,您可以將設(shè)備繞垂直方向滾動,連續(xù)獲取來自加速度磁力計的讀數(shù),并計算偏移量,直到計算出的平均值穩(wěn)定在一個可靠的結(jié)果附近,但數(shù)學(xué)會復(fù)雜得多。 iO
    的頭像 發(fā)表于 10-23 11:34 ?7780次閱讀

    LIS2MDL 3D數(shù)字磁力計應(yīng)用筆記

    電子發(fā)燒友網(wǎng)站提供《LIS2MDL 3D數(shù)字磁力計應(yīng)用筆記.pdf》資料免費(fèi)下載
    發(fā)表于 07-31 10:12 ?5次下載
    <b class='flag-5'>LIS2MDL</b> 3D數(shù)字<b class='flag-5'>磁力計</b>應(yīng)用筆記

    MEMS_慣性傳感器16-磁力計橢球擬合校準(zhǔn)步驟

    磁力計橢球擬合校準(zhǔn)是一種將磁力計測量數(shù)據(jù)校準(zhǔn)到真實(shí)磁場的技術(shù)。這種技術(shù)通常使用橢球模型來擬合磁力計的測量結(jié)果,然后通過最小二乘法來找到擬合參
    發(fā)表于 10-15 15:49 ?2381次閱讀
    MEMS_慣性傳感器16-<b class='flag-5'>磁力計</b>橢球擬合<b class='flag-5'>校準(zhǔn)</b>步驟
    RM新时代网站-首页