搜索
bottom↓
回复: 15

【求助】MPU9150读磁力计数据问题

[复制链接]

出0入0汤圆

发表于 2015-6-8 00:18:42 | 显示全部楼层 |阅读模式
本帖最后由 zhongjiequan 于 2015-6-8 00:19 编辑

我对mpu9150开了I2C pass-by模式,能读出AK8976的ID,但写测量命令后,还是无法读出磁力计数据
写自检命令,却能读到磁力的自检。。。

以下我mpu9150的代码
  1.         mpu6050_reset(mpu9150_device.i2c_bus);
  2.         mpu9150_delay_ms(100);

  3.         mpu6050_set_sleep_enabled(mpu9150_device.i2c_bus,RT_FALSE);// Activate MPU6050
  4.         mpu6050_set_temp_sensor_enabled(mpu9150_device.i2c_bus,RT_TRUE);// Enable temp sensor
  5.         mpu6050_set_int_enabled(mpu9150_device.i2c_bus,RT_FALSE);// Disable interrupts
  6.        

  7.         mpu6050_set_rate(mpu9150_device.i2c_bus,1);
  8.         mpu6050_set_DLFP_mode(mpu9150_device.i2c_bus,MPU6050_DLPF_BW_188);// Set digital low-pass bandwidth
  9.         mpu6050_set_clock_source(mpu9150_device.i2c_bus,MPU6050_CLOCK_PLL_XGYRO);// Set x-axis gyro as clock source
  10.         mpu6050_set_full_scale_gyro_range(mpu9150_device.i2c_bus,MPU6050_GYRO_FS_2000);// Set gyro full scale range
  11.         mpu6050_set_full_scale_accel_range(mpu9150_device.i2c_bus,MPU6050_ACCEL_FS_16);// Set accelerometer full scale range
  12.        
  13.         mpu6050_set_I2C_bypass_enabled(mpu9150_device.i2c_bus,RT_TRUE);
  14.        
  15.         rt_kprintf("ak8975_get_device_ID = 0x%2x\n",ak8975_get_device_ID(mpu9150_device.i2c_bus));
  16.         ak8975_set_operation_mode(mpu9150_device.i2c_bus,AK8975_CNTL_MODE_SINGLE);
  17.         rt_int16_t gx,gy,gz,ax,ay,az,mx,my,mz;
  18.         rt_uint8_t flag;
  19.         while(1)
  20.         {
  21.                 flag = ak8975_get_data_ready(mpu9150_device.i2c_bus);
  22.                 rt_kprintf("ak8975_get_data_ready = 0x%2x\n",flag);
  23.                 mpu6050_set_I2C_bypass_enabled(mpu9150_device.i2c_bus,RT_FALSE);
  24.                 if(flag == 0x01)
  25.                 {
  26.                         ak8975_get_magnetometer(mpu9150_device.i2c_bus,&mx,&my,&mz);
  27.                         rt_kprintf("mx=%d,my=%d,mz=%d\n",mx,my,mz);
  28.                         ak8975_set_operation_mode(mpu9150_device.i2c_bus,AK8975_CNTL_MODE_SINGLE);
  29.                
  30.                 }
  31.                 rt_thread_delay(100);
  32.         }
复制代码

出0入0汤圆

 楼主| 发表于 2015-6-10 16:54:35 | 显示全部楼层
自己顶一下,就没人懂???

出0入0汤圆

发表于 2015-6-13 12:07:27 | 显示全部楼层
http://bbs.21ic.com/icview-605405-1-1.html  你可以看看这贴怎样

出0入0汤圆

