精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

磁力計LIS2MDL開發(4)----MotionMC 執行磁力計校準

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

概述

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

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

視頻教學

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

樣品申請

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

源碼下載

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

硬件準備

首先需要準備一個開發板,這里我準備的是自己繪制的開發板,需要的可以進行申請。

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

開啟CRC

串口設置

設置串口速率為2000000。

開啟X-CUBE-MEMS1

速率選擇

磁力計數據最大可以設置100Hz。

參考程序

這里參考 IKS01A3_MagnetometerCalibration 。

磁力計校準過程

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

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

初始化定義

/* 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傳感器相關的初始化、處理和管理函數。這些文件在磁力計校準、數據處理以及傳感器初始化等方面發揮著重要作用。
● MX_MEMS_Init(void) 和 MX_MEMS_Process(void):這些函數用于初始化和處理MEMS傳感器的操作。
● MotionMC_manager_init(int sampletime, unsigned short int enable):初始化MotionMC庫。
● MotionMC_manager_update(MMC_Input_t *data_in):使用新的傳感器數據更新MotionMC庫。
● MotionMC_manager_get_params(MMC_Output_t *data_out):獲取校準后的參數。
● MotionMC_manager_compensate(MOTION_SENSOR_Axes_t *data_raw, MOTION_SENSOR_Axes_t *data_comp):對傳感器數據應用校準補償。

MotionMC_Initialize

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

MotionMC_manager_get_version

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

MotionMC_manager_update

MotionMC_manager_update中主要執行MotionMC_Update,MotionMC_Update用途主要是運行磁力計校準算法。這個函數需要周期性地調用,其周期與初始化函數中設置的sampletime參數相同。
參數:
data_in: 指向包含輸入數據的結構體的指針。這個結構體包含了當前的磁力計傳感器數據和時間戳。

MotionMC_manager_get_params

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

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

MotionMC_manager_compensate

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

/**
 * @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];
}

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

主程序執行流程

/* 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 */

演示

未校準成功時未0。

校準成功時為3。

指向北數據。

指向南數據。

審核編輯 黃宇

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 傳感器
    +關注

    關注

    2548

    文章

    50740

    瀏覽量

    752137
  • 嵌入式系統
    +關注

    關注

    41

    文章

    3570

    瀏覽量

    129251
  • 磁力計
    +關注

    關注

    1

    文章

    71

    瀏覽量

    20841
收藏 人收藏

    評論

    相關推薦

    e2studio開發磁力計LIS2MDL(1)----輪詢獲取磁力計數據

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

    磁力計LIS2MDL開發(1)----輪詢獲取磁力計數據

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

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

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

    e2studio開發磁力計LIS2MDL(1)----輪詢獲取磁力計數據

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

    MotionEC和MotionMC的庫在磁力計校準后為什么不調用MotionMC_SaveCalInNVM函數?

    MotionEC和MotionMC的庫在磁力計校準后為啥不調用MotionMC_SaveCalInNVM這個函數
    發表于 04-02 08:05

    磁力計

    磁力計最新資料,全心奉獻
    發表于 09-01 18:16

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

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

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

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

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

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

    LIS2MDL軸標簽是否指示正軸方向?

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

    STLIS2MDL磁力計傳感器相關的使用信息和應用提示

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

    LIS2MDL磁力計傳感器相關資料

    LIS2MDL進行配置,使其產生用于磁場檢測的中斷信號,并自動補償由較高應用層提供的硬鐵偏移。LIS2MDL的ST軟件支持包括驅動、傾斜補償的電子羅盤、動態磁力計校準和6軸或9軸傳感
    發表于 09-13 07:48

    怎樣隨時重新校準磁力計

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

    LIS2MDL 3D數字磁力計應用筆記

    電子發燒友網站提供《LIS2MDL 3D數字磁力計應用筆記.pdf》資料免費下載
    發表于 07-31 10:12 ?5次下載
    <b class='flag-5'>LIS2MDL</b> 3D數字<b class='flag-5'>磁力計</b>應用筆記

    MEMS_慣性傳感器16-磁力計橢球擬合校準步驟

    磁力計橢球擬合校準是一種將磁力計測量數據校準到真實磁場的技術。這種技術通常使用橢球模型來擬合磁力計的測量結果,然后通過最小二乘法來找到擬合參
    發表于 10-15 15:49 ?2243次閱讀
    MEMS_慣性傳感器16-<b class='flag-5'>磁力計</b>橢球擬合<b class='flag-5'>校準</b>步驟