查看: 2435|回复: 0

STM32两轮平衡小车——传感器MPU6050

[复制链接]
  • TA的每日心情
    开心
    2015-7-7 09:19
  • 签到天数: 13 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2015-7-10 08:36:14 | 显示全部楼层 |阅读模式
    分享到:
    对于平衡小车,这一篇帖子已经是第四个了,慢慢的也开始讲到了传感器部分,剩余的部分还是尽量做到每周更新一篇。
      这一篇就大概的对传感器做一个介绍,以及如何进行控制。当然对于MPU6050的传感器讲解度娘一搜索一大堆都是,以下观点仅代表个人观点,如有雷同,存属正常。
      对于MPU6050这个类传感器主要还是用于制作平衡车,空中鼠标,飞行器以及倒立摆等等必要用到的传感器,当然这一类的传感器也是很多,只不过在国内MPU6050用的稍微多一些!所以在选择是本人也就选择了6050(后面MPU6050都简称为6050)。
      对于6050就类似于USB鼠标,鼠标通过USB数据线将操作信息传送给电脑,而6050是通过IIC协议(上一讲讲解)将数据传送给主控MCU,在学习6050之前最好还是先看一下6050的数据手册,网上也有中文版本的,数据手册里面讲解了传输协议以及对芯片内部寄存器介绍。
      对于MPU6050操作主要用到八个管脚(其它管脚根据数据手册通过电容接地或者电源),当然很多时候都只需要用到4条(VCC、GND、SCL、SDA),对于XCL和XDA是6050作为主机时使用,这个我们放到后面几篇帖子讲解。AD0地址管脚是设置芯片地址使用的,而很多时候我们都会直接接地拉低,让芯片地址为0xD0;INT引脚在平衡车中没有使用,当然有时候也是很有用的,他能够作为数据准备完成的中断线。

      接下来就是对6050进行初始化(使用到的IIC协议请看上一贴),
            MPU6050_setClockSource(MPU6050_CLOCK_PLL_XGYRO); //设置时钟    MPU6050_setFullScaleGyroRange(MPU6050_GYRO_FS_1000);//陀螺仪最大量程 +-1000度每秒    MPU6050_setFullScaleAccelRange(MPU6050_ACCEL_FS_2);        //加速度度最大量程 +-2G    MPU6050_setSleepEnabled(0); //进入工作状态对于如果有使用INT引脚的就需要进行初始化:
            //配置MPU6050 的中断模式 和中断电平模式        IICwriteBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_LEVEL_BIT, 0);        IICwriteBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_OPEN_BIT, 0);        IICwriteBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_LATCH_INT_EN_BIT, 1);        IICwriteBit(devAddr, MPU6050_RA_INT_PIN_CFG, MPU6050_INTCFG_INT_RD_CLEAR_BIT, 1);        //开数据转换完成中断    IICwriteBit(devAddr, MPU6050_RA_INT_ENABLE, MPU6050_INTERRUPT_DATA_RDY_BIT, 1);在进行数据读取时使用如下方法:        if(MPU6050_is_DRY()){        IICreadBytes(devAddr, MPU6050_RA_ACCEL_XOUT_H, 14, buffer);    MPU6050_Lastax=(((int16_t)buffer[0]) << 8) | buffer[1];    MPU6050_Lastay=(((int16_t)buffer[2]) << 8) | buffer[3];    MPU6050_Lastaz=(((int16_t)buffer[4]) << 8) | buffer[5];        //跳过温度ADC    MPU6050_Lastgx=(((int16_t)buffer[8]) << 8) | buffer[9];    MPU6050_Lastgy=(((int16_t)buffer[10]) << 8) | buffer[11];    MPU6050_Lastgz=(((int16_t)buffer[12]) << 8) | buffer[13];        MPU6050_newValues(MPU6050_Lastax,MPU6050_Lastay,MPU6050_Lastaz                ,MPU6050_Lastgx,MPU6050_Lastgy,MPU6050_Lastgz);        *ax  =MPU6050_FIFO[0][10];        *ay  =MPU6050_FIFO[1][10];        *az = MPU6050_FIFO[2][10];        *gx  =MPU6050_FIFO[3][10]-Gx_offset;        *gy = MPU6050_FIFO[4][10]-Gy_offset;        *gz = MPU6050_FIFO[5][10]-Gz_offset;        } else {        *ax = MPU6050_FIFO[0][10];//=MPU6050_FIFO[0][10];        *ay = MPU6050_FIFO[1][10];//=MPU6050_FIFO[1][10];        *az = MPU6050_FIFO[2][10];//=MPU6050_FIFO[2][10];        *gx = MPU6050_FIFO[3][10]-Gx_offset;//=MPU6050_FIFO[3][10];        *gy = MPU6050_FIFO[4][10]-Gy_offset;//=MPU6050_FIFO[4][10];        *gz = MPU6050_FIFO[5][10]-Gz_offset;//=MPU6050_FIFO[5][10];        }数据读取出来过后这只是6050的原始数据,还需要进行必要的转换,对于转换将在下一篇讲解。待续……
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-11-18 20:24 , Processed in 0.124483 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.