发表于 2015-6-15 13:55:36 | 显示全部楼层
楼主你好,这几天我也在弄mpu915的磁力计部分,差不多也遇到跟你相似的问题。我9150里关于6050的数据是能读出来的,但是按照网上说的去读取磁力计,就只有2个值,要么是0要么是-256.这是我的代码,希望能有大神来给我们这种菜鸟指点一二,在这里万分感谢
  1. void MPU6050_Init()
  2. {
  3.         IIC_Init();
  4.        
  5.         //device init
  6.         IIC_Write_Data(MPU6050_Addr,PWR_MGMT_1,0x00);       
  7.         IIC_DelayMs(20);

  8.         IIC_Write_Data(MPU6050_Addr,PWR_MGMT_1,0x03);       
  9.         IIC_Write_Data(MPU6050_Addr,CONFIG_MPU6050,0x02);
  10.         IIC_Write_Data(MPU6050_Addr,SMPLRT_DIV,0x00);
  11.         IIC_Write_Data(MPU6050_Addr,GYRO_CONFIG,0x18);
  12.         IIC_Write_Data(MPU6050_Addr,ACCEL_CONFIG,0x08);
  13.        
  14.         //IIC_Write_Data(MPU6050_Addr,PWR_MGMT_1,0x00);
  15.         //IIC_Write_Data(MPU6050_Addr,SMPLRT_DIV,0x07);
  16.         //IIC_Write_Data(MPU6050_Addr,CONFIG, 0x06);

  17.         IIC_Write_Data(MPU6050_Addr,INT_PIN_CFG,0x02);
  18.         IIC_Write_Data(MPU6050_Addr,USER_CTRL,0x00);
  19.         IIC_Write_Data(MAGADD,CNTL, 0x00);
  20.         IIC_DelayMs(2);
  21.         IIC_Write_Data(MAGADD,CNTL, 0x01);
  22.        
  23.         //IIC_Read_Data_N(MAGADD,0X10,3,mag_sens_adj);
  24.        
  25. }
  26. uint16_t MPU6050_Read(unsigned char REG_Address)
  27. {
  28.         uint8_t H,L;
  29.         uint16_t temp;
  30.         H=IIC_Read_Data(MPU6050_Addr,REG_Address);
  31.         L=IIC_Read_Data(MPU6050_Addr,REG_Address+1);
  32.         temp= (H<<8)|L ;   
  33.         return temp;
  34. }

  35. uint16_t COMPASS_Read(unsigned char REG_Address)
  36. {
  37.         uint8_t H,L;
  38.         uint16_t temp;
  39.        

  40.         H=IIC_Read_Data(MAGADD,REG_Address);       
  41.         IIC_Write_Data(MAGADD,CNTL, 0x01);       
  42.         L=IIC_Read_Data(MAGADD,REG_Address-1);       
  43.         IIC_Write_Data(MAGADD,CNTL, 0x01);
  44.        
  45.        
  46.         temp= (H<<8)|L ;   
  47.        
  48.         return temp;
  49. }


  50. void MPU6050_CONVENT()
  51. {
  52.         ACC.X=MPU6050_Read(ACCEL_XOUT_H)-ACC_OFFSET.X;
  53.         ACC.Y=MPU6050_Read(ACCEL_YOUT_H)-ACC_OFFSET.Y;
  54.         ACC.Z=MPU6050_Read(ACCEL_ZOUT_H)-ACC_OFFSET.Z;
  55.        
  56.         GYR_RATE.X=MPU6050_Read(GYRO_XOUT_H);
  57.         GYR_RATE.Y= MPU6050_Read(GYRO_YOUT_H);
  58.         GYR_RATE.Z=MPU6050_Read(GYRO_ZOUT_H);
  59.        
  60.         COMPASS.X=COMPASS_Read(HXH);
  61.         COMPASS.Y=COMPASS_Read(HYH);
  62.         COMPASS.Z=COMPASS_Read(HZH);
  63.        
  64.         //COMPASS.X=((long)COMPASS.X * mag_sens_adj[0]) >> 8;
  65.         //COMPASS.Y=((long)COMPASS.X * mag_sens_adj[1]) >> 8;
  66.         //COMPASS.Z=((long)COMPASS.X * mag_sens_adj[2]) >> 8;
  67.        
  68.         GYR.X= GYR_RATE.X-GYR_OFFSET.X;
  69.         GYR.Y= GYR_RATE.Y-GYR_OFFSET.Y;
  70.         GYR.Z= GYR_RATE.Z-GYR_OFFSET.Z;
  71.        
  72.        
  73.        
  74. }
复制代码

出0入0汤圆

