零知開源——STM32F103RBT6驅動 ICM20948 九軸傳感器及 vofa + 上位機可視化教程

STM32F1

????????本教程使用零知標準板(STM32F103RBT6)通過I2C驅動ICM20948九軸傳感器,實現姿態解算,并通過串口將數據實時發送至VOFA+上位機進行3D可視化。代碼基于開源庫修改優化,適合嵌入式及物聯網開發者。在基礎驅動上新增濾波參數優化,重點解決yaw值漂移問題,提供完整的參數調優方案和效果對比。

目錄

STM32F1

一、硬件準備

二、軟件環境搭建

三、核心代碼實現

四、VOFA+上位機配置

五、濾波參數優化與動態效果對比

六、效果演示

七、?效果驗證與結論


一、硬件準備

1.硬件清單

  • 零知標準板(主控STM32F103RBT6)

  • ICM20948九軸傳感器模塊

  • USB轉串口模塊(用于調試和數據傳輸)

  • 杜邦線若干

2.接線方式

ICM20948引腳零知開發板引腳
VCC3.3V
GNDGND
SDAA4
SCLA5
硬件連接圖

連接實物圖?

注意:確保I2C引腳正確,避免接反導致芯片損壞。

二、軟件環境搭建

開發環境

  • 零知 IDE + 零知開發板支持包

  • 所需庫文件:

? ? ? AHRSAlgorithms.cpp(姿態解算庫)

? ? ? ICM20948.cpp(傳感器驅動庫)

庫文件關鍵功能

  • AHRSAlgorithms.cpp

????????????????Madgwick/Mahony濾波算法

????????????????四元數實時輸出?getQ()

????????????????參數可調:KpKibeta

  • ICM20948.cpp

????????????????I2C通信底層驅動

????????????????自動量程配置(加速度計±2/4/8/16g,陀螺儀±250/500/1000/2000dps)

????????????????磁力計初始化?initAK09916()

????????????????校準函數?calibrateICM20948()

三、核心代碼實現

主程序框架?

(ICM20948_VOFA.ino)

/* ICM20948完整優化代碼 */
#include "AHRSAlgorithms.h"
#include "ICM20948.h"#define AHRS true
#define SerialDebug true int myLed = LED_BUILTIN;  
ICM20948 myIMU;void setup() {pinMode(myLed, OUTPUT);digitalWrite(myLed, HIGH);Serial.begin(115200);Wire.begin();// 初始化與自檢if(myIMU.begin()) {Serial.println("ICM20948初始化成功");// 執行兩級校準myIMU.calibrateICM20948(myIMU.gyroBias, myIMU.accelBias);float magBias[3], magScale[3];myIMU.magCalICM20948(magBias, magScale);// 設置優化分辨率myIMU.getAres(); myIMU.getGres();myIMU.getMres();} else {Serial.println("傳感器初始化失敗!");while(1);}
}void loop() {// 數據讀取if (myIMU.readByte(ICM20948_ADDRESS, INT_STATUS_1) & 0x01) {myIMU.readAccelData(myIMU.accelCount);myIMU.readGyroData(myIMU.gyroCount);myIMU.readMagData(myIMU.magCount);// 單位轉換myIMU.ax = (float)myIMU.accelCount[0] * myIMU.aRes;myIMU.ay = (float)myIMU.accelCount[1] * myIMU.aRes;myIMU.az = (float)myIMU.accelCount[2] * myIMU.aRes;myIMU.gx = (float)myIMU.gyroCount[0] * myIMU.gRes;myIMU.gy = (float)myIMU.gyroCount[1] * myIMU.gRes;myIMU.gz = (float)myIMU.gyroCount[2] * myIMU.gRes;myIMU.mx = (float)myIMU.magCount[0] * myIMU.mRes - myIMU.magBias[0];myIMU.my = (float)myIMU.magCount[1] * myIMU.mRes - myIMU.magBias[1];myIMU.mz = (float)myIMU.magCount[2] * myIMU.mRes - myIMU.magBias[2];}// 更新時間基準myIMU.updateTime();// 姿態解算(使用優化參數)MahonyQuaternionUpdate(myIMU.ax, myIMU.ay, myIMU.az,myIMU.gx * DEG_TO_RAD, myIMU.gy * DEG_TO_RAD,myIMU.gz * DEG_TO_RAD,myIMU.my, myIMU.mx, myIMU.mz, // 軸序修正myIMU.deltat);// 轉換為歐拉角const float* q = getQ();myIMU.yaw   = atan2(2.0f*(q[1]*q[2] + q[0]*q[3]), q[0]*q[0] + q[1]*q[1] - q[2]*q[2] - q[3]*q[3]) * RAD_TO_DEG;myIMU.pitch = -asin(2.0f*(q[1]*q[3] - q[0]*q[2])) * RAD_TO_DEG;myIMU.roll  = atan2(2.0f*(q[0]*q[1] + q[2]*q[3]),q[0]*q[0] - q[1]*q[1] - q[2]*q[2] + q[3]*q[3]) * RAD_TO_DEG;// 發送到VOFA+Serial.print(myIMU.yaw, 1);   // yawSerial.print(",");Serial.print(myIMU.pitch, 1); // pitchSerial.print(",");Serial.println(myIMU.roll, 1);// rolldelay(10); // 100Hz輸出
}

