自平衡小车-4 CZ521-ITG/MPU6050模块与测控
  MPU6050芯片集成加速度计-测量3轴加速度定物体朝向 和 陀螺仪-测量旋转角速度定摆动、俯仰以及滚动。这个可以找到太多资料,没多少可说的。这里主要验证一下。
  这里记录下自己这次从从没接触到略有所得的过程关键吧。已明白或精通矢量分析的高手可忽略。
 
陀螺原理图:
 
 
一、 加速度计(accelerometer
  加速度与力的关系是牛顿第二定律。加速度计测量的是关联惯性力的加速度,单位为重力加速度g
换句话说,加速度计测量重力场和有加速度运动时的三维加速度其实就是物体相对地球球心的朝向(非位置,位置要GPS多点卫星测量)。 基于直角坐标系或和极坐标系,通过陀螺和电容原理,确定以二维、三维物体(不是用质点表示的物体)的朝向状态。 通常以元件平面为基础推广至电路板、电路板所在物体。
  其本质是以重力场方向为测量参照,获得物体局部坐标系的xyz三维朝向。理论上,静止时,上述任一坐标轴正向指向地球球心时,对应轴测定的加速度为-g,其他二轴加速度为0,三个加速度联合可确定物体的朝向。
 
  试验结果确认:CZ521-ITG/MPU6050模块上MPU6050芯片12719~24管脚排列x加速度正方向, 18~1316管脚排列为y轴正方向,z指向无元件面,如图
静止时加速度测量:看起来还是很稳定的,变动大约+-40. aacx灰, aacy蓝, aacz红
手持转动时:
 
二、 陀螺仪(gyroscope,也称作 gyro
陀螺仪检测的是三轴旋转速度,即单位时间内三个轴转过的角度,即角速度,角度的变化率,单位为弧度/秒。理论上,静止时,三轴角速度为0
元件为原点,元件体的三维旋转运动,     gyrox, gyroy, gyroz xyz转动速度 
静止时角速度测量:gyrox灰, gyroy兰, gyroz红 ,  看起来还是很稳定的,
 
手持转动时:仰俯 摆动  滚动,
 
三、 数据融合
  实在上 实际的加速度对震动和机械噪声很敏感,对瞬时机械变化敏感。角速度检测容易漂移,造成累积误差。这MPU6050的原始测量数据简直惨不忍睹。也许科研使用、飞机上使用的陀螺仪检很精密稳定, 好在对人的感觉要求,MPU6050的数据经处理后得到的姿态信息还是可以满足需要的。
  基本的数据处理方法有多种,其基本出发点都是 1) 同时使用加速度和角速度以适当权重联合处理; 2) 综合历史数据的累积信息、数据瞬变特征、当前数据,以适当权重联合处理。资料很多,这些我不怎么懂的就不多说了。
  可惜,dmp初始化都过不去,失败,有空在探索dmp吧。
 
发现NXPSDK一个问题:
  调试函数PRINTF  DbgConsole_Printf 以%d格式输出数据,会把负数当正数输出。

 

  而标准的printf能正确转换输出。建议向NXP提交报告检查修正。
           printf("mpu6050 temp is%d\r\n", MPU_Get_Temperature());
           mpu_dmp_get_data(&pitch,&roll,&yaw);               //得到姿态角即欧拉角
           MPU_Get_Accelerometer(&aacx,&aacy,&aacz);  //得到加速度传感器数据
           MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);  //得到陀螺仪数据 \r\n
           printf("pitch is %d, roll is %d,yaw is %d\r\n", (int)pitch, (int)roll, (int)yaw);
           printf("gyrox is %d, gyroy is%d, gyroz is %d\r\n", gyrox, gyroy, gyroz);
           PRINTF("aacx is %d, aacy is %d, aacz is %d\r\n", aacx, aacy, aacz);
           printf("aacxis %d, aacy is %d, aacz is %d\r\n", aacx, aacy, aacz);

 

           PRINTF("aacxis %x, aacy is %x, aacz is %x\r\n\r\n", aacx, aacy, aacz);
此时输出为:可发现PRINTF和printf输出的aacx,aacy,aacz不同。