首页 > 编程语言 >四轴控制算法(PID、Mahony互补滤波算法等)

四轴控制算法(PID、Mahony互补滤波算法等)

时间:2024-06-30 18:59:33浏览次数:3  
标签:四轴 GYRO 控制算法 PID RA WriteByte 陀螺仪 buf MPU9250

四轴控制算法(PID、Mahony互补滤波算法等)

第一章 四轴控制算法及实现之如何获取MPU9250的原始数据


文章目录


前言

MPU9250 是一款9轴运动跟踪装置,他在 3X3X1mm 的封装中融合了 3轴加速度、3 轴陀螺仪、3 轴磁力计以及数字运动处理器(DMP)并且兼容 MPU6515。其完美的 I2C 方案,可直接输出 9 轴的全部数据。因此它也是四轴姿态解算的基础,所以正确获取 MPU9250 的原始数据显得尤为重要。


一、MPU9250简介

1.概述

MPU9250是一个 QFN 封装的复合芯片(MCM),它由2部分组成。一组是 3轴加速度还有3轴陀螺仪,另一组则是 AKM 公司的 AK8963 3轴磁力计。
MPU9250 的具有三个 16 位加速度 AD 输出,三个 16 位陀螺仪 AD 输出,三个6位磁力计 AD输出。 精密的慢速和快速运动跟踪,提供给客户全量程的可编程陀螺仪参数选择(士250,土500,土1000,and士2000。/秒(dps)),可编程的加速度参数选择士2g,士4g,士8g,士16g,以及最大磁力计可达到士4800uT。

2.通信协议-I2C

MPU9250与 MCU 通信时,一般都是作为 IIC从机,MCU 为主机。IIC的一主机对多从机通信时,是需要通过地址匹配然后确立与哪个从机进行通信的。所以在进行MCU与MPU9250 通信时,首先要确定MPU9250 的从机地址。
MPU9250 作为从机时的地址为7位110100X(B)。这个地址的LSB位由AD0 引脚的电平确定,这样就使得一个系统中可以同时连接2个MPU9250了。(ADO 为低电平时 X为 0,高电平 X 则为 1)。如果只用了一个 MPU9250,可知 AD0 接高电平时,所以X为 1。那么 MPU9250 的地址为 1101001(B),十六进制表示为 0x69


二、MPU9250获取原始数据

1.初始化流程

  1. 检查 MCU 与 MPU9250 是否通信成功。
  2. 设置 MPU9250 为复位状态+100ms 复位延时
  3. 唤醒 MPU9250,选择 PLL 为时钟源
  4. 配置六轴数据(3 轴加速度+3 轴陀螺仪)全输出
  5. 禁止所有中断
  6. 设置 MPU9250 内部采样频率
  7. 设置陀螺仪和加速度的满量程范围
  8. 设置陀螺仪和加速度输出低通滤波

初始化MPU9250代码如下(示例):

void MPU9250_Init(void)
{
    MPU9250_Check(); //检查MPU9250是否连接
	
	MPU9250_WriteByte(MPU9250_RA_PWR_MGMT_1, 0x80); //复位MPU9250
    delay_ms(100);
    MPU9250_WriteByte(MPU9250_RA_PWR_MGMT_1, 0x01); //唤醒MPU9250,并选择PLL为时钟源
	MPU9250_WriteByte(MPU9250_RA_PWR_MGMT_2, 0x00); //设置输出三轴陀螺仪与三轴加速度数据
	MPU9250_WriteByte(MPU9250_RA_INT_ENABLE, 0x00); //禁止中断
    MPU9250_WriteByte(MPU9250_RA_SMPLRT_DIV, 0x00); //采样分频  (采样频率 = 陀螺仪输出频率 / (1+DIV),采样频率1000hz)
	MPU9250_WriteByte(MPU9250_RA_GYRO_CONFIG, 0x18); //陀螺仪满量程+-2000度/秒     (最低分辨率 = 2^16/4000 = 16.4LSB/度/秒 
	MPU9250_WriteByte(MPU9250_RA_ACCEL_CONFIG, 0x08); //加速度满量程+-4g            (最低分辨率 = 2^16/8g = 8196LSB/g )
	MPU9250_WriteByte(MPU9250_RA_ACCEL_CONFIG_2,0x04); //设置加速度滤波为DLPF=20Hz  
    MPU9250_WriteByte(MPU9250_RA_CONFIG, MPU9250_DLPF_BW_98);//设置陀螺的输出为1kHZ,DLPF=92Hz  
	MPU9250_WriteByte(MPU9250_RA_INT_PIN_CFG, 0x02);//MPU 可直接访问MPU9250辅助I2C
}

2.读取原始数据

主函数读取原始数据代码如下(示例):

int main()
{
	LED_init();         //LED初始化化
	USART_init(115200); //USART1初始化
	Delay_init();       //延时初始化
	IIC_Init();
	MPU9250_Init();
	
	while(1)
	{
		MPU9250_GyroRead(GYRO);
		MPU9250_AccRead(ACC);
		MPU9250_TempRead(&Temperature);	
		
		printf("GYRO_X:%d  GYRO_Y:%d GYRO_Z:%d\r\n",GYRO[0],GYRO[1],GYRO[2]);
		printf(" ACC_X:%d   ACC_Y:%d   ACC_Z:%d\r\n",ACC[0],ACC[1],ACC[2]);
		printf("Temperature:%0.2f\r\n\r\n",Temperature);
		LED5_Run(); //D5闪烁
		delay_ms(500);//延时500ms
	}
}

