2689|1

1403

帖子

1

TA的资源

纯净的硅(中级)

楼主
 

【LPC54100】姿态数据初步解析 [复制链接]

本帖最后由 shinykongcn 于 2015-5-6 20:40 编辑

    代码两个星期前写完了,最近忙着学新东西,加之人比较懒,帖子一直没发,罪过罪过~~
上一篇帖子中实现了与MPU6050的硬件I2C通信,这里要赞一个NXP的I2C,用起来不要太爽,demo瞟一眼,立马会用了,不象之前用stmxx的时候,捣鼓半天,最后没捣鼓出来,现在还没高熟练(原谅我的智商吧)。相比来说lpc54102的I2C只要简单的初始化GPIO,设置I2C参数,发送接收数据只要填充一个机构体 ROM_I2CM_XFER_T 里的发送接收缓冲,发送接收数据大小,还有从机地址就可以了。

MPU6050是一颗6轴的运动感应器,可以感应xyz 3轴的加速度(Accelerometer加速度计)和3轴角速度大小(Gyroscope陀螺仪)。量程和精度可调,注意这里的加速度计的单位为g,当水平静止时,由于z轴有重力,所以其输出应该为ax=0,ay=0,az=1g,陀螺仪测得的为角速度大小,单位为o/s,静止时应该gx=gy=gz=0。MPU6050同时还可以测量温度,换算方法为
   
    好了,下面就说说怎么获取到加速度a和角速度g,通过查看mpu6050,首先需要设置传感器参数,这里主要是设置酵素的和角速度的量程,这个跟测量的结果是有关的,因为mpu6050内部adc的结果保存使用2字节16bit的空间存放,也就是2^16个数据组合,这里拿加速度为例,加速度的量程可以设置为+-2g/+-4g/+-8g/+-16g,如果设置位+-2g,则每个一个单位保存的数据大小位2^16/4 = 16384 LSB/g,即1g在寄存器中有16384个数据来表示,当量程为+-16g时, 2^16/32g = 2048LSB/g,此时1g用2048个数据表示,精度就降低了。这也是后面计算加速度大小时的算法。量程为+-4g时实际加速度值 a = regRead/(2^16/8)g。换算表可以查MPU6050寄存器

下面上点小代码,带有注释的,应该容易理解,整个MPU6050的操作就是读写寄存器,封装了一个方法用于完成这个步骤,部分代码来源网上,版权归别人所有。。。
  1. static void mpu_hw_init() { // 初始化
  2.         mpu_write_reg(MPU6050_RA_PWR_MGMT_1,   0x00);
  3.         delay_ms(200);    //解除休眠后的延时要上百毫秒,否则初始化不成功
  4.         mpu_write_reg(MPU6050_RA_PWR_MGMT_1,   0x03);       //选时钟
  5.         mpu_write_reg(MPU6050_RA_CONFIG,            0x03);       //加速度44hz滤波,陀螺仪42hz滤波
  6.         mpu_write_reg(MPU6050_RA_SMPLRT_DIV,   0x00);       //陀螺仪采样率,1khz效果不错
  7.         mpu_write_reg(MPU6050_RA_GYRO_CONFIG,  0x18);       //陀螺仪最大量程 +-2000度每秒
  8.         mpu_write_reg(MPU6050_RA_ACCEL_CONFIG, 0x08);       //加速度度最大量程 +-4G
  9. }
复制代码
寄存器值换算成实际的加速度和角速度
  1. uint8_t mpu_get_motion6(float m[6]) {
  2.         int ret;
  3.         static int16_t raw[6];

  4.         ret = mpu_read_regs(MPU6050_RA_ACCEL_XOUT_H, mpu_read_buf, 14); // a+g+t
  5.         if (ret == 14) {
  6.                 raw[0] = (((int16_t) mpu_read_buf[0]) << 8) | mpu_read_buf[1];        // Accel
  7.                 raw[1] = (((int16_t) mpu_read_buf[2]) << 8) | mpu_read_buf[3];
  8.                 raw[2] = (((int16_t) mpu_read_buf[4]) << 8) | mpu_read_buf[5];
  9. //                raw[6] = (((int16_t) mpu_read_buf[6]) << 8) | mpu_read_buf[7];         // Temperature, reg0x41,reg0x42
  10.                 raw[3] = (((int16_t) mpu_read_buf[8]) << 8) | mpu_read_buf[9];         // gyro
  11.                 raw[4] = (((int16_t) mpu_read_buf[10]) << 8) | mpu_read_buf[11];
  12.                 raw[5] = (((int16_t) mpu_read_buf[12]) << 8) | mpu_read_buf[13];

  13.                 int i;
  14.                 for (i = 0; i < 3; i++)
  15.                         m[i] = (float) raw[i] / 8192.0f; // +-4g
  16.                 for (i = 3; i < 6; i++)
  17.                         m[i] = (float) raw[i] / 16.4f; // +-2000deg/s -> 16.4LSB deg/s

  18. //                m[6] = (float) raw[6] / 340 + 36.53f; // Temperaturein degrees C = (TEMP_OUT Register Valueas a signed quantity)/340 + 36.53

  19.                 return !0;
  20.         } else {
  21.                 return 0;
  22.         }
  23. }
