MPU6050 自检

2019-08-14 16:47发布

我想检测MPU6050X轴陀螺仪的误差,于是我用正点原子的初始化程序,然后按照手册先配置陀螺仪的量程为+/-250dps,然后配置地址为0x0d的SELF_TESTX寄存器,写入值为0x0f,再配置地址为0x1B的GYRO_CONFIG寄存器,写入值为0x80,即打开x轴陀螺仪自检功能,手册翻来翻去,好像没其他寄存器需要配置了,然后我读以上两个寄存器的值,发现配置的值正确写进去了,但是我调试的时候发现不管我给SELF_TESTX寄存器写入多少值,都不影响Gyroscope_Measuermentsc x轴寄存器的输出值!!!按手册的理解,我给寄存器SELF_TESTX写入一定的值,并且使能GYRO_CONFIG寄存器的情况下,会在MPU6050内部产生一个作用力产生内部位移偏差,从而影响Gyroscope_Measuermentsc寄存器的输出值才对啊!!!但是值一直是固定值,除非我把寄存器GYRO_CONFIGX轴自检使能位设置为0,即关掉自检功能,x轴输出值才改变。可是这样无法测量STR的值啊!!!#include "mpu6050.h"
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "inv_mpu.h"
#include "inv_mpu_dmp_motion_driver.h"
int main(void)
{       
        short aacx,aacy,aacz;
        short gyrox,gyroy,gyroz;
        float pitch,roll,yaw;
        int a;
        Stm32_Clock_Init(9);
        uart_init(72,9600);
        delay_init(72);
        MPU_Init();
        MPU_Write_Byte(MPU_SELF_TESTX_REG,0X0f);//self-test
        delay_ms(10);
        MPU_Write_Byte(MPU_GYRO_CFG_REG,0X80);
        delay_ms(10);
        while(1)
                {
                        MPU_Get_Accelerometer(&aacx,&aacy,&aacz);
                        MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);
                       
                        a=MPU_Read_Byte(MPU_SELF_TESTX_REG);

                        printf("gyrox:%d ",gyrox);
                        printf("a:%d ",a);
                        delay_ms(100);
                       
                }
       
       
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
3条回答
2576936901
2019-08-14 18:08
黄文戈 发表于 2017-8-9 17:44
解除休眠了吗?采样率什么的配置了吗

u8 MPU_Init(void)
{
        u8 res;
        MPU_IIC_Init();//初始化IIC总线
        MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X80);        //复位MPU6050
    delay_ms(100);
        MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X00);        //唤醒MPU6050
        MPU_Set_Gyro_Fsr(0);                                        //陀螺仪传感器,±250dps       
        MPU_Set_Accel_Fsr(0);                                        //加速度传感器,±2g
        MPU_Set_Rate(50);                                                //设置采样率50Hz
        MPU_Write_Byte(MPU_INT_EN_REG,0X00);        //关闭所有中断
        MPU_Write_Byte(MPU_USER_CTRL_REG,0X00);        //I2C主模式关闭
        MPU_Write_Byte(MPU_FIFO_EN_REG,0X00);        //关闭FIFO
        MPU_Write_Byte(MPU_INTBP_CFG_REG,0X80);        //INT引脚低电平有效
        res=MPU_Read_Byte(MPU_DEVICE_ID_REG);
       

       
        if(res==MPU_ADDR)//器件ID正确
        {
                MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01);        //设置CLKSEL,PLL X轴为参考
                MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00);        //加速度与陀螺仪都工作
                MPU_Set_Rate(50);                                                //设置采样率为50Hz
        }else return 1;
        return 0;
}

一周热门 更多>