void MPU9250_AccRead(int16_t *accData)
{
    uint8_t buf[6]; 
   	MPU9250_ReadMultBytes(MPU9250_RA_ACCEL_XOUT_H,6,buf);
    accData[0] = (int16_t)((buf[0] << 8) | buf[1]);
    accData[1] = (int16_t)((buf[2] << 8) | buf[3]);
    accData[2] = (int16_t)((buf[4] << 8) | buf[5]);
}
void MPU9250_GyroRead(int16_t *gyroData)
{
    uint8_t buf[6];
	
	  MPU9250_ReadMultBytes(MPU9250_RA_GYRO_XOUT_H, 6, buf);
    gyroData[0] = (int16_t)((buf[0] << 8) | buf[1]) ;
    gyroData[1] = (int16_t)((buf[2] << 8) | buf[3]) ;
    gyroData[2] = (int16_t)((buf[4] << 8) | buf[5]) ;
}
void MPU9250_TempRead(float *tempdata)
{
	uint8_t buf[2];
	short data;
	MPU9250_ReadMultBytes(MPU9250_RA_TEMP_OUT_H, 2, buf);
	data = (int16_t)((buf[0] << 8) | buf[1]) ;
	*tempdata = (data/333.87)+21;
}
uint8_t MPU9250_ReadMultBytes(uint8_t reg,uint8_t len,uint8_t *buf)
{
	if(IIC_ReadMultByteFromSlave(MPU9250Addr,reg,len,buf))
	   return 1;
	else
	   return 0;
}

三、代码实现结果

运行结果
在这里插入图片描述

总结

以上就是获取IMU原始数据的基本步骤,如需工程代码可留言。

标签:四轴,GYRO,控制算法,PID,RA,WriteByte,陀螺仪,buf,MPU9250
From: https://blog.csdn.net/weixin_44745712/article/details/140083766

相关文章

  • 用 PID 优化拥塞控制
    这算是一篇读书实践,最近读了B站up主DR_CAN的《控制之美》,本想写篇读后感,有了PID和我的inflight守恒算法的结合,就算是习题和实践了。PS:这本书非常不错,但并非专业计算机范畴的作品,控制论大多数被应用在机械自动化,电子自动化,航空航天,机器人,运筹学等,但拥塞控制肯定也......
  • 智能优化算法应用:基于平衡优化器算法PID参数优化 - 附代码
    智能优化算法应用:基于平衡优化器算法PID参数优化-附代码文章目录智能优化算法应用:基于平衡优化器算法PID参数优化-附代码1.PID简介2.平衡优化器算法简介3.适应度函数设计4.算法实验与结果5.参考文献:6.Matlab代码摘要:本文主要介绍如何用平衡优化器算法进行PID参......
  • 【雕爷学编程】Arduino BLDC 之简单的四轴无人机姿态控制
    Arduino是一个开放源码的电子原型平台,它可以让你用简单的硬件和软件来创建各种互动的项目。Arduino的核心是一个微控制器板,它可以通过一系列的引脚来连接各种传感器、执行器、显示器等外部设备。Arduino的编程是基于C/C++语言的,你可以使用ArduinoIDE(集成开发环境)来编写、......
  • 智能电池充电:使用PID控制器优化SOC(Matlab代码实现)
     ......
  • 横向LQR、纵向PID控制进行轨迹跟踪以及python实现
    横向LQR、纵向PID控制进行轨迹跟踪以及python实现附赠自动驾驶最全的学习资料和量产经验:链接一、LQR问题模型建立:理论部分比较成熟,这里只介绍demo所使用的建模方程:使用离散代数黎卡提方程求解系统状态矩阵:输入矩阵:A矩阵:B矩阵:二、代码实现#导入相关包imp......
  • RapidLayout:中英文版面分析推理库
    引言继上一篇文章之后,我这里想着将360发布的版面分析模型整合到现有的rapid_layout仓库中,便于大家快速使用。不曾想到,我这整理工作越做越多了,好在整体都是往更好方向走。起初,rapid_layout项目是在RapidStructure仓库下的。RapidStructure仓库包含三大块:文档方向分类、版面分析......
  • 【控制】基于 PID 控制器控制直流电机速度simulink实现
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,代码获取、论文复现及科研仿真合作可私信。......
  • Rapidfuzz,一个高效的 Python 模糊匹配神器
    目录01初识Rapidfuzz            什么是Rapidfuzz?为什么选择Rapidfuzz?安装Rapidfuzz配置Rapidfuzz02基本操作简单比率计算03高级功能                 查找单个最佳匹配查找多个最佳匹配使用阈值优化......
  • 【PXIE301-208】基于PXIE总线架构的Serial RapidIO总线通讯协议仿真卡
     板卡概述       PXIE301-208是一款基于3UPXIE总线架构的SerialRapidIO总线通讯协议仿真卡。该板卡采用Xilinx的高性能Kintex系列FPGA作为主处理器,实现各个接口之间的数据互联、处理以及实时信号处理。板卡支持4路SFP+光纤接口,支持一个PCIex8主机接口,板载1组独立的6......
  • Matlab Simulink 的PID参数整定方法【1】
    MatlabSimulink提供的控制参数整定效果还是值得肯定的,在此记录本人进行PID参数整定的过程,有不对之处忽略即可,但更欢迎批评指正。资料引用(基于Matlab官方)CascadeDigitalPIDControlDesignforPowerElectronicConvertersMultiloopControlDesignforBuckConverte......