STM32F103上移植MPU6050的DMP与上位机

在我们使用MPU6050芯片时期望得到的是姿态数据,也就是姿态的倾角。我们通常利用的原始数据,进行姿态融合解算,此方法比较复杂,知识点比较多,需要进行数学的四元数推运算,初学者不易掌握。其实,MPU6050 本身自带了数字运动处理器,即DMP(Digital Motion Processing),并且InvenSense提供了一个 MPU6050的嵌入式运动驱动库,结合MPU6050的DMP,可以将我们的原始数据,直接转换成四元数输出,而得到四元数之后,就可以很方便的计算出欧拉角,从而得到yaw(航向角)、roll(翻滚角)和 pitch(俯仰角)。

     使用内置的DMP,简化了姿态融合解析代码设计,不用进行姿态解算过程,在一定程度上降低了MCU的负担,从而有更多的时间去处理其他事件,提高系统实时性(其实卡尔曼滤波和互补滤波在STM32里面也没花多少时间)。更重要的是,让大家可以不需要接触复杂的滤波算法就可以直接得到姿态的倾角。

    使用MPU6050的DMP输出的四元数是q30格式的,也就是浮点数放大了2的30次方倍。在换算成欧拉角之前,必须先将其转换为浮点数,也就是除以2的30次方,然后再进行计算,

   计算公式为:

   q0=quat[0] / q30; //q30格式转换为浮点数

   q1=quat[1] / q30;

   q2=quat[2] / q30;

   q3=quat[3] / q30;

   //下面计算得到俯仰角、横滚角、航向角

   pitch=asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3;//俯仰角

   roll=atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 *q1 - 2 * q2* q2 + 1)* 57.3; //横滚角

   yaw=atan2(2 * (q1 * q2 + q0 * q3),q0 * q0 + q1 *q 1- q2 * q2 - q3 * q3) * 57.3; //航向角

     到此我们即可直接得到姿态的三个参数。

      移植官方 DMP驱动库并不难,下面我们来讲解一下如何移植。

     首先打开我提供的资料里面的文件夹【MPU6050+上位机】,此文件夹为我移植成功的工程文件夹。移植的平台是正点原子miniSTM32开发板V3.0,并增加3.2寸LCD显示屏。

这个是360云盘地址:https://yunpan.cn/OcPnF2zNFdbzvU 访问密码 d4ba。下载并解压,如下图.

USER:里面有keilu5的工程文件,最好用keil5打开。
HARDWARE:里面是外设驱动文件,里面就是我们放的MPU6050库文件。
打开HARDWARE文件夹,看到MPU6050文件,把整个文件夹复制到你的工程里,里面包含了DMP库和模拟IIC文件。

打开USER文件夹中的keil工程文件。可以看到工程为;

然后,我们在MDK里面双击上图中的HARDWARE,在弹出的对话框中把【HARDWARE】里面的所有C文件ADD进去:

 



然后加入文件包含路径,操作如下图所示:


到此DMP的移植工作已经完成。下面简单分析程序的组成:


main函数中与普通的工程一样,一开始进行引脚配置的初始化。下面主要分析MPU6050的函数:MPU6050_initialize()和MPU6050_Pose();

在MPU6050.c文件中我们找到MPU6050_initialize()函数:

 

初始化时先配置模拟IIC,然后对DMP进行初始化,判断初始化函数返回值result,并把初始化的各个阶段串口打印。具体的模拟IIC配置请看STM32_IIC.c文件,由于是模拟IIC所以只要是普通IO引脚就可以。IIC中的读写时序请参考MPU6050的参考手册。

 

 

 



初始化操作完成后,直接使用while(1)循环读取MPU6050数据:MPU6050_Pose(Pose,Gyro,Accel);//Pose[3];姿态Gyro[3];陀螺仪Accel[3];加速度


可以在MPU6050.c中看到函数源代码:

#define q30 1073741824.0f

floatq0=1.0f,q1=0.0f,q2=0.0f,q3=0.0f;

floatPitch,Roll,Yaw;

floattemp_p,temp_r,temp_y;

unsigned longsensor_timestamp;

shortsensors;

unsigned charmore;

longquat[4];

voidMPU6050_Pose(float *pose ,short *gyro,short *accel)

