MPU-6000(6050)为全球首例整合性6轴运动处理组件,相较于多组件方案,免除了组合陀螺仪与加速器时间轴之差的问题,减少了大量的封装空间。
MPU-6000(6050)的角速度全格感测范围为±250、±500、±1000与±2000°/sec (dps),可准确追踪快速与慢速动作,并且,用户可程式控制的加速器全格感测范围为±2g、±4g±8g与±16g。产品传输可透过最高至400kHz的IC或最高达20MHz的SPI(MPU-6050没有SPI)。MPU-6000可在不同电压下工作,VDD供电电压介为2.5V±5%、3.0V±5%或3.3V±5%,逻辑接口VDDIO供电为1.8V± 5%(MPU6000仅用VDD)。MPU-6000的包装尺寸4x4x0.9mm(QFN),在业界是革命性的尺寸。其他的特征包含内建的温度感测器、包含在运作环境中仅有±1%变动的振荡器。
MPU6050以数字输出6轴或9轴的旋转矩阵、四元数(quaternion)、欧拉角格式(Euler Angle forma)的融合演算数据。 具有131 LSBs/°/sec 敏感度与全格感测范围为±250、±500、±1000与±2000°/sec 的3轴角速度感测器(陀螺仪)。 可程式控制,且程式控制范围为±2g、±4g、±8g和±16g的3轴加速器。 移除加速器与陀螺仪轴间敏感度,降低设定给予的影响与感测器的飘移。 数字运动处理(DMP: Digital Mo tion Processing)引擎可减少复杂的融合演算数据、感测器同步化、姿势感应等的负荷。 运动处理数据库支持Android、Linux与Windows 内建之运作时间偏差与磁力感测器校正演算技术,免除了客户须另外进行校正的需求。 以数位输出的温度传感器 以数位输入的同步引脚(Sync pin)支援视频 电子影相稳定技术与GPS 可程式控制的中断(interrupt)支援姿势识别、摇摄、画面放大缩小、滚动、快速下降中断、high-G中断、零动作感应、触击感应、摇动感应功能。 VDD供电电压为2.5V±5%、3.0V±5%、3.3V±5%;VDDIO为1.8V± 5% 陀螺仪运作电流:5mA,陀螺仪待命电流:5µA;加速器运作电流:350µA,加速器省电模式电流: 20µA@10Hz 高达400kHz快速模式的I2C,或最高至20MHz的SPI串行主机接口(serial host interface) 内建频率产生器在所有温度范围(full temperature range)仅有±1%频率变化。 使用者亲自测试 10,000 g 碰撞容忍度 为可携式产品量身订作的最小最薄包装 (4x4x0.9mm QFN) 符合RoHS及环境标准。
这里我使用的是模拟I2C,因为使用引脚比较随意, 通信效果也挺不错,所以我还是比较愿意使用模拟IC的。
MPU6050初始化及数据读取:
- u8 Init_MPU6050(void)
- {
- I2C_GPIO_Config();
- ysm(1);
- I2C_Start();
- ysm(1);
- Single_Write(MPU6050_Addr,PWR_MGMT_1, 0x00);
- Single_Write(MPU6050_Addr,SMPLRT_DIV, 0x02);
- Single_Write(MPU6050_Addr,CONFIG, 0x02);
- Single_Write(MPU6050_Addr,GYRO_CONFIG, 0x18);
- Single_Write(MPU6050_Addr,ACCEL_CONFIG, 0x11);
- return (Single_Read(MPU6050_Addr,WHO_AM_I)); //0X68
- }
- void READ6050_in_float(Float_mpu *data)
- {
- u8 a,b;
- a=Single_Read(MPU6050_Addr,ACCEL_XOUT_L);
- b=Single_Read(MPU6050_Addr,ACCEL_XOUT_H);
- data->AX=((short)(b<<8)|a)/4096.0f;
- a=Single_Read(MPU6050_Addr,ACCEL_YOUT_L);
- b=Single_Read(MPU6050_Addr,ACCEL_YOUT_H);
- data->AY=((short)(b<<8)|a)/4096.0f;
-
- a=Single_Read(MPU6050_Addr,ACCEL_ZOUT_L);
- b=Single_Read(MPU6050_Addr,ACCEL_ZOUT_H);
- data->AZ=((short)(b<<8)|a)/4096.0f;
-
- a=Single_Read(MPU6050_Addr,GYRO_XOUT_L);
- b=Single_Read(MPU6050_Addr,GYRO_XOUT_H);
- data->GX=((short)(b<<8)|a)/16.384f;
- a=Single_Read(MPU6050_Addr,GYRO_YOUT_L);
- b=Single_Read(MPU6050_Addr,GYRO_YOUT_H);
- data->GY=((short)(b<<8)|a)/16.384f;
-
- a=Single_Read(MPU6050_Addr,GYRO_ZOUT_L);
- b=Single_Read(MPU6050_Addr,GYRO_ZOUT_H);
- data->GZ=((short)(b<<8)|a)/16.384f;
-
- }
复制代码
数据更新:采集频率500HZ
- Float_mpu MPU_DATA,MPU_Final;
- float CAR_Dip_Angle;
- static float MPU_ZREO_GX,MPU_ZREO_GY,MPU_ZREO_GZ;
- void TIM9_Init(void)
- {
- RCC->APB2ENR|=0x10000;
- TIM9->CR1=0;
- TIM9->DIER=1;
- TIM9->ARR=9999;
- TIM9->PSC=19;
-
- NVIC->ISER[0]|=0x01U<
- NVIC->IP[TIM1_BRK_TIM9_IRQn]=0x10;
-
- TIM9->CR1=1;
- }
- void Zreo_process(void)
- {
- int k;
- float gxtp=0,gytp=0,gztp=0;
- k=100;
- while(k--)
- {
- READ6050_in_float(&MPU_DATA);
- gxtp+=MPU_DATA.GX;
- gytp+=MPU_DATA.GY;
- gztp+=MPU_DATA.GZ;
- ysm(2);
- }
- MPU_ZREO_GX=gxtp/100.0f;
- MPU_ZREO_GY=gytp/100.0f;
- MPU_ZREO_GZ=gztp/100.0f;
- CAR_Dip_Angle = atan2f(MPU_DATA.AX,MPU_DATA.AZ) * 57.3f;
- }
- void Data_UPdate_Init(void)
- {
- Zreo_process();
- TIM9_Init();
- }
- void TIM1_BRK_TIM9_IRQHandler(void)
- {
- if(TIM9->SR&0x01)
- {
- READ6050_in_float(&MPU_DATA);
- MPU_DATA.GX -= MPU_ZREO_GX;
- MPU_DATA.GY -= MPU_ZREO_GY;
- MPU_DATA.GZ -= MPU_ZREO_GZ;
- MPU_Final.AX = MPU_Final.AX*0.7f + MPU_DATA.AX*0.3f;
- MPU_Final.AY = MPU_Final.AY*0.7f + MPU_DATA.AY*0.3f;
- MPU_Final.AZ = MPU_Final.AZ*0.7f + MPU_DATA.AZ*0.3f;
- MPU_Final.GX = MPU_Final.GX*0.7f + MPU_DATA.GX*0.3f;
- MPU_Final.GY = MPU_Final.GY*0.7f + MPU_DATA.GY*0.3f;
- MPU_Final.GZ = MPU_Final.GZ*0.7f + MPU_DATA.GZ*0.3f;
- CAR_Dip_Angle += (atan2f(MPU_Final.AX,MPU_Final.AZ) * 57.3f - CAR_Dip_Angle)*0.02f - MPU_Final.GY * 0.98f/500.0f;
- }
- TIM9->SR=0;
- }
复制代码
|
|
|
|