一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

零知開源——STM32F103RBT6驅(qū)動(dòng) ICM20948 九軸傳感器及 vofa + 上位機(jī)可視化教程

PCB56242069 ? 來(lái)源:PCB56242069 ? 作者:PCB56242069 ? 2025-06-09 14:01 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

STM32F1

教程使用零知標(biāo)準(zhǔn)板(STM32F103RBT6)通過(guò)I2C驅(qū)動(dòng)ICM20948九軸傳感器,實(shí)現(xiàn)姿態(tài)解算,并通過(guò)串口將數(shù)據(jù)實(shí)時(shí)發(fā)送至VOFA+上位機(jī)進(jìn)行3D可視化。代碼基于開源庫(kù)修改優(yōu)化,適合嵌入式物聯(lián)網(wǎng)開發(fā)者。在基礎(chǔ)驅(qū)動(dòng)上新增 本教程使用零知標(biāo)準(zhǔn)板(STM32F103RBT6)通過(guò)I2C驅(qū)動(dòng)ICM20948九軸傳感器,實(shí)現(xiàn)姿態(tài)解算,并通過(guò)串口將數(shù)據(jù)實(shí)時(shí)發(fā)送至VOFA+上位機(jī)進(jìn)行3D可視化。代碼基于開源庫(kù)修改優(yōu)化,適合嵌入式及物聯(lián)網(wǎng)開發(fā)者。在基礎(chǔ)驅(qū)動(dòng)上新增濾波參數(shù)優(yōu)化,重點(diǎn)解決yaw值漂移問(wèn)題,提供完整的參數(shù)調(diào)優(yōu)方案和效果對(duì)比。,重點(diǎn)解決yaw值漂移問(wèn)題,提供完整的參數(shù)調(diào)優(yōu)方案和效果對(duì)比。

一、硬件準(zhǔn)備

1.硬件清單

零知標(biāo)準(zhǔn)板(主控STM32F103RBT6)

ICM20948九軸傳感器模塊

USB轉(zhuǎn)串口模塊(用于調(diào)試和數(shù)據(jù)傳輸)

杜邦線若干

2.接線方式

ICM20948引腳 零知開發(fā)板引腳
VCC 3.3V
GND GND
SDA A4
SCL A5

硬件連接圖

wKgZPGhGdd6AJ8-uAAhf9arQelo722.png

連接實(shí)物圖

wKgZO2hGdfCAPPreAEqjqT86Jw8506.png

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

二、軟件環(huán)境搭建

開發(fā)環(huán)境

零知 IDE + 零知開發(fā)板支持包

所需庫(kù)文件:

AHRSAlgorithms.cpp(姿態(tài)解算庫(kù))

ICM20948.cpp(傳感器驅(qū)動(dòng)庫(kù))

庫(kù)文件關(guān)鍵功能

AHRSAlgorithms.cpp

Madgwick/Mahony濾波算法

四元數(shù)實(shí)時(shí)輸出getQ()

參數(shù)可調(diào):Kp、Ki、beta

ICM20948.cpp

I2C通信底層驅(qū)動(dòng)

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

磁力計(jì)初始化initAK09916()

校準(zhǔn)函數(shù)calibrateICM20948()

三、核心代碼實(shí)現(xiàn)

主程序框架

((ICM20948_VOFA.ino))

/* ICM20948完整優(yōu)化代碼 */
#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初始化成功");
    
    // 執(zhí)行兩級(jí)校準(zhǔn)
    myIMU.calibrateICM20948(myIMU.gyroBias, myIMU.accelBias);
    float magBias[3], magScale[3];
    myIMU.magCalICM20948(magBias, magScale);
    
    // 設(shè)置優(yōu)化分辨率
    myIMU.getAres(); 
    myIMU.getGres();
    myIMU.getMres();
  } else {
    Serial.println("傳感器初始化失敗!");
    while(1);
  }
}

void loop() {
  // 數(shù)據(jù)讀取
  if (myIMU.readByte(ICM20948_ADDRESS, INT_STATUS_1) & 0x01) {
    myIMU.readAccelData(myIMU.accelCount);
    myIMU.readGyroData(myIMU.gyroCount);
    myIMU.readMagData(myIMU.magCount);
    
    // 單位轉(zhuǎn)換
    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];
  }
  
  // 更新時(shí)間基準(zhǔn)
  myIMU.updateTime();
  
  // 姿態(tài)解算(使用優(yōu)化參數(shù))
  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
  );
  
  // 轉(zhuǎn)換為歐拉角
  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;
  
  // 發(fā)送到VOFA+
  Serial.print(myIMU.yaw, 1);   // yaw
  Serial.print(",");
  Serial.print(myIMU.pitch, 1); // pitch
  Serial.print(",");
  Serial.println(myIMU.roll, 1);// roll

  delay(10); // 100Hz輸出
}