发表于 2015-6-15 13:59:06 | 显示全部楼层
  1. #define        SMPLRT_DIV                0x19        //ÍÓÂÝÒDzÉÑùÂÊ£¬µäÐÍÖµ£º0x07(125Hz)
  2. #define        CONFIG_MPU6050                          0x1A        //µÍͨÂ˲¨ÆµÂÊ£¬µäÐÍÖµ£º0x06(5Hz)
  3. #define        GYRO_CONFIG                0x1B        //ÍÓÂÝÒÇ×Լ켰²âÁ¿·¶Î§£¬µäÐÍÖµ£º0x18(²»×Լ죬2000deg/s)
  4. #define        ACCEL_CONFIG        0x1C        //¼ÓËÙ¼Æ×Լ졢²âÁ¿·¶Î§¼°¸ßͨÂ˲¨ÆµÂÊ£¬µäÐÍÖµ£º0x01(²»×Լ죬2G£¬5Hz)

  5. #define        ACCEL_XOUT_H        0x3B
  6. #define        ACCEL_XOUT_L        0x3C

  7. #define        ACCEL_YOUT_H        0x3D
  8. #define        ACCEL_YOUT_L        0x3E

  9. #define        ACCEL_ZOUT_H        0x3F
  10. #define        ACCEL_ZOUT_L        0x40

  11. #define        TEMP_OUT_H                0x41
  12. #define        TEMP_OUT_L                0x42

  13. #define        GYRO_XOUT_H                0x43
  14. #define        GYRO_XOUT_L                0x44       

  15. #define        GYRO_YOUT_H                0x45
  16. #define        GYRO_YOUT_L                0x46

  17. #define        GYRO_ZOUT_H                0x47
  18. #define        GYRO_ZOUT_L                0x48

  19. #define        PWR_MGMT_1                0x6B        //µçÔ´¹ÜÀí£¬µäÐÍÖµ£º0x00(Õý³£ÆôÓÃ)
  20. #define        WHO_AM_I                0x75        //IICµØÖ·¼Ä´æÆ÷(ĬÈÏÊýÖµ0x68£¬Ö»¶Á)

  21. //#define        SMPLRT_DIV                0x19        //??????,???:0x07(125Hz)
  22. #define        CONFIG                        0x1A        //??????,???:0x06(5Hz)
  23. #define HXL             0X03
  24. #define HXH             0X04
  25. #define HYL             0X05
  26. #define HYH             0X06
  27. #define HZL             0X07
  28. #define HZH             0X08
  29. #define CNTL            0X0A
  30. #define INT_PIN_CFG                0X37
  31. #define USER_CTRL       0X6A
  32. #define MPU9150SLAADD   0XD0

  33. #define MAGADD                        0X18
  34. //#define        PWR_MGMT_1                0x6B        //????,???:0x00(????)

  35. #define        WHO_AM_I                        0x75        //IIC?????(????0x68,??)
  36. //****************************

  37. #define        MPU6050_Addr   0xD0          //¶¨ÒåÆ÷¼þÔÚIIC×ÜÏßÖеĴӵØÖ·,¸ù¾ÝALT  ADDRESSµØÖ·Òý½Å²»Í¬ÐÞ¸Ä
复制代码

出0入0汤圆

 楼主| 发表于 2015-6-15 16:02:52 | 显示全部楼层

啥意思?

出0入0汤圆

 楼主| 发表于 2015-6-15 16:03:35 | 显示全部楼层
Timingtime 发表于 2015-6-13 12:07
http://bbs.21ic.com/icview-605405-1-1.html  你可以看看这贴怎样

看过,不能解决我的问题

出0入0汤圆

发表于 2015-6-15 16:25:52 | 显示全部楼层
zhongjiequan 发表于 2015-6-15 16:03
看过,不能解决我的问题

看过,没啥用,找了几个程序安照他们的配置,compass.x输出的值要么是0要么是-256,没啥用。严重怀疑我芯片是不是出问题了,或者接线不对(只接了SCL   SDA  VCC GND)。真心感觉没啥问题
  1.         IIC_Write_Data(MPU6050_Addr,PWR_MGMT_1,0x01);       
  2.         IIC_Write_Data(MPU6050_Addr,CONFIG_MPU6050,0x03);
  3.         IIC_Write_Data(MPU6050_Addr,GYRO_CONFIG,0x18);
  4.         IIC_Write_Data(MPU6050_Addr,ACCEL_CONFIG,0x08);
  5.         IIC_Write_Data(MPU6050_Addr,INT_PIN_CFG,0x32);
  6.         IIC_Write_Data(MPU6050_Addr,USER_CTRL,0x00);
  7.         IIC_DelayMs(10);
  8.        
  9.         IIC_Write_Data(MAGADD,CNTL, 0x01);
  10.         IIC_DelayMs(10);
复制代码

出0入0汤圆

发表于 2015-6-15 20:32:19 来自手机 | 显示全部楼层
每读一次地磁三个轴数据,都得写一次CNTL为0x01,不知楼主写了没?

出0入0汤圆

发表于 2015-6-15 20:39:45 来自手机 | 显示全部楼层
还有,地磁传感器的数据读取周期不能小于7ms。亲测8毫秒是可以的

出0入0汤圆

 楼主| 发表于 2015-6-16 17:50:40 | 显示全部楼层
恋芜 发表于 2015-6-15 20:32
每读一次地磁三个轴数据,都得写一次CNTL为0x01,不知楼主写了没?

有写,也等了10ms。可是。。。哎

出0入0汤圆

发表于 2015-6-17 19:50:47 | 显示全部楼层
我发了一个开源帖子,看能解决你的问题不【开源】模拟IIC读取MPU9250九轴+温度数据

出0入0汤圆

发表于 2015-8-5 17:25:08 | 显示全部楼层
CC2541软件模拟i2c读取没问题,但是硬件i2c读取加速计和陀螺仪没有问题,磁力计数据有问题,
要么不对要么读不出来!

出0入0汤圆

发表于 2015-8-6 15:30:41 | 显示全部楼层
问题已经解决,噢耶!

出0入0汤圆

 楼主| 发表于 2015-8-7 16:07:36 | 显示全部楼层
maskblue 发表于 2015-8-6 15:30
问题已经解决,噢耶!

敢问是怎么解决的

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-5 15:03

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

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