amobbs.com 阿莫电子技术论坛

标题: 战舰stm32板子mpu6050官方DMP移植成功,源码分享... [打印本页]

作者: mandzy    时间: 2015-1-25 22:41
标题: 战舰stm32板子mpu6050官方DMP移植成功,源码分享...
根据坛子里其他大侠的讲解和源代码,自己在战舰STM32开发板上移植成功,可以在匿名上位机中看到姿态变化,另外这个代码中USRAT部分还有完整的DMA收发功能,可以接收和发送不定长度的字符串,希望可以帮到有需要的人

作者: qs6361036    时间: 2015-1-25 23:46
不错 ,有时间在自己的板子上搞起来 !
作者: cdh    时间: 2015-1-26 09:00
顶起来。
作者: Free_man    时间: 2015-1-26 09:09
        MARK!
作者: xiaojianren210    时间: 2015-1-26 09:29
谢谢分享,请问lz这是6.1的DMP库吗,想请教一下初始化的流程官方哪里有介绍还是看例程和API?
作者: cdfs_shangxiao    时间: 2015-1-26 09:56
这个很酷啊
作者: Shampoo    时间: 2015-1-26 11:20
已测试。可用。
能给个讲解的链接吗?
作者: mandzy    时间: 2015-1-26 19:06
xiaojianren210 发表于 2015-1-26 09:29
谢谢分享,请问lz这是6.1的DMP库吗,想请教一下初始化的流程官方哪里有介绍还是看例程和API? ...

5.1的库,就是看库里边的函数,大概看看明白是什么意思就行了,初始化就是用inv_mpu.c里边的那个初始化,就是对照着代码一步一步查看阅读,MDK编译器的GO TO功能挺好用
int mpu_init(void)
{
    unsigned char data[6], rev;

    /* Reset device. */
    data[0] = 0x80;//BIT_RESET;     // 这里写0x80就是复位MPU,可以直接查MPU_PWR_MGMT1_REG寄存器的设置,电源管理1
    if (i2c_write(st.hw->addr, st.reg->pwr_mgmt_1, 1, &(data[0])))
        return -1;
    delay_ms(100);

    /* Wake up chip. */
    data[0] = 0x00; // 这里写0x00就是唤醒MPU,可以直接查MPU_PWR_MGMT1_REG寄存器的设置,电源管理1
    if (i2c_write(st.hw->addr, st.reg->pwr_mgmt_1, 1, &(data[0])))
        return -1;

#if defined MPU6050
    /* Check product revision. */
    if (i2c_read(st.hw->addr, st.reg->accel_offs, 6, data))
        return -1;
    rev = ((data[5] & 0x01) << 2) | ((data[3] & 0x01) << 1) |
        (data[1] & 0x01);

    if (rev) {
        /* Congrats, these parts are better. */
        if (rev == 1)
            st.chip_cfg.accel_half = 1;
        else if (rev == 2)
            st.chip_cfg.accel_half = 0;
        else {
            log_e("Unsupported software product rev %d.\n");
            return -1;
        }
    } else {
        if (i2c_read(st.hw->addr, st.reg->prod_id, 1, &(data[0])))
            return -1;
        rev = data[0] & 0x0F;
        if (!rev) {
            log_e("Product ID read as 0 indicates device is either "
                "incompatible or an MPU3050.\n");
            return -1;
        } else if (rev == 4) {
            log_i("Half sensitivity part found.\n");
            st.chip_cfg.accel_half = 1;
        } else
            st.chip_cfg.accel_half = 0;
    }
#elif defined MPU6500
#define MPU6500_MEM_REV_ADDR    (0x17)
    if (mpu_read_mem(MPU6500_MEM_REV_ADDR, 1, &rev))
        return -1;
    if (rev == 0x1)
        st.chip_cfg.accel_half = 0;
    else {
        log_e("Unsupported software product rev %d.\n", rev);
        return -1;
    }

    /* MPU6500 shares 4kB of memory between the DMP and the FIFO. Since the
     * first 3kB are needed by the DMP, we'll use the last 1kB for the FIFO.
     */
    data[0] = BIT_FIFO_SIZE_1024 | 0x8;//设置FIFO
    if (i2c_write(st.hw->addr, st.reg->accel_cfg2, 1, data))
        return -1;
#endif

    /* Set to invalid values to ensure no I2C writes are skipped. */
    st.chip_cfg.sensors = 0xFF;
    st.chip_cfg.gyro_fsr = 0xFF;
    st.chip_cfg.accel_fsr = 0xFF;
    st.chip_cfg.lpf = 0xFF;
    st.chip_cfg.sample_rate = 0xFFFF;
    st.chip_cfg.fifo_enable = 0xFF;
    st.chip_cfg.bypass_mode = 0xFF;
#ifdef AK89xx_SECONDARY
    st.chip_cfg.compass_sample_rate = 0xFFFF;
#endif
    /* mpu_set_sensors always preserves this setting. */
    st.chip_cfg.clk_src = INV_CLK_PLL;
    /* Handled in next call to mpu_set_bypass. */
    st.chip_cfg.active_low_int = 1;
    st.chip_cfg.latched_int = 0;
    st.chip_cfg.int_motion_only = 0;
    st.chip_cfg.lp_accel_mode = 0;
    memset(&st.chip_cfg.cache, 0, sizeof(st.chip_cfg.cache));
    st.chip_cfg.dmp_on = 0;
    st.chip_cfg.dmp_loaded = 0;
    st.chip_cfg.dmp_sample_rate = 0;

    if (mpu_set_gyro_fsr(2000))//设置陀螺仪量程2000dps
        return -1;
    if (mpu_set_accel_fsr(2))//设置加速度量程2g
        return -1;
    if (mpu_set_lpf(42))//设置滤波器
        return -1;
    if (mpu_set_sample_rate(50))//设置采样频率
        return -1;
    if (mpu_configure_fifo(0))//设置FIFO
        return -1;

    /*if (int_param)
        reg_int_cb(int_param);*/

#ifdef AK89xx_SECONDARY
    setup_compass();
    if (mpu_set_compass_sample_rate(10))
        return -1;
#else
    /* Already disabled by setup_compass. */
    if (mpu_set_bypass(0))
        return -1;
#endif

    mpu_set_sensors(0);
    return 0;
}
作者: mandzy    时间: 2015-1-26 19:07
Shampoo 发表于 2015-1-26 11:20
已测试。可用。
能给个讲解的链接吗?

