国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

3天內不再提示

驅動LSM6DS3TR-C實現高效運動檢測與數據采集(11)----磁力計校準

嵌入式單片機MCU開發 ? 來源:嵌入式單片機MCU開發 ? 作者:嵌入式單片機MCU開 ? 2024-08-23 09:57 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

概述

磁力計校準是確保傳感器數據準確性和可靠性的關鍵步驟。磁力計用于測量地球磁場,并在導航、定位、姿態測量等應用中起到重要作用。然而,磁力計在使用過程中會受到環境磁場、硬件偏差、安裝誤差等因素的影響,從而導致測量數據出現偏差。因此,校準磁力計以消除這些影響,是獲得精確測量數據的必要步驟。

本文將介紹如何使用ST提供的MotionFX庫在嵌入式系統中實現磁力計校準, 通過本文的介紹,讀者將能夠理解磁力計校準的基本概念,掌握使用MotionFX庫進行校準的步驟和方法,并學會如何在實際項目中實現磁力計的校準,以獲得高精度的磁場測量數據。

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

視頻教學

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

樣品申請

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

源碼下載

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

硬件準備

首先需要準備一個開發板,這里我準備的是自己繪制的開發板,需要的可以進行申請。
主控為STM32H503CB,陀螺儀為LSM6DS3TR-C,磁力計為LIS2MDL。

DataLogFusion

這里參考ST提供的DataLogFusion程序,DataLogFusion示例應用展示了如何使用STMicroelectronics開發的MotionFX中間件庫進行實時運動傳感器數據融合。

DataLogFusion的主要執行流程包括初始化硬件和傳感器、中間件庫(MotionFX)的配置與初始化、傳感器數據的采集、實時數據融合以及結果的輸出。

磁力計校準過程

MotionFX庫的磁力計校準庫用于補償硬鐵失真。磁力計校準可以以比傳感器融合輸出數據速率更慢的頻率進行(例如25 Hz)。
● 初始化磁力計校準庫:
● 調用 MotionFX_MagCal_init 或 MotionFX_CM0P_MagCal_init 函數。
● 定期調用校準函數:
● 調用 MotionFX_MagCal_run 或 MotionFX_CM0P_MagCal_run 函數,直到校準成功完成。
● 檢查校準是否成功:
● 調用 MotionFX_MagCal_getParams 或 MotionFX_CM0P_MagCal_getParams 函數。如果函數返回 mag_data_out.cal_quality = MFX_MAGCALGOOD 或 MFX_CM0P_CALQSTATUSBEST,則校準成功。

在app_mems.c中的Magneto_Sensor_Handler函數負責處理磁力計(磁傳感器)數據的獲取、校準和發送。該函數的主要功能是從磁力計傳感器獲取數據,進行必要的校準,然后將處理后的數據傳輸給其他部分使用。具體包括以下步驟:

  1. 檢查傳感器是否啟用:函數首先檢查是否啟用了磁力計傳感器。如果傳感器未啟用,則函數不會執行進一步操作。
  2. 獲取磁力計數據:
    ○ 如果使用離線數據(即在調試或仿真模式下),函數會從預定義的離線數據數組中讀取磁力計數據。
    ○ 如果使用實時數據,函數會通過調用BSP_SENSOR_MAG_GetAxes函數從實際的磁力計傳感器中讀取當前的磁力計數據。
  3. 執行磁力計校準:
    ○ 函數檢查磁力計是否已經校準。如果尚未校準,則會進行校準過程。
    ○ 將獲取的磁力計數據轉換為適當的單位,并準備校準輸入數據。
    ○ 調用MotionFX_manager_MagCal_run函數運行校準算法
    ○ 如果校準結果良好(校準質量達到標準),函數會保存校準偏移值,并停止進一步的校準。
  4. 應用校準偏移:將校準偏移應用到磁力計讀數中,以補償硬件偏差和環境干擾。
  5. 序列化并發送數據:將校準后的磁力計數據序列化,并存儲到消息結構(Msg)中,以供系統其他部分使用。

MotionFX_manager_MagCal_run函數用于運行磁力計校準算法。該函數接受磁力計輸入數據,調用MotionFX庫中的校準算法對數據進行處理,并返回校準結果。
MotionFX_MagCal_run函數執行校準算法,對輸入數據進行處理,計算出校準所需的參數。
MotionFX_MagCal_getParams函數從校準算法中獲取校準后的參數,并存儲在輸出數據結構data_out中。這些參數包括磁力計的偏移和標度因子等校準信息。

MotionFX_MagCal_getParams

MotionFX_MagCal_getParams函數用于獲取磁力計的校準參數。這些參數包括校準后的硬鐵偏移量和校準質量指標。該函數通過傳入一個指向輸出數據結構的指針,返回校準結果的詳細信息。

