精华内容
下载资源
问答
  • MPU6050原始数据分析

    2016-05-11 09:45:24
    MPU6050原始数据分析
  • 利用瑞萨代码生成器生成的IICA0,可以读取出MPU6050原始数据
  • 在STM32F103C8T6使用标准IIC协议读取MPU6050原始数据,并打印原始数据
  • 基于STM32的MPU6050原始数据的获取
  • MPU6050原始数据获取源码
  • MPU6050原始数据分析——学习笔记个人学习笔记MPU6050简介原始数据分析加速度计陀螺仪 个人学习笔记 用于记录自己学习的成果,并且分享给大家一起看看。希望对看到这篇的朋友有所帮助。 MPU6050简介 MPU-6050是一款6...

    个人学习笔记

    用于记录自己学习的成果,并且分享给大家一起看看。希望对看到这篇的朋友有所帮助。

    MPU6050简介

    MPU-6050是一款6轴运动处理组件,将陀螺仪和加速度计合在一起,减少了大量封装空间,还是很不错的。如果连接三轴的磁强计,那就成九轴了。MPU6050用的是IIC通信,想要了解更多的话,直接点击下方链接(省的打字搜索)
    link

    原始数据分析

    加速度计

    数据手册描述如下:
    Accelerometer Features
    The triple-axis MEMS accelerometer in MPU-60X0 includes a wide range of features:
     Digital-output triple-axis accelerometer with a programmable full scale range of ±2g, ±4g, ±8g and ±16g
     Integrated 16-bit ADCs enable simultaneous sampling of accelerometers while requiring no external
    multiplexer
     Accelerometer normal operating current: 500µA
     Low power accelerometer mode current: 10µA at 1.25Hz, 20µA at 5Hz, 60µA at 20Hz, 110µA at
    40Hz
     Orientation detection and signaling
     Tap detection
     User-programmable interrupts
     High-G interrupt
     User self-test
    应用时处理数据我们需要知道 16-bit ADCs(读出的数据应该在-32768~32767),同时设置不同的量程 ±2g, ±4g, ±8g and ±16g
    根据需求选取量程,量程选取越小,精度越高,量程较大时精度不如小量程。
    设x轴加速度原始数据为ADCx,假设此时量程选取为±4g,则原始数据转换公式为 (4g * ADCx)/32768
    下方笔记有兴趣可以看看,比较简略。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    陀螺仪

    数据手册的描述如下:
    Gyroscope Features
    The triple-axis MEMS gyroscope in the MPU-60X0 includes a wide range of features:
     Digital-output X-, Y-, and Z-Axis angular rate sensors (gyroscopes) with a user-programmable fullscale range of ±250, ±500, ±1000, and ±2000°/sec
     External sync signal connected to the FSYNC pin supports image, video and GPS synchronization
     Integrated 16-bit ADCs enable simultaneous sampling of gyros
     Enhanced bias and sensitivity temperature stability reduces the need for user calibration
     Improved low-frequency noise performance
     Digitally-programmable low-pass filter
     Gyroscope operating current: 3.6mA
     Standby current: 5µA
     Factory calibrated sensitivity scale factor
     User self-test
    应用时处理数据我们需要知道 16-bit ADCs(读出的数据应该在-32768~32767),同时设置不同的量程 ±250, ±500, ±1000, and ±2000°/sec
    陀螺仪提供的是三轴角速度
    根据需求选取量程,量程选取越小,精度越高,量程较大时精度不如小量程。
    设x轴角速度原始数据为ADCx,假设此时量程选取为±2000dps(degree per second),则原始数据转换公式为 (2000 * ADCx)/32768
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    代码

    下面展示一些 MPU6050原始数据处理代码,没几行,主要是试试这个功能,第一次用CSDN写东西
    代码不完整,变量、子函数什么的自己看着补吧。。。

    unsigned char MPU6050_Init(void)
    {
        int  res;
        res = MPU_Read_Byte(MPU6050_ADDR,WHO_AM_I);           //读取MPU6050的ID
        if(res == MPU6050_ID)                                 //器件ID正确
        {
        	;
        }
        else
        {
            return 1;
        }
    
        res = 0;
        res += MPU_Write_Byte(MPU6050_ADDR,MPU_PWR_MGMT1_REG,0X80);//复位MPU6050
        delayms_mpu(100);  //延时100ms
        res += MPU_Write_Byte(MPU6050_ADDR,MPU_PWR_MGMT1_REG,0X00);//唤醒MPU6050
        res += MPU_Set_Gyro_Fsr(3);					        	   //陀螺仪传感器,±2000dps
        res += MPU_Set_Accel_Fsr(1);					       	   //加速度传感器,±4g
        res += MPU_Set_Rate(1000);						       	   //设置采样率1000Hz
        res += MPU_Write_Byte(MPU6050_ADDR,MPU_CFG_REG,0x02);      //设置数字低通滤波器   98hz
        res += MPU_Write_Byte(MPU6050_ADDR,MPU_INT_EN_REG,0X00);   //关闭所有中断
        res += MPU_Write_Byte(MPU6050_ADDR,MPU_USER_CTRL_REG,0X00);//I2C主模式关闭
        res += MPU_Write_Byte(MPU6050_ADDR,MPU_PWR_MGMT1_REG,0X01);//设置CLKSEL,PLL X轴为参考
        res += MPU_Write_Byte(MPU6050_ADDR,MPU_PWR_MGMT2_REG,0X00);//加速度与陀螺仪都工作
    
        if(res == 0)  //上面寄存器都写入成功
        {
            ;
        }
        else return 1;
    
        return 0;
    }
    
    void MPU6050(void)
    {
        MPU_Get_Raw_data(&Accel_x,&Accel_y,&Accel_z,&Gyro_x,&Gyro_y,&Gyro_z);	//得到加速度传感器数据
            ax = (4*9.8*Accel_x)/32768;
            ay = (4*9.8*Accel_y)/32768;
            az = (4*9.8*Accel_z)/32768;
            Gyro_x = (2000*Gyro_x)/32768;
            Gyro_y = (2000*Gyro_y)/32768;
            Gyro_z = (2000*Gyro_z)/32768;
    
        	//用加速度计算三个轴和水平面坐标系之间的夹角
        	Angle_x_temp=(atan(ay/az))*180/3.14;
        	Angle_y_temp=(atan(ax/az))*180/3.14;
    
        	Kalman_Filter_X(Angle_x_temp,Gyro_x);  //卡尔曼滤波计算X倾角
        	Kalman_Filter_Y(Angle_y_temp,Gyro_y);  //卡尔曼滤波计算Y倾角
    }
    
    展开全文
  • MPU6050原始数据对应关系 1.陀螺仪 如下图, 陀螺仪范围 陀螺仪的范围有±250、±500、±2000可选,而对应的精度分别是131LSB/(°/s)、65.5LSB/(°/s)、32.8LSB/(°/s)、16.4 LSB/(°/s) a.那么这个精度和范围的关系...

    MPU6050原始数据对应关系
    1.陀螺仪

    如下图,

    陀螺仪范围

    陀螺仪的范围有±250、±500、±2000可选,而对应的精度分别是131LSB/(°/s)、65.5LSB/(°/s)、32.8LSB/(°/s)、16.4 LSB/(°/s)

    a.那么这个精度和范围的关系是什么?
    首先MPU6050数据寄存器是一个16位的,由于最高位是符号位,故而数据寄存器的输出范围是-7FFF~7FFF ,也既是-32767~32767;

    b.如果选择陀螺仪范围是±2000,那么意味着-32767对应的是-2000(°/s),32767对应是2000(°/s),当读取陀螺仪的值是1000的,对应的角速度计算如下:32767/2000 =1000/x; 既x = 1000/16.4(°/s),可以看出32767/2000 = 16.4 ,对应手册中的精度 16.4 LSB/(°/s),其他范围的也是如此。

    c.在四轴姿态计算中,我们通常要把角度换算成弧度。我们知道2Pi代表360度,那么1度换算成弧度就是:
    2Pi/360=(2*3.1415926)/360=0.0174532=1/57.30。

    d.总结:当量程为-2000到+2000的范围,把陀螺仪获取的数据转换为真正的弧度每秒的公式:(gyro_x来代表从陀螺仪读到的数据): gyro_x/(16.4057.30)=gyro_x0.001064,单位为弧度每秒。

    2.加速度计

    如下图

    加速度计

    采用和陀螺仪同样的计算方法,当AFS_SEL=3时,数字-32767对应-16g,32767对应16g。把32767除以16,就可以得到2048, 即我们说的灵敏度。把从加速度计读出的数字除以2048,就可以换算成加速度的数值。举个例子,如果我们从加速度计读到的数字是1000,那么对应的加速度数据是1000/2048=0.49g。g为加速度的单位,重力加速度定义为1g, 等于9.8米每平方秒。

    展开全文
  • mpu6050原始数据采集

    2015-08-12 22:24:37
    基于stm32f103 对mpu6050原始数据采集 并通过串口在串口工具中显示
  • 使用stm32f103vet6硬件iic读取mpu6050原始数据并显示在led屏上使用stm32f103vet6硬件iic读取mpu6050原始数据并显示在led屏上
  • 单片机采集的MPU6050原始数据对应关系

    万次阅读 多人点赞 2017-04-08 15:00:04
    单片机采集的MPU6050原始数据对应关系1.陀螺仪如下图,陀螺仪的范围有±250、±500、±2000可选,而对应的精度分别是131LSB/(°/s)、65.5LSB/(°/s)、32.8LSB/(°/s)、16.4 LSB/(°/s)a.那么这个精度和范围的关系是...

    单片机采集的MPU6050原始数据对应关系

    1.陀螺仪

    如下图,

    陀螺仪范围

    陀螺仪的范围有±250、±500、±2000可选,而对应的精度分别是131LSB/(°/s)、65.5LSB/(°/s)、32.8LSB/(°/s)、16.4 LSB/(°/s)

    a.那么这个精度和范围的关系是什么?
    首先MPU6050数据寄存器是一个16位的,由于最高位是符号位,故而数据寄存器的输出范围是-7FFF~7FFF ,也既是-32767~32767;

    b.如果选择陀螺仪范围是±2000,那么意味着-32767对应的是-2000(°/s),32767对应是2000(°/s),当读取陀螺仪的值是1000的,对应的角速度计算如下:32767/2000 =1000/x; 既x = 1000/16.4(°/s),可以看出32767/2000 = 16.4 ,对应手册中的精度 16.4 LSB/(°/s),其他范围的也是如此。

    c.在四轴姿态计算中,我们通常要把角度换算成弧度。我们知道2Pi代表360度,那么1度换算成弧度就是:
    2Pi/360=(2*3.1415926)/360=0.0174532=1/57.30。

    d.总结:当量程为-2000到+2000的范围,把陀螺仪获取的数据转换为真正的弧度每秒的公式:(gyro_x来代表从陀螺仪读到的数据): gyro_x/(16.40*57.30)=gyro_x*0.001064,单位为弧度每秒。

    2.加速度计

    如下图

    加速度计

    采用和陀螺仪同样的计算方法,当AFS_SEL=3时,数字-32767对应-16g,32767对应16g。把32767除以16,就可以得到2048, 即我们说的灵敏度。把从加速度计读出的数字除以2048,就可以换算成加速度的数值。举个例子,如果我们从加速度计读到的数字是1000,那么对应的加速度数据是1000/2048=0.49g。g为加速度的单位,重力加速度定义为1g, 等于9.8米每平方秒。

    展开全文
  • 我们用模拟IIC来控制MPU6050。 首先初始化MPU6050。 关于IIC的code部分大家应该都很熟悉。 这里给大家看下我们读取的时序。 /*单字节写*/ u8 MPU_Write_Byte(u8 reg,u8 data) { MPU_IIC_Start(); MPU...

    原理图待补XXXXXXXXXXXXX。

    我们用模拟IIC来控制MPU6050。

    首先初始化MPU6050。

    关于IIC的code部分大家应该都很熟悉。

    这里给大家看下我们读取的时序。

    /*单字节写*/
    u8 MPU_Write_Byte(u8 reg,u8 data) 				 
    { 
        MPU_IIC_Start(); 
    	MPU_IIC_Send_Byte((MPU_ADDR<<1)|0);
    	if(MPU_IIC_Wait_Ack())	
    	{
    		MPU_IIC_Stop();		 
    		return 1;		
    	}
        MPU_IIC_Send_Byte(reg);	
        MPU_IIC_Wait_Ack();		
    	MPU_IIC_Send_Byte(data);
    	if(MPU_IIC_Wait_Ack())	
    	{
    		MPU_IIC_Stop();	 
    		return 1;		 
    	}		 
        MPU_IIC_Stop();	 
    	return 0;
    }
    
    
    /*单字节读*/
    u8 MPU_Read_Byte(u8 reg)
    {
    	u8 res;
        MPU_IIC_Start(); 
    	MPU_IIC_Send_Byte((MPU_ADDR<<1)|0);
    	//MPU_IIC_Wait_Ack();		
        if(MPU_IIC_Wait_Ack())
            return 0;
        MPU_IIC_Send_Byte(reg);	
        //MPU_IIC_Wait_Ack();		
        if(MPU_IIC_Wait_Ack())
            return 1;
        MPU_IIC_Start();
    	MPU_IIC_Send_Byte((MPU_ADDR<<1)|1);	
        //MPU_IIC_Wait_Ack();		
        if(MPU_IIC_Wait_Ack())
            return 2;
    	res=MPU_IIC_Read_Byte(0);
        MPU_IIC_Stop();			
    	return res;		
    }
    
    /*多字节写*/
    u8 MPU_Write_Len(u8 addr,u8 reg,u8 len,u8 *buf)
    {
    	u8 i; 
        MPU_IIC_Start(); 
    	MPU_IIC_Send_Byte((addr<<1)|0);//·¢ËÍÆ÷¼þµØÖ·+дÃüÁî	
    	if(MPU_IIC_Wait_Ack())	//µÈ´ýÓ¦´ð
    	{
    		MPU_IIC_Stop();		 
    		return 1;		
    	}
        MPU_IIC_Send_Byte(reg);	//д¼Ä´æÆ÷µØÖ·
        MPU_IIC_Wait_Ack();		//µÈ´ýÓ¦´ð
    	for(i=0;i<len;i++)
    	{
    		MPU_IIC_Send_Byte(buf[i]);	//·¢ËÍÊý¾Ý
    		if(MPU_IIC_Wait_Ack())		//µÈ´ýACK
    		{
    			MPU_IIC_Stop();	 
    			return 1;		 
    		}		
    	}    
        MPU_IIC_Stop();	 
    	return 0;	
    } 
    
    /*多字节读*/
    u8 MPU_Read_Len(u8 addr,u8 reg,u8 len,u8 *buf)
    { 
     	MPU_IIC_Start(); 
    	MPU_IIC_Send_Byte((addr<<1)|0);//·¢ËÍÆ÷¼þµØÖ·+дÃüÁî	
    	if(MPU_IIC_Wait_Ack())	//µÈ´ýÓ¦´ð
    	{
    		MPU_IIC_Stop();		 
    		return 1;		
    	}
        MPU_IIC_Send_Byte(reg);	//д¼Ä´æÆ÷µØÖ·
        MPU_IIC_Wait_Ack();		//µÈ´ýÓ¦´ð
        MPU_IIC_Start();
    	MPU_IIC_Send_Byte((addr<<1)|1);//·¢ËÍÆ÷¼þµØÖ·+¶ÁÃüÁî	
        MPU_IIC_Wait_Ack();		//µÈ´ýÓ¦´ð 
    	while(len)
    	{
    		if(len==1)*buf=MPU_IIC_Read_Byte(0);//¶ÁÊý¾Ý,·¢ËÍnACK 
    		else *buf=MPU_IIC_Read_Byte(1);		//¶ÁÊý¾Ý,·¢ËÍACK  
    		len--;
    		buf++; 
    	}    
        MPU_IIC_Stop();	//²úÉúÒ»¸öÍ£Ö¹Ìõ¼þ 
    	return 0;	
    }
    

     

    准备工作做好,接下来是Init MPU6050

    u8 MPU_Init(void)
    { 
    	u8 res;
    
    	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(3);					//设置陀螺仪分辨率,±2000dps
    	MPU_Set_Accel_Fsr(0);					//设置加速计分辨率,±2g
    	MPU_Set_Rate(50);						//设置采样速率
    	MPU_Write_Byte(MPU_INT_EN_REG,0X00);	//关闭所有中断
    	MPU_Write_Byte(MPU_USER_CTRL_REG,0X00);	//IIC自主模式关闭
    	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,注意这里不是从地址
    	{
            printf(">>> MPU6050 Init Success! <<<\r\n");
    		MPU_Write_Byte(MPU_PWR_MGMT1_REG,0X01);	//设置CLKSEL,PLL,X轴为参考
    		MPU_Write_Byte(MPU_PWR_MGMT2_REG,0X00);	//加速计与陀螺仪都工作
    		MPU_Set_Rate(50);						//再次设置采样速率
     	}else 
        {
            printf(">>> MPU6050 Init Failed! <<<\r\n");
            return 1;
        }
    	return 0;
    }

    具体函数的实现:

    /*设置陀螺仪分辨率*/
    u8 MPU_Set_Gyro_Fsr(u8 fsr)
    {
    	return MPU_Write_Byte(MPU_GYRO_CFG_REG,fsr<<3);//ÉèÖÃÍÓÂÝÒÇÂúÁ¿³Ì·¶Î§  
    }
    
    
    u8 MPU_Set_Accel_Fsr(u8 fsr)
    {
    	return MPU_Write_Byte(MPU_ACCEL_CFG_REG,fsr<<3);//ÉèÖüÓËٶȴ«¸ÐÆ÷ÂúÁ¿³Ì·¶Î§  
    }
    
    
    /*设置低通滤波*/
    u8 MPU_Set_LPF(u16 lpf)
    {
    	u8 data=0;
    	if(lpf>=188)data=1;
    	else if(lpf>=98)data=2;
    	else if(lpf>=42)data=3;
    	else if(lpf>=20)data=4;
    	else if(lpf>=10)data=5;
    	else data=6; 
    	return MPU_Write_Byte(MPU_CFG_REG,data);//ÉèÖÃÊý×ÖµÍͨÂ˲¨Æ÷  
    }
    
    /*设置采样速率(假定Fs=1KHz)*/
    u8 MPU_Set_Rate(u16 rate)
    {
    	u8 data;
    	if(rate>1000)rate=1000;
    	if(rate<4)rate=4;
    	data=1000/rate-1;
    	data=MPU_Write_Byte(MPU_SAMPLE_RATE_REG,data);	//ÉèÖÃÊý×ÖµÍͨÂ˲¨Æ÷
     	return MPU_Set_LPF(rate/2);	//×Ô¶¯ÉèÖÃLPFΪ²ÉÑùÂʵÄÒ»°ë
    }
    
    
    /*获取温度,这个可以不用*/
    short MPU_Get_Temperature(void)
    {
        u8 buf[2]; 
        short raw;
    	float temp;
    	MPU_Read_Len(MPU_ADDR,MPU_TEMP_OUTH_REG,2,buf); 
        raw=((u16)buf[0]<<8)|buf[1];  
        temp=36.53+((double)raw)/340;  
        return temp*100;;
    }
    
    /*获取陀螺仪3轴原始值*/
    u8 MPU_Get_Gyroscope(short *gx,short *gy,short *gz)
    {
        u8 buf[6],res;  
    	res=MPU_Read_Len(MPU_ADDR,MPU_GYRO_XOUTH_REG,6,buf);
    	if(res==0)
    	{
    		*gx=((u16)buf[0]<<8)|buf[1];  
    		*gy=((u16)buf[2]<<8)|buf[3];  
    		*gz=((u16)buf[4]<<8)|buf[5];
    	} 	
        return res;;
    }
    
    /*获取加速计3轴原始值*/
    u8 MPU_Get_Accelerometer(short *ax,short *ay,short *az)
    {
        u8 buf[6],res;  
    	res=MPU_Read_Len(MPU_ADDR,MPU_ACCEL_XOUTH_REG,6,buf);
    	if(res==0)
    	{
    		*ax=((u16)buf[0]<<8)|buf[1];  
    		*ay=((u16)buf[2]<<8)|buf[3];  
    		*az=((u16)buf[4]<<8)|buf[5];
    	} 	
        return res;;
    }

    设置完成后就可以读取到陀螺仪的原始值了。

    欢迎大家批评指正。可以加QQ:727169295,一起交流学习~~~

    展开全文
  • 【硬件】NodeMCU 1.0(ESP-12E Module)、MPU6050六轴陀螺仪【软件】ArduinoIDE(开发板库ESP8266 Boards 2.5.2)【接线图】NodeMCU默认情况下I2C接口为D1(SCL)、D2(SDA)还可以在开启 I2C 总线(主设备)时指定...
  • 用STM32实现MPU6050原始数据的读取

    千次阅读 2019-10-22 13:57:22
    STM32+MPU6050读取加速度计和陀螺仪原始数据
  • 本范例是根据STC的开源四轴项目为基础,提取的单独读取MPU6050的六轴数据
  • MPU6050原始数据的获取

    千次阅读 2018-02-12 15:32:00
    MPU6050采用IIC通讯,IIC通讯的结构如下图 IIC 即Inter-Integrated Circuit(集成电路总线),这种总线类型是由飞利浦半导体公司在八十年代初设计出来的一种简单、双向、二线制、同步串行总线,主要是用来连接整体...
  • 修改书《嵌入式Linux系统设计及应用-基于国产龙芯SOCV2.3.0》中IIC的例子,获取MPU6050数据。 1.连线方式,MPU6050的AD0连接GND,SDA连接P00,SCL连接P01。 2.注册新设备。使用i2c_new _device方法。文件保存...
  • STM32通过IIC读取MPU6050数据过程详解 一:硬件介绍 此款MPU6050是通过IIC来与MCU通信的,它有两个IIC接口,第一个是SCL和SDA与主IIC通信;第二个是AUX_CL和AUX_DA,这个接口可用来连接外部从设备,比如磁传感器,...
  • 微型四轴设计之通过arduino读取MPU6050原始数据

    千次阅读 热门讨论 2018-03-31 20:55:02
    主控板打算使用stm32,此处使用arduino来读取mpu6050只是为了便于开发和调试(arduino的串口监视器用起来很方便,便于打印输出调试信息到电脑),同时熟悉一下mpu6050的使用流程。 开发环境 操作系统:...
  • CC2540读取MPU6050原始数据

    千次阅读 2015-11-07 17:26:01
    MPU-60X0 是全球首例9 轴运动处理传感器。它集成了3 轴MEMS 陀螺仪,3 轴MEMS加速度计,以及一个可扩展的数字运动处理器DMP(Digital Motion Processor),可用I2C接口连接一个第三方的数字传感器,比如磁力...

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 161
精华内容 64
关键字:

mpu6050原始数据