复制代码
温度数据换算:
  1. float mpu_get_temperature() {
  2.         int16_t t = 0;
  3.         uint8_t raw[2];

  4.         if (mpu_read_regs(MPU6050_RA_TEMP_OUT_H, raw, 2) == 2) {
  5.                 t = (int16_t) (raw[0]<<8 | raw[1]);
  6.                 return (float) t / 340 + 36.53f;
  7.         }
  8.         return 0;
  9. }
复制代码
数据通过串口发送给pc,通过SerialChat现实波形,这里同时输出了温度值
  1. static float m[6];
  2.                                 int ret = mpu_get_motion6(m);

  3.                                 if (ret) {
  4.                                         DEBUGOUT(/*"MPU6050 a/g:    "*/"%4.3f,%4.3f,%4.3f,%4.3f,%4.3f,%4.3f"/*"\r\n"*/,
  5.                                                                         m[0], m[1], m[2], m[3], m[4], m[5]);
  6.                                         DEBUGOUT(",%2.3f\r\n", mpu_get_temperature());
  7. //                                DEBUGOUT("Temp=[%4.3f]`C\r\n", mpu_get_temperature()); //m[6]);
  8.                                 } else {
  9.                                         DEBUGOUT("get motion data failed, check connection again!\r\n");
  10.                                         break;
  11.                                 }
复制代码
最后看波形,最上面亮绿色的是温度,下面有6个波形是对应加速度和角速度的,MPU6050是拿在手上的,可以明显看到抖动,哈哈。。

SerialChat网上有说怎么用,配置需要自己摸索一下,当时捣鼓了半天才搞明白,顺便把我的配置发上来,配置说明里面也有,2楼找附件哈。。
此帖出自NXP MCU论坛

赞赏

1

查看全部赞赏

点赞 关注
个人签名HELLO_WATER
 

回复
举报

1403

帖子

1

TA的资源

纯净的硅(中级)

沙发
 
本帖最后由 shinykongcn 于 2015-5-6 20:47 编辑

SerialChart 配置方法简单说明:可参考http://bbs.ednchina.com/BLOG_ARTICLE_3015472.HTM

数据分行处理,数据之间使用逗号隔开。如:
-0.075,-0.062,1.037,-2.866,0.122,-0.488,
-0.072,-0.063,1.037,-2.866,0.183,-0.488,
-0.075,-0.064,1.038,-2.805,0.183,-0.427,

[_setup_]
port=COM2
baudrate=115200

width=10000
height=600
background_color = black

grid_h_origin = 300         // 水平方向参考坐标线位置,为height/2刚好在正中央
grid_h_step = 10        // 水平方向一格表格高度
grid_h_color = #101010        // 水平方向表格线颜色
grid_h_origin_color = transparent // 水平方向原点坐标线颜色 transparent 表示无颜色

grid_v_origin = 10         // 垂直方向
grid_v_step = 10
grid_v_color = #101010
grid_v_origin_color = transparent  //  transparent 表示无颜色

[_default_]
min=-100
max=100

[pulsetime]
min=0
max=40000
color=bisque

[pulsetime1]
min=0
max=40000
color=gray

[_default_]          // 线默认属性
min=-100        // 垂直方向值大小
max=+100
color = transparent

// 波形属性
[ax]
min=-10
max=+10
color=red

[ay]
min=-10
max=+10
color=green

[az]
min=-10
max=+10
color=blue

[gx]
min=-400
max=+400
color=yellow

[gy]
min=-400
max=+400
color=deeppink

[gz]
min=-400
max=+400
color=purple

SerialChart.rar

4.27 MB, 下载次数: 1

此帖出自NXP MCU论坛
 
个人签名HELLO_WATER
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表