{

dmp_read_fifo(gyro, accel,quat, &sensor_timestamp, &sensors,&more);

if (sensors& INV_WXYZ_QUAT )//姿态量

{

//PrintChar("in Calculating quaternion steps.....\n");

q0=quat[0] /q30;

q1=quat[1] /q30;

q2=quat[2] /q30;

q3=quat[3] /q30;

Pitch = asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3; //pitch

Roll = atan2(2* q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3; //roll

Yaw =atan2(2*(q1*q2 + q0*q3),q0*q0+q1*q1-q2*q2-q3*q3) *57.3;//yaw

pose[0] =Pitch;//俯仰 绕Y轴

pose[1] =Roll;//横滚 绕X轴

pose[2] =Yaw;//航向 绕Z轴

UART1_ReportIMU((int)(Yaw*10),(int)(Pitch*10),(int)(Roll*10),1,1,1,100);//上位机数据发送函数

}

 

}

上位机发送函数的协议也在usart.c中:

 

voidUART1_ReportIMU(int16_t yaw,int16_t pitch,int16_troll

,int16_talt,int16_t tempr,int16_t press,int16_t IMUpersec)

{

 unsigned int temp=0xaF+2;

charctemp;

UART1_Put_Char(0xa5);

UART1_Put_Char(0x5a);

UART1_Put_Char(14+2);

UART1_Put_Char(0xA1);

if(yaw<0)yaw=32768-yaw;

ctemp=yaw>>8;

UART1_Put_Char(ctemp);

temp+=ctemp;

ctemp=yaw;

UART1_Put_Char(ctemp);

temp+=ctemp;

if(pitch<0)pitch=32768-pitch;

ctemp=pitch>>8;

UART1_Put_Char(ctemp);

temp+=ctemp;

ctemp=pitch;

UART1_Put_Char(ctemp);

temp+=ctemp;

if(roll<0)roll=32768-roll;

ctemp=roll>>8;

UART1_Put_Char(ctemp);

temp+=ctemp;

ctemp=roll;

UART1_Put_Char(ctemp);

temp+=ctemp;

if(alt<0)alt=32768-alt;

ctemp=alt>>8;

UART1_Put_Char(ctemp);

temp+=ctemp;

ctemp=alt;

UART1_Put_Char(ctemp);

temp+=ctemp;

if(tempr<0)tempr=32768-tempr;

ctemp=tempr>>8;

UART1_Put_Char(ctemp);

temp+=ctemp;

ctemp=tempr;

UART1_Put_Char(ctemp);

temp+=ctemp;

if(press<0)press=32768-press;

ctemp=press>>8;

UART1_Put_Char(ctemp);

temp+=ctemp;

ctemp=press;

UART1_Put_Char(ctemp);

temp+=ctemp;

UART1_Put_Char(temp%6);

UART1_Put_Char(0xaa);

 

}

到此可以对你的移植工程进行编译,修改好引脚配置后基本上是没有什么问题的。把编译好的工程下载到板子上,连接MPU6050模块。下面我们来看上位机效果:

打开文件夹中的上位机文件夹,打开AHRS_Captain_Flight.exe(如果是第一次使用需要进行一些配置才能使用3D效果的功能,请网上搜索)



点击文件操作-->端口设置-->选择串口号和波特率等,再打开即可,实时显示数据曲线:



点击3D显示按钮,显示3D效果:



到此整个MPU6050在STM32F103上的移植全部完成。

具体程序的执行和姿态DMP如果运算,请看官方MPU6050资料。也可参考我的下一篇博文四元数的姿态解析。

  • 4
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
移植 MPU6050 DMPSTM32F103 上需要进行以下步骤: 1. 准备工作 首先需要准备好 MPU6050 模块,以及 STM32F103 开发板,并连接好它们。另外,还需要下载 MPU6050 DMP 库文件和 STM32F103 的开发环境,例如 Keil 或者 CubeMX。 2. 配置 I2C MPU6050 是通过 I2C 协议与 STM32F103 通信的,因此需要配置好 I2C。在 CubeMX 中选择 I2C 外设并进行配置,设置好 I2C 的时钟和引脚等参数。在 Keil 中,需要编写 I2C 相关的初始化代码。 3. 配置 MPU6050MPU6050 DMP 库中,有一份 MPU6050 库文件,其中包含了 MPU6050 初始化相关的代码。需要将该文件添加到工程中,并按照需要进行修改。主要需要配置 MPU6050 的采样率、陀螺仪量程、加速度计量程等参数。 4. 导入 DMP 库 将 MPU6050 DMP 库文件加入到工程中,并在代码中进行调用。需要注意的是,DMP 库文件需要与 MPU6050 库文件进行配合使用。 5. 填充缓冲区 在 DMP 库文件中,有一个叫做“dmp_read_fifo”的函数,该函数用于读取 MPU6050 的原始数据,并调用 DMP 算法进行处理。在该函数内部,需要填充缓冲区,将处理后的数据存储到缓冲区中。 6. 解析数据 解析数据是将缓冲区中的数据进行解析,得到姿态角度等信息。在 DMP 库文件中,有一个叫做“dmp_get_data”的函数,该函数用于解析数据。需要注意的是,解析数据的过程需要根据具体情况进行调整,例如需要考虑坐标系的转换等问题。 7. 输出结果 最后,将得到的姿态角度等信息进行输出。可以通过串口或者 OLED 屏幕等方式进行显示。 总的来说,移植 MPU6050 DMPSTM32F103 上需要进行一系列的配置和调试工作,需要有一定的硬件和软件基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值