搜索
bottom↓
回复: 15

STM32F103 IIC读取MPU6050数据

[复制链接]

出0入0汤圆

发表于 2014-11-28 10:20:56 | 显示全部楼层 |阅读模式
一直想做四轴,就是没有行动。直到最近有点时间,开始着手做,之前在论坛里看了不少四轴的资料(烈火、圆点、匿名等),决定自己先做些底层的硬件平台熟悉熟悉,然后画板子。TB上买了STM32F103C8最小系统板+烧写器+MPU6050,开始调试:
因为之前没有用过ARM芯片,所以先花了两周的时间把IIC外设调通,之后再连接MPU6050。用了两种方法:分开读取加速度计数据、连续一次性读取加速度和角速度数据(时钟都是400K)。废话不多说上图:

方法一:一次读取一个数据(包含高低位)

unsigned int Read_MPU6050_2Bytes(uint8_t DeviceAddress,uint8_t Start_MemoryAddress)
{
unsigned int Received_data;
        I2C_AcknowledgeConfig(I2C2,ENABLE);//开应答
  while(I2C_GetFlagStatus(I2C2,I2C_FLAG_BUSY));//等待总线空闲
        I2C_GenerateSTART(I2C2,ENABLE);  //START
        while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT)!=SUCCESS);//等待START 完成
  I2C_SendDeviceAddress(I2C2,DeviceAddress,Write);//发送MPU6050地址+写入指令
        while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)!=SUCCESS);//等待上一步完成
        I2C_SendData(I2C2,Start_MemoryAddress);//写入要操作的寄存器地址
        while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED)!=SUCCESS);//等待上一步完成
        I2C_GenerateSTART(I2C2,ENABLE); //再次START
        while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT)!=SUCCESS);//等待上一步完成
  I2C_SendDeviceAddress(I2C2,DeviceAddress,Read);//发送MPU6050地址+读出指令
        I2C_PECPositionConfig(I2C2,I2C_PECPosition_Next);//indicates that the next byte is PEC
        while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)!=SUCCESS);//wait for ADDR BUZY MSL to be set
        I2C_AcknowledgeConfig(I2C2,DISABLE);//Clear ACK
        while(I2C_GetFlagStatus(I2C2,I2C_FLAG_BTF)!=SET);//wait for BTF
        I2C_GenerateSTOP(I2C2,ENABLE);////Stop
        while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED)!=SUCCESS);//
        Received_data=I2C_ReceiveData(I2C2);//
        Received_data=Received_data<<8;
        Received_data|=I2C_ReceiveData(I2C2);//连续读两次数据寄存器把数据寄存器和移位寄存器的数据都读出来
        return Received_data;
}

示波器抓到的读取加速度和角速度(6个数据,包含高低位)的总时间:740uS






方法2:一次读取加速度+角速度+温度数据(包含高低位)
连续读取要好好看看下图的这个时序(755Page Reference)


程序(直接粘贴中文注释成乱码):
void Get_Mpu6050_Data(void)
{
uint8_t i=0;
I2C_AcknowledgeConfig(I2C2,ENABLE);//
  while(I2C_GetFlagStatus(I2C2,I2C_FLAG_BUSY));//µÈ´ý¿ÕÏÐ
  //START£¬Ö÷¶¯Çл»³ÉMASTERģʽ
        I2C_GenerateSTART(I2C2,ENABLE);//²úÉú¿ªÊ¼ÐźÅ
        while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT)!=SUCCESS);
        //´Ó»úµØÖ·+дָÁî
  I2C_SendDeviceAddress(I2C2,MPU6050_ADDR,Write);//·¢ËÍ´Ó»úµØÖ·+дÈëÖ¸Áî
        while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)!=SUCCESS);
        //дÈëÒª¶ÁÈ¡µÄ¼Ä´æÆ÷µØÖ·
        I2C_SendData(I2C2,ACCEL_XOUT_H);//дÈë±»²Ù×÷µÄ¼Ä´æÆ÷µØÖ·
        while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED)!=SUCCESS);//µÈ´ý·¢ËÍÍê±Ï
        //START
        I2C_GenerateSTART(I2C2,ENABLE);//Ôٴη¢Æð¿ªÊ¼ÐźÅ
        while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT)!=SUCCESS);
                //´Ó»úµØÖ·+¶ÁÖ¸Áî
  I2C_SendDeviceAddress(I2C2,MPU6050_ADDR,Read);//·¢ËÍ´Ó»úµØÖ·+¶ÁÖ¸Áî
        //I2C_PECPositionConfig(I2C2,I2C_PECPosition_Next);
        //I2C_AcknowledgeConfig(I2C2,ENABLE);
        while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)!=SUCCESS);//wait for ADDR BUZY MSL to be set
        for(i=0;i<12;)
                        {
                    if(i<11)
                                                                                {
                   while(I2C_GetFlagStatus(I2C2,I2C_FLAG_RXNE)!=SET);//µÈ´ý½ÓÊÕµ½Êý¾Ý
                   Data_Mpu6050=I2C_ReceiveData(I2C2);//¶ÁÈ¡¸Õ¸ÕÊÕµ½µÄÊý¾Ý
                                                                         i++;                                       
                    }
                                                                                //最后三个数据收取需要小动作
                                                                                if(i>=11){
         //等待数据进来把data register & shift register灌满,放心不会丢失后面的数据
                while((I2C_GetFlagStatus(I2C2,I2C_FLAG_RXNE)!=SET)&&(I2C_GetFlagStatus(I2C2,I2C_FLAG_BTF)!=SET));      
                                                                                        I2C_AcknowledgeConfig(I2C2,DISABLE);//Clear ACK       
                                                                                        Data_Mpu6050=I2C_ReceiveData(I2C2);//读取Data N-2
                      I2C_GenerateSTOP(I2C2,ENABLE);////Stop
                      i++;                                                                                       
                      Data_Mpu6050=I2C_ReceiveData(I2C2);//读取Data N-1
                      while(I2C_GetFlagStatus(I2C2,I2C_FLAG_RXNE)!=SET);//等待Data N进来       
                      i++;                                                                                       
                      Data_Mpu6050=I2C_ReceiveData(I2C2);//读取Data N                                                                       
                                                                                  }  
                  }
}