哪有什么讲解啊,都是自己慢慢看,论坛上边有很多关于MPU的帖子,综合起来看
作者: mandzy    时间: 2015-1-26 19:10
官方的DMP库已经上传了,坛子其他帖子也有,这里上传方便大家下载,免得找
作者: xiaojianren210    时间: 2015-1-27 08:41
mandzy 发表于 2015-1-26 19:06
5.1的库,就是看库里边的函数,大概看看明白是什么意思就行了,初始化就是用inv_mpu.c里边的那个初始化, ...

谢谢 我再研究一下
作者: 123bac    时间: 2015-1-28 12:45
相当强大的帖子
作者: 技术平原    时间: 2015-2-4 21:50
感谢分享
作者: xld826    时间: 2015-3-27 16:30
楼主可以加QQ吗,就一个问题,947894709
作者: ghdnui    时间: 2015-3-28 15:05
感谢分享,请问 lz  对xyz轴 inv_orientation_matrix_to_scalar这个函数怎么理解的,我一直想不通
作者: 芒果丶    时间: 2015-3-28 15:19
感谢楼主分享,最近也在弄这个
作者: GHmcu    时间: 2015-3-28 15:53
谢谢分享,学习一下。
作者: bkyss    时间: 2015-4-24 16:11
谢楼主! 最近打算玩玩这个~
作者: 睿翼1992    时间: 2015-4-28 16:17
另外这个代码中USRAT部分还有完整的DMA收发功能,可以接收和发送不定长度的字符串,这玩意有么?楼主只是配置了DMA,却没有使用吧   
作者: mandzy    时间: 2015-4-28 22:42
睿翼1992 发表于 2015-4-28 16:17
另外这个代码中USRAT部分还有完整的DMA收发功能,可以接收和发送不定长度的字符串,这玩意有么?楼主只是配 ...

