查看: 5894|回复: 0

[原创] 自平衡小车-4 CZ521-ITG/MPU6050模块与测控

[复制链接]
  • TA的每日心情
    擦汗
    2021-7-5 15:45
  • 签到天数: 664 天

    连续签到: 1 天

    [LV.9]以坛为家II

    42

    主题

    1594

    帖子

    19

    金牌会员

    Rank: 6Rank: 6

    积分
    5618
    最后登录
    2021-12-22
    发表于 2017-10-28 20:54:48 | 显示全部楼层 |阅读模式
    本帖最后由 okwh 于 2017-11-11 23:38 编辑

    自平衡小车-4 CZ521-ITG/MPU6050模块与测控
      MPU6050芯片集成加速度计-测量3轴加速度定物体朝向 和 陀螺仪-测量旋转角速度定摆动、俯仰以及滚动。这个可以找到太多资料,没多少可说的。这里主要验证一下。
      这里记录下自己这次从从没接触到略有所得的过程关键吧。已明白或精通矢量分析的高手可忽略。
    陀螺原理图:
    gyro.gif gyro1.gif
    一、 加速度计(accelerometer
      加速度与力的关系是牛顿第二定律。加速度计测量的是关联惯性力的加速度,单位为重力加速度g
    换句话说,加速度计测量重力场和有加速度运动时的三维加速度, 其实就是物体相对地球球心的朝向(非位置,位置要GPS多点卫星测量)。 基于直角坐标系或和极坐标系,通过陀螺和电容原理,确定以二维、三维物体(不是用质点表示的物体)的朝向状态。 通常以元件平面为基础推广至电路板、电路板所在物体。
      其本质是以重力场方向为测量参照,获得物体局部坐标系的xyz三维朝向。理论上,静止时,上述任一坐标轴正向指向地球球心时,对应轴测定的加速度为-g,其他二轴加速度为0,三个加速度联合可确定物体的朝向。
      试验结果确认:CZ521-ITG/MPU6050模块上MPU6050芯片12719~24管脚排列x加速度正方向, 18~1316管脚排列为y轴正方向,z指向无元件面,如图
    6050.png
    静止时加速度测量:看起来还是很稳定的,变动大约+-40. aacx灰, aacy蓝, aacz红
    60503.png
    手持转动时:
    60505.png

    二、 陀螺仪(gyroscope,也称作 gyro
    陀螺仪检测的是三轴旋转速度,即单位时间内三个轴转过的角度,即角速度,角度的变化率,单位为弧度/秒。理论上,静止时,三轴角速度为0
    元件为原点,元件体的三维旋转运动,     gyrox, gyroy, gyroz xyz转动速度 
    静止时角速度测量:gyrox灰, gyroy兰, gyroz红 ,  看起来还是很稳定的,
    60502.png

    手持转动时:仰俯 摆动  滚动,
    60504.png

    三、 数据融合
      实在上 实际的加速度对震动和机械噪声很敏感,对瞬时机械变化敏感。角速度检测容易漂移,造成累积误差。这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不同。
    60501.png



    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-19 14:55 , Processed in 0.091012 second(s), 20 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表