实际测试的时间:370uS


读取数据就是这些,程序在附件里。
======================================分割线=====================================
MPU6050的数据读出来了,处理的时候遇到了问题,InvenSense在RM文件里没说清楚,16位的数据到底怎么scale,-2g对应0,0g对应0xffff/2?好疑惑(按这个处理的结果不对)。于是走上了瞎猜的路,还好最后蒙对了。0xffff对应+0g,0x0000对应-0g,2g对应(0xffff/2)+1,-2g对应(0xffff/2)-1。(按这个处理结果是对的,下面是图):




欢迎拍砖。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2014-11-28 10:22:16 | 显示全部楼层
沙发自己坐

出0入0汤圆

发表于 2014-11-28 11:01:56 | 显示全部楼层
硬件I2C比較難調,還是軟件方便。

出0入0汤圆

发表于 2014-11-28 19:28:16 | 显示全部楼层
字体好大啊 !  

出0入0汤圆

发表于 2014-11-28 23:39:40 | 显示全部楼层
学习,谢谢楼主分享

出65入0汤圆

发表于 2014-11-29 00:19:11 来自手机 | 显示全部楼层
字体啊,手机党伤不起!

出0入0汤圆

发表于 2014-11-30 22:03:34 | 显示全部楼层
和楼主同感,一直想弄但是没有真正动起来,能否发个站内信给我,加QQ一起沟通学习

出0入0汤圆

发表于 2014-12-1 13:05:51 | 显示全部楼层
参考下,准备用f407做iic

出0入0汤圆

发表于 2014-12-3 12:51:15 | 显示全部楼层
GY-521引脚怎么接啊

出0入0汤圆

 楼主| 发表于 2014-12-4 10:29:09 | 显示全部楼层
酷赛引 发表于 2014-11-30 22:03
和楼主同感,一直想弄但是没有真正动起来,能否发个站内信给我,加QQ一起沟通学习
  ...

我权限不够

出0入0汤圆

 楼主| 发表于 2014-12-4 10:34:38 | 显示全部楼层
ntsyans 发表于 2014-12-3 12:51
GY-521引脚怎么接啊

模块资料里面应该有啊,电源和通信连上就能用了

出0入0汤圆

发表于 2014-12-9 22:49:10 | 显示全部楼层
lzm2010 发表于 2014-11-28 11:01
硬件I2C比較難調,還是軟件方便。

匿名四轴就把硬件IIC封起来了 没有开源

出0入0汤圆

 楼主| 发表于 2015-9-13 17:20:17 | 显示全部楼层
酷赛引 发表于 2014-11-30 22:03
和楼主同感,一直想弄但是没有真正动起来,能否发个站内信给我,加QQ一起沟通学习
  ...

试着给你发消息,你那边只接受好友的消息。

出0入0汤圆

发表于 2015-9-13 17:29:58 | 显示全部楼层
先收藏了  有时间回来下载仔细参考一下

出0入0汤圆

发表于 2015-10-7 13:55:15 | 显示全部楼层
最近也在做四轴,准备自己调6050,先试试行不行吧!不行再来问大神们,哈哈

出0入0汤圆

发表于 2015-12-22 08:26:20 | 显示全部楼层
shuen729 发表于 2015-9-13 17:20
试着给你发消息,你那边只接受好友的消息。

可以加一下我的扣:一零七一五六九三,一起沟通学习
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-23 22:09

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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