MPU6050如何电脑进入省电模式黑屏6

查看: 7423|回复: 8
想用MPU6050做步计器,返回的波形眼睛可以看出走的步数,怎样用单片机去判断呢
粉红色的线比较明显,打算分析这条线来得到脚步...求大神。。。。。。。
(32.34 KB, 下载次数: 23)
11:50 上传
粉红色的线比较明显,打算分析这条线来得到脚步...求大神。。。。。。。
呵呵,我想(Ax^2+Ay^2+Az^2)^0.5先取得无方向的运动矢量,再做一个阀值处理,再计数就可以做成一个3D计步器了。
太乱了,幅值差别太大,滤波一下,差不多大小,在阈值判断
ranqingfa 发表于
太乱了,幅值差别太大,滤波一下,差不多大小,在阈值判断
这个貌似不可取,这个阀值怎样去得到呢?
林定祥 发表于
呵呵,我想(Ax^2+Ay^2+Az^2)^0.5先取得无方向的运动矢量,再做一个阀值处理,再计数就可以做成一个3D计步器 ...
3D 计步器??有点不懂可以详细点吗?
通常使用的计步器需要规定方向,如机械式必须保持水平,这样步行时才能保证振子计数。用MPU6050三轴加速度芯片,无论如何什么角度三轴都会有感应,只是必须把三轴感应数据合成一个数,这样计步器无论怎样放置,只要有震动就会感应数据。
晓峰 发表于
这个貌似不可取,这个阀值怎样去得到呢?
先把多维数据映射到单维上。然后低通滤波,然后可以用动态阈值算法。。话说一直在考虑计步器这种东西如果用主成分分析之类的会有啥效果……
你好,我想问下你是如何把接受到的数据转换成波形图的?我是菜鸟,可能问题有点白痴,请见谅
通常使用的计步器需要规定方向,如机械式必须保持水平,这样步行时才能保证振子计数。用MPU6050三轴加速度 ...
朋友,你好。我已經把加速度和陀螺儀的XYZ給求出來了,請問怎樣通過這些數據做出計步器呢
Powered by查看: 12903|回复: 9
MPU6050使用问题
小弟刚拿到6050的芯片,和51单片机开发板连接后,通过串口得到的数据全是 -1,现在不清楚到底是模块本身有问题,还是程序有错误设置。先把程序贴出来,各位大侠帮我看看。
//****************************************
// 定义51单片机端口
//****************************************
sbit& & SCL=P1^0;& & & & & & & & & & & & //IIC时钟引脚定义
sbit& & SDA=P1^1;& & & & & & & & & & & & //IIC数据引脚定义
//****************************************
// 定义MPU6050内部地址
//****************************************
#define& & & & SMPLRT_DIV& & & & & & & & 0x19& & & & //陀螺仪采样率,典型值:0x07(125Hz)
#define& & & & CONFIG& & & & & & & & & & & & 0x1A& & & & //低通滤波频率,典型值:0x06(5Hz)
#define& & & & GYRO_CONFIG& & & & & & & & 0x1B& & & & //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
#define& & & & ACCEL_CONFIG& & & & 0x1C& & & & //加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)
#define& & & & ACCEL_XOUT_H& & & & 0x3B
#define& & & & ACCEL_XOUT_L& & & & 0x3C
#define& & & & ACCEL_YOUT_H& & & & 0x3D
#define& & & & ACCEL_YOUT_L& & & & 0x3E
#define& & & & ACCEL_ZOUT_H& & & & 0x3F
#define& & & & ACCEL_ZOUT_L& & & & 0x40
#define& & & & TEMP_OUT_H& & & & & & & & 0x41
#define& & & & TEMP_OUT_L& & & & & & & & 0x42
#define& & & & GYRO_XOUT_H& & & & & & & & 0x43
#define& & & & GYRO_XOUT_L& & & & & & & & 0x44& & & &
#define& & & & GYRO_YOUT_H& & & & & & & & 0x45
#define& & & & GYRO_YOUT_L& & & & & & & & 0x46
#define& & & & GYRO_ZOUT_H& & & & & & & & 0x47
#define& & & & GYRO_ZOUT_L& & & & & & & & 0x48
#define& & & & PWR_MGMT_1& & & & & & & & 0x6B& & & & //电源管理,典型值:0x00(正常启用)
#define& & & & WHO_AM_I& & & & & & & & 0x75& & & & //IIC地址寄存器(默认数值0x68,只读)
#define& & & & SlaveAddress& & & & 0xD0& & & & //IIC写入时的地址字节数据,+1为读取
//****************************************
//定义类型及变量
//****************************************
uchar dis[6];& & & & & & & & & & & & & & & & & & & & & & & & & & & & //显示数字(-511至512)的字符数组
int& & & & dis_& & & & & & & & & & & & & & & & & & & & & & & & //变量
//int& & & & Temperature,Temp_h,Temp_l;& & & & //温度及高低位数据
//****************************************
//函数声明
//****************************************
void&&delay(unsigned int k);& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //延时& & & & & & & & & & & & & & & & & & & & & & & &
void&&lcd_printf(uchar *s,int temp_data);
//MPU6050操作函数
void&&InitMPU6050();& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //初始化MPU6050
void&&Delay5us();
void&&I2C_Start();
void&&I2C_Stop();
void&&I2C_SendACK(bit ack);
bit& &I2C_RecvACK();
void&&I2C_SendByte(uchar dat);
uchar I2C_RecvByte();
void&&I2C_ReadPage();
void&&I2C_WritePage();
void&&display_ACCEL_x();
void&&display_ACCEL_y();
void&&display_ACCEL_z();
uchar Single_ReadI2C(uchar REG_Address);& & & & & & & & & & & & & & & & & & & & & & & & //读取I2C数据
void&&Single_WriteI2C(uchar REG_Address,uchar REG_data);& & & & //向I2C写入数据
//****************************************
//整数转字符串
//****************************************
void lcd_printf(uchar *s,int temp_data)
& & & & if(temp_data&0)
& & & & & & & & temp_data=-temp_
& & & & & & & & *s='-';
& & & & else *s=' ';
& & & & *++s =temp_data/;
& & & & temp_data=temp_data%10000;& &&&//取余运算
& & & & *++s =temp_data/;
& & & & temp_data=temp_data%1000;& &&&//取余运算
& & & & *++s =temp_data/100+0x30;
& & & & temp_data=temp_data%100;& &&&//取余运算
& & & & *++s =temp_data/10+0x30;
& & & & temp_data=temp_data%10;& && &//取余运算
& & & & *++s =temp_data+0x30; & & & &
//****************************************
void&&SeriPushSend(uchar send_data)
& & SBUF=send_&&
& & & & while(!TI);TI=0;& & & && &
//****************************************
//****************************************
void delay(unsigned int k)& & & &
{& & & & & & & & & & & & & & & & & & & & & & & &
& & & & unsigned int i,j;& & & & & & & & & & & & & & & &
& & & & for(i=0;i&k;i++)
& & & & {& & & & & & & & & & & &
& & & & & & & & for(j=0;j&121;j++);
& & & & }& & & & & & & & & & & & & & & & & & & & & & & &
//**************************************
//延时5微秒(STC90C52RC@12M)
//不同的工作环境,需要调整此函数
//当改用1T的MCU时,请调整此延时函数
//**************************************
void Delay5us()
& & & & _nop_();_nop_();_nop_();_nop_();
& & & & _nop_();_nop_();_nop_();_nop_();
& & & & _nop_();_nop_();_nop_();_nop_();
& & & & _nop_();_nop_();_nop_();_nop_();
& & & & _nop_();_nop_();_nop_();_nop_();
& & & & _nop_();_nop_();_nop_();_nop_();
//**************************************
//I2C起始信号
//**************************************
void I2C_Start()
& & SDA = 1;& && && && && && &&&//拉高数据线
& & SCL = 1;& && && && && && &&&//拉高时钟线
& & Delay5us();& && && && && &&&//延时
& & SDA = 0;& && && && && && &&&//产生下降沿
& & Delay5us();& && && && && &&&//延时
& & SCL = 0;& && && && && && &&&//拉低时钟线
//**************************************
//I2C停止信号
//**************************************
void I2C_Stop()
& & SDA = 0;& && && && && && &&&//拉低数据线
& & SCL = 1;& && && && && && &&&//拉高时钟线
& & Delay5us();& && && && && &&&//延时
& & SDA = 1;& && && && && && &&&//产生上升沿
& & Delay5us();& && && && && &&&//延时
//**************************************
//I2C发送应答信号
//入口参数:ack (0:ACK 1:NAK)
//**************************************
void I2C_SendACK(bit ack)
& & SDA =& && && && && && &//写应答信号
& & SCL = 1;& && && && && && &&&//拉高时钟线
& & Delay5us();& && && && && &&&//延时
& & SCL = 0;& && && && && && &&&//拉低时钟线
& & Delay5us();& && && && && &&&//延时
//**************************************
//I2C接收应答信号
//**************************************
bit I2C_RecvACK()
& & SCL = 1;& && && && && && &&&//拉高时钟线
& & Delay5us();& && && && && &&&//延时
& & CY = SDA;& && && && && && & //读应答信号
& & SCL = 0;& && && && && && &&&//拉低时钟线
& & Delay5us();& && && && && &&&//延时
& & return CY;
//**************************************
//向I2C总线发送一个字节数据
//**************************************
void I2C_SendByte(uchar dat)
& & for (i=0; i&8; i++)& && && &//8位计数器
& && &&&dat &&= 1;& && && && &&&//移出数据的最高位
& && &&&SDA = CY;& && && && && &//送数据口
& && &&&SCL = 1;& && && && && & //拉高时钟线
& && &&&Delay5us();& && && && & //延时
& && &&&SCL = 0;& && && && && & //拉低时钟线
& && &&&Delay5us();& && && && & //延时
& & I2C_RecvACK();
//**************************************
//从I2C总线接收一个字节数据
//**************************************
uchar I2C_RecvByte()
& & uchar dat = 0;
& & SDA = 1;& && && && && && &&&//使能内部上拉,准备读取数据,
& & for (i=0; i&8; i++)& && && &//8位计数器
& && &&&dat &&= 1;
& && &&&SCL = 1;& && && && && & //拉高时钟线
& && &&&Delay5us();& && && && & //延时
& && &&&dat |= SDA;& && && && & //读数据& && && && && &
& && &&&SCL = 0;& && && && && & //拉低时钟线
& && &&&Delay5us();& && && && & //延时
//**************************************
//向I2C设备写入一个字节数据
//**************************************
void Single_WriteI2C(uchar REG_Address,uchar REG_data)
& & I2C_Start();& && && && && && &//起始信号
& & I2C_SendByte(SlaveAddress);& &//发送设备地址+写信号
& & I2C_SendByte(REG_Address);& & //内部寄存器地址,
& & I2C_SendByte(REG_data);& && & //内部寄存器数据,
& & I2C_Stop();& && && && && && & //发送停止信号
//**************************************
//从I2C设备读取一个字节数据
//**************************************
uchar Single_ReadI2C(uchar REG_Address)
& & & & uchar REG_
& & & & I2C_Start();& && && && && && & //起始信号
& & & & I2C_SendByte(SlaveAddress);& & //发送设备地址+写信号
& & & & I2C_SendByte(REG_Address);& &&&//发送存储单元地址,从0开始& & & &
& & & & I2C_Start();& && && && && && & //起始信号
& & & & I2C_SendByte(SlaveAddress+1);&&//发送设备地址+读信号
& & & & REG_data=I2C_RecvByte();& && & //读出寄存器数据
& & & & I2C_SendACK(1);& && && && && & //接收应答信号
& & & & I2C_Stop();& && && && && && &&&//停止信号
& & & & return REG_
//**************************************
//初始化MPU6050
//**************************************
void InitMPU6050()
& & & & Single_WriteI2C(PWR_MGMT_1, 0x00);& & & & //解除休眠状态
& & & & Single_WriteI2C(SMPLRT_DIV, 0x07);
& & & & Single_WriteI2C(CONFIG, 0x06);
& & & & Single_WriteI2C(GYRO_CONFIG, 0x18);
& & & & Single_WriteI2C(ACCEL_CONFIG, 0x01);
//**************************************
//合成数据
//**************************************
int GetData(uchar REG_Address)
& & & & uchar H,L;
& & & & H=Single_ReadI2C(REG_Address);
& & & & L=Single_ReadI2C(REG_Address+1);
& & & & return (H&&8)+L;& &//合成数据
//**************************************
//在1602上显示10位数据
//**************************************
void Display10BitData(int value,uchar x,uchar y)
& & & & lcd_printf(dis, value);& & & & & & & & & & & & //转换数据显示
& & & & for(i=0;i&6;i++)
& && &&&SeriPushSend(dis[i]);
//**************************************
//显示温度
//**************************************
//void display_temp()
//& & & & Temp_h=Single_ReadI2C(TEMP_OUT_H); //读取温度
//& & & & Temp_l=Single_ReadI2C(TEMP_OUT_L); //读取温度
//& & & & Temperature=Temp_h&&8|Temp_l;& &&&//合成温度
//& & & & Temperature = 35+ ((double) (Temperature + 13200)) / 280; // 计算出温度
//& & & & lcd_printf(dis,Temperature);& &&&//转换数据显示
//& & & & DisplayListChar(11,1,dis,4);& &&&//启始列,行,显示数组,显示位数
void init_uart()
& & & & TMOD=0x21;& & & & & & & & & & & & & & & &
& & & & TH1=0& & & & & & & & & & & & & & & &
& & & & TL1=0& & & & & & & &
& & & & & & & &
& & & & SCON=0x50;
& & & & PS=1;& && &//串口中断设为高优先级别
& & & & TR0=1;& & & && & //启动定时器& & & & & & & & & & & &
& & & & TR1=1;
& & & & ET0=1;& &&&//打开定时器0中断& & & & & & & & & & & &
& & & & ES=1;& & & &
& & & & EA=1;
//*********************************************************
//*********************************************************
void main()
& & & & delay(500);& & & & & & & & //上电延时& & & & & & & &
& & & & init_uart();
& & & & InitMPU6050();& & & & //初始化MPU6050
& & & & delay(150);
& & & & while(1)
& & & & & & & & Display10BitData(GetData(ACCEL_XOUT_H),2,0);& & & & //显示X轴加速度
& & & & & & & & Display10BitData(GetData(ACCEL_YOUT_H),7,0);& & & & //显示Y轴加速度
& & & & & & & & Display10BitData(GetData(ACCEL_ZOUT_H),12,0);& & & & //显示Z轴加速度
& & & & & & & & Display10BitData(GetData(GYRO_XOUT_H),2,1);& & & && &&&//显示X轴角速度
& & & & & & & & Display10BitData(GetData(GYRO_YOUT_H),7,1);& & & && &&&//显示Y轴角速度
& & & & & & & & Display10BitData(GetData(GYRO_ZOUT_H),12,1);& & & & //显示Z轴角速度
& & & & & & & & SeriPushSend(0x0d);
& && &&&SeriPushSend(0x0a);//换行,回车
& & & & & & & & delay(100);
本帖最后由 voidgod 于
23:39 编辑
已经解决了,很撞墙的一个狗血问题。搞了半天是排针和芯片的连接不是很好,压紧一点就好了。还以为芯片是坏的。网上买的芯片因为模块和排针是分开的,用的时候要自己插上,所以才出现这种问题。老是怀疑软件有问题,瞎倒腾了两个晚上,硬件这东西真是折磨人。
大神能帮忙详细说下过程么?包括管脚的接法等等,弄了两天了。。真不知道怎么弄,接到的数据全是1.。。。。。。该怎么办啊。。我扣扣,在这回复也行,最后能详细说说,帮帮忙,谢谢啦
6050的数据可以用这个一个串口数据显示软件来显示,安装协议发送,角速度,加速度和角度就能够显示了,测试方便。
专业销售MPU6050/MPU6050C/MPU3050/MPU3050C,香港现货,价格优势,电话:6陈小姐
{嗯,永恒 发表于
大神能帮忙详细说下过程么?包括管脚的接法等等,弄了两天了。。真不知道怎么弄,接到的数据全是1.。。。。 ...
有串口输出的6050模块,还带角度解算输出的:http://item.taobao.com/item.htm?spm=a230r.1.14.29.aLzK5F&id=
可不可以用6050测量出一个角度来,求代码,在线等
好的& &学习l !!!!!!
大神!!!为啥这个程序利用串口显示的时候是乱码呢。。求指导
问个问题,mpu传感器的休眠状态就是只把PWR_MGMT_1的sleep位置1就行了吗?
Powered by我是一个小胖墩
MPU6050应用详解
最近项目上要用到 MPU6050 陀螺仪,以前没有接触过它。虽然在网上很容易就可以找到了需要的代码。实现了一部分功能。但是却还是对陀螺仪的工作原理不太了解,它的代码也需要分析一下,I2C通信、相关寄存器也要熟悉。我看网上多是在Arduino开发板实现的,那么在 C51单片机板上怎么实现呢,又或者 S5PV210 上怎么实现呢?带着这些问题,开始 MPU6050 的开发。一、型号我看了一下型号为 可在官网下载最新的芯片手册和寄存器映射和描述,参看:二、查看芯片手册(1)产品简介MPU-60X0是世界上第一款集成 6 轴MotionTracking设备。它集成了3轴MEMS陀螺仪,3轴MEMS加速度计,以及一个可扩展的数字运动处理器 DMP( DigitalMotion Processor),可用I2C接口连接一个第三方的数字传感器,比如磁力计。扩展之后就可以通过其 I2C或SPI接口输出一个9轴的信号( SPI接口仅在MPU-6000可用)。 MPU-60X0也可以通过其I2C接口连接非惯性的数字传感器,比如压力传感器。MPU-60X0对陀螺仪和加速度计分别用了三个16位的ADC,将其测量的模拟量转化为可输出的数字量。为了精确跟踪快速和慢速的运动,传感器的测量范围都是用户可控的,陀螺仪可测范围为±250, ±500, ±1000, ±2000°/秒( dps),加速度计可测范围为±2, ±4,±8, ±16g。一个片上1024字节的FIFO,有助于降低系统功耗。和所有设备寄存器之间的通信采用 400kHz的 I2C接口或 1MHz的 SPI接口( SPI仅MPU-6000可用)。 对于需要高速传输的应用, 对寄存器的读取和中断可用 20MHz的SPI。另外,片上还内嵌了一个温度传感器和在工作环境下仅有±1%变动的振荡器。芯片尺寸4×4×0.9mm,采用QFN封装(无引线方形封装),可承受最大 10000g的冲击,并有可编程的低通滤波器。关于电源, MPU-60X0可支持 VDD范围 2.5V±5%, 3.0V±5%,或 3.3V±5%。另外MPU-6050还有一个 VLOGIC引脚,用来为 I2C输出提供逻辑电平。 VLOGIC电压可取1.8±5%或者VDD。(2)产品特征数字输出6轴或9轴的旋转矩阵、四元数(quaternion)、欧拉角格式(EulerAngleforma)的融合演算数据。具有131 LSBs/°/sec 敏感度与全格感测范围为±250、 ±500、 ±1000与±2000°/sec 的3轴角速度感测器(陀螺仪)。可程式控制,且程式控制范围为±2g、 ±4g、 ±8g和±16g的3轴加速器。移除加速器与陀螺仪轴间敏感度,降低设定给予的影响与感测器的飘移。数字运动处理(DMP:DigitalMotion Processing)引擎可减少复杂的融合演算数据、 感测器同步化、 姿势感应等的负荷。 运动处理数据库支持 Android、 Linux与Windows 内建之运作时间偏差与磁力感测器校正演算技术,免除了客户须另外进行校正的需求。以数位输出的温度传感器以数位输入的同步引脚(Syncpin)支援视频电子影相稳定技术与GPS可程式控制的中断(interrupt)支援姿势识别、摇摄、画面放大缩小、滚动、快速下降中断、 high-G中断、零动作感应、触击感应、摇动感应功能。VDD供电电压为2.5V±5%、 3.0V±5%、 3.3V±5%; VDDIO为1.8V±5%陀螺仪运作电流: 5mA, 陀螺仪待命电流: 5uA; 加速器运作电流: 500uA, 加速器省电模式电流: 40uA@10Hz高达 400kHz 快速模式的 I2C,或最高至 20MHz 的 SPI 串行主机接口(serial hostinterface)内建振荡器在工作温度范围内仅有±1%频率变化。 可选外部时钟输入 32.768kHz或19.2MHz(3)使用说明《1》引脚输出和信号描述《2》典型用法《3》所需电容规格需要了解的小知识点:电容的基本单位是F(法拉),其它单位还有:毫法(mF)、微法(uF)、纳法(nF)、皮法(pF)。由于单位F 的容量太大,所以我们看到的一般都是μF、nF、pF的单位。换算:1F=1000000μF,1μF=1000nF=1000000pF电容规格:Ceramic, X7R, 0.1μF ±10%, 2V
是什么意思呢?参看:Ceramic陶瓷介质X7R温度系数/特性:工作温度范围 -55℃~125℃ (军工级)
元器件级别主要是指其工作温度范围,如下:
商业级:0℃~+70℃
工业级:-40℃~+85℃
汽车级:-40℃~125℃
军品级:-55℃~+125℃0.1μF ±10%0.1μF 容量,容差是±10%2V额定电压,以此也可以选择电容尺寸三、电路图到此,硬件部分看完了!!/////////////////////////////////////////////////////////////////////上面简单的介绍了 MPU6050,里面有好多概念不明白,3轴、6轴、9轴、加速度计、磁力针、DMP等等。都是什么玩意。。。啊!!这道题我不会做,太难了!带着这些问题,继续看芯片手册。一、概述MPU-60X0由以下几个关键块和功能组成:1、带有16位ADC和信号调理的三轴MEMS速率陀螺仪传感器2、具有16位ADC和信号调理的三轴MEMS加速度传感器3、数字运动处理器(DMP)引擎4、主I2C和SPI(仅MPU-6000)串行通信接口5、用于第三方磁力计和其他传感器的辅助I2C串行接口6、时钟7、传感器数据寄存器8、FIFO9、中断10、数字输出温度传感器11、陀螺仪和加速度计自检12、偏见和LDO13、充电泵其系统结构图:接下来就一一的开始看。二、带有16位ADC和信号调理的三轴MEMS陀螺仪MPU-60X0由三个独立的振动速率陀螺仪组成,可检测旋转角度X轴,Y轴和Z轴。 当陀螺仪围绕任何感应轴旋转时,就会产生电容式传感器检测到的振动。 所得到的信号被放大,解调和滤波产生与角速度成比例的电压。 该电压使用单独的片内数字化16位模数转换器(ADC)对每个轴进行采样。 陀螺仪传感器可以全面范围的被数字编程为每秒±250,±500,±1000或±2000度(dps)。 ADC样本速率可以从每秒8,000个采样点编程到每秒3.9个采样点,并且可由用户选择低通滤波器可实现广泛的截止频率。三、具有16位ADC和信号调理的三轴MEMS加速度计MPU-60X0的3轴加速度计为每个轴使用单独的检测质量。 加速沿着一条特定轴在相应的检测质量上引起位移,并且电容式传感器检测到该位移位移有差别。 MPU-60X0的架构降低了加速度计的敏感度制造变化以及热漂移。 当设备放置在平坦的表面上时,将进行测量在X和Y轴上为 0g,在Z轴上为+ 1g。 加速度计的比例因子在工厂进行校准并且在名义上与电源电压无关。 每个传感器都有一个专用的来提供数字输出。 数字输出的满量程范围可以调整到±2g,±4g,±8g或±16g。四、数字运动处理器(DMP)嵌入式数字运动处理器(DMP)位于MPU-60X0内部,可从主机处理器中卸载运动处理算法的运算。 DMP从加速度计,陀螺仪以及其他第三方传感器(如磁力计)获取数据,并处理数据。结果数据可以从DMP的寄存器中读取,或者可以在FIFO中缓冲。 DMP可以访问其中的一个MPU的外部引脚,可用于产生中断。DMP的目的是卸载主机处理器的时序要求和处理能力。通常,运动处理算法应该以高速运行,通常在200Hz左右,以提供低延迟的精确结果。即使应用程序以更低的速率更新,这也是必需的。例如,一个低功率的用户界面可能会以5Hz的速度更新,但运动处理仍然应该以200Hz运行。 DMP可以作为一种工具使用,以最大限度地降低功耗,简化定时,简化软件架构,并在主机处理器上节省宝贵的MIPS,以便在应用中使用。五、主要 I2C 和 SPI 串行通信接口MPU-60X0使用 SPI(仅MPU-6000)或 I2C 串行通信至系统处理器接口。 与系统处理器通信时,MPU-60X0始终充当从属设备。 LSB的 I2C 从地址的地址由引脚9(AD0)设置(一般接地)。MPU-60X0与其主机之间的通信逻辑电平如下:
MPU-6000:与主机通信的逻辑电平由VDD上的电压设置
MPU-6050:与主机通信的逻辑电平由VLOGIC上的电压设置六、辅助I2C串行接口MPU-60X0 具有一个辅助 I2C 总线,用于与片外3轴数字输出磁力计进行通信或其他传感器。 两种工作模式:I2C Master Mode,此时MPU-60X0作为主设备与外接传感器通信; Pass-Through Mode, 此时仅用作连接, 允许MPU和外接传感器同时和芯片通信。因为我没有用到磁力针,这部分不详讲。到此就搞清楚了:GY-521MPU6050 是三维角度传感器,为全球首例集成六轴传感器的运动处理组件。这里的六轴,代表的是它内置了一个三轴 MEMS 陀螺仪、一个三轴 MEMS 加速度计,一个数字运动处理引擎(DMP)。它还有用于第三方的数字传感器接口的辅助 I2C 串行接口,比如当辅助 I2C 串行接口连接到一个三轴磁力计,MPU6050 能提供一个完整的九轴融合输出到其主 I2C 端口。 下图标明了传感器的参考坐标系( XYZ组成右手系)以及 3个测量轴和旋转方向。旋转的正向可用右手螺旋定则判断
七、内部时钟生成MPU-60X0具有灵活的时钟方案,允许多种内部或外部时钟源用于内部同步电路。这个同步电路包括信号调理和ADC,DMP以及各种控制电路和寄存器。片内PLL提供了灵活性允许输入产生这个时钟。产生内部时钟的允许的内部源是:
内部张弛振荡器
任何X,Y或Z陀螺(在整个温度范围内变化±1%的MEMS振荡器)允许的外部时钟源是:
32.768kHz方波
19.2MHz方波生成内部同步时钟源的选择取决于外部的可用性来源以及对功耗和时钟精度的要求。这些要求将是最多的可能因操作模式而异。例如,在一种模式中,最关心的是电量消耗,用户可能希望操作MPU-60X0的数字运动处理器进行处理加速计数据,同时保持陀螺仪关闭。在这种情况下,内部张弛振荡器是一个好时钟选择。但是,在另一种陀螺仪激活的模式下,选择陀螺仪作为时钟源提供更精确的时钟源。时钟精度非常重要,因为时序误差直接影响数字运动处理器(以及任何处理器的扩展)执行的距离和角度计算。还有启动条件要考虑。当MPU-60X0首次启动时,设备使用其内部时钟,直到编程从另一个来源操作。这允许用户例如等待使MEMS振荡器在被选为时钟源之前稳定下来。八、传感器数据寄存器传感器数据寄存器包含最新的陀螺仪,加速度计,辅助传感器和温度测量数据。 它们是只读寄存器,可通过串行接口访问。 这些寄存器的数据可以随时读取。 但是,可以使用中断函数来确定新数据何时可用。九、FIFOMPU-60X0包含一个可通过串行接口访问的1024字节FIFO寄存器。 FIFO配置寄存器决定哪个数据写入FIFO。 可能的选择包括陀螺仪数据,加速计数据,温度读数,辅助传感器读数和 FSYNC 输入。 FIFO 计数器跟踪 FIFO 中包含的有效数据字节数。 FIFO寄存器支持突发读取。 中断功能可用于确定新数据何时可用。十、中断中断功能通过中断配置寄存器进行配置。 可配置的项目包括INT引脚配置,中断锁存和清除方法以及中断触发器。 可触发中断的项目有:(1)时钟发生器锁定到新的参考振荡器(用于切换时钟源); (2)可以读取新数据(来自FIFO和数据寄存器); (3)加速度计事件中断; (4)MPU-60X0 没有收到辅助传感器的确认I2C总线。 中断状态可以从中断状态寄存器读取。十一、数字输出温度传感器片上温度传感器和ADC用于测量MPU-60X0芯片温度。 ADC的读数可以从FIFO或传感器数据寄存器读取。十二、偏压和LDO偏压和LDO部分产生MPU-60X0所需的内部电源和参考电压和电流。 其两个输入是一个2.375至3.46V的未调整VDD和一个1.71V至VDD(仅MPU-6050)的VLOGIC逻辑参考电源电压。 在REGOUT,LDO输出被一个电容旁路。十三、电荷泵板载电荷泵产生MEMS振荡器所需的高电压。 其输出在CPOUT旁边被一个电容旁路。
MPU6050原理详解及实例应用
Arduino教程:MPU6050的数据获取、分析与处理
STM32控制MPU6050
MPU6050 加速计滤波
mpu6050参数获取
mpu6050的使用
MPU6050 介绍
关于MPU6050陀螺仪模块的测量误差分析
关于MPU6050姿态解算的理解与认识
没有更多推荐了,}

我要回帖

更多关于 电脑进入省电模式开不了机6 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信