精华内容
下载资源
问答
  • MPU6050初始化失败

    2021-04-24 13:51:48
    MPU6050初始化失败 osDelay(1000); //上电 uint8_t mpu_ok = MPU_init(); uint8_t cnt = 0; while(cnt++ < 3&& !mpu_ok) //多次进行初始化 { osDelay(500); mpu_ok = MPU_init(); }

    MPU6050初始化失败

    osDelay(1000); //上电
    uint8_t mpu_ok = MPU_init();
    uint8_t cnt = 0;
    while(cnt++ < 3&& !mpu_ok) //多次进行初始化
    {
    osDelay(500);
    mpu_ok = MPU_init();
    }

    展开全文
  • 移植正点原子mpu6050代码,总是MPU6050初始化失败解决 首先观察正点原子MPU6050代码,发现它在读取MPU6050数据的同时,还将数据通过串口发送给上位机进行调试,而我们移植mpu6050,只是单纯的想读取MUP6050的数据,...

    移植正点原子mpu6050代码,总是MPU6050初始化失败解决

    首先观察正点原子MPU6050代码,发现它在读取MPU6050数据的同时,还将数据通过串口发送给上位机进行调试,而我们移植mpu6050,只是单纯的想读取MUP6050的数据,不需要串口部分,问题就出在串口发送数据这。下面我将详细的讲解:(库函数)
    我们在移植代码的时候,只移植MPU6050的代码,这样当然没什么问题,我也是这样移植的,移植之后再修改主函数,将串口及LCD显示的一些函数给删掉,删掉之后的代码我就用我的主函数作为示例,我使用的是oled进行显示,示例如下:

    #include "led.h"
    #include "delay.h"
    #include "key.h"
    #include "sys.h"
    #include "usart.h"
    #include "mpu6050.h" 
    #include "inv_mpu.h"
    #include "inv_mpu_dmp_motion_driver.h" 
    #include "oled.h"
    
    char oledBuf[20];
     	
     int main(void)
     {	 
    	float pitch,roll,yaw; 		//欧拉角
    	short aacx,aacy,aacz;		//加速度传感器原始数据
    	short gyrox,gyroy,gyroz;	//陀螺仪原始数据	 
    	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    	delay_init();	//延时初始化 
    	LED_Init();		  			//初始化与LED连接的硬件接口
    	KEY_Init();					//初始化按键 
    	MPU_Init();					//初始化MPU6050
    	while(mpu_dmp_init())
        {
        }
        OLED_Init();			//初始化OLED  
        OLED_Clear(); 
     	while(1)
    	{	
    		while(mpu_dmp_get_data(&pitch,&roll,&yaw)==0)
    		{		
    			MPU_Get_Accelerometer(&aacx,&aacy,&aacz);	//得到加速度传感器数据
    			MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);	//得到陀螺仪数据
            }
    		delay_ms(100);       
            sprintf(oledBuf,"%d",gyrox);
            OLED_ShowString(0,4,(u8*)oledBuf,16);
            sprintf(oledBuf,"%d",gyroy);
            OLED_ShowString(48,4,(u8*)oledBuf,16);
            sprintf(oledBuf,"%d",gyroz);//得到陀螺仪数据
            OLED_ShowString(96,4,(u8*)oledBuf,16);
            sprintf(oledBuf,"%.1lf",pitch);
            OLED_ShowString(0,6,(u8*)oledBuf,16);
            sprintf(oledBuf,"%.1lf",roll);
            OLED_ShowString(48,6,(u8*)oledBuf,16);
            sprintf(oledBuf,"%.1lf",yaw);
            OLED_ShowString(96,6,(u8*)oledBuf,16);//得到欧拉角数据			
    	} 	
    }
    

    在修改主函数之后,将程序烧录进自己的板子,发现程序不执行,显示屏无显示。
    经过筛查之后,发现mpu_dmp_init()这个函数中的mpu_init()这个函数初始化失败。
    在mpu_init()这个函数中,将蓝颜色方框的代码屏蔽掉,问题自然就解决了。
    在这里插入图片描述

    展开全文
  • MPU6050初始化失败 错误代码8

    千次阅读 2021-02-24 21:32:48
    MPU6050是一款6轴(三轴加速度+三轴角速度)姿态...直说吧,MPU6050初始化失败且错误代码8,原因是因为MPU的DMP驱动程序是用的InvenSense Corporation官方的代码,而官方代码中初始化要求模块必须平放 下面给出理由:

    MPU6050是一款6轴(三轴加速度+三轴角速度)姿态传感器。

    最近需要用到这款传感器,但在使用过程中发现模块DMP初始化总是失败,网上查资料有的说使模块坏了,也有的说是模块出厂漏焊了两个电容,但总觉的这类说法有问题,因为有时候模块可以正常初始化。最终在网上看到一个大神说初始化的时候把模块放平可以解决问题,亲测有效。

    直说吧,MPU6050初始化失败且错误代码8,原因是因为MPU的DMP驱动程序是用的InvenSense Corporation官方的代码,而官方代码中初始化要求模块必须平放
    下面给出理由:
    选中初始化代码mpu_dmp_init();按下F12,追溯DMP初始代码是inv_mpu.c下的一个功能段,代码如下:

    u8 mpu_dmp_init(void)
    {
    	u8 res=0;
    	MPU_IIC_Init(); 	//初始化IIC总线
    	if(mpu_init()==0)	//初始化MPU6050
    	{
    		res=mpu_set_sensors(INV_XYZ_GYRO|INV_XYZ_ACCEL);//设置所需要的传感器
    		if(res)return 1; 
    		res=mpu_configure_fifo(INV_XYZ_GYRO|INV_XYZ_ACCEL);//设置FIFO
    		if(res)return 2; 
    		res=mpu_set_sample_rate(DEFAULT_MPU_HZ);	//设置采样率
    		if(res)return 3; 
    		res=dmp_load_motion_driver_firmware();		//加载dmp固件
    		if(res)return 4; 
    		res=dmp_set_orientation(inv_orientation_matrix_to_scalar(gyro_orientation));//设置陀螺仪方向
    		if(res)return 5; 
    		res=dmp_enable_feature(DMP_FEATURE_6X_LP_QUAT|DMP_FEATURE_TAP|	//设置dmp功能
    		    DMP_FEATURE_ANDROID_ORIENT|DMP_FEATURE_SEND_RAW_ACCEL|DMP_FEATURE_SEND_CAL_GYRO|
    		    DMP_FEATURE_GYRO_CAL);
    		if(res)return 6; 
    		res=dmp_set_fifo_rate(DEFAULT_MPU_HZ);	//设置DMP输出速率(最大不超过200Hz)
    		if(res)return 7;   
    		res=run_self_test();		//自检
    		if(res)return 8;    
    		res=mpu_set_dmp_state(1);	//使能DMP
    		if(res)return 9;     
    	}else return 10;
    	return 0;
    }
    

    该程序是MPU6050模块的DMP初始化代码,我自己初始化的时候,总是报错,错误代码返回数字8,即res=run_self_test(); if(res)return 8;
    自检失败,选中run_self_test(); 继续追溯,追溯代码为与前段代码同 .c 文件下的程序,程序如下:

    u8 run_self_test(void)
    {
    	int result;
    	//char test_packet[4] = {0};
    	long gyro[3], accel[3]; 
    	result = mpu_run_self_test(gyro, accel);
    	if (result == 0x3) 
    	{
    		/* Test passed. We can trust the gyro data here, so let's push it down
    		* to the DMP.
    		*/
    		float sens;
    		unsigned short accel_sens;
    		mpu_get_gyro_sens(&sens);
    		gyro[0] = (long)(gyro[0] * sens);
    		gyro[1] = (long)(gyro[1] * sens);
    		gyro[2] = (long)(gyro[2] * sens);
    		dmp_set_gyro_bias(gyro);
    		mpu_get_accel_sens(&accel_sens);
    		accel[0] *= accel_sens;
    		accel[1] *= accel_sens;
    		accel[2] *= accel_sens;
    		dmp_set_accel_bias(accel);
    		return 0;
    	}else return 1;
    }
    

    选中mpu_run_self_test(gyro, accel);继续追溯,代码仍在上述 .c 文件下,代码及相关注释如下:

    /**
     *  @brief      Trigger gyro/accel/compass self-test.
     *  On success/error, the self-test returns a mask representing the sensor(s)
     *  that failed. For each bit, a one (1) represents a "pass" case; conversely,
     *  a zero (0) indicates a failure.
     *
     *  \n The mask is defined as follows:
     *  \n Bit 0:   Gyro.
     *  \n Bit 1:   Accel.
     *  \n Bit 2:   Compass.
     *
     *  \n Currently, the hardware self-test is unsupported for MPU6500. However,
     *  this function can still be used to obtain the accel and gyro biases.
     *
     *  \n This function must be called with the device either face-up or face-down
     *  (z-axis is parallel to gravity).
     *  @param[out] gyro        Gyro biases in q16 format.
     *  @param[out] accel       Accel biases (if applicable) in q16 format.
     *  @return     Result mask (see above).
     */
    int mpu_run_self_test(long *gyro, long *accel)
    {
    #ifdef MPU6050
        const unsigned char tries = 2;
        long gyro_st[3], accel_st[3];
        unsigned char accel_result, gyro_result;
    #ifdef AK89xx_SECONDARY
        unsigned char compass_result;
    #endif
        int ii;
    #endif
        int result;
        unsigned char accel_fsr, fifo_sensors, sensors_on;
        unsigned short gyro_fsr, sample_rate, lpf;
        unsigned char dmp_was_on;
    
        if (st.chip_cfg.dmp_on) {
            mpu_set_dmp_state(0);
            dmp_was_on = 1;
        } else
            dmp_was_on = 0;
    
        /* Get initial settings. */
        mpu_get_gyro_fsr(&gyro_fsr);
        mpu_get_accel_fsr(&accel_fsr);
        mpu_get_lpf(&lpf);
        mpu_get_sample_rate(&sample_rate);
        sensors_on = st.chip_cfg.sensors;
        mpu_get_fifo_config(&fifo_sensors);
    
        /* For older chips, the self-test will be different. */
    #if defined MPU6050
        for (ii = 0; ii < tries; ii++)
            if (!get_st_biases(gyro, accel, 0))
                break;
        if (ii == tries) {
            /* If we reach this point, we most likely encountered an I2C error.
             * We'll just report an error for all three sensors.
             */
            result = 0;
            goto restore;
        }
        for (ii = 0; ii < tries; ii++)
            if (!get_st_biases(gyro_st, accel_st, 1))
                break;
        if (ii == tries) {
            /* Again, probably an I2C error. */
            result = 0;
            goto restore;
        }
        accel_result = accel_self_test(accel, accel_st);
        gyro_result = gyro_self_test(gyro, gyro_st);
    
        result = 0;
        if (!gyro_result)
            result |= 0x01;
        if (!accel_result)
            result |= 0x02;
    
    #ifdef AK89xx_SECONDARY
        compass_result = compass_self_test();
        if (!compass_result)
            result |= 0x04;
    #endif
    restore:
    #elif defined MPU6500
        /* For now, this function will return a "pass" result for all three sensors
         * for compatibility with current test applications.
         */
        get_st_biases(gyro, accel, 0);
        result = 0x7;
    #endif
        /* Set to invalid values to ensure no I2C writes are skipped. */
        st.chip_cfg.gyro_fsr = 0xFF;
        st.chip_cfg.accel_fsr = 0xFF;
        st.chip_cfg.lpf = 0xFF;
        st.chip_cfg.sample_rate = 0xFFFF;
        st.chip_cfg.sensors = 0xFF;
        st.chip_cfg.fifo_enable = 0xFF;
        st.chip_cfg.clk_src = INV_CLK_PLL;
        mpu_set_gyro_fsr(gyro_fsr);
        mpu_set_accel_fsr(accel_fsr);
        mpu_set_lpf(lpf);
        mpu_set_sample_rate(sample_rate);
        mpu_set_sensors(sensors_on);
        mpu_configure_fifo(fifo_sensors);
    
        if (dmp_was_on)
            mpu_set_dmp_state(1);
    
        return result;
    }
    

    注意:上面代码的注释中,第11行注释
    This function must be called with the device either face-up or face-down
    即初始化必须把模块正面朝上或朝下放置

    展开全文
  • stm32c8t6移植MPU6050总是初始化失败,在自检测试通不过,返回8,网上的解决方法是将MPU6050放置水平,或者握紧杜邦线,但是怎么都不好使。 二、解决方法 查找到一篇文章说是晶振时序的影响,后来下载一个工程对比...

    一、问题

    stm32c8t6移植MPU6050总是初始化失败,在自检测试通不过,返回8,网上的解决方法是将MPU6050放置水平,或者握紧杜邦线,但是怎么都不好使。
    在这里插入图片描述

    二、解决方法

    查找到一篇文章说是晶振时序的影响,后来下载一个工程对比分析发现system_stm32f10x.c在RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9)配置不一样,错误的工程中是 RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLXTPRE_HSE_Div2 | RCC_CFGR_PLLMULL9);
    在这里插入图片描述
    修改为RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9),自检通过。多了RCC_CFGR_PLLXTPRE_HSE_Div2 果然影响时钟。
    这部分代码为外部晶振为8M时的情况:

    /*PLL configuration:PLLCLK = HSE * 9 = 72MHz */
    
        RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLMULL));
    
        RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
    
    /*
    

    修改后的代码对应的外部晶振为8/2=4M:

    RCC->CFGR &= (uint32_t)((uint32_t)~(RCC_CFGR_PLLSRC | RCC_CFGR_PLLXTPRE | RCC_CFGR_PLLXTPRE_HSE_Div2 | RCC_CFGR_PLLMULL));
    
         RCC->CFGR |= (uint32_t)(RCC_CFGR_PLLXTPRE_Div2 | RCC_CFGR_PLLSRC_HSE | RCC_CFGR_PLLMULL9);
    

    通过对比发现,修改后的代码多了一句话RCC_CFGR_PLLXTPRE_Div2。
    RCC_CFGR:时钟配置寄存器,偏移地址为:0x04,复位值为:0x0000 0000。
    PLLXTPRE:PREDIV1分频因子的低位。
    Div2:二分频
    而stm32f10x.h中写的外部晶振HSE的值为8M,所以得到8/2=4M的时钟频率,明显导致IIC通讯异常。
    在这里插入图片描述

    工程下载STM32F103C8T6-MPU6050
    https://download.csdn.net/download/u011463646/19421862

    展开全文
  • MPU6050单轴双浆姿态平衡PID调戏之MPU6050姿态解算这个其实是为了直观的观察PID的调节过程,因为本人对于数学并不擅长,又说PID是比较依赖经验,看着老外搭建了一个实验的设备,我也画了葫芦做了一个。以下是需要的...
  • 关于调试 MPU6050 DMP初始化过不去 总是显示mpu_set_sensor complete 的解决办法 串口总是显示mpu_set_sensor complete这一句话 首先 ,参考了这个博主的解决方法,一个一个排查,但是没有解决。 ...
  • 战舰v3上的p8(2×3的排针)上要将GBX_RX和PB10连接在一起,将GBC_TX和PB11连接在一起
  • mpu6050的DMP初始化不成功的问题

    千次阅读 2019-08-03 16:08:23
    这一点在正点原子的视频中有所提到,杜邦线连接可能不稳。。。 如果是直接插到板子上,那没有问题,程序我就不放了,网上到处都有,我之前的一篇文章主要也是说的6050与...其实很多人搞错了,不是6050初始化有问...
  • 根据MPU6050 DMP官方使用手册进行的中文翻译版本,可能有不太恰当的地方还请多多包涵. 根据MPU6050 DMP官方使用手册进行的中文翻译版本,可能有不太恰当的地方还请多多包涵. 根据MPU6050 DMP官方使用手册进行的中文...
  • 这个其实是为了直观的观察PID的调节过程,因为本人...MPU6050 PCA9685 2个有浆无刷电机(浆要两个不一样的,转的时候要抵消) 编程平台 树莓派运行官方Linux系统,编辑器用交叉编译工具(arm-linux-g++)。 MPU60...
  • MPU6050初始化成功,在自检时,总是失败 问题总结 在RTOS,RTThread中,会在SubSubSubmain()中进行操作系统初始化,∗∗main()中进行操作系统初始化,**main()中进行操作系统初始化,∗∗Sub$$main()在用户main()...
  • * Other: 1.DMP初始化慢,上电后保持8S稳定后才可使用 * 2.有矫正零飘功能,需启用MPU6050_OFFSET_DEBUG宏为1,记录绝对水平面偏置量,并重新写入偏置量宏 * 3.下一版本可能增加依据内部温度芯片修正温飘 * 4.未添加...
  • 对于MPU6050的一些问题汇总

    万次阅读 多人点赞 2018-07-29 13:39:10
    本人大二,这两年才刚接触单片机,这个暑假用MPU6050练习一下I2C通讯,结果I2C还好说,但在使用MPU6050时遇到很多问题,上网查有些问题也没有具体的原因和解决方案。于是有了一个在这里汇总记录一下我遇到的问题和...
  • MPU6050简单初始化步骤如下(仅供参考): 复位MPU6050。配置电源管理寄存器1(0x6B),复位:将bit7写1实现,复位后,默认值0x40,然后设置0x00-->唤醒MPU6050。 选择X/Y/Z其中一个轴作为参考坐标。同样也是...
  • MPU6050电路自检失败解决方案

    千次阅读 2018-11-29 17:25:28
    自己焊接的MPU6050模块在初始化始终不通过。 MPU_Init(); //初始化MPU6050 while(mpu_dmp_init()) { LCD_ShowString(30,130,200,16,16,&quot;MPU6050 Error&quot;); delay_ms(200); LCD_...
  • MPU6050常见问题的分析与处理

    千次阅读 2021-01-25 18:27:13
    # MPU6050常见问题的分析与处理 本文主要针对STM32使用MPU6050过程中产生的问题进行分析和处理,部分内容也适用于其他单片机。本文基于MPU6050自带的DMP算法。文章内容对于MPU6050调试过程有一定的帮助。
  • 本资源是基于山外MK60函数库的MPU6050测试程序,可以用上位机...3、mpu6050在上电初始化时需要4~5s的时间,注意接线,线路松动容易初始化失败 4、mpu6050在初始化时核心板上的led3(蓝灯)点亮,初始化成功则led3熄灭
  • 用STM32实现MPU6050原始数据的读取

    千次阅读 2019-10-22 13:57:22
    STM32+MPU6050读取加速度计和陀螺仪原始数据。
  • MPU6050工作原理及STM32控制MPU6050

    万次阅读 多人点赞 2017-08-01 21:49:48
    要想知道MPU6050工作原理,得先了解下面俩个传感器:①陀螺仪传感器: 陀螺仪的原理就是,一个旋转物体的旋转轴所指的方向在不受外力影响时,是不会改变的。人们根据这个道理,用它来保持方向。然后用多种方法读取...
  • MPU6050/MPU9150传感器的DMP数据读取中遇到的问题总结

    千次阅读 多人点赞 2019-06-01 12:14:03
    MPU6050/MPU9150传感器的DMP数据读取中遇到的问题总结 ...问题1:MPU6050的AD0引脚接了3.3V,器件地址在程序中设置了是0X69,但是初始化不成功? 首先,一般的初始化代码大致如下: //初始化MPU60...
  • 移植正点原子MPU6050工程

    千次阅读 2020-07-13 16:18:34
    1、首先把正点原子MPU6050例程文件夹下 HARDWARE/MPU6050 这个文件夹整个拷贝到我们的工程文件夹里面。...一般经过上面几个步骤就已经移植成功了,不够有时候会出现MPU6050的DMP模式初始化失败的情况
  • 最近在调试MPU6050 DMP功能时出现程序卡在dmp_load_motion_driver_firmware()。 通过多次的插入打印信息发现是memcmp(firmware+ii, cur, this_write)函数数据对比失败,即写入和读取memory的值不匹配。 for (ii ...
  • 《手把手教你学STM32》—MPU6050六轴传感器实验

    万次阅读 多人点赞 2018-10-16 19:14:17
    1.1、MPU6050简介-什么是MPU6050? MPU6050是InvenSense公司推出的全球首款整合性6轴运动处理组件,内带3轴陀螺仪和3轴加速度传感器,并且含有一个第二IIC接口,可用于连接外部磁力传感器,利用自带数字运动处理器...
  • 因为网上关于STM32读取6050的例程并不少但是总会有古怪的问题存在,在尝试读取的过程中在网上逛论坛发现很多问题到最后没结果不了了之,不知那些前辈们是否...除了经常存在的问题如初始化前加延时,mpu坏掉,无法读I
  • MPU6050驱动

    2020-10-28 13:17:54
    使用的模拟IIC接口驱动的MPU6050,最后使用官方的mpu_dmp计算的最终数据存在偏移,估计是没有电子罗盘进行校准,时间长了方向偏移特别严重。 //MPU6050 /*******************************************************...
  • STM32控制MPU6050

    万次阅读 多人点赞 2017-08-02 15:56:52
    STM32控制MPU6050 1.硬件连接 实验采用正点原子公司的 AN1507 ATK-MPU6050 六轴传感器模块 MPU6050 STM32 VCC --> VCC GND --> GND SDA --> PB9 SCL --> PB8 INT -->

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 800
精华内容 320
关键字:

mpu6050初始化失败