使用mpu6050和hmc5883l集成的9轴芯片测量数据,如果开启了DMP驱动,就没法获得hmc的数据了,只能获得mpu6050相关数据?

2019-10-16 06:18发布

前提:
       我使用的是mpu6050和hmc5883l集成的9轴芯片LEADIY D3B芯片。
       芯片内部的hmc5883l的SCL和SDA线是连接在mpu6050的AUX_CL和AUX_DA上的,所以我在初始化mpu6050的时候关闭了I2C主模式,并且设置中断/旁路设置寄存器使他开启Bypass功能,使mpu6050可以通过I2C辅助总线直接访问HMC5883l。

问题:
       当我不开启DMP驱动(即没有进行mpu_dmp_init()),直接只是测量mpu6050的三轴加速度和角速度,以及hmc5883l的三轴磁分量。测量数据输出正常。
     但是当我卡其DMP驱动,则hmc5883l就无法输出了,三轴磁分量都是为一个很小的定值不变,而且每次reset这三个定值也不变。

     以上配置mpu6050和开启DMP驱动的方法,都是移植原子哥的代码,自己只不过加了开启hmc5883l的代码。在不开启DMP的时候hmc5883l输出正常,但开启DMP,就不正常了,所以问题应噶是出在DMP这一块,是不是在驱动DMP的时候关闭了Bypass功能,使mpu6050不能通过I2C辅助总线直接访问HMC5883l还是其他原因?应该怎么改呢?
     求助大神应该怎么在开启DMP的功能的基础上,让hmc的功能也实现。


不开启DMP时,主程序代码:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 
uart_init(115200); 
delay_init(); 
usmart_dev.init(72); 
KEY_Init();
LED_Init();     
MPU_Init(); 
 init_hmc5883l();
while(1)
{
if((t%1000)==0)

temp=MPU_Get_Temperature(); 
 MPU_Get_Accelerometer(&aacx,&aacy,&aacz);
 MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);
 get_hmc5883l(&bbx,&bby,&bbz,&angle);           //以上四句为获得数据

print_HMC5883L(&bbx,&bby,&bbz,&angle);
 MPU_show_Gyroscope(&gyrox,&gyroy,&gyroz);
MPU_show_Accelerometer(&aacx,&aacy,&aacz);    //以上三句为打印数据
delay_ms(500);
 t=0;
 LED0=!LED0;
}
t++:
}

开启DMP时代码:
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 
uart_init(115200); 
delay_init(); 
usmart_dev.init(72); 
KEY_Init();
LED_Init();     
MPU_Init(); 
 init_hmc5883l();
while(mpu_dmp_init())                        
 {
   printf("MPUdmp6050 Error ");
   delay_ms(200);
 }  

while(1)
{
if(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
{

if((t%1000)==0)

temp=MPU_Get_Temperature(); 
 MPU_Get_Accelerometer(&aacx,&aacy,&aacz);
 MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);
 get_hmc5883l(&bbx,&bby,&bbz,&angle);           //以上四句为获得数据

print_HMC5883L(&bbx,&bby,&bbz,&angle);
 MPU_show_Gyroscope(&gyrox,&gyroy,&gyroz);
MPU_show_Accelerometer(&aacx,&aacy,&aacz);    //以上三句为打印数据
delay_ms(500);
 t=0; 
 LED0=!LED0; 
}
}

t++:
}



友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
正点原子
1楼-- · 2019-10-16 11:16
帮顶。。。。
jdwang1000
2楼-- · 2019-10-16 12:47
請參考國外這一帖有完美的解決方案

Attached File  MPU6050_DMP_mag.zip   5.4KB   2884 downloads 
 
http://www.i2cdevlib.com/forums/topic/111-arduino-example-sketch-to-read-magnetometer-while-dmp-is-on/
jdwang1000
3楼-- · 2019-10-16 14:45
 精彩回答 2  元偷偷看……
jdwang1000
4楼-- · 2019-10-16 17:36

編譯代碼前請先詳讀所有的註釋


我使用的是 Arduino nano 所以第 132 行


  //TWBR = 24; // 400kHz I2C clock (200kHz if CPU is 8MHz)  //This line should be commented if you are using Arduino DUE


應取消註釋改程如下


[mw_shl_code=c,true]void setup() { // join I2C bus (I2Cdev library doesn't do this automatically) #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE Wire.begin(); // ************************************************************** // It is best to configure I2C to 400 kHz. // If you are using an Arduino DUE, modify the variable TWI_CLOCK to 400000, defined in the file: // c:/Program Files/Arduino/hardware/arduino/sam/libraries/Wire/Wire.h // If you are using any other Arduino instead of the DUE, uncomment the following line: TWBR = 24; // 400kHz I2C clock (200kHz if CPU is 8MHz) //This line should be commented if you are using Arduino DUE // ************************************************************** #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE Fastwire::setup(400, true); #endif[/mw_shl_code]

jdwang1000
5楼-- · 2019-10-16 18:07
由於我尚未入門 STM 所以如何修改代碼移植至 STM 就有勞其他大神了 !!
拓宽灵感
6楼-- · 2019-10-16 22:41
        //以下是开完DMP后 ,重新设置xda,xcl
        //读出后再设置
        u8 temp[1]={0};
        I2C_ByteRead(MPU6050_Addr,MPU_USER_CTRL_REG,1,temp);
        I2C_ByteWrite(MPU6050_Addr,MPU_USER_CTRL_REG,temp[0]&0xfd);         //I2C_MST_EN=0
      
        I2C_ByteRead(MPU6050_Addr,MPU_INTBP_CFG_REG,1,temp);
        I2C_ByteWrite(MPU6050_Addr,MPU_INTBP_CFG_REG,temp[0]|0x02);        // I2C_BYPASS_EN=1;
        
本来不用DMP配置的配置是:
        I2C_ByteWrite(MPU6050_Addr,MPU_USER_CTRL_REG,0X00); //I2C_MST_EN=0
        I2C_ByteWrite(MPU6050_Addr,MPU_INTBP_CFG_REG,0X02);//I2C_BYPASS_EN=1;

数据手册为:
   



我已解决!!!

一周热门 更多>