找回密码
 马上注册

QQ登录

只需一步,快速开始

查看: 18830|回复: 8

6050(DMP)C代码,来自网友,试着移植了,不成功.....

[复制链接]
发表于 2014-1-20 10:05:49 | 显示全部楼层 |阅读模式
本帖最后由 blackblue 于 2014-6-8 15:56 编辑

上回说到准备用NXT S4的高速端口,扩展出一个高速率数字陀螺,估计这里有兴趣的人也是有限的,我这里一步步讲一些我的做法和思路;

加顾上一贴的,将NXT S4扩展成TTL,有了TTL,我们可以方便地与其他MCU相连了;

这一贴是讲,使用ATMEL的MCU,打开MPU6050的DMP功能,MPU6050能以400K的速率输出姿态数据(FIFO,一共42个字节);DMP有个好处,
不需要经过复杂的滤波过程,出来的数据,特别是四位元和YRP数据,是直接可用,而且效果比简化KALMAN滤波的要好和稳定,响应速度很快很快;

下面是代码:有兴趣的可以直接用........

  1. ---------------------
  2. /*****************************************************
  3. Date    : 2013-7-2
  4. Author  :注意,原代码是本地一位朋友给的,这里本来空着,经过核实,原贴来自阿莫论坛,作者见贴子下面的跟贴,感谢他......
  5. Chip type               : ATmega16
  6. Program type            : Application
  7. AVR Core Clock frequency: 16.000000 MHz
  8. Memory model            : Small
  9. External RAM size       : 0
  10. Data Stack size         : 256
  11. *****************************************************/
  12. #include <mega16.h>
  13. #include <alcd.h>
  14. #include <delay.h>
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <math.h>
  18. #include <twi.h>  /* 从WINAVR目录C:\WinAVR\avr\include\util 中拷贝来,删除了#include <avr/io.h>一句 */
  19. unsigned char dmpdatas[42];
  20. unsigned char i2cw=0xd0;
  21. unsigned char i2cr=0xd1;
  22. float quartf[4]; /* 四元数*/
  23. float gyrof[3];  /* 陀螺仪读数*/
  24. float accelf[3]; /* 加速度值*/
  25. float yprf[3];   /* Euler 角度*/
  26. //以下的 firmware 及 config update 数据来自于 Jeff Jrowberg 公开的程序
  27. flash unsigned char dmpmemorydata[1929]={
  28. // bank 0, 256 bytes
  29.     0xFB, 0x00, 0x00, 0x3E, 0x00, 0x0B, 0x00, 0x36, 0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00,
  30.     0x00, 0x65, 0x00, 0x54, 0xFF, 0xEF, 0x00, 0x00, 0xFA, 0x80, 0x00, 0x0B, 0x12, 0x82, 0x00, 0x01,
  31.     0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  32.     0x00, 0x28, 0x00, 0x00, 0xFF, 0xFF, 0x45, 0x81, 0xFF, 0xFF, 0xFA, 0x72, 0x00, 0x00, 0x00, 0x00,
  33.     0x00, 0x00, 0x03, 0xE8, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x7F, 0xFF, 0xFF, 0xFE, 0x80, 0x01,
  34.     0x00, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  35.     0x00, 0x3E, 0x03, 0x30, 0x40, 0x00, 0x00, 0x00, 0x02, 0xCA, 0xE3, 0x09, 0x3E, 0x80, 0x00, 0x00,
  36.     0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
  37.     0x41, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x2A, 0x00, 0x00, 0x16, 0x55, 0x00, 0x00, 0x21, 0x82,
  38.     0xFD, 0x87, 0x26, 0x50, 0xFD, 0x80, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x05, 0x80, 0x00,
  39.     0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
  40.     0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x6F, 0x00, 0x02, 0x65, 0x32, 0x00, 0x00, 0x5E, 0xC0,
  41.     0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  42.     0xFB, 0x8C, 0x6F, 0x5D, 0xFD, 0x5D, 0x08, 0xD9, 0x00, 0x7C, 0x73, 0x3B, 0x00, 0x6C, 0x12, 0xCC,
  43.     0x32, 0x00, 0x13, 0x9D, 0x32, 0x00, 0xD0, 0xD6, 0x32, 0x00, 0x08, 0x00, 0x40, 0x00, 0x01, 0xF4,
  44.     0xFF, 0xE6, 0x80, 0x79, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD0, 0xD6, 0x00, 0x00, 0x27, 0x10,
  45.     // bank 1, 256 bytes
  46.     0xFB, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  47.     0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,
  48.     0x00, 0x00, 0xFA, 0x36, 0xFF, 0xBC, 0x30, 0x8E, 0x00, 0x05, 0xFB, 0xF0, 0xFF, 0xD9, 0x5B, 0xC8,
  49.     0xFF, 0xD0, 0x9A, 0xBE, 0x00, 0x00, 0x10, 0xA9, 0xFF, 0xF4, 0x1E, 0xB2, 0x00, 0xCE, 0xBB, 0xF7,
  50.     0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x02, 0x02, 0x00, 0x00, 0x0C,
  51.     0xFF, 0xC2, 0x80, 0x00, 0x00, 0x01, 0x80, 0x00, 0x00, 0xCF, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00,
  52.     0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x14,
  53.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  54.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  55.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  56.     0x00, 0x00, 0x00, 0x00, 0x03, 0x3F, 0x68, 0xB6, 0x79, 0x35, 0x28, 0xBC, 0xC6, 0x7E, 0xD1, 0x6C,
  57.     0x80, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB2, 0x6A, 0x00, 0x00, 0x00, 0x00,
  58.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x30,
  59.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  60.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  61.     0x00, 0x00, 0x25, 0x4D, 0x00, 0x2F, 0x70, 0x6D, 0x00, 0x00, 0x05, 0xAE, 0x00, 0x0C, 0x02, 0xD0,
  62.     // bank 2, 256 bytes
  63.     0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x54, 0xFF, 0xEF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  64.     0x00, 0x00, 0x01, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x01, 0x00,
  65.     0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x00, 0x00, 0x54, 0x00, 0x00, 0xFF, 0xEF, 0x00, 0x00,
  66.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  67.     0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  68.     0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  69.     0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  70.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  71.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  72.     0x00, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  73.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  74.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00,
  75.     0x00, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  76.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  77.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  78.     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  79.     // bank 3, 256 bytes
  80.     0xD8, 0xDC, 0xBA, 0xA2, 0xF1, 0xDE, 0xB2, 0xB8, 0xB4, 0xA8, 0x81, 0x91, 0xF7, 0x4A, 0x90, 0x7F,
  81.     0x91, 0x6A, 0xF3, 0xF9, 0xDB, 0xA8, 0xF9, 0xB0, 0xBA, 0xA0, 0x80, 0xF2, 0xCE, 0x81, 0xF3, 0xC2,
  82.     0xF1, 0xC1, 0xF2, 0xC3, 0xF3, 0xCC, 0xA2, 0xB2, 0x80, 0xF1, 0xC6, 0xD8, 0x80, 0xBA, 0xA7, 0xDF,
  83.     0xDF, 0xDF, 0xF2, 0xA7, 0xC3, 0xCB, 0xC5, 0xB6, 0xF0, 0x87, 0xA2, 0x94, 0x24, 0x48, 0x70, 0x3C,
  84.     0x95, 0x40, 0x68, 0x34, 0x58, 0x9B, 0x78, 0xA2, 0xF1, 0x83, 0x92, 0x2D, 0x55, 0x7D, 0xD8, 0xB1,
  85.     0xB4, 0xB8, 0xA1, 0xD0, 0x91, 0x80, 0xF2, 0x70, 0xF3, 0x70, 0xF2, 0x7C, 0x80, 0xA8, 0xF1, 0x01,
  86.     0xB0, 0x98, 0x87, 0xD9, 0x43, 0xD8, 0x86, 0xC9, 0x88, 0xBA, 0xA1, 0xF2, 0x0E, 0xB8, 0x97, 0x80,
  87.     0xF1, 0xA9, 0xDF, 0xDF, 0xDF, 0xAA, 0xDF, 0xDF, 0xDF, 0xF2, 0xAA, 0xC5, 0xCD, 0xC7, 0xA9, 0x0C,
  88.     0xC9, 0x2C, 0x97, 0x97, 0x97, 0x97, 0xF1, 0xA9, 0x89, 0x26, 0x46, 0x66, 0xB0, 0xB4, 0xBA, 0x80,
  89.     0xAC, 0xDE, 0xF2, 0xCA, 0xF1, 0xB2, 0x8C, 0x02, 0xA9, 0xB6, 0x98, 0x00, 0x89, 0x0E, 0x16, 0x1E,
  90.     0xB8, 0xA9, 0xB4, 0x99, 0x2C, 0x54, 0x7C, 0xB0, 0x8A, 0xA8, 0x96, 0x36, 0x56, 0x76, 0xF1, 0xB9,
  91.     0xAF, 0xB4, 0xB0, 0x83, 0xC0, 0xB8, 0xA8, 0x97, 0x11, 0xB1, 0x8F, 0x98, 0xB9, 0xAF, 0xF0, 0x24,
  92.     0x08, 0x44, 0x10, 0x64, 0x18, 0xF1, 0xA3, 0x29, 0x55, 0x7D, 0xAF, 0x83, 0xB5, 0x93, 0xAF, 0xF0,
  93.     0x00, 0x28, 0x50, 0xF1, 0xA3, 0x86, 0x9F, 0x61, 0xA6, 0xDA, 0xDE, 0xDF, 0xD9, 0xFA, 0xA3, 0x86,
  94.     0x96, 0xDB, 0x31, 0xA6, 0xD9, 0xF8, 0xDF, 0xBA, 0xA6, 0x8F, 0xC2, 0xC5, 0xC7, 0xB2, 0x8C, 0xC1,
  95.     0xB8, 0xA2, 0xDF, 0xDF, 0xDF, 0xA3, 0xDF, 0xDF, 0xDF, 0xD8, 0xD8, 0xF1, 0xB8, 0xA8, 0xB2, 0x86,
  96.     // bank 4, 256 bytes
  97.     0xB4, 0x98, 0x0D, 0x35, 0x5D, 0xB8, 0xAA, 0x98, 0xB0, 0x87, 0x2D, 0x35, 0x3D, 0xB2, 0xB6, 0xBA,
  98.     0xAF, 0x8C, 0x96, 0x19, 0x8F, 0x9F, 0xA7, 0x0E, 0x16, 0x1E, 0xB4, 0x9A, 0xB8, 0xAA, 0x87, 0x2C,
  99.     0x54, 0x7C, 0xB9, 0xA3, 0xDE, 0xDF, 0xDF, 0xA3, 0xB1, 0x80, 0xF2, 0xC4, 0xCD, 0xC9, 0xF1, 0xB8,
  100.     0xA9, 0xB4, 0x99, 0x83, 0x0D, 0x35, 0x5D, 0x89, 0xB9, 0xA3, 0x2D, 0x55, 0x7D, 0xB5, 0x93, 0xA3,
  101.     0x0E, 0x16, 0x1E, 0xA9, 0x2C, 0x54, 0x7C, 0xB8, 0xB4, 0xB0, 0xF1, 0x97, 0x83, 0xA8, 0x11, 0x84,
  102.     0xA5, 0x09, 0x98, 0xA3, 0x83, 0xF0, 0xDA, 0x24, 0x08, 0x44, 0x10, 0x64, 0x18, 0xD8, 0xF1, 0xA5,
  103.     0x29, 0x55, 0x7D, 0xA5, 0x85, 0x95, 0x02, 0x1A, 0x2E, 0x3A, 0x56, 0x5A, 0x40, 0x48, 0xF9, 0xF3,
  104.     0xA3, 0xD9, 0xF8, 0xF0, 0x98, 0x83, 0x24, 0x08, 0x44, 0x10, 0x64, 0x18, 0x97, 0x82, 0xA8, 0xF1,
  105.     0x11, 0xF0, 0x98, 0xA2, 0x24, 0x08, 0x44, 0x10, 0x64, 0x18, 0xDA, 0xF3, 0xDE, 0xD8, 0x83, 0xA5,
  106.     0x94, 0x01, 0xD9, 0xA3, 0x02, 0xF1, 0xA2, 0xC3, 0xC5, 0xC7, 0xD8, 0xF1, 0x84, 0x92, 0xA2, 0x4D,
  107.     0xDA, 0x2A, 0xD8, 0x48, 0x69, 0xD9, 0x2A, 0xD8, 0x68, 0x55, 0xDA, 0x32, 0xD8, 0x50, 0x71, 0xD9,
  108.     0x32, 0xD8, 0x70, 0x5D, 0xDA, 0x3A, 0xD8, 0x58, 0x79, 0xD9, 0x3A, 0xD8, 0x78, 0x93, 0xA3, 0x4D,
  109.     0xDA, 0x2A, 0xD8, 0x48, 0x69, 0xD9, 0x2A, 0xD8, 0x68, 0x55, 0xDA, 0x32, 0xD8, 0x50, 0x71, 0xD9,
  110.     0x32, 0xD8, 0x70, 0x5D, 0xDA, 0x3A, 0xD8, 0x58, 0x79, 0xD9, 0x3A, 0xD8, 0x78, 0xA8, 0x8A, 0x9A,
  111.     0xF0, 0x28, 0x50, 0x78, 0x9E, 0xF3, 0x88, 0x18, 0xF1, 0x9F, 0x1D, 0x98, 0xA8, 0xD9, 0x08, 0xD8,
  112.     0xC8, 0x9F, 0x12, 0x9E, 0xF3, 0x15, 0xA8, 0xDA, 0x12, 0x10, 0xD8, 0xF1, 0xAF, 0xC8, 0x97, 0x87,
  113.     // bank 5, 256 bytes
  114.     0x34, 0xB5, 0xB9, 0x94, 0xA4, 0x21, 0xF3, 0xD9, 0x22, 0xD8, 0xF2, 0x2D, 0xF3, 0xD9, 0x2A, 0xD8,
  115.     0xF2, 0x35, 0xF3, 0xD9, 0x32, 0xD8, 0x81, 0xA4, 0x60, 0x60, 0x61, 0xD9, 0x61, 0xD8, 0x6C, 0x68,
  116.     0x69, 0xD9, 0x69, 0xD8, 0x74, 0x70, 0x71, 0xD9, 0x71, 0xD8, 0xB1, 0xA3, 0x84, 0x19, 0x3D, 0x5D,
  117.     0xA3, 0x83, 0x1A, 0x3E, 0x5E, 0x93, 0x10, 0x30, 0x81, 0x10, 0x11, 0xB8, 0xB0, 0xAF, 0x8F, 0x94,
  118.     0xF2, 0xDA, 0x3E, 0xD8, 0xB4, 0x9A, 0xA8, 0x87, 0x29, 0xDA, 0xF8, 0xD8, 0x87, 0x9A, 0x35, 0xDA,
  119.     0xF8, 0xD8, 0x87, 0x9A, 0x3D, 0xDA, 0xF8, 0xD8, 0xB1, 0xB9, 0xA4, 0x98, 0x85, 0x02, 0x2E, 0x56,
  120.     0xA5, 0x81, 0x00, 0x0C, 0x14, 0xA3, 0x97, 0xB0, 0x8A, 0xF1, 0x2D, 0xD9, 0x28, 0xD8, 0x4D, 0xD9,
  121.     0x48, 0xD8, 0x6D, 0xD9, 0x68, 0xD8, 0xB1, 0x84, 0x0D, 0xDA, 0x0E, 0xD8, 0xA3, 0x29, 0x83, 0xDA,
  122.     0x2C, 0x0E, 0xD8, 0xA3, 0x84, 0x49, 0x83, 0xDA, 0x2C, 0x4C, 0x0E, 0xD8, 0xB8, 0xB0, 0xA8, 0x8A,
  123.     0x9A, 0xF5, 0x20, 0xAA, 0xDA, 0xDF, 0xD8, 0xA8, 0x40, 0xAA, 0xD0, 0xDA, 0xDE, 0xD8, 0xA8, 0x60,
  124.     0xAA, 0xDA, 0xD0, 0xDF, 0xD8, 0xF1, 0x97, 0x86, 0xA8, 0x31, 0x9B, 0x06, 0x99, 0x07, 0xAB, 0x97,
  125.     0x28, 0x88, 0x9B, 0xF0, 0x0C, 0x20, 0x14, 0x40, 0xB8, 0xB0, 0xB4, 0xA8, 0x8C, 0x9C, 0xF0, 0x04,
  126.     0x28, 0x51, 0x79, 0x1D, 0x30, 0x14, 0x38, 0xB2, 0x82, 0xAB, 0xD0, 0x98, 0x2C, 0x50, 0x50, 0x78,
  127.     0x78, 0x9B, 0xF1, 0x1A, 0xB0, 0xF0, 0x8A, 0x9C, 0xA8, 0x29, 0x51, 0x79, 0x8B, 0x29, 0x51, 0x79,
  128.     0x8A, 0x24, 0x70, 0x59, 0x8B, 0x20, 0x58, 0x71, 0x8A, 0x44, 0x69, 0x38, 0x8B, 0x39, 0x40, 0x68,
  129.     0x8A, 0x64, 0x48, 0x31, 0x8B, 0x30, 0x49, 0x60, 0xA5, 0x88, 0x20, 0x09, 0x71, 0x58, 0x44, 0x68,
  130.     // bank 6, 256 bytes
  131.     0x11, 0x39, 0x64, 0x49, 0x30, 0x19, 0xF1, 0xAC, 0x00, 0x2C, 0x54, 0x7C, 0xF0, 0x8C, 0xA8, 0x04,
  132.     0x28, 0x50, 0x78, 0xF1, 0x88, 0x97, 0x26, 0xA8, 0x59, 0x98, 0xAC, 0x8C, 0x02, 0x26, 0x46, 0x66,
  133.     0xF0, 0x89, 0x9C, 0xA8, 0x29, 0x51, 0x79, 0x24, 0x70, 0x59, 0x44, 0x69, 0x38, 0x64, 0x48, 0x31,
  134.     0xA9, 0x88, 0x09, 0x20, 0x59, 0x70, 0xAB, 0x11, 0x38, 0x40, 0x69, 0xA8, 0x19, 0x31, 0x48, 0x60,
  135.     0x8C, 0xA8, 0x3C, 0x41, 0x5C, 0x20, 0x7C, 0x00, 0xF1, 0x87, 0x98, 0x19, 0x86, 0xA8, 0x6E, 0x76,
  136.     0x7E, 0xA9, 0x99, 0x88, 0x2D, 0x55, 0x7D, 0x9E, 0xB9, 0xA3, 0x8A, 0x22, 0x8A, 0x6E, 0x8A, 0x56,
  137.     0x8A, 0x5E, 0x9F, 0xB1, 0x83, 0x06, 0x26, 0x46, 0x66, 0x0E, 0x2E, 0x4E, 0x6E, 0x9D, 0xB8, 0xAD,
  138.     0x00, 0x2C, 0x54, 0x7C, 0xF2, 0xB1, 0x8C, 0xB4, 0x99, 0xB9, 0xA3, 0x2D, 0x55, 0x7D, 0x81, 0x91,
  139.     0xAC, 0x38, 0xAD, 0x3A, 0xB5, 0x83, 0x91, 0xAC, 0x2D, 0xD9, 0x28, 0xD8, 0x4D, 0xD9, 0x48, 0xD8,
  140.     0x6D, 0xD9, 0x68, 0xD8, 0x8C, 0x9D, 0xAE, 0x29, 0xD9, 0x04, 0xAE, 0xD8, 0x51, 0xD9, 0x04, 0xAE,
  141.     0xD8, 0x79, 0xD9, 0x04, 0xD8, 0x81, 0xF3, 0x9D, 0xAD, 0x00, 0x8D, 0xAE, 0x19, 0x81, 0xAD, 0xD9,
  142.     0x01, 0xD8, 0xF2, 0xAE, 0xDA, 0x26, 0xD8, 0x8E, 0x91, 0x29, 0x83, 0xA7, 0xD9, 0xAD, 0xAD, 0xAD,
  143.     0xAD, 0xF3, 0x2A, 0xD8, 0xD8, 0xF1, 0xB0, 0xAC, 0x89, 0x91, 0x3E, 0x5E, 0x76, 0xF3, 0xAC, 0x2E,
  144.     0x2E, 0xF1, 0xB1, 0x8C, 0x5A, 0x9C, 0xAC, 0x2C, 0x28, 0x28, 0x28, 0x9C, 0xAC, 0x30, 0x18, 0xA8,
  145.     0x98, 0x81, 0x28, 0x34, 0x3C, 0x97, 0x24, 0xA7, 0x28, 0x34, 0x3C, 0x9C, 0x24, 0xF2, 0xB0, 0x89,
  146.     0xAC, 0x91, 0x2C, 0x4C, 0x6C, 0x8A, 0x9B, 0x2D, 0xD9, 0xD8, 0xD8, 0x51, 0xD9, 0xD8, 0xD8, 0x79,
  147.     // bank 7, 138 bytes (remainder)
  148.     0xD9, 0xD8, 0xD8, 0xF1, 0x9E, 0x88, 0xA3, 0x31, 0xDA, 0xD8, 0xD8, 0x91, 0x2D, 0xD9, 0x28, 0xD8,
  149.     0x4D, 0xD9, 0x48, 0xD8, 0x6D, 0xD9, 0x68, 0xD8, 0xB1, 0x83, 0x93, 0x35, 0x3D, 0x80, 0x25, 0xDA,
  150.     0xD8, 0xD8, 0x85, 0x69, 0xDA, 0xD8, 0xD8, 0xB4, 0x93, 0x81, 0xA3, 0x28, 0x34, 0x3C, 0xF3, 0xAB,
  151.     0x8B, 0xF8, 0xA3, 0x91, 0xB6, 0x09, 0xB4, 0xD9, 0xAB, 0xDE, 0xFA, 0xB0, 0x87, 0x9C, 0xB9, 0xA3,
  152.     0xDD, 0xF1, 0xA3, 0xA3, 0xA3, 0xA3, 0x95, 0xF1, 0xA3, 0xA3, 0xA3, 0x9D, 0xF1, 0xA3, 0xA3, 0xA3,
  153.     0xA3, 0xF2, 0xA3, 0xB4, 0x90, 0x80, 0xF2, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3,
  154.     0xA3, 0xB2, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xA3, 0xB0, 0x87, 0xB5, 0x99, 0xF1, 0xA3, 0xA3, 0xA3,
  155.     0x98, 0xF1, 0xA3, 0xA3, 0xA3, 0xA3, 0x97, 0xA3, 0xA3, 0xA3, 0xA3, 0xF3, 0x9B, 0xA3, 0xA3, 0xDC,
  156.     0xB9, 0xA7, 0xF1, 0x26, 0x26, 0x26, 0xD8, 0xD8, 0xFF
  157. };
  158. flash unsigned char dmpcfgupddata[239] = {
  159. //  dmp config
  160. //  BANK    OFFSET  LENGTH  [DATA]
  161.     0x03,   0x7B,   0x03,   0x4C, 0xCD, 0x6C,         
  162.     0x03,   0xAB,   0x03,   0x36, 0x56, 0x76,         
  163.     0x00,   0x68,   0x04,   0x02, 0xCB, 0x47, 0xA2,   
  164.     0x02,   0x18,   0x04,   0x00, 0x05, 0x8B, 0xC1,   
  165.     0x01,   0x0C,   0x04,   0x00, 0x00, 0x00, 0x00,   
  166.     0x03,   0x7F,   0x06,   0x0C, 0xC9, 0x2C, 0x97, 0x97, 0x97,
  167.     0x03,   0x89,   0x03,   0x26, 0x46, 0x66,         
  168.     0x00,   0x6C,   0x02,   0x20, 0x00,               
  169.     0x02,   0x40,   0x04,   0x00, 0x00, 0x00, 0x00,   
  170.     0x02,   0x44,   0x04,   0x00, 0x00, 0x00, 0x00,   
  171.     0x02,   0x48,   0x04,   0x00, 0x00, 0x00, 0x00,   
  172.     0x02,   0x4C,   0x04,   0x00, 0x00, 0x00, 0x00,   
  173.     0x02,   0x50,   0x04,   0x00, 0x00, 0x00, 0x00,   
  174.     0x02,   0x54,   0x04,   0x00, 0x00, 0x00, 0x00,  
  175.     0x02,   0x58,   0x04,   0x00, 0x00, 0x00, 0x00,  
  176.     0x02,   0x5C,   0x04,   0x00, 0x00, 0x00, 0x00,  
  177.     0x02,   0xBC,   0x04,   0x00, 0x00, 0x00, 0x00,   
  178.     0x01,   0xEC,   0x04,   0x00, 0x00, 0x40, 0x00,  
  179.     0x03,   0x7F,   0x06,   0x0C, 0xC9, 0x2C, 0x97, 0x97, 0x97,
  180.     0x04,   0x02,   0x03,   0x0D, 0x35, 0x5D,         
  181.     0x04,   0x09,   0x04,   0x87, 0x2D, 0x35, 0x3D,   
  182.     0x00,   0xA3,   0x01,   0x00,                    
  183.     0x00,   0x00,   0x01,   0x01,
  184.     //原程序中此行代码为
  185.     //0x00,   0x00,   0x00,   0x01,  即LENGTH=0x00,有错
  186.         
  187.     0x07,   0x86,   0x01,   0xFE,                     
  188.     0x07,   0x41,   0x05,   0xF1, 0x20, 0x28, 0x30, 0x38,
  189.     0x07,   0x7E,   0x01,   0x30,                  
  190.     0x07,   0x46,   0x01,   0x9A,                    
  191.     0x07,   0x47,   0x04,   0xF1, 0x28, 0x30, 0x38,   
  192.     0x07,   0x6C,   0x04,   0xF1, 0x28, 0x30, 0x38,  
  193.     0x02,   0x16,   0x02,   0x00, 0x01,              
  194. // 上行最后一个数据调整FIFO rate :0x01=100HZ,0x02=66HZ,0x03=50HZ ,0x04=40HZ,0x05=33.33HZ,
  195. // 可从 datasheet 公式推算
  196. //dmp updates
  197.     0x01,   0xB2,   0x02,   0xFF, 0xFF,
  198.     0x01,   0x90,   0x04,   0x09, 0x23, 0xA1, 0x35,
  199.     0x01,   0x6A,   0x02,   0x06, 0x00,
  200.     0x01,   0x60,   0x08,   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  201.     0x00,   0x60,   0x04,   0x40, 0x00, 0x00, 0x00,
  202.     0x01,   0x62,   0x02,   0x00, 0x00,
  203.     0x00,   0x60,   0x04,   0x00, 0x40, 0x00, 0x00
  204. };
  205. void i2cinit(void)  
  206. {
  207.   // 16 M晶振,400K TWI 速率
  208.   TWBR=0x0a;
  209.   TWAR=0x00;
  210.   TWCR=0x94;
  211.   TWSR=0x00;
  212. }
  213. void showfloat(unsigned char x,unsigned char y,float f_2show)
  214. {
  215.   unsigned char str2show[10];
  216.   lcd_gotoxy(x,y);
  217.   ftoa( f_2show,10,str2show);
  218.   lcd_puts(str2show);
  219. }
  220. void showlong(unsigned char x,unsigned char y,long l_2show)
  221. {
  222.   unsigned char str2show[15];
  223.   lcd_gotoxy(x,y);
  224.   ltoa( l_2show,str2show);
  225.   lcd_puts(str2show);
  226. }
  227. //以下TWI的基本操作函数是从马潮老师的书中复制而来,在此表示谢意
  228. unsigned char i2cstart(void)
  229. {
  230.   TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
  231.   while(!(TWCR&(1<<TWINT))){};
  232.   return 1;
  233. }
  234. void i2cstop(void)
  235. {
  236.   TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
  237. }
  238. unsigned char i2cwbyte(unsigned char c)
  239. {
  240.   unsigned char ack=1;
  241.   TWDR=c;
  242.   TWCR=(1<<TWINT)|(1<<TWEN);
  243.   while(!(TWCR&(1<<TWINT))){};
  244.   if((TWSR&0xF8)!=TW_MT_SLA_ACK)
  245.     ack=0;
  246.   return ack;
  247. }
  248. unsigned char i2crbyte(unsigned char ack)
  249. {
  250.   if(ack)
  251.     TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA);
  252.   else
  253.     TWCR=(1<<TWINT)|(1<<TWEN);
  254.   while(!(TWCR&(1<<TWINT))){};
  255.   return(TWDR);
  256. }
  257. unsigned char i2cread(unsigned char address)
  258. {
  259.   unsigned char data;
  260.   i2cstart();
  261.   i2cwbyte(i2cw);
  262.   i2cwbyte(address);
  263.   i2cstart();
  264.   i2cwbyte(i2cr);
  265.   data=i2crbyte(0);
  266.   i2cstop();
  267.   return data;
  268. }
  269. void i2cwrite(unsigned char address,unsigned char data)
  270. {
  271.   i2cstart();
  272.   i2cwbyte(i2cw);
  273.   i2cwbyte(address);
  274.   i2cwbyte(data);
  275.   i2cstop();
  276. }
  277. void readdmp(void)
  278. {
  279.   unsigned char dmpnum;
  280.   i2cstart();
  281.   i2cwbyte(i2cw);
  282.   i2cwbyte(0x74);
  283.   i2cstart();
  284.   i2cwbyte(i2cr);     
  285.   for (dmpnum=0;dmpnum<41;dmpnum++)
  286.    {
  287.     dmpdatas[dmpnum]=i2crbyte(1);  
  288.    };
  289.   dmpdatas[41]=i2crbyte(0);
  290.   i2cstop();
  291. }
  292. long getdmplong(unsigned char address)
  293. {
  294.   long dmptempl;
  295.   dmptempl = dmpdatas[address];
  296.   dmptempl <<= 8;
  297.   dmptempl |= dmpdatas[address+1];
  298.   dmptempl <<= 8;
  299.   dmptempl |= dmpdatas[address+2];
  300.   dmptempl <<= 8;
  301.   dmptempl |= dmpdatas[address+3];
  302.   return dmptempl;
  303. }
  304. void getquaternion(void)
  305. {   
  306.   quartf[0] = getdmplong(0)/1073741824.0;  
  307.   quartf[1] = getdmplong(4)/1073741824.0;
  308.   quartf[2] = getdmplong(8)/1073741824.0;
  309.   quartf[3] = getdmplong(12)/1073741824.0;
  310. }
  311. void getgyro(void)
  312. {
  313.   gyrof[0]=getdmplong(16)/16.384;
  314.   gyrof[1]=getdmplong(20)/16.384;
  315.   gyrof[2]=getdmplong(24)/16.384;
  316. }
  317. void getaccel(void)
  318. {
  319.   accelf[0]=getdmplong(28)/32768.0;
  320.   accelf[1]=getdmplong(32)/32768.0;
  321.   accelf[2]=getdmplong(36)/32768.0;
  322. }
  323. void init6050(void)
  324. {
  325.   i2cwrite(0x6b , 0b10000000);                          
  326.   delay_ms(200);
  327.   i2cwrite(0x6b , 0b00000001);                          //No sleep  , 3 PLL with X axis gyroscope reference
  328.   i2cwrite(0x23 , 0b00000000);                          //FIFO 11111000 ,temp,gx,gy,gz,accel
  329.   i2cwrite(0x19 , 0b00000101);                          //SMPLRT_DIV,+1 ,要能被 FIFO rate 整除
  330.   i2cwrite(0x1a , 0b00000011);                          //00 111,8k ,other  1K  DLPF
  331.   i2cwrite(0x1b , 0b00011000);                          //00011000  GYRO-CFG +-2000d/s
  332.   i2cwrite(0x1c , 0b00000000);                          //ACCEL  +-2g/s
  333. }

  334. void loadfirmware(void)
  335. {
  336.   unsigned int datanum=0;
  337.   unsigned char bank;
  338.   unsigned lastbank=1;
  339.   for (datanum=0;datanum<1929;datanum++)
  340.    {
  341.      bank=datanum/256;
  342.      if(lastbank!=bank){
  343.        i2cwrite(0x6d,bank);
  344.        i2cwrite(0x6e,0);
  345.      }
  346.      i2cwrite(0x6f,dmpmemorydata[datanum]);
  347.      lastbank=bank;
  348.     };
  349. }
  350. void loadcfgupd(void)
  351. {
  352.   unsigned char line;
  353.   unsigned char bank;
  354.   unsigned char datacounts=0;
  355.   unsigned char bytes2write;
  356.   unsigned char offset;
  357.   unsigned char writingcounts;
  358.      
  359.   for (line=0;line<37;line++)
  360.   {
  361.     bank=dmpcfgupddata[datacounts];
  362.     datacounts++;
  363.     offset=dmpcfgupddata[datacounts];
  364.     datacounts++;
  365.     bytes2write=dmpcfgupddata[datacounts];
  366.     i2cwrite(0x6d,bank);  
  367.     i2cwrite(0x6e,offset);
  368.    
  369.     for (writingcounts=0;writingcounts<bytes2write;writingcounts++)
  370. {
  371.      datacounts++;
  372.         i2cwrite(0x6f,dmpcfgupddata[datacounts]);  
  373.     };
  374.     datacounts++;
  375.   };
  376. }
  377. void getyawpitchroll(void)
  378. {
  379.   // Roll = Atan2(2 *(Y * Z + W * X) , W * W -X * X -Y * Y + Z * Z)
  380. yprf[0] = atan2(2 *(quartf[2] * quartf[3] + quartf[0] * quartf[1]) , quartf[0] * quartf[0] -quartf[1] * quartf[1] -quartf[2] * quartf[2] + quartf[3] * quartf[3])*57.3;
  381.   // Pitch = asin(-2 * (X * Z - W * Y))  
  382. yprf[1]=asin(-2*(quartf[1]*quartf[3]-quartf[0]*quartf[2]))*57.3;
  383.   // Yaw   = atan2(2 * (X * Y + W * Z) ,W * W + X * X - Y * Y - Z * Z)
  384. yprf[2]=atan2(2*(quartf[1] * quartf[2] + quartf[0] * quartf[3]) , quartf[0] * quartf[0] +quartf[1] * quartf[1] -quartf[2] * quartf[2] - quartf[3] * quartf[3])*57.3;
  385. }

  386. void main(void)
  387. {
  388. unsigned int fifocounts;
  389. // Bit Rate: 400.000 kHz
  390. TWBR=0x0a;
  391. TWAR=0x00;
  392. TWCR=0x94;
  393. TWSR=0x00;
  394. // Alphanumeric LCD initialization
  395. // Connections specified in the
  396. // Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
  397. // RS - PORTA Bit 2
  398. // RD - PORTA Bit 1
  399. // EN - PORTA Bit 3
  400. // D4 - PORTA Bit 4
  401. // D5 - PORTA Bit 5
  402. // D6 - PORTA Bit 6
  403. // D7 - PORTA Bit 7
  404. // Characters/line: 16
  405. lcd_init(16);   
  406. i2cinit();   
  407. lcd_clear();
  408. init6050();
  409. loadfirmware();
  410. loadcfgupd();

  411. i2cwrite(0x70 , 0b00000011);                        
  412. i2cwrite(0x71 , 0b00000000);                        
  413. i2cwrite(0x6a , 0b11001100);  
  414. while(1)
  415. {   
  416.    do
  417.     {
  418.        do {  
  419.          fifocounts=i2cread(0x72);
  420.          fifocounts=fifocounts<<8;
  421.          fifocounts=fifocounts+i2cread(0x73);    //读出FIFO里有多少数据
  422.          //showlong(12,3,fifocounts);
  423.      }
  424.        while (fifocounts<42);
  425.        readdmp();  
  426.     fifocounts=i2cread(0x72);
  427.        fifocounts=fifocounts<<8;
  428.        fifocounts=fifocounts+i2cread(0x73);
  429.    }while(fifocounts>=42);
  430.          
  431.    getquaternion();
  432.    //getgyro();
  433.    //getaccel();
  434.    getyawpitchroll();
  435.    showlong(12,0,dmpdatas[0]);      //显示一下原始数据,看有没有规律
  436.    showlong(12,1,dmpdatas[1]);
  437.    showfloat(0,0,yprf[0]);   //显示 ROLL PITCH YAW 值
  438.    showfloat(0,1,yprf[1]);
  439.    showfloat(0,2,yprf[2]);
  440.    delay_ms(200);      
  441.    lcd_clear();
  442. }
  443. }
