OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3674|回复: 10

玩了一天原子MPU9250的程序,分享一下经验

[复制链接]

64

主题

446

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1032
金钱
1032
注册时间
2017-7-26
在线时间
275 小时
发表于 2019-12-4 14:29:09 | 显示全部楼层 |阅读模式
本帖最后由 a3748622 于 2019-12-4 14:32 编辑

我用的是F407移植原子F429的MPU9250实验,
自己买的MPU9250小模块使用。

移植过程中也出现了一些问题,分享一下:

1、程序卡死在自检“res=run_self_test();”
     一开始串口总是不输出数据,后面我发现把模块水平放置就可以了。。。。。
     不然的话自检 不能通过

2、自检通过后,发现串口还是不能输出数据,debug发现,程序卡死在FIFO的读取哪里
  1.     if (fifo_count > (st.hw->max_fifo >> 1)) {
  2.         /* FIFO is 50% full, better check overflow bit. */
  3.         if (i2c_read(st.hw->addr, st.reg->int_status, 1, tmp))
  4.             return -1;
  5.         if (tmp[0] & BIT_FIFO_OVERFLOW) {
  6.             mpu_reset_fifo();
  7.             return -2;
  8.         }
  9.     }
复制代码
这段代码是用来检测FIFO是否已满,如果MPU9250FIFO已满,则重启FIFO,然后再读取。那么为什么我一开始不能输出数据呢?因为我把单片机获取MPU9250数据,然后输出到串口的时间调为1S。。。。
如下代码:
  1.      if(mpu_mpl_get_data(&pitch,&roll,&yaw)==0)
  2.                  {
  3.                
  4.      temp=MPU_Get_Temperature();
  5.                  MPU_Get_Accelerometer(&arr[0],&arr[1],&arr[2]);
  6.                  MPU_Get_Gyroscope(&arr[3],&arr[4],&arr[5]);
  7.            mpu6050_send_data(arr[0],arr[1],arr[2],arr[3],arr[4],arr[5]);
  8.                  usart1_report_imu((int)(roll*100),(int)(pitch*100),(int)(yaw*100),0,0);
  9.      }

  10.      HAL_Delay(1000);        
复制代码
造成的结果是重启一次,然后FIFO在1S内满了,然后又重启。。。无限循环。。。
如何解决呢?我把工程发上来大家自己看吧。。。。

3、原子哥程序的小问题,导致匿名地面站飞控状态不能更新。
     串口终于能成功输出数据了,但是却发现加速度陀螺仪数据能接收,但是飞控状态,float pitch,roll,yaw;
     却不能更新。

     检查代码发现如下问题:

  1. void usart1_niming_report(uint8_t fun,uint8_t*data,uint8_t len)
  2. {
  3.         uint8_t send_buf[32];
  4.         uint8_t i;
  5.         if(len>28)return;
  6.         send_buf[len+4]=0;        //原本这里是len+3
  7.         send_buf[0]=0XAA;
  8.         send_buf[1]=0XAA;
  9.         send_buf[2]=fun;
  10.         send_buf[3]=len;
  11.         for(i=0;i<len;i++)send_buf[4+i]=data[i];
  12.         for(i=0;i<len+4;i++)send_buf[len+4]+=send_buf[i];
  13.         //for(i=0;i<len+5;i++)usart1_send_char(send_buf[i]);
  14.         HAL_UART_Transmit(&huart1, send_buf, len+5, 50);
  15. }
复制代码


           如上修改后,很棒,尽情玩耍吧。
        




111.png
22.png

mpu9250.rar

12.97 MB, 下载次数: 1339

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10569
金钱
10569
注册时间
2017-2-18
在线时间
1913 小时
发表于 2019-12-4 18:33:17 | 显示全部楼层
回复 支持 反对

使用道具 举报

7

主题

105

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1027
金钱
1027
注册时间
2016-1-28
在线时间
135 小时
发表于 2019-12-4 22:31:19 | 显示全部楼层
谢谢楼主分享~
回复 支持 反对

使用道具 举报

2

主题

6

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2019-11-30
在线时间
20 小时
发表于 2019-12-30 15:36:48 | 显示全部楼层
加速度值为什么是那样子的?怎么转换成正确的?
回复 支持 反对

使用道具 举报

64

主题

446

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1032
金钱
1032
注册时间
2017-7-26
在线时间
275 小时
 楼主| 发表于 2019-12-30 16:35:01 | 显示全部楼层
灯灰 发表于 2019-12-30 15:36
加速度值为什么是那样子的?怎么转换成正确的?

加速度不正确吗?
回复 支持 反对

使用道具 举报

1

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
150
金钱
150
注册时间
2019-8-12
在线时间
19 小时
发表于 2020-1-3 18:06:17 | 显示全部楼层
正好需要,谢谢分享
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2019-8-21
在线时间
12 小时
发表于 2020-1-6 01:43:04 | 显示全部楼层
请教一下,为什么总是显示 Compass not found
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2019-8-21
在线时间
12 小时
发表于 2020-1-6 01:49:13 | 显示全部楼层
/* Find compass. Possible addresses range from 0x0C to 0x0F. */
    for (akm_addr = 0x0C; akm_addr <= 0x0F; akm_addr++) {
        int result;
        result = i2c_read(akm_addr, AKM_REG_WHOAMI, 1, data);
        if (!result && (data[0] == AKM_WHOAMI))
            break;
    }

    if (akm_addr > 0x0F) {
        /* TODO: Handle this case in all compass-related functions. */
        log_e("Compass not found.\n");
        return -1;
    }





为什么我的MPU9250出现了Compass not found!
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2019-8-21
在线时间
12 小时
发表于 2020-1-6 01:54:18 | 显示全部楼层
/* Find compass. Possible addresses range from 0x0C to 0x0F. */     for (akm_addr = 0x0C; akm_addr <= 0x0F; akm_addr++) {         int result;         result = i2c_read(akm_addr, AKM_REG_WHOAMI, 1, data);         if (!result && (data[0] == AKM_WHOAMI))             break;     }      if (akm_addr > 0x0F) {         /* TODO: Handle this case in all compass-related functions. */         log_e("Compass not found.\n");         return -1;     }
回复 支持 反对

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2019-8-21
在线时间
12 小时
发表于 2020-1-6 01:54:44 | 显示全部楼层
我的为什么 Compass not found!
回复 支持 反对

使用道具 举报

6

主题

23

帖子

0

精华

初级会员

Rank: 2

积分
121
金钱
121
注册时间
2019-5-23
在线时间
44 小时
发表于 2020-3-24 09:06:17 | 显示全部楼层
我用的是探索者F4的开发板验证你的程序,可是串口打印的是乱码,不知道为啥
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-23 07:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表