調用MotionFX_MagCal_getParams函數后,可以通過檢查data_out結構體中的參數來評估校準結果的質量,并應用偏移量來調整磁力計數據。
cal_quality:校準質量因子,指示校準結果的準確性。具體值包括:
MFX_MAGCALUNKNOWN = 0:校準參數的準確性未知。
MFX_MAGCALPOOR = 1:校準參數的準確性較差,不能被信任。
MFX_MAGCALOK = 2:校準參數的準確性尚可。
MFX_MAGCALGOOD = 3:校準參數的準確性良好。

校準移植

在main.c中添加變量定義。

/* USER CODE BEGIN 0 */
float MagOffset[3]={0.0f,0.0f,0.0f};//磁力計偏差
int Mag_TimeStamp,Mag_TimeStamp_1,Mag_TimeStamp_2;//磁力計時間戳

uint8_t Mag_flag=0;
/* USER CODE END 0 */

磁力計數據官方文檔推薦20/40HZ。

在mian.c中添加磁力計校準執行函數這里陀螺儀數據為416Hz,單次循環執行10次,所以讓磁力計在單次循環中只執行一次,頻率則為40Hz左右。

/* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {

    if(fifo_flag)
    {
        for(int i=0;i< fifo_num;i++)// 遍歷 FIFO 數據數組
        {    

            int16_t gyr;                
            gyr=(gyr_fifo[i][1]< 
            gyr_x =lsm6ds3tr_c_from_fs2000dps_to_mdps(gyr);
            gyr=(gyr_fifo[i][3]< 
            gyr_y =lsm6ds3tr_c_from_fs2000dps_to_mdps(gyr);
            gyr=(gyr_fifo[i][5]< 
            gyr_z =lsm6ds3tr_c_from_fs2000dps_to_mdps(gyr);
//            printf(
//                            "gyr_x:%4.2ft%4.2ft%4.2frn",
//                            gyr_x, gyr_y, gyr_z);            
            int16_t acc;
            acc=(acc_fifo[i][1]< 
            acc_x =lsm6ds3tr_c_from_fs4g_to_mg(acc);
            acc=(acc_fifo[i][3]< 
            acc_y =lsm6ds3tr_c_from_fs4g_to_mg(acc);
            acc=(acc_fifo[i][5]< 
            acc_z =lsm6ds3tr_c_from_fs4g_to_mg(acc);

//            printf(
//                            "acc_x:%4.2ft%4.2ft%4.2frn",
//                            acc_x, acc_y, acc_z);    

         /* 讀取時間戳數據 */
            uint32_t timestamp=0;
            timestamp=(timestamp_fifo[i][1]< 
                |(timestamp_fifo[i][3]);

            if(i==0)
                Mag_flag=1;        
            if(deltatime_first==0)//第一次
                {
                    deltatime_1=timestamp;
                    deltatime_2=deltatime_1;
                    deltatime_first=1;
                    Mag_TimeStamp_1=timestamp;
                    Mag_TimeStamp_2=timestamp;  
                }
                else
                {
                    deltatime_2=timestamp;
                    Mag_TimeStamp_2=timestamp;
                }
      memset(data_raw_magnetic, 0x00, 3 * sizeof(int16_t));
      lis2mdl_magnetic_raw_get(&lis2mdl_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]);
            if(Mag_flag)
            {
                Mag_TimeStamp=Mag_TimeStamp_2-Mag_TimeStamp_1;
                if(Mag_TimeStamp_2 >Mag_TimeStamp_1)
                    Mag_TimeStamp=(int)((Mag_TimeStamp_2-Mag_TimeStamp_1)*25.0f/1000);
                else if(Mag_TimeStamp_1 >Mag_TimeStamp_2)
                    Mag_TimeStamp=(int)((0xffffffff-Mag_TimeStamp_2+Mag_TimeStamp_1)*25.0f/1000);
                else if(Mag_TimeStamp_1==Mag_TimeStamp_2)
                    Mag_TimeStamp=0;
                Magneto_Sensor_Handler();
                Mag_TimeStamp_1=Mag_TimeStamp_2;
                Mag_flag=0;
            }    
            magnetic_mG[0] = magnetic_mG[0]-MagOffset[0];
            magnetic_mG[1] = magnetic_mG[1]-MagOffset[1];
            magnetic_mG[2] = magnetic_mG[2]-MagOffset[2];    

                    lsm6ds3tr_c_motion_fx_determin();    
                deltatime_1=deltatime_2;

            }
            fifo_flag=0;                
        }

    /* USER CODE END WHILE */

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

在app.h中添加磁力計校準函數定義。

#define FROM_UT50_TO_MGAUSS  500.0f
void Magneto_Sensor_Handler(void);

在app.c中添加磁力計校準函數。