關(guān)鍵配置修改 關(guān)鍵配置修改

在ICM20948.cpp中調(diào)整量程(根據(jù)應(yīng)用需求):


// 加速度計(jì)量程 (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+上位機(jī)配置

數(shù)據(jù)協(xié)議設(shè)置

選擇FireWater協(xié)議

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

波特率:115200

控件添加

3D立方體:顯示實(shí)時(shí)姿態(tài)、綁定四元數(shù)數(shù)據(jù)通道、設(shè)置模型縮放比例

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

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

界面效果

wKgZPGhGdoiAXQueAAN-scVaVj8629.png

實(shí)時(shí)顯示傳感器3D姿態(tài)及運(yùn)動(dòng)波形

五、濾波參數(shù)優(yōu)化與動(dòng)態(tài)效果對(duì)比

1.傳感器校準(zhǔn)

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

2.問(wèn)題現(xiàn)象

使用默認(rèn)參數(shù)(Kp=10.0, Ki=0.0)時(shí),VOFA+顯示yaw值持續(xù)漂移(約2-5°/s),動(dòng)態(tài)運(yùn)動(dòng)時(shí)零漂明顯

wKgZPGhGdsmAKVLyADKPt9vrm7Y358.png

3.優(yōu)化方案

在AHRSAlgorithms.h中調(diào)整Mahony濾波參數(shù):

// 原參數(shù)(漂移明顯)
// #define Kp 2.0f * 5.0f
// #define Ki 0.0f

// 優(yōu)化參數(shù)(大幅改善漂移)
#define Kp 3.0f    // 降低比例增益,減少高頻噪聲響應(yīng)
#define Ki 0.1f   // 降低積分增益,抑制累積誤差

效果對(duì)比

參數(shù)狀態(tài) Yaw漂移率 VOFA+動(dòng)態(tài)表現(xiàn)
默認(rèn)(Kp=10f,Ki=0.0f) 2-5°/s 靜止時(shí)緩慢旋轉(zhuǎn),運(yùn)動(dòng)后復(fù)位慢
優(yōu)化(Kp=3.0f,Ki=0.1f) <0.5°/s 靜止穩(wěn)定,運(yùn)動(dòng)后快速收斂

4.優(yōu)化后效果

wKgZO2hGdx6AQVO4AEiJ6SyHx1Y906.png

參數(shù)調(diào)整原理

Kp過(guò)高:對(duì)加速度計(jì)噪聲敏感,導(dǎo)致高頻抖動(dòng)

Ki過(guò)高:積分累積誤差引起零漂

黃金比例:Kp/Ki ≈ 20-30時(shí)平衡動(dòng)態(tài)響應(yīng)與穩(wěn)定性

六、效果演示

靜態(tài)測(cè)試

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

Z軸加速度≈9.8 m/s2

wKgZPGhGd1yADzgMAAOKsE6xV8E188.png

動(dòng)態(tài)測(cè)試

旋轉(zhuǎn)開發(fā)板,3D模型同步跟隨

快速晃動(dòng)時(shí)波形圖顯示各軸加速度變化

演示視頻: https://live.csdn.net/v/480172?spm=1001.2014.3001.5501

輸出速率調(diào)優(yōu)

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

當(dāng)delt_t=60ms時(shí),姿態(tài)解算循環(huán)(16.7Hz)與傳感器更新周期不同步

導(dǎo)致部分?jǐn)?shù)據(jù)幀被重復(fù)使用或跳過(guò)

wKgZO2hGd-uAEFeSAAPHqou5WHM818.png

完整工程代碼

百度網(wǎng)盤獲取完整工程文件,鏈接如下:

https://pan.baidu.com/s/11tr8XJvNrNernqwK1zA9Mw?pwd=pbxd

七、效果驗(yàn)證與結(jié)論

測(cè)試結(jié)果

指標(biāo) 優(yōu)化前 優(yōu)化后
靜態(tài)yaw漂移 2-5°/s <0.5°/s
動(dòng)態(tài)收斂時(shí)間 >3s <1s
高溫穩(wěn)定性 漂移增加300% 漂移增加<50%

結(jié)論

通過(guò)調(diào)整Kp/Ki比例可有效抑制yaw漂移

磁力計(jì)軸序修正提升方位角精度

VOFA+可視化提供直觀參數(shù)調(diào)優(yōu)依據(jù)

三階段校準(zhǔn)確保全溫度范圍穩(wěn)定性

?(●'?'●)

