网站服务器安全防护,wordpress 游客也可以上传附件,旧货交易网站开发的背景,注册城乡规划师是干什么的STM32F1 本教程使用零知标准板#xff08;STM32F103RBT6#xff09;通过I2C驱动ICM20948九轴传感器#xff0c;实现姿态解算#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…STM32F1 本教程使用零知标准板STM32F103RBT6通过I2C驱动ICM20948九轴传感器实现姿态解算并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化适合嵌入式及物联网开发者。在基础驱动上新增滤波参数优化重点解决yaw值漂移问题提供完整的参数调优方案和效果对比。 目录
STM32F1
一、硬件准备
二、软件环境搭建
三、核心代码实现
四、VOFA上位机配置
五、滤波参数优化与动态效果对比
六、效果演示
七、 效果验证与结论 一、硬件准备
1.硬件清单 零知标准板主控STM32F103RBT6 ICM20948九轴传感器模块 USB转串口模块用于调试和数据传输 杜邦线若干 2.接线方式
ICM20948引脚零知开发板引脚VCC3.3VGNDGNDSDAA4SCLA5
硬件连接图 连接实物图 注意确保I2C引脚正确避免接反导致芯片损坏。 二、软件环境搭建
开发环境 零知 IDE 零知开发板支持包 所需库文件: AHRSAlgorithms.cpp姿态解算库 ICM20948.cpp传感器驱动库 库文件关键功能 AHRSAlgorithms.cpp Madgwick/Mahony滤波算法 四元数实时输出 getQ() 参数可调Kp、Ki、beta 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;// 发送到VOFASerial.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).// Heres 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).// Heres 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.问题现象
使用默认参数(Kp10.0, Ki0.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动态表现默认(Kp10f,Ki0.0f)2-5°/s静止时缓慢旋转运动后复位慢优化(Kp3.0f,Ki0.1f)0.5°/s静止稳定运动后快速收敛 4.优化后效果 参数调整原理 Kp过高对加速度计噪声敏感导致高频抖动 Ki过高积分累积误差引起零漂 黄金比例Kp/Ki ≈ 20-30 时平衡动态响应与稳定性 六、效果演示
静态测试 传感器平放时VOFA显示俯仰角/横滚角接近0° Z轴加速度≈9.8 m/s² 动态测试 旋转开发板3D模型同步跟随 快速晃动时波形图显示各轴加速度变化 ICM20948九轴传感器动态测试 输出速率调优 ICM20948原始数据输出率约100Hz(10ms/次) 当delt_t60ms时姿态解算循环(16.7Hz)与传感器更新周期不同步 导致部分数据帧被重复使用或跳过 完整工程代码
百度网盘获取完整工程文件链接如下:
零知标准板驱动ICM20948项目工程https://pan.baidu.com/s/11tr8XJvNrNernqwK1zA9Mw?pwdpbxd 七、 效果验证与结论
测试结果
指标优化前优化后静态yaw漂移2-5°/s0.5°/s动态收敛时间3s1s高温稳定性漂移增加300%漂移增加50% 结论 通过调整Kp/Ki比例可有效抑制yaw漂移磁力计轴序修正提升方位角精度VOFA可视化提供直观参数调优依据三阶段校准确保全温度范围稳定性 ✔(●◡●) 有关本篇博客的任何问题、或者任何想法和建议等欢迎您在底部评论区留言一起交流~ 零知开源是一个真正属于国人自己的开源软硬件平台在开发效率上超越了Arduino平台并且更加容易上手大大降低了开发难度。 零知开源在软件方面提供了完整的学习教程和丰富示例代码让不懂程序的工程师也能非常轻而易举的搭建电路来创作产品测试产品。快来动手试试吧 www.lingzhilab.com