typedef struct
{
  uint8_t hours;
  uint8_t minutes;
  uint8_t seconds;
  uint8_t subsec;
  float pressure;
  float humidity;
  float temperature;
  int32_t acceleration_x_mg;
  int32_t acceleration_y_mg;
  int32_t acceleration_z_mg;
  int32_t angular_rate_x_mdps;
  int32_t angular_rate_y_mdps;
  int32_t angular_rate_z_mdps;
  int32_t magnetic_field_x_mgauss;
  int32_t magnetic_field_y_mgauss;
  int32_t magnetic_field_z_mgauss;
} offline_data_t;

#define OFFLINE_DATA_SIZE  8
uint8_t UseOfflineData = 0;
uint8_t MagCalStatus = 0;
offline_data_t OfflineData[OFFLINE_DATA_SIZE];
extern float MagOffset[3];
extern float magnetic_mG[3];
extern int Mag_TimeStamp;
/**
  * @brief  Handles the MAG axes data getting/sending
  * @param  Msg the MAG part of the stream
  * @retval None
  */
void Magneto_Sensor_Handler(void)
{
  float ans_float;
  MFX_MagCal_input_t mag_data_in;
  MFX_MagCal_output_t mag_data_out;


        mag_data_in.mag[0] = (float)magnetic_mG[0] * FROM_MGAUSS_TO_UT50;
        mag_data_in.mag[1] = (float)magnetic_mG[1] * FROM_MGAUSS_TO_UT50;
        mag_data_in.mag[2] = (float)magnetic_mG[2] * FROM_MGAUSS_TO_UT50;

        mag_data_in.time_stamp = (int)Mag_TimeStamp;
//        Mag_TimeStamp += (uint32_t)ALGO_PERIOD;


        MotionFX_MagCal_run(&mag_data_in);
        MotionFX_MagCal_getParams(&mag_data_out);
        printf("mag_data_out=%d,MFX_MAGCALGOOD=%dn",mag_data_out.cal_quality,MFX_MAGCALGOOD);
        if (mag_data_out.cal_quality == MFX_MAGCALGOOD)
        {

//            MagCalStatus = 1;

            ans_float = (mag_data_out.hi_bias[0] * FROM_UT50_TO_MGAUSS);
            MagOffset[0] = (int32_t)ans_float;
            ans_float = (mag_data_out.hi_bias[1] * FROM_UT50_TO_MGAUSS);
            MagOffset[1] = (int32_t)ans_float;
            ans_float = (mag_data_out.hi_bias[2] * FROM_UT50_TO_MGAUSS);
            MagOffset[2] = (int32_t)ans_float;

//          /* Disable magnetometer calibration */
//          MotionFX_manager_MagCal_stop(ALGO_PERIOD);
        }

}

演示

未校準成功時未0。

校準成功時為3。

