前提:
我使用的是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++:
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
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/
編譯代碼前請先詳讀所有的註釋
我使用的是 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]
//读出后再设置
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;
数据手册为:
我已解决!!!
一周热门 更多>