复制代码

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
发表于 2014-1-20 11:05:44 | 显示全部楼层
哇,乐高玩具竟然可以玩的这么深入,还有程序......
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2014-1-20 11:22:52 | 显示全部楼层
看半天没看懂……
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2014-1-20 12:31:13 | 显示全部楼层
我的天,这字典写的,头晕。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2014-3-8 14:45:56 | 显示全部楼层
我在stm8上模仿你的思路写了代码,但是在读取fifo中的数据的时候走不出循环。
do

    {

       do {  

         fifocounts=i2cread(0x72);

         fifocounts=fifocounts<<8;

         fifocounts=fifocounts+i2cread(0x73);    //读出FIFO里有多少数据

         //showlong(12,3,fifocounts);

     }

       while (fifocounts<42);

       readdmp();  

    fifocounts=i2cread(0x72);

       fifocounts=fifocounts<<8;

       fifocounts=fifocounts+i2cread(0x73);

   }while(fifocounts>=42);
自己感觉是fifo的写入速度是比读取的速度还要快。请教楼主如何设置fifo的写入速度,是不是直接和mpu6050的采样速度挂钩的。
i2cwrite(0x70 , 0b00000011);                        

i2cwrite(0x71 , 0b00000000);                        

i2cwrite(0x6a , 0b11001100);  
这几个寄存器是设置的什么内容,我在官方手册中只看到了0x6a是USER_CTRL,前面两个手册上找不到,官网上下的dmp库中却是有用到前面两个寄存器,但没看明白怎么用的,自己也就不知道该如何设置。
希望楼主不吝赐教
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2014-3-8 14:50:03 | 显示全部楼层
还有就是读取加速度accel 以及 角速度gyro时,为什么是连读4个字节,看官方库以及手册应该是读取2个字节,只有在读取四元数的时候是4个字节。不知道楼主是不是写错了。因为无论是2字节还是4字节后面main函数中的内容不会受影响。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2014-3-25 10:55:28 | 显示全部楼层
楼上的,给你6050的寄存器资料(其实网上有的)