对,只是配置好了,这个代码里边没有用到
作者: 完美幸    时间: 2015-4-28 22:51
谢谢分享。。。。
作者: hao999a    时间: 2015-4-29 08:48
mark  大力支持楼主继续更好的作品
作者: tjuspring001    时间: 2015-4-29 09:11
这个怎么玩啊,有大神能科普一下吗
作者: 机械电子协会    时间: 2015-5-27 16:19
必须赞一个               
作者: Arthur244    时间: 2015-5-28 11:56
楼主你用的是软写IIC么。。
作者: 万古长风    时间: 2015-6-2 19:39
谢谢分享
作者: acchkr    时间: 2015-6-2 20:41
多谢分享~
作者: videofun    时间: 2015-6-13 15:32
谢谢分享,楼主厉害                 
作者: zhangyh89    时间: 2015-7-7 10:21
移植到了LPC1114上,但发现,刚上点的时候yaw航向角一直在变,灯过一段时间才稳定,不知道楼主有没有这问题
作者: 王晨    时间: 2015-7-12 21:26
楼主好,我把源码下进去之后,发现上位机能收到数据,但是通过手摇动6050,姿态没有变化呀,这应该是什么原因呢?
作者: mandzy    时间: 2015-7-12 22:28
王晨 发表于 2015-7-12 21:26
楼主好,我把源码下进去之后,发现上位机能收到数据,但是通过手摇动6050,姿态没有变化呀,这应该是什么原 ...

先查一下硬件连接,这个程序在战舰板子上运行正常
作者: 王晨    时间: 2015-7-12 22:57
mandzy 发表于 2015-7-12 22:28
先查一下硬件连接,这个程序在战舰板子上运行正常

MPU6050接到STM32上面去四根线呀,分别是SCL,SDA,VCC,GND,I2C接B10,B11   再不用接别的线到STM32上面去了吧  硬件应该没有连错呀
作者: AbnerSmith    时间: 2015-7-22 20:17
如果想加入hmc5883l该怎么修改呢
作者: mandzy    时间: 2015-7-22 22:21
AbnerSmith 发表于 2015-7-22 20:17
如果想加入hmc5883l该怎么修改呢

这个没研究过,不好意思
作者: dianzixiehui    时间: 2015-7-27 09:27
点赞点赞点赞点赞点赞
作者: dianzixiehui    时间: 2015-7-27 09:33
pid可以读写吗

作者: dianzixiehui    时间: 2015-7-27 10:12
王晨 发表于 2015-7-12 21:26
楼主好,我把源码下进去之后,发现上位机能收到数据,但是通过手摇动6050,姿态没有变化呀,这应该是什么原 ...

你解决了没,我也是这样啊

作者: 王晨    时间: 2015-7-27 12:29
dianzixiehui 发表于 2015-7-27 10:12
你解决了没,我也是这样啊

我之前接的单片机的5V电源输出,5V上没有电压,然后接的3.3V,就可以正常工作了   
有时候上位机有点问题,关了,再开就行
作者: 沉默胜过白金    时间: 2015-7-27 19:54
dianzixiehui 发表于 2015-7-27 10:12
你解决了没,我也是这样啊

你解决了没?我的也全是0 。
作者: jorry    时间: 2015-8-2 07:59
顶,赞谢谢分享
作者: jorry    时间: 2015-8-3 16:29
谢谢!感谢分享!!!
作者: ilove_music    时间: 2015-8-3 19:15
谢谢分享啦
作者: 430504    时间: 2015-8-3 19:22
很漂亮 谢谢分享
作者: maxes    时间: 2015-8-3 23:15
感谢楼主分享
作者: yllyly0454    时间: 2016-11-14 15:48
很好的分享,但是上位机好像下载不了了,请帮忙看看
作者: yllyly0454    时间: 2016-11-14 15:56
很好的分享,上位机好像下载不了,请帮忙看看。
作者: sanwa    时间: 2021-10-27 15:08
这个上位机下载不了,只有1k多大小,还能再上传下吗?
作者: armok.    时间: 2021-12-4 11:30
sanwa 发表于 2021-10-27 15:08
这个上位机下载不了,只有1k多大小,还能再上传下吗?

谁有这个文件能帮忙重新上传?
作者: sanwa    时间: 2021-12-4 13:48
ghdnui 发表于 2015-3-28 15:05
感谢分享,请问 lz  对xyz轴 inv_orientation_matrix_to_scalar这个函数怎么理解的,我一直想不通 ...

这个帖子的资料还有吗?能否方便上传下
作者: armok.    时间: 2021-12-5 10:54
根据坛友提供的资料,上位机可以在下面的帖子可以找到,我已经上传到楼主位。大家可以到上面楼主位下载。



匿名上位机

https://www.amobbs.com/forum.php ... A%E4%BD%8D%E6%9C%BA

https://www.amobbs.com/forum.php ... A%E4%BD%8D%E6%9C%BA





欢迎光临 amobbs.com 阿莫电子技术论坛 (https://www.amobbs.com/) Powered by Discuz! X3.4