最近在网上看到关于MPU9250内部有自带9轴MPL角度解算的功能,因为刚好工作需要,于是在网上查找了一番资料,经过琢磨,目前基本把MPU9250内部的四元数和角度都取出来了;因为之前开发一直使用的是维特智能的JY901模块,模块也是内置MPU9250,只不过是角度什么都处理好,直接输出,而且他们还加入了自己的算法,当时懒得折腾,直接买了几块,省去我大半的时间去琢磨一些算法什么的;刚好看到网上有MPL的技术,就拿来和JY901模块做下对比,具体操作流程及使用效果怎么样,我这边会在下文提及到。
1、前期准备
1.1、材料准备:
材料准备 | 备注 |
---|---|
STM32F103RCT6开发板 | 在网上搜索都可以买到这种开发板,推荐使用STM32F103系列的,不需要去移植程序,毕竟移植程序也是非常耗时间的一件事,这里注意了,为什么要用RC系列的,因为MPU9250的MPL官方库至少有70K的Flash,选太小Flash芯片,不够存放代码量 |
MPU9250模块 | 直接在网上购买现成模块即可,没太多要求,只要I2C和SPI管脚有引出即可,这里我们需要用到I2C,需要用到4个引脚 |
胶带 | 用来固定线和MPU9250模块,避免8字校准时扯到线,导致接触不良 |
杜邦线及护套线 | 杜邦线用来连接MPU9250模块和开发板;护套线用来串口输出,在条件允许的情况下,最好别用杜邦线,因为整个过程中,会涉及到航向角8字校准,传感器要绕圈画8字,这样只要线稍微不牢固,容易断电,调试效果非常差 |
外壳 | 要测量角度,就必须使用外壳固定,千万不要用手拿着,这样测试角度是不标准的 |
串口USB-TTL | 用来打印角度数据,可用串口助手查看数据 |
J-Link | 用于下载程序 |
JY901模块 | 用来对比角度数据 |
1.2、软件准备
软件准备 | 备注 |
---|---|
Keil5 | 开发环境,以下代码都是在此环境调试开发 |
9轴MPL示例代码 | https://download.csdn.net/download/weixin_40905871/12819773 |
串口助手 | 用于显示角度数据 |
2、硬件连接
2.1、实物接线
这里先附上图片,主要两个部分,MPU9250模块(左边紫色模块)和STM32开发板,这里为什么不把MPU9250模块装进外壳里面呢,主要是因为磁场下面不能有电路布线,为了避免对比加入其他不可控因素,所以把他固定在外壳的耳朵;接下来直接讲接线,因为每个人手上的开发板不一样,附上图片也未必能讲清楚,这里直接用芯片和模块的管脚做讲解;
这里再附上JY901的连接图,JY901模块只需要串口即可,其他参考他们的说明书;
2.2、管脚接线图
3、程序讲解
这里先讲下main函数的整体结构:
打开程序工程“Template.uvprojx”(请下载1.2章节的MPL示例程序链接,具体的Keil5安装这里就不讲解了);找到main.c文件,结合以上的程序流程框图,就能了解整个程序的工作流程了;
先附上主函数:
int main(void)
{
unsigned char ucMPU9250Str[100];
short sCaliFlag = 0; //磁场校准标志位
short sAcc[3],sGyro[3],sMag[3];
float pitch,roll,yaw; //欧拉角
delay_init(); //初始化延时函数
uart_init(115200); //初始化USART
LED_Init(); //初始化LED
// MPU9250_Init(); //这个函数可注释
while(mpu_dmp_init()){
;}
while(1)
{
if(mpu_mpl_get_data(sAcc,sGyro,sMag,&pitch,&roll,&yaw,&sCaliFlag)==0)
{
memset(ucMPU9250Str,0,100);
sprintf(ucMPU9250Str,"pitch:%.3f,roll:%.3f,yaw:%.3f,CaliFlag:%d\r\n", pitch, roll, yaw,sCaliFlag);
usart1_send_str(ucMPU9250Str