MPU-6050寄存器映射.pdf

650.26 KB, 下载次数: 19

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2014-5-21 22:07:30 | 显示全部楼层
本帖最后由 catluoq 于 2014-5-21 22:20 编辑

很惊奇在这里看到了这个程序,问题是 Author  : 怎么是空的,应该是catluoq,就是本人啊,该说明一下,这是在CodeVisionAVR 2.05环境下编译的。另回复5、6楼BPT_YCC,MPU6050 DMP的功能在官方公开手册里是没有的,读取速度其实够快,关于fifo速率,仔细读firmware,config,update库,里面已经有说明,至于gyro,accel数据,要读4字节,没错,原因是,读的是42个字节的DMP包数据,不是正常运行状态的数据,那个当然是2个字节,再重复一遍,DMP功能的参数在官方公开手册里是没有的,不管你英语水平有多高,实际上就是没写。我在ambbs论坛里贴出来的,也有人碰到和你一样的问题,可以参考他们的解决办法,不过我建议还是自己多摸索一下,那才有乐趣。别难为楼主了。阿莫论坛我不会再上了,站长有毛病。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2015-1-10 16:03:18 | 显示全部楼层
catluoq 发表于 2014-5-21 22:07
很惊奇在这里看到了这个程序,问题是 Author  : 怎么是空的,应该是catluoq,就是本人啊,该说明一下,这是 ...

我试着在atmel studio中移植了您的代码,使用atmega16,也是在read fifo的时候有问题,走不出count < 42的循环。。。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

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

本版积分规则

QQ|手机版|中文乐高 ( 桂ICP备13001575号-7 )

GMT+8, 2024-11-5 17:26 , Processed in 0.099909 second(s), 23 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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