零知開源是一個(gè)真正屬于國(guó)人自己的開源軟硬件平臺(tái),在開發(fā)效率上超越了Arduino平臺(tái)并且更加容易上手,大大降低了開發(fā)難度。
零知開源在軟件方面提供了完整的學(xué)習(xí)教程和豐富示例代碼,讓不懂程序的工程師也能非常輕而易舉的搭建電路來(lái)創(chuàng)作產(chǎn)品,測(cè)試產(chǎn)品??靵?lái)動(dòng)手試試吧!
www.lingzhilab.com


審核編輯 黃宇

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

    關(guān)注

    2567

    文章

    53027

    瀏覽量

    767827
  • 可視化
    +關(guān)注

    關(guān)注

    1

    文章

    1264

    瀏覽量

    21878
  • stm32f1
    +關(guān)注

    關(guān)注

    1

    文章

    60

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    開源——STM32F407VET6驅(qū)動(dòng)SHT41溫濕度傳感器完整教程

    目基于STM32F407VET6增強(qiáng)板,實(shí)現(xiàn)SHT41高精度溫濕度傳感器驅(qū)動(dòng)和數(shù)據(jù)采集。SHT41是Sensirion推出的新一代數(shù)字
    發(fā)表于 07-10 12:01

    開源——STM32F407VET6驅(qū)動(dòng)SHT41溫濕度傳感器完整教程

    摘要:本項(xiàng)目基于STM32F407VET6增強(qiáng)板驅(qū)動(dòng)SHT41高精度溫濕度傳感器,實(shí)現(xiàn)±0.2℃溫度精度和±1.8%RH濕度精度的數(shù)據(jù)采
    的頭像 發(fā)表于 07-09 18:53 ?169次閱讀
    <b class='flag-5'>零</b><b class='flag-5'>知</b><b class='flag-5'>開源</b>——<b class='flag-5'>STM32F407VET6</b><b class='flag-5'>驅(qū)動(dòng)</b>SHT41溫濕度<b class='flag-5'>傳感器</b>完整教程

    開源——STM32F1驅(qū)動(dòng)BMP581壓強(qiáng)傳感器使用SPI實(shí)現(xiàn)ST7789顯示的環(huán)境監(jiān)測(cè)系統(tǒng)

    組件 型號(hào) 數(shù)量 主控板標(biāo)準(zhǔn)板 1 氣壓傳感器 BMP581 1 顯示屏ST7789 (240x320)1 杜邦線公對(duì)公若干 1.2 接線方案
    發(fā)表于 07-03 17:26

    開源——STM32F103RBT6驅(qū)動(dòng) ICM20948 傳感器vofa + 上位機(jī)可視化教程

    STM32F1本教程使用標(biāo)準(zhǔn)板(STM32F103RBT6)通過(guò)I2C驅(qū)動(dòng)ICM20948
    發(fā)表于 06-09 14:53

    經(jīng)驗(yàn)——STM32F4驅(qū)動(dòng)ICM20948 運(yùn)動(dòng)傳感器 + VOFA上位機(jī)可視化驗(yàn)證與抗漂移優(yōu)化

    核心優(yōu)化成果:經(jīng)過(guò)系統(tǒng)性調(diào)優(yōu),將ICM20948的yaw漂移從初始的15°/min降至0.8°/min,動(dòng)態(tài)響應(yīng)時(shí)間縮短40%,搖擺幅度減少75% 一、問(wèn)題根源:傳感器漂移難題在
    發(fā)表于 06-06 10:03

    經(jīng)驗(yàn)——STM32F4驅(qū)動(dòng)ICM20948 運(yùn)動(dòng)傳感器 + VOFA上位機(jī)可視化驗(yàn)證與抗漂移優(yōu)化

    通過(guò)對(duì)ICM20948傳感器的系統(tǒng)性優(yōu)化,成功將yaw漂移從15°/min降至0.8°/min,動(dòng)態(tài)性能提升顯著。硬件層面優(yōu)化了I2C
    的頭像 發(fā)表于 06-06 09:43 ?383次閱讀
    <b class='flag-5'>零</b><b class='flag-5'>知</b>經(jīng)驗(yàn)——<b class='flag-5'>STM32F</b>4<b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>ICM20948</b> <b class='flag-5'>九</b><b class='flag-5'>軸</b>運(yùn)動(dòng)<b class='flag-5'>傳感器</b> + <b class='flag-5'>VOFA</b><b class='flag-5'>上位</b><b class='flag-5'>機(jī)</b><b class='flag-5'>可視化</b>驗(yàn)證與抗漂移優(yōu)化

    開源——STM32F4驅(qū)動(dòng)MAX31865實(shí)現(xiàn)PT100高精度測(cè)溫

    材料增強(qiáng)板(STM32F407VET6) MAX31865模塊(支持三線制PT100) 三線制PT100傳感器 0.96寸I2C OLED顯示屏(SSD1306
    發(fā)表于 05-26 18:52

    開源——STM32F1驅(qū)動(dòng)MAX31865讀取三線PT100溫度傳感器

    STM32F103RBT6) MAX31865模塊(支持三線制PT100) 三線制PT100傳感器 0.96寸I2C OLED顯示屏(SSD1306驅(qū)動(dòng)) 杜邦線若干 2.MAX31865跳線修改三線制PT100必須修改模塊
    發(fā)表于 05-23 18:27

    開源——STM32F1驅(qū)動(dòng)MAX31865讀取三線PT100溫度傳感器

    本教程詳細(xì)介紹了如何使用標(biāo)準(zhǔn)板(STM32F103RBT6)通過(guò)MAX31865模塊讀取三線制PT100鉑電阻溫度,并通過(guò)I2C OLED實(shí)時(shí)顯示溫度值和電阻值。教程內(nèi)容包括硬件接線配置、三線
    的頭像 發(fā)表于 05-23 18:05 ?595次閱讀
    <b class='flag-5'>零</b><b class='flag-5'>知</b><b class='flag-5'>開源</b>——<b class='flag-5'>STM32F</b>1<b class='flag-5'>驅(qū)動(dòng)</b>MAX31865讀取三線PT100溫度<b class='flag-5'>傳感器</b>

    STM32F103RCT6采集不同采樣率傳感器數(shù)據(jù)發(fā)送到位機(jī)數(shù)據(jù)不完整

    你好,我用STM32F103RCT6對(duì)2個(gè)傳感器實(shí)時(shí)采集數(shù)據(jù),傳感器1:SPI通信,采樣率1000HZ,TIM2中斷判斷并通過(guò)串口1發(fā)送數(shù)據(jù)到上位機(jī)
    發(fā)表于 04-23 01:22

    用NANO STM32F103RBT6的開發(fā)板燒錄不了是哪里出了問(wèn)題?

    今天用久別的NANO STM32F103RBT6的開發(fā)板,在公司的電腦上編譯基本工程,怎么就燒錄不了了?望好友伸出援助之手,不勝感激。
    發(fā)表于 03-10 07:48

    開源——ESP8266結(jié)合ICM20948實(shí)現(xiàn)高精度姿態(tài)解算

    清單 組件 型號(hào) 主控板 ESP8266 傳感器 ICM20948 連接線 杜邦
    發(fā)表于 03-07 15:46

    開源——MPU6050六傳感器模塊實(shí)踐教程,輕松實(shí)現(xiàn)運(yùn)動(dòng)檢測(cè)!

    增強(qiáng)板I2C通信 ? ? ? 本教程將指導(dǎo)您如何使用增強(qiáng)板與MPU6050六傳感器模塊
    的頭像 發(fā)表于 02-20 16:17 ?1188次閱讀
    <b class='flag-5'>零</b><b class='flag-5'>知</b><b class='flag-5'>開源</b>——MPU6050六<b class='flag-5'>軸</b><b class='flag-5'>傳感器</b>模塊實(shí)踐教程,輕松實(shí)現(xiàn)運(yùn)動(dòng)檢測(cè)!

    開源——MPU6050六傳感器模塊實(shí)踐教程,輕松實(shí)現(xiàn)運(yùn)動(dòng)檢測(cè)!

    本帖最后由 PCB56242069 于 2025-2-20 17:27 編輯 ?增強(qiáng)板I2C通信 本教程將指導(dǎo)您如何使用增強(qiáng)板與MPU6050六
    發(fā)表于 02-20 15:53

    陀螺儀LSM6DSOW開發(fā)(2)----上報(bào)匿名上位機(jī)實(shí)現(xiàn)可視化

    本文檔詳細(xì)介紹了如何使用匿名助手的上位機(jī)實(shí)現(xiàn)加速度計(jì)和陀螺儀數(shù)據(jù)的可視化顯示。內(nèi)容涵蓋了加速度計(jì)和陀螺儀的工作原理、上位機(jī)通信協(xié)議、數(shù)據(jù)處理
    的頭像 發(fā)表于 08-05 09:52 ?2151次閱讀
    陀螺儀LSM<b class='flag-5'>6</b>DSOW開發(fā)(2)----上報(bào)匿名<b class='flag-5'>上位</b><b class='flag-5'>機(jī)</b>實(shí)現(xiàn)<b class='flag-5'>可視化</b>