查看: 10049|回复: 8

【PSOC4】MPU6050应用(IIC通讯)

  [复制链接]
  • TA的每日心情
    开心
    2013-9-3 20:45
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2013-11-9 13:03:42 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 qixiyi 于 2013-11-9 13:14 编辑

    MPU6050应用(IIC通讯)

           MPU-6050是全球首例9轴运动处理传感器。它集成了3轴MEMS陀螺仪,3轴MEMS加速度计,以及一个可扩展的数字运动处理器DMP,可用I2C接口连接一个第三方的数字传感器,比如磁力计。扩展之后就可以通过其I2C或SPI接口输出一个9轴的信号。
           MPU-6050对陀螺仪和加速度计分别用了三个16位的ADC,将其测量的模拟量转化为可输出的数字量。为了精确跟踪快速和慢速的运动,传感器的测量范围都是用户可控的,陀螺仪可测范围为±250,±5001000,±2000°/秒(dps),加速度计可测范围为±2,±4,±8,±16g。
          下图标明了传感器的参考坐标系(XYZ组成右手系)以及3个测量轴和旋转方向,旋转的正向可用右手螺旋定则判断。
    file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image002.jpg

    MPU6050

    MPU6050
    硬件设计
    接线方式:SCL P4.0
                     SDA P4.1
    MPU6050模块:仅使用SCL、SDA、GND和5V引脚。
    PSOC4 kit使用3.3V供电。
    IMG_20000102_061442.jpg
    file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image004.jpg
    软件设计
        在void InitMPU6050()函数中,一个I2C写操作周期为:
        I2C_M_Start();
        status=I2C_M_I2CMasterClearStatus();        //清除之前状态
        status=I2C_M_I2CMasterSendStart(SlaveAddress,I2C_M_I2C_WRITE_XFER_MODE);   //校验地址+写入模式
        while(status!=I2C_M_I2C_MSTR_NO_ERROR);
        I2C_M_I2CMasterWriteByte(PWR_MGMT_1);       //电源管理,解除休眠状态
        I2C_M_I2CMasterWriteByte(0x00);
       I2C_M_I2CMasterSendStop();
    (1)I2C_M_Start()函数会调用I2C_M_Init()函数,然后调用I2C_M_Enable()函数。
    (2)I2C_M_I2CMasterSendStart(SlaveAddress,I2C_M_I2C_WRITE_XFER_MODE);
            用于产生I2C开始条件,SlaveAddress是mpu6050从地址0x68,这里需要特别注意,
           这个参数是右对齐7位从器件地址(有效范围介于0~127之间)。
    3I2C_M_I2CMasterWriteByte(PWR_MGMT_1);用于发送子地址。
    4I2C_M_I2CMasterSendStop();发送停止命令。

      在int8 getResult(uint8 reg_addr)函数中,一个I2C读操作周期为:
      I2C_M_Start();
      I2C_M_I2CMasterClearStatus();
      I2C_M_I2CMasterSendStart(SlaveAddress,I2C_M_I2C_WRITE_XFER_MODE);
      I2C_M_I2CMasterWriteByte(reg_addr);
      I2C_M_Start();
      I2C_M_I2CMasterSendRestart(SlaveAddress,I2C_M_I2C_READ_XFER_MODE);
      result=I2C_M_I2CMasterReadByte(I2C_M_I2C_ACK_DATA);
      I2C_M_Stop();
      在进行读写切换操作时,需要加入I2C_M_Start()和I2C_M_I2CMasterSendRestart()这两个函数,才能实现。

    实验效果
        for(;;)
        {
            Value[0] = getAccel_X();
            Value[1] = getAccel_Y();
            Value[2] = getAccel_Z();
            Value[3] = getGyro_X();
            Value[4] = getGyro_Y();
            Value[5] = getGyro_Z();
            Value[6] = Angel_ACCX();
            Value[7] = Angel_ACCY();
            Value[8] = Angel_ACCZ();
        }
    file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image006.jpg

    实验现象

    实验现象
    注意:使用PSOC4在Creator2.2的编译环境下进行编程中用到了math.h文件,如何添加?
           对于 PSoC4/PSoC5 LP 的工程, Creator 默认是不加载 math 库的,如果需要调用 math 库里面的函数,需要在 Creator 里面做如下设置:
           打开工程, 点击 Project -> Build Settings -> Linker -> General-> Additional Libraries. 在 “ Additional Libraries“ 文本框里面添加 ”m“. 然后确定,保存就可以了。

    math.h添加方法

    math.h添加方法
    file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image008.jpg

    mpu6050.rar

    1.18 MB, 下载次数: 288

    MPU6050应用(IIC通讯).pdf

    801.56 KB, 下载次数: 207

    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-5-12 10:32
  • 签到天数: 295 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2013-11-9 15:27:04 | 显示全部楼层
    赞一个~~~~~~~~~~~·
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2014-1-4 20:00
  • 签到天数: 10 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2013-11-10 20:40:59 | 显示全部楼层
    共享精神  值得学习
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2017-12-13 09:01
  • 签到天数: 152 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2013-11-21 19:51:59 | 显示全部楼层
    顶一个
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2014-7-7 21:38
  • 签到天数: 155 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2013-11-24 13:06:01 | 显示全部楼层
    你好,我也在调一个角度传感器,遇到一个问题,就是我进行在线调试的时候发现程序一直在*******************************************************************************/
    uint32 I2C_M_I2CMasterWriteByte(uint32 theByte)
    {
        uint32 errStatus;
        uint8  enableInterrupts;

        errStatus        = I2C_M_I2C_MSTR_NOT_READY;
        enableInterrupts = 0u;

        /* Check FSM state before write byte */
        if(I2C_M_CHECK_I2C_MASTER_ACTIVE)
        {
            I2C_M_TX_FIFO_WR_REG = theByte;

            while(!I2C_M_CHECK_INTR_MASTER(I2C_M_INTR_MASTER_I2C_ACK      |     //注释一直停在这里,请问怎么回事
                                                      I2C_M_INTR_MASTER_I2C_NACK     |
                                                      I2C_M_INTR_MASTER_I2C_ARB_LOST |
                                                      I2C_M_INTR_MASTER_I2C_BUS_ERROR))
            {
                /* Wait until byte will be transfered */
            }
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2013-9-3 20:45
  • 签到天数: 3 天

    连续签到: 1 天

    [LV.2]偶尔看看I

     楼主| 发表于 2013-11-25 10:47:55 | 显示全部楼层
    勇敢的心 发表于 2013-11-24 13:06
    你好,我也在调一个角度传感器,遇到一个问题,就是我进行在线调试的时候发现程序一直在****************** ...

    发送了错误的从器件地址吧?
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    擦汗
    2021-6-1 08:44
  • 签到天数: 398 天

    连续签到: 2 天

    [LV.9]以坛为家II

    发表于 2013-11-25 11:12:12 | 显示全部楼层
    顶一下~~~~~~~~~~~~~~~~~~~~~~~~~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2014-7-7 21:38
  • 签到天数: 155 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2013-11-25 13:38:22 | 显示全部楼层
    qixiyi 发表于 2013-11-25 10:47
    发送了错误的从器件地址吧?

    应该没有 最终用模拟的了  谢谢哈
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2014-6-25 21:09
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2014-6-25 21:30:56 | 显示全部楼层
    大神,我有个问题,我读出的数据为啥不随着我传感器的移动而跟着移动呢?
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-5-20 16:32 , Processed in 0.197132 second(s), 31 queries , MemCache On.

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

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.