搜索
bottom↓
回复: 6

求救!!MPU6050能读出who am i但是读加速度和陀螺仪都是0

[复制链接]

出0入0汤圆

发表于 2013-8-10 11:22:11 | 显示全部楼层 |阅读模式
求救!!MPU6050能读出who am i但是读加速度和陀螺仪都是0。读WHO_AM_I读到0x68.有点迷茫了
  1. #include "stm32f10x.h"
  2. #include "led.h"
  3. #include "usart.h"
  4. #include "mpu6050.h"
  5. #include "i2c.h"


  6. #define   uchar unsigned char
  7. #define   uint unsigned int       

  8. //定义MPU6050内部地址********************
  9. #define        SMPLRT_DIV                0x19        //陀螺仪采样率,典型值:0x07(125Hz)
  10. #define        CONFIG                        0x1A        //低通滤波频率,典型值:0x06(5Hz)
  11. #define        GYRO_CONFIG                0x1B        //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
  12. #define        ACCEL_CONFIG        0x1C        //加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)
  13. #define        ACCEL_XOUT_H        0x3B
  14. #define        ACCEL_XOUT_L        0x3C
  15. #define        ACCEL_YOUT_H        0x3D
  16. #define        ACCEL_YOUT_L        0x3E
  17. #define        ACCEL_ZOUT_H        0x3F
  18. #define        ACCEL_ZOUT_L        0x40
  19. #define        TEMP_OUT_H                0x41
  20. #define        TEMP_OUT_L                0x42

  21. #define        GYRO_XOUT_H                0x43
  22. #define        GYRO_XOUT_L                0x44       
  23. #define        GYRO_YOUT_H                0x45
  24. #define        GYRO_YOUT_L                0x46
  25. #define        GYRO_ZOUT_H                0x47
  26. #define        GYRO_ZOUT_L                0x48

  27. #define        PWR_MGMT_1                0x6B        //电源管理,典型值:0x00(正常启用)
  28. #define        WHO_AM_I                0x75        //IIC地址寄存器(默认数值0x68,只读)
  29. //****************************

  30. #define        MPU6050_Addr   0xD0          //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改

  31. unsigned char TX_DATA[4];           //显示据缓存区
  32. unsigned char BUF[10];       //接收数据缓存区
  33. char  test=0;                                  //IIC用到
  34. short T_X,T_Y,T_Z,T_T;                 //X,Y,Z轴,温度

  35. //************************************
  36. /*模拟IIC端口输出输入定义*/
  37. #define SCL_H         GPIOB->BSRR = GPIO_Pin_6
  38. #define SCL_L         GPIOB->BRR  = GPIO_Pin_6
  39.    
  40. #define SDA_H         GPIOB->BSRR = GPIO_Pin_7
  41. #define SDA_L         GPIOB->BRR  = GPIO_Pin_7

  42. #define SCL_read      GPIOB->IDR  & GPIO_Pin_6
  43. #define SDA_read      GPIOB->IDR  & GPIO_Pin_7





  44. //void Delay(__IO u32 nCount);

  45. /*
  46. * 函数名:main
  47. * 描述  :主函数
  48. * 输入  :无
  49. * 输出  :无
  50. */

  51. /*******************************************************************************
  52. * Function Name  : I2C_GPIO_Config
  53. * Description    : Configration Simulation IIC GPIO
  54. * Input          : None
  55. * Output         : None
  56. * Return         : None
  57. ****************************************************************************** */
  58. void I2C_GPIO_Config(void)
  59. {
  60.   GPIO_InitTypeDef  GPIO_InitStructure;

  61.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6;
  62.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  63.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;  
  64.   GPIO_Init(GPIOB, &GPIO_InitStructure);

  65.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_7;
  66.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  67.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  68.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  69. }
  70. /*******************************************************************************
  71. * Function Name  : I2C_delay
  72. * Description    : Simulation IIC Timing series delay
  73. * Input          : None
  74. * Output         : None
  75. * Return         : None
  76. ****************************************************************************** */
  77. void I2C_delay(void)
  78. {
  79.                
  80.    u8 i=30; //这里可以优化速度        ,经测试最低到5还能写入
  81.    while(i)
  82.    {
  83.      i--;
  84.    }  
  85. }

  86. void delay5ms(void)
  87. {
  88.                
  89.    int i=5000;  
  90.    while(i)
  91.    {
  92.      i--;
  93.    }  
  94. }
  95. /*******************************************************************************
  96. * Function Name  : I2C_Start
  97. * Description    : Master Start Simulation IIC Communication
  98. * Input          : None
  99. * Output         : None
  100. * Return         : Wheather         Start
  101. ****************************************************************************** */
  102. bool I2C_Start(void)
  103. {
  104.         SDA_H;
  105.         SCL_H;
  106.         I2C_delay();
  107.         if(!SDA_read)return FALSE;        //SDA线为低电平则总线忙,退出
  108.         SDA_L;
  109.         I2C_delay();
  110.         if(SDA_read) return FALSE;        //SDA线为高电平则总线出错,退出
  111.         SDA_L;
  112.         I2C_delay();
  113.         return TRUE;
  114. }
  115. /*******************************************************************************
  116. * Function Name  : I2C_Stop
  117. * Description    : Master Stop Simulation IIC Communication
  118. * Input          : None
  119. * Output         : None
  120. * Return         : None
  121. ****************************************************************************** */
  122. void I2C_Stop(void)
  123. {
  124.         SCL_L;
  125.         I2C_delay();
  126.         SDA_L;
  127.         I2C_delay();
  128.         SCL_H;
  129.         I2C_delay();
  130.         SDA_H;
  131.         I2C_delay();
  132. }
  133. /*******************************************************************************
  134. * Function Name  : I2C_Ack
  135. * Description    : Master Send Acknowledge Single
  136. * Input          : None
  137. * Output         : None
  138. * Return         : None
  139. ****************************************************************************** */
  140. void I2C_Ack(void)
  141. {       
  142.         SCL_L;
  143.         I2C_delay();
  144.         SDA_L;
  145.         I2C_delay();
  146.         SCL_H;
  147.         I2C_delay();
  148.         SCL_L;
  149.         I2C_delay();
  150. }   
  151. /*******************************************************************************
  152. * Function Name  : I2C_NoAck
  153. * Description    : Master Send No Acknowledge Single
  154. * Input          : None
  155. * Output         : None
  156. * Return         : None
  157. ****************************************************************************** */
  158. void I2C_NoAck(void)
  159. {       
  160.         SCL_L;
  161.         I2C_delay();
  162.         SDA_H;
  163.         I2C_delay();
  164.         SCL_H;
  165.         I2C_delay();
  166.         SCL_L;
  167.         I2C_delay();
  168. }
  169. /*******************************************************************************
  170. * Function Name  : I2C_WaitAck
  171. * Description    : Master Reserive Slave Acknowledge Single
  172. * Input          : None
  173. * Output         : None
  174. * Return         : Wheather         Reserive Slave Acknowledge Single
  175. ****************************************************************************** */
  176. bool I2C_WaitAck(void)          //返回为:=1有ACK,=0无ACK
  177. {
  178.         SCL_L;
  179.         I2C_delay();
  180.         SDA_H;                       
  181.         I2C_delay();
  182.         SCL_H;
  183.         I2C_delay();
  184.         if(SDA_read)
  185.         {
  186.       SCL_L;
  187.           I2C_delay();
  188.       return FALSE;
  189.         }
  190.         SCL_L;
  191.         I2C_delay();
  192.         return TRUE;
  193. }
  194. /*******************************************************************************
  195. * Function Name  : I2C_SendByte
  196. * Description    : Master Send a Byte to Slave
  197. * Input          : Will Send Date
  198. * Output         : None
  199. * Return         : None
  200. ****************************************************************************** */
  201. void I2C_SendByte(u8 SendByte) //数据从高位到低位//
  202. {
  203.     u8 i=8;
  204.     while(i--)
  205.     {
  206.         SCL_L;
  207.         I2C_delay();
  208.       if(SendByte&0x80)
  209.         SDA_H;  
  210.       else
  211.         SDA_L;   
  212.         SendByte<<=1;
  213.         I2C_delay();
  214.                 SCL_H;
  215.         I2C_delay();
  216.     }
  217.     SCL_L;
  218. }  
  219. /*******************************************************************************
  220. * Function Name  : I2C_RadeByte
  221. * Description    : Master Reserive a Byte From Slave
  222. * Input          : None
  223. * Output         : None
  224. * Return         : Date From Slave
  225. ****************************************************************************** */
  226. unsigned char I2C_RadeByte(void)  //数据从高位到低位//
  227. {
  228.     u8 i=8;
  229.     u8 ReceiveByte=0;

  230.     SDA_H;                               
  231.     while(i--)
  232.     {
  233.       ReceiveByte<<=1;      
  234.       SCL_L;
  235.       I2C_delay();
  236.           SCL_H;
  237.       I2C_delay();       
  238.       if(SDA_read)
  239.       {
  240.         ReceiveByte|=0x01;
  241.       }
  242.     }
  243.     SCL_L;
  244.     return ReceiveByte;
  245. }
  246. //ZRX         
  247. //单字节写入*******************************************

  248. bool Single_Write(unsigned char SlaveAddress,unsigned char REG_Address,unsigned char REG_data)                     //void
  249. {
  250.           if(!I2C_Start())return FALSE;
  251.     I2C_SendByte(SlaveAddress);   //发送设备地址+写信号//I2C_SendByte(((REG_Address & 0x0700) >>7) | SlaveAddress & 0xFFFE);//设置高起始地址+器件地址
  252.     if(!I2C_WaitAck()){I2C_Stop(); return FALSE;}
  253.     I2C_SendByte(REG_Address );   //设置低起始地址      
  254.     I2C_WaitAck();       
  255.     I2C_SendByte(REG_data);
  256.     I2C_WaitAck();   
  257.     I2C_Stop();
  258.     delay5ms();
  259.     return TRUE;
  260. }

  261. //单字节读取*****************************************
  262. unsigned char Single_Read(unsigned char SlaveAddress,unsigned char REG_Address)
  263. {   unsigned char REG_data;            
  264.         if(!I2C_Start())return FALSE;
  265.     I2C_SendByte(SlaveAddress); //I2C_SendByte(((REG_Address & 0x0700) >>7) | REG_Address & 0xFFFE);//设置高起始地址+器件地址
  266.     if(!I2C_WaitAck()){I2C_Stop();test=1; return FALSE;}
  267.     I2C_SendByte((u8) REG_Address);   //设置低起始地址      
  268.     I2C_WaitAck();
  269.     I2C_Start();
  270.     I2C_SendByte(SlaveAddress+1);
  271.     I2C_WaitAck();

  272.         REG_data= I2C_RadeByte();
  273.     I2C_NoAck();
  274.     I2C_Stop();
  275.     //return TRUE;
  276.         return REG_data;

  277. }                                                     
  278. //初始化MPU3050,根据需要请参考pdf进行修改************************
  279. void Init_MPU6050(void)
  280. {
  281.         Single_Write(MPU6050_Addr,PWR_MGMT_1, 0x00);        //解除休眠状态
  282.         Single_Write(MPU6050_Addr,SMPLRT_DIV, 0x07);
  283.         Single_Write(MPU6050_Addr,CONFIG, 0x06);
  284.         Single_Write(MPU6050_Addr,GYRO_CONFIG, 0x18);
  285.         Single_Write(MPU6050_Addr,ACCEL_CONFIG, 0x01);
  286. }
  287. //******读取MPU6050数据****************************************
  288. void READ_MPU6050(void)
  289. {
  290.   BUF[0]=Single_Read(MPU6050_Addr,GYRO_XOUT_L);
  291.        
  292.    BUF[1]=Single_Read(MPU6050_Addr,GYRO_XOUT_H);
  293.    T_X=        (BUF[1]<<8)|BUF[0];
  294.    T_X/=16.4;                                                    //读取计算X轴数据

  295.        
  296.        
  297.          BUF[2]=Single_Read(MPU6050_Addr,GYRO_YOUT_L);
  298.    BUF[3]=Single_Read(MPU6050_Addr,GYRO_YOUT_H);
  299.    T_Y=        (BUF[3]<<8)|BUF[2];
  300.    T_Y/=16.4;                                                    //读取计算Y轴数据
  301.    BUF[4]=Single_Read(MPU6050_Addr,GYRO_ZOUT_L);
  302.    BUF[5]=Single_Read(MPU6050_Addr,GYRO_ZOUT_H);
  303.    T_Z=        (BUF[5]<<8)|BUF[4];
  304.    T_Z/=16.4;                                                //读取计算Z轴数据

  305.   // BUF[6]=Single_Read(MPU6050_Addr,TEMP_OUT_L);
  306.   // BUF[7]=Single_Read(MPU6050_Addr,TEMP_OUT_H);
  307.   // T_T=(BUF[7]<<8)|BUF[6];
  308.   // T_T = 35+ ((double) (T_T + 13200)) / 280;// 读取计算出温度
  309. }
  310. /*
  311. ********************************************************************************
  312. ** 函数名称 : Delay(vu32 nCount)
  313. ** 函数功能 : 延时函数
  314. ** 输    入        : 无
  315. ** 输    出        : 无
  316. ** 返    回        : 无
  317. ********************************************************************************
  318. */
  319. void Delay(vu32 nCount)
  320. {
  321.   for(; nCount != 0; nCount--);
  322. }

  323. /*
  324. ********************************************************************************
  325. ** 函数名称 : void Delayms(vu32 m)
  326. ** 函数功能 : 长延时函数         m=1,延时1ms
  327. ** 输    入        : 无
  328. ** 输    出        : 无
  329. ** 返    回        : 无
  330. ********************************************************************************
  331. */
  332. void Delayms(vu32 m)
  333. {
  334.   u32 i;
  335.   
  336.   for(; m != 0; m--)       
  337.        for (i=0; i<50000; i++);
  338. }


  339. int main(void)
  340. {
  341.         /* 配置系统时钟为72M */      
  342.   SystemInit();       
  343.        
  344.         /* LED 端口初始化 */
  345.         LED_GPIO_Config();
  346.         USART_Configuration();
  347.         USART_Test();
  348.         I2C_GPIO_Config();                 //配置IIC使用端口
  349.   Delayms(10);                                 //延时
  350.   Init_MPU6050();                     //初始化MPU3050
  351.   while (1)
  352.   {
  353.                 LED1( ON );                          // 亮
  354.                 Delay(0x6FFFEF);
  355.                 LED1( OFF );                  // 灭

  356.                 LED2( ON );
  357.                 Delay(0x6FFFEF);
  358.                 LED2( OFF );

  359.                 LED3( ON );
  360.                 Delay(0x6FFFEF);
  361.                 LED3( OFF );   
  362.                  
  363.         //USART_SendData(USART1,Single_Read(MPU6050_Addr,0x75));
  364.         USART_SendData(USART1,Single_Read(MPU6050_Addr,TEMP_OUT_H));
  365.         USART_SendData(USART1,Single_Read(MPU6050_Addr,TEMP_OUT_L));        
  366.         //        READ_MPU6050();                 //读取MPU3050数据
  367.         /*        printf("X:%d\r\n",T_X);//转换X轴数据到数组
  368.                 printf("Y:%d\r\n",T_Y);;//转换Y轴数据到数组
  369.                 printf("Z:%d\r\n",T_Z);;//转换Z轴数据到数组
  370.                 printf("T:%d\r\n",T_T);//转换温度数据到数组
  371.         */
  372.   }
  373. }

复制代码

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2013-8-10 11:35:00 | 显示全部楼层
读控制寄存器的值都是正确的,就是我设置的值。但是读加速度计陀螺仪的寄存器就是读不到值!

出0入0汤圆

发表于 2013-8-12 16:05:07 | 显示全部楼层
一上来就看见这么多代码,大家的热心锐减

出0入0汤圆

 楼主| 发表于 2013-8-13 07:22:27 | 显示全部楼层
问题解决了。是模块有个悬空引脚和一个有用的脚连在一起。焊开就好了

出0入0汤圆

发表于 2013-10-15 11:50:17 | 显示全部楼层
楼主,你的哪两个脚焊到一起了会有这种情况,我的现在总是有一个轴Y周的加速度值一直读到为0不变,其他5个值都是对的,请问是何原因,换了好几个模块都是这样的。

出0入0汤圆

 楼主| 发表于 2013-10-15 23:45:19 | 显示全部楼层
ycysky 发表于 2013-10-15 11:50
楼主,你的哪两个脚焊到一起了会有这种情况,我的现在总是有一个轴Y周的加速度值一直读到为0不变,其他5个 ...

没印象了,是没有接进电路的两个脚。重新补焊一下焊开就好了

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-4 04:24

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

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