審核編輯 黃宇

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

    關注

    2576

    文章

    55028

    瀏覽量

    791239
  • 驅動
    +關注

    關注

    12

    文章

    1954

    瀏覽量

    88522
  • 數據采集
    +關注

    關注

    41

    文章

    8037

    瀏覽量

    120877
  • 運動檢測
    +關注

    關注

    0

    文章

    40

    瀏覽量

    12839
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    靜態定向之謎:為什么高端GNSS設備都離不開這個小小的磁力計

    系統的固有缺陷:它可以告訴你“在哪里”,卻無法在靜止時告訴你“朝向哪里”。這正是磁力計在GNSS接收器中不可或缺的原因。二、毫米級“電子羅盤”:磁力計如何解決導航的
    的頭像 發表于 01-23 12:02 ?542次閱讀
    靜態定向之謎:為什么高端GNSS設備都離不開這個小小的<b class='flag-5'>磁力計</b>?

    使用K-means算法進行異常偵測

    3D 磁力計(LIS2MDL) ※ 3D 加速度/陀螺儀(LSM6DS3TR) 圖 1. AT32-EdgeAI-Sensor-
    發表于 01-16 14:09

    LSM6DSV iNEMO?慣性模塊:為下一代智能設備提供高性能運動感知

    的配置、濾波和處理功能。LSM6DSV在高性能模式下提升性能(0.65mA時),具有不間斷低功耗特性,實現最佳的消費者運動體驗。該器件嵌入了高級專用功能,例如有限狀態機和數據濾波,用于
    的頭像 發表于 10-28 11:25 ?696次閱讀
    <b class='flag-5'>LSM6</b>DSV iNEMO?慣性模塊:為下一代智能設備提供高性能<b class='flag-5'>運動</b>感知

    LSM6DSV16B:面向TWS與可穿戴設備的6軸IMU,融合傳感與低功耗智能

    于提供精確的加速度和角速度感測數據處理。 LSM6DSV16B具有專用于運動跟蹤、設備電源管理、游戲3D頭部跟蹤和增強音頻體驗的雙通道,提供無與倫比的多用性和功能。該器件還具有單獨通
    的頭像 發表于 10-25 14:28 ?1127次閱讀
    <b class='flag-5'>LSM6</b>DSV16B:面向TWS與可穿戴設備的<b class='flag-5'>6</b>軸IMU,融合傳感與低功耗智能

    MEMS加速度:小身材里藏著怎樣的&amp;quot;運動感知&amp;quot;大能量?

    優勢,正廣泛應用于振動檢測、姿態控制、安全報警領域。當它與陀螺儀、磁力計結合成慣性測量單元(IMU)時,更構成了智能系統的“神經末梢”,讓設備感知世界如虎添翼。
    的頭像 發表于 10-21 15:00 ?318次閱讀
    MEMS加速度<b class='flag-5'>計</b>:小身材里藏著怎樣的&amp;quot;<b class='flag-5'>運動</b>感知&amp;quot;大能量?

    LSM6DSV320X:面向高端應用的智能6軸慣性測量單元

    。STMicroelectronics IMU設計用于提供精確的運動檢測和傳感器融合功能,因此非常適合用于汽車碰撞檢測運動監控和物聯網 (IoT) 設備。LSM6DSV320X采用四
    的頭像 發表于 10-21 14:34 ?712次閱讀
    <b class='flag-5'>LSM6</b>DSV320X:面向高端應用的智能<b class='flag-5'>6</b>軸慣性測量單元

    淺談HMC5883L和QMC5883P磁力計的區別及STM32F103驅動

    HMC5883L和QMC5883P是兩款硬件兼容但軟件不兼容的磁力計芯片,主要區別在于寄存器地址、設備地址和磁場方向定義。本文提供了HMC5883L的初始化代碼和寄存器配置說明,包括采樣率、量程設置
    的頭像 發表于 08-30 10:10 ?6844次閱讀
    淺談HMC5883L和QMC5883P<b class='flag-5'>磁力計</b>的區別及STM32F103<b class='flag-5'>驅動</b>

    實時、高效,解鎖氣象數據采集新速度——氣象數據采集

    在氣象監測的宏大版圖中,氣象數據采集器宛如一顆精準跳動的心臟,為整個氣象研究與應用體系輸送著至關重要的“血液”——氣象數據。它以實時、高效的特性,解鎖了氣象數據采集的新速度,為氣象監測
    的頭像 發表于 08-22 17:27 ?753次閱讀

    需要將lsm6ds3tr-c傳感器集成到展銳平臺android系統,請問有示例文檔嗎?

    您好,我現在需要將lsm6ds3tr-c傳感器集成到展銳平臺android系統,請問有示例文檔嗎
    發表于 06-18 08:28

    LSM6DS3TRC FIFO模式,長時間運行\"卡死\"有人遇到過嗎

    問題嗎?剛開始是正常運行的,但是可能過幾個小時后就會出現這個問題,導致用中斷喚醒不了我的mcu了 附帶我的初始化 Lsm6ds3_SoftwareReset(); // 加速度26HZ, 2g量程
    發表于 06-08 15:08

    labview數據采集同步性及獲取時間問題

    請問在labview中進行數據采集,為保證不同設備之間采集數據的同步性,準備利用PPS進行觸發開始任務,利用DAQmx設備內部時鐘源來設置數據采集的一些參數,但是為了防止pps信號的缺失,準備能夠周期性的利用pps對內部晶振進行
    發表于 04-27 10:54

    labview進行的數據采集

    請問在labview中進行數據采集,為保證不同設備之間采集數據的同步性,準備利用PPS進行觸發開始任務,利用DAQmx設備內部時鐘源來設置數據采集的一些參數,但是為了防止pps信號的缺失,準備能夠周期性的利用pps對內部晶振進行
    發表于 04-27 10:19

    LSM6DS3TR-C長時間讀取后角速度輸出為0是怎么回事?

    LSM6DS3TR-C 長時間讀取后角速度輸出為0
    發表于 03-14 07:42

    使用iic對mpu9250進行讀取數據,讀取磁力計數據時采用的是主控iic方式,但是讀取的速度特別慢,為什么?

    使用iic對mpu9250進行讀取數據,讀取磁力計數據時采用的是主控iic方式,但是讀取的速度特別慢,幾秒一次,網上說磁力計數據輸出的速率最快是100hz,幾秒一次也太慢了;另外在初始化函數中開啟了延時,但是一次讀取
    發表于 03-14 07:40

    LSM6DS3TRC讀取加速度數據不對是哪里的問題?

    LSM6DS3TRC初始化后,讀取加速度(理論應是 0,0,1000),得出的加速度慢慢上升變化,讀取幾十個(每次讀取都是判斷XDLA位是否為1)后的加速度值才是正確的。這個什么原因?如附圖是慢慢變化上升的加速度(只打印了Z軸的)。
    發表于 03-13 06:10