?關鍵配置修改

?在?ICM20948.cpp?中調整量程(根據應用需求):

// 加速度計量程 (AFS_2G/AFS_4G/AFS_8G/AFS_16G)
void ICM20948::getAres()
{switch (Ascale){// Possible accelerometer scales (and their register bit settings) are:// 2 Gs (00), 4 Gs (01), 8 Gs (10), and 16 Gs  (11).// Here's a bit of an algorith to calculate DPS/(ADC tick) based on that// 2-bit value:case AFS_2G:aRes = 2.0f / 32768.0f;break;case AFS_4G:aRes = 4.0f / 32768.0f;break;case AFS_8G:aRes = 8.0f / 32768.0f;break;case AFS_16G:aRes = 16.0f / 32768.0f;break;}
}// 陀螺儀量程 (GFS_250DPS/GFS_500DPS/GFS_1000DPS/GFS_2000DPS)
void ICM20948::getGres()
{switch (Gscale){// Possible gyro scales (and their register bit settings) are:// 250 DPS (00), 500 DPS (01), 1000 DPS (10), and 2000 DPS (11).// Here's a bit of an algorith to calculate DPS/(ADC tick) based on that// 2-bit value:case GFS_250DPS:gRes = 250.0f / 32768.0f;break;case GFS_500DPS:gRes = 500.0f / 32768.0f;break;case GFS_1000DPS:gRes = 1000.0f / 32768.0f;break;case GFS_2000DPS:gRes = 2000.0f / 32768.0f;break;}
}

四、VOFA+上位機配置

數據協議設置

  • 選擇?FireWater?協議

  • 格式:q0, q1, q2(逗號分隔+換行符)

  • 波特率:115200

控件添加

  • 3D立方體:顯示實時姿態、綁定四元數數據通道、設置模型縮放比例

  • 波形圖:各軸角速度/加速度

  • 儀表盤:顯示偏航角(Yaw)

界面效果

實時顯示傳感器3D姿態及運動波形

五、濾波參數優化與動態效果對比

1.傳感器校準

float gyroBias[3], accelBias[3];
IMU.calibrateICM20948(gyroBias, accelBias); // 上電時執行一次

2.問題現象

使用默認參數(Kp=10.0, Ki=0.0)時,VOFA+顯示yaw值持續漂移(約2-5°/s),動態運動時零漂明顯

3.優化方案

?在AHRSAlgorithms.h中調整Mahony濾波參數:

// 原參數(漂移明顯)
// #define Kp 2.0f * 5.0f
// #define Ki 0.0f// 優化參數(大幅改善漂移)
#define Kp 3.0f    // 降低比例增益,減少高頻噪聲響應
#define Ki 0.1f   // 降低積分增益,抑制累積誤差

效果對比

參數狀態Yaw漂移率VOFA+動態表現
默認(Kp=10f,Ki=0.0f)2-5°/s靜止時緩慢旋轉,運動后復位慢
優化(Kp=3.0f,Ki=0.1f)<0.5°/s靜止穩定,運動后快速收斂

4.優化后效果

參數調整原理

Kp過高:對加速度計噪聲敏感,導致高頻抖動

Ki過高:積分累積誤差引起零漂

黃金比例Kp/Ki ≈ 20-30?時平衡動態響應與穩定性

六、效果演示

靜態測試

  • 傳感器平放時,VOFA+顯示俯仰角/橫滾角接近0°

  • Z軸加速度≈9.8 m/s2

動態測試

  • 旋轉開發板,3D模型同步跟隨

  • 快速晃動時波形圖顯示各軸加速度變化

ICM20948九軸傳感器動態測試

輸出速率調優

  • ICM20948原始數據輸出率約100Hz(10ms/次)

  • delt_t=60ms時,姿態解算循環(16.7Hz)與傳感器更新周期不同步

  • 導致部分數據幀被重復使用或跳過

完整工程代碼

百度網盤獲取完整工程文件,鏈接如下:

零知標準板驅動ICM20948項目工程https://pan.baidu.com/s/11tr8XJvNrNernqwK1zA9Mw?pwd=pbxd?

七、?效果驗證與結論

測試結果

指標優化前優化后
靜態yaw漂移2-5°/s<0.5°/s
動態收斂時間>3s<1s
高溫穩定性漂移增加300%漂移增加<50%

結論

  • 通過調整Kp/Ki比例可有效抑制yaw漂移
  • 磁力計軸序修正提升方位角精度
  • VOFA+可視化提供直觀參數調優依據
  • 三階段校準確保全溫度范圍穩定性

??(●'?'●)

有關本篇博客的任何問題、或者任何想法和建議等,歡迎您在底部評論區留言,一起交流~

零知開源是一個真正屬于國人自己的開源軟硬件平臺,在開發效率上超越了Arduino平臺并且更加容易上手,大大降低了開發難度。
零知開源在軟件方面提供了完整的學習教程和豐富示例代碼,讓不懂程序的工程師也能非常輕而易舉的搭建電路來創作產品,測試產品。快來動手試試吧!
www.lingzhilab.com

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/908983.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/908983.shtml
英文地址,請注明出處:http://en.pswp.cn/news/908983.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

華為OD最新機試真題-食堂供餐-OD統一考試(B卷)

題目描述 某公司員工食堂以盒飯方式供餐。 為將員工取餐排隊時間降低為0,食堂的供餐速度必須要足夠快,現在需要根據以往員工取餐的統計信息,計算出一個剛好能達成排隊時間為0的最低供餐速度。即,食堂在每個單位時間內必須至少做出 多少價盒飯才能滿足要求。 輸入描述 第1行…

【筆記】MSYS2 的 MINGW64 環境 全面工具鏈

#工作記錄 MSYS2 的 MINGW64 環境&#xff08;mingw64.exe&#xff09;&#xff0c;下面是為該環境準備的最全工具鏈安裝命令&#xff08;包括 C/C、Python、pip/wheel、GTK3/GTK4、PyGObject、Cairo、SDL2 等&#xff09;。 這一環境適用于構建原生 64 位 Windows 應用程序。…

基于 HTTP 的單向流式通信協議SSE詳解

SSE&#xff08;Server-Sent Events&#xff09;詳解 &#x1f9e0; 什么是 SSE&#xff1f; SSE&#xff08;Server-Sent Events&#xff09; 是 HTML5 標準中定義的一種通信機制&#xff0c;它允許服務器主動將事件推送給客戶端&#xff08;瀏覽器&#xff09;。與傳統的 H…

【react+antd+vite】優雅的引入svg和阿里巴巴圖標

1.安裝相關包 由于是vite項目&#xff0c;要安裝插件來幫助svg文件引入進來&#xff0c;否則會失敗 npm下載包 npm i vite-plugin-svgr vite.config.ts文件內&#xff1a; import svgr from "vite-plugin-svgr"; //... export default defineConfig({plugins: …

UI框架-通知組件

UI框架-通知組件 介紹 一個基于 Vue 3 的輕量級通知組件庫&#xff0c;提供了豐富的消息通知功能。支持多種通知類型、自定義樣式、進度條顯示等特性。 特性 &#x1f3a8; 支持多種通知類型&#xff1a;信息、成功、警告、錯誤? 支持進度條顯示&#x1f504; 支持加載中狀…

WordZero:讓Markdown與Word文檔自由轉換的Golang利器

在日常工作中&#xff0c;我們經常需要在Markdown和Word文檔之間進行轉換。Markdown方便編寫和版本控制&#xff0c;而Word文檔更適合正式的商務環境。作為一名Golang開發者&#xff0c;我開發了WordZero這個庫&#xff0c;專門解決這個痛點。 項目背景 GitHub倉庫&#xff1…

計算機網絡面試匯總(完整版)

基礎 1.說下計算機網絡體系結構 計算機網絡體系結構&#xff0c;一般有三種&#xff1a;OSI 七層模型、TCP/IP 四層模型、五層結構。 簡單說&#xff0c;OSI是一個理論上的網絡通信模型&#xff0c;TCP/IP是實際上的網絡通信模型&#xff0c;五層結構就是為了介紹網絡原理而折…

動端React表格組件:支持合并

前言 在移動端開發中&#xff0c;表格組件是一個常見但復雜的需求。相比PC端&#xff0c;移動端表格面臨著屏幕空間有限、交互方式不同、性能要求更高等挑戰。本文將詳細介紹如何從零開始構建一個功能完整的移動端React表格組件&#xff0c;包含固定列、智能單元格合并、排序等…

廣告系統中后鏈路數據為什么要使用流批一體技術?流批一體技術是什么?

在大規模廣告系統的后鏈路(離線和實時特征計算、模型訓練與上線、效果監控等)中,往往既有對海量歷史數據的批量計算需求(離線特征、離線模型訓練、報表匯總),又有對在線請求的低延遲實時計算需求(實時特征、在線打分、實時監控/告警)。傳統將二者割裂、用 Lambda 架構…

6.10 - 常用 SQL 語句以及知識點

MySQL 技術 SQL 是結構化查詢語言&#xff0c;他是關系型數據庫的通用語言 SQL 可以分為分為以下三個類別 DDL (data definition languages) 語句 數據定義語言&#xff0c;定義了 不同的數據庫、表、索引等數據庫對象的定義。常用的的語句關鍵字包括 **create、drop、alter …

OpenCV CUDA 模塊光流計算------稀疏光流算法類SparsePyrLKOpticalFlow

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 OpenCV CUDA 模塊中實現的稀疏光流算法類&#xff0c;基于 Lucas-Kanade 方法&#xff0c;并支持圖像金字塔結構。適用于特征點跟蹤任務&#xf…

免費工具-微軟Bing Video Creator

目錄 引言 一、揭秘Bing Video Creator 二、輕松上手&#xff1a;三步玩轉Bing Video Creator 2.1 獲取與訪問&#xff1a; 2.2 創作流程&#xff1a; 2.3 提示詞撰寫技巧——釋放AI的想象力&#xff1a; 三、核心特性詳解&#xff1a;靈活滿足多樣化需求 3.1 雙重使用模…

MySQL技術內幕1:內容介紹+MySQL編譯使用介紹

文章目錄 1.整體內容介紹2.下載編譯流程2.1 安裝編譯工具和依賴庫2.2 下載編譯 3.配置MySQL3.1 數據庫初始化3.2 編輯配置文件3.3 啟動停止MySQL3.4 登錄并修改密碼 1.整體內容介紹 MySQL技術系列文章將從MySQL下載編譯&#xff0c;使用到MySQL各組件使用原理源碼分析&#xf…

MySQL 事務詳解

MySQL 事務詳解 一、事務是什么&#xff1f;為什么需要事務&#xff1f; 二、事務的四大特性&#xff08;ACID&#xff09;舉例說明&#xff1a;轉賬操作 三、MySQL 中事務的支持四、事務分類&#xff1a;隱式 vs 顯式1. 隱式事務&#xff08;自動提交&#xff09;2. 顯式事務&…

深入淺出Asp.Net Core MVC應用開發系列-AspNetCore中的日志記錄

ASP.NET Core 是一個跨平臺的開源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 應用。 ASP.NET Core 中的日志記錄 .NET 通過 ILogger API 支持高性能結構化日志記錄&#xff0c;以幫助監視應用程序行為和診斷問題。 可以通過配置不同的記錄提供程…

利用coze工作流制作一個自動生成PPT的智能體

在Coze平臺中&#xff0c;通過工作流實現PPT自動化生成是一個高效且靈活的解決方案&#xff0c;尤其適合需要快速產出標準化演示文稿的場景。以下是基于Coze工作流制作PPT的核心邏輯與操作建議&#xff1a; 理論流程 一、核心流程設計 需求輸入與解析 用戶輸入&#xff1a;主…

vue3 按鈕級別權限控制

在Vue 3中實現按鈕級別的權限控制&#xff0c;可以通過多種方式實現。這里我將介紹幾種常見的方法&#xff1a; 方法1&#xff1a;使用Vue 3的Composition API 在Vue 3中&#xff0c;你可以使用Composition API來創建一個可復用的邏輯來處理權限控制。 創建權限控制邏輯 首…

spa首屏加載慢怎樣解決

SPA&#xff08;Single Page Application&#xff0c;單頁應用&#xff09;首屏加載慢是一個常見問題&#xff0c;主要原因通常是首次加載需要拉取體積較大的 JavaScript 文件、樣式表、初始化數據等。以下是一些常見的 優化策略&#xff0c;可以幫助你 提升首屏加載速度&#…

UE5 音效系統

一.音效管理 音樂一般都是WAV,創建一個背景音樂類SoudClass,一個音效類SoundClass。所有的音樂都分為這兩個類。再創建一個總音樂類&#xff0c;將上述兩個作為它的子類。 接著我們創建一個音樂混合類SoundMix&#xff0c;將上述三個類翻入其中&#xff0c;通過它管理每個音樂…

2.Vue編寫一個app

1.src中重要的組成 1.1main.ts // 引入createApp用于創建應用 import { createApp } from "vue"; // 引用App根組件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要寫三種標簽 <template> <!--html--> </template>…