搜索
bottom↓
回复: 12

mpu6050数据分析

[复制链接]

出0入0汤圆

发表于 2013-1-31 20:40:08 | 显示全部楼层 |阅读模式
那位大师能把它改成串口调试助手显示数据
  1. #include <REG52.H>       
  2. #include <math.h>    //Keil library  
  3. #include <stdio.h>   //Keil library       
  4. #include <INTRINS.H>
  5. typedef unsigned char  uchar;
  6. typedef unsigned short ushort;
  7. typedef unsigned int   uint;
  8. //****************************************
  9. // 定义51单片机端口
  10. //****************************************
  11. #define DataPort P0                //LCD1602数据端口
  12. sbit    SCL=P1^0;                        //IIC时钟引脚定义
  13. sbit    SDA=P1^1;                        //IIC数据引脚定义
  14. sbit    LCM_RS=P2^6;                //LCD1602命令端口               
  15. sbit    LCM_RW=P2^5;                //LCD1602命令端口               
  16. sbit    LCM_EN=P2^7;                //LCD1602命令端口                                                   

  17. //****************************************
  18. // 定义MPU6050内部地址
  19. //****************************************
  20. #define        SMPLRT_DIV                0x19        //陀螺仪采样率,典型值:0x07(125Hz)
  21. #define        CONFIG                        0x1A        //低通滤波频率,典型值:0x06(5Hz)
  22. #define        GYRO_CONFIG                0x1B        //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s)
  23. #define        ACCEL_CONFIG        0x1C        //加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz)
  24. #define        ACCEL_XOUT_H        0x3B
  25. #define        ACCEL_XOUT_L        0x3C
  26. #define        ACCEL_YOUT_H        0x3D
  27. #define        ACCEL_YOUT_L        0x3E
  28. #define        ACCEL_ZOUT_H        0x3F
  29. #define        ACCEL_ZOUT_L        0x40
  30. #define        TEMP_OUT_H                0x41
  31. #define        TEMP_OUT_L                0x42
  32. #define        GYRO_XOUT_H                0x43
  33. #define        GYRO_XOUT_L                0x44       
  34. #define        GYRO_YOUT_H                0x45
  35. #define        GYRO_YOUT_L                0x46
  36. #define        GYRO_ZOUT_H                0x47
  37. #define        GYRO_ZOUT_L                0x48
  38. #define        PWR_MGMT_1                0x6B        //电源管理,典型值:0x00(正常启用)
  39. #define        WHO_AM_I                        0x75        //IIC地址寄存器(默认数值0x68,只读)
  40. #define        SlaveAddress        0xD0        //IIC写入时的地址字节数据,+1为读取
  41. //****************************************
  42. //定义类型及变量
  43. //****************************************
  44. uchar dis[4];                                                        //显示数字(-511至512)的字符数组
  45. int        dis_data;                                                //变量
  46. //int        Temperature,Temp_h,Temp_l;        //温度及高低位数据
  47. //****************************************
  48. //函数声明
  49. //****************************************
  50. void  delay(unsigned int k);                                                                                //延时
  51. //LCD相关函数
  52. void  InitLcd();                                                                                                                //初始化lcd1602
  53. void  lcd_printf(uchar *s,int temp_data);
  54. void  WriteDataLCM(uchar dataW);                                                                        //LCD数据
  55. void  WriteCommandLCM(uchar CMD,uchar Attribc);                                //LCD指令
  56. void  DisplayOneChar(uchar X,uchar Y,uchar DData);                        //显示一个字符
  57. void  DisplayListChar(uchar X,uchar Y,uchar *DData,L);        //显示字符串
  58. //MPU6050操作函数
  59. void  InitMPU6050();                                                                                                        //初始化MPU6050
  60. void  Delay5us();
  61. void  I2C_Start();
  62. void  I2C_Stop();
  63. void  I2C_SendACK(bit ack);
  64. bit   I2C_RecvACK();
  65. void  I2C_SendByte(uchar dat);
  66. uchar I2C_RecvByte();
  67. void  I2C_ReadPage();
  68. void  I2C_WritePage();
  69. void  display_ACCEL_x();
  70. void  display_ACCEL_y();
  71. void  display_ACCEL_z();
  72. uchar Single_ReadI2C(uchar REG_Address);                                                //读取I2C数据
  73. void  Single_WriteI2C(uchar REG_Address,uchar REG_data);        //向I2C写入数据
  74. //****************************************
  75. //整数转字符串
  76. //****************************************
  77. void lcd_printf(uchar *s,int temp_data)
  78. {
  79.         if(temp_data<0)
  80.         {
  81.                 temp_data=-temp_data;
  82.                 *s='-';
  83.         }
  84.         else *s=' ';
  85.         *++s =temp_data/100+0x30;
  86.         temp_data=temp_data%100;     //取余运算
  87.         *++s =temp_data/10+0x30;
  88.         temp_data=temp_data%10;      //取余运算
  89.         *++s =temp_data+0x30;        
  90. }
  91. //****************************************
  92. //延时
  93. //****************************************
  94. void delay(unsigned int k)       
  95. {                                               
  96.         unsigned int i,j;                               
  97.         for(i=0;i<k;i++)
  98.         {                       
  99.                 for(j=0;j<121;j++);
  100.         }                                               
  101. }
  102. //****************************************
  103. //LCD1602初始化
  104. //****************************************
  105. void InitLcd()                               
  106. {                       
  107.         WriteCommandLCM(0x38,1);       
  108.         WriteCommandLCM(0x08,1);       
  109.         WriteCommandLCM(0x01,1);       
  110.         WriteCommandLCM(0x06,1);       
  111.         WriteCommandLCM(0x0c,1);
  112.         DisplayOneChar(0,0,'A');
  113.         DisplayOneChar(0,1,'G');
  114. }                       
  115. //****************************************
  116. //LCD1602写允许
  117. //****************************************
  118. void WaitForEnable(void)       
  119. {                                       
  120.         DataPort=0xff;               
  121.         LCM_RS=0;LCM_RW=1;_nop_();
  122.         LCM_EN=1;_nop_();_nop_();
  123.         while(DataPort&0x80);       
  124.         LCM_EN=0;                               
  125. }                                       
  126. //****************************************
  127. //LCD1602写入命令
  128. //****************************************
  129. void WriteCommandLCM(uchar CMD,uchar Attribc)
  130. {                                       
  131.         if(Attribc)WaitForEnable();       
  132.         LCM_RS=0;LCM_RW=0;_nop_();
  133.         DataPort=CMD;_nop_();       
  134.         LCM_EN=1;_nop_();_nop_();LCM_EN=0;
  135. }                                       
  136. //****************************************
  137. //LCD1602写入数据
  138. //****************************************
  139. void WriteDataLCM(uchar dataW)
  140. {                                       
  141.         WaitForEnable();               
  142.         LCM_RS=1;LCM_RW=0;_nop_();
  143.         DataPort=dataW;_nop_();       
  144.         LCM_EN=1;_nop_();_nop_();LCM_EN=0;
  145. }               
  146. //****************************************
  147. //LCD1602写入一个字符
  148. //****************************************
  149. void DisplayOneChar(uchar X,uchar Y,uchar DData)
  150. {                                               
  151.         Y&=1;                                               
  152.         X&=15;                                               
  153.         if(Y)X|=0x40;                                       
  154.         X|=0x80;                       
  155.         WriteCommandLCM(X,0);               
  156.         WriteDataLCM(DData);               
  157. }                                               
  158. //****************************************
  159. //LCD1602显示字符串
  160. //****************************************
  161. void DisplayListChar(uchar X,uchar Y,uchar *DData,L)
  162. {
  163.         uchar ListLength=0;
  164.         Y&=0x1;               
  165.         X&=0xF;               
  166.         while(L--)            
  167.         {                       
  168.                 DisplayOneChar(X,Y,DData[ListLength]);
  169.                 ListLength++;  
  170.                 X++;                        
  171.         }   
  172. }
  173. //**************************************
  174. //延时5微秒(STC90C52RC@12M)
  175. //不同的工作环境,需要调整此函数
  176. //当改用1T的MCU时,请调整此延时函数
  177. //**************************************
  178. void Delay5us()
  179. {
  180.         _nop_();_nop_();_nop_();_nop_();
  181.         _nop_();_nop_();_nop_();_nop_();
  182.         _nop_();_nop_();_nop_();_nop_();
  183.         _nop_();_nop_();_nop_();_nop_();
  184.         _nop_();_nop_();_nop_();_nop_();
  185.         _nop_();_nop_();_nop_();_nop_();
  186. }
  187. //**************************************
  188. //I2C起始信号
  189. //**************************************
  190. void I2C_Start()
  191. {
  192.     SDA = 1;                    //拉高数据线
  193.     SCL = 1;                    //拉高时钟线
  194.     Delay5us();                 //延时
  195.     SDA = 0;                    //产生下降沿
  196.     Delay5us();                 //延时
  197.     SCL = 0;                    //拉低时钟线
  198. }
  199. //**************************************
  200. //I2C停止信号
  201. //**************************************
  202. void I2C_Stop()
  203. {
  204.     SDA = 0;                    //拉低数据线
  205.     SCL = 1;                    //拉高时钟线
  206.     Delay5us();                 //延时
  207.     SDA = 1;                    //产生上升沿
  208.     Delay5us();                 //延时
  209. }
  210. //**************************************
  211. //I2C发送应答信号
  212. //入口参数:ack (0:ACK 1:NAK)
  213. //**************************************
  214. void I2C_SendACK(bit ack)
  215. {
  216.     SDA = ack;                  //写应答信号
  217.     SCL = 1;                    //拉高时钟线
  218.     Delay5us();                 //延时
  219.     SCL = 0;                    //拉低时钟线
  220.     Delay5us();                 //延时
  221. }
  222. //**************************************
  223. //I2C接收应答信号
  224. //**************************************
  225. bit I2C_RecvACK()
  226. {
  227.     SCL = 1;                    //拉高时钟线
  228.     Delay5us();                 //延时
  229.     CY = SDA;                   //读应答信号
  230.     SCL = 0;                    //拉低时钟线
  231.     Delay5us();                 //延时
  232.     return CY;
  233. }
  234. //**************************************
  235. //向I2C总线发送一个字节数据
  236. //**************************************
  237. void I2C_SendByte(uchar dat)
  238. {
  239.     uchar i;
  240.     for (i=0; i<8; i++)         //8位计数器
  241.     {
  242.         dat <<= 1;              //移出数据的最高位
  243.         SDA = CY;               //送数据口
  244.         SCL = 1;                //拉高时钟线
  245.         Delay5us();             //延时
  246.         SCL = 0;                //拉低时钟线
  247.         Delay5us();             //延时
  248.     }
  249.     I2C_RecvACK();
  250. }
  251. //**************************************
  252. //从I2C总线接收一个字节数据
  253. //**************************************
  254. uchar I2C_RecvByte()
  255. {
  256.     uchar i;
  257.     uchar dat = 0;
  258.     SDA = 1;                    //使能内部上拉,准备读取数据,
  259.     for (i=0; i<8; i++)         //8位计数器
  260.     {
  261.         dat <<= 1;
  262.         SCL = 1;                //拉高时钟线
  263.         Delay5us();             //延时
  264.         dat |= SDA;             //读数据               
  265.         SCL = 0;                //拉低时钟线
  266.         Delay5us();             //延时
  267.     }
  268.     return dat;
  269. }
  270. //**************************************
  271. //向I2C设备写入一个字节数据
  272. //**************************************
  273. void Single_WriteI2C(uchar REG_Address,uchar REG_data)
  274. {
  275.     I2C_Start();                  //起始信号
  276.     I2C_SendByte(SlaveAddress);   //发送设备地址+写信号
  277.     I2C_SendByte(REG_Address);    //内部寄存器地址,
  278.     I2C_SendByte(REG_data);       //内部寄存器数据,
  279.     I2C_Stop();                   //发送停止信号
  280. }
  281. //**************************************
  282. //从I2C设备读取一个字节数据
  283. //**************************************
  284. uchar Single_ReadI2C(uchar REG_Address)
  285. {
  286.         uchar REG_data;
  287.         I2C_Start();                   //起始信号
  288.         I2C_SendByte(SlaveAddress);    //发送设备地址+写信号
  289.         I2C_SendByte(REG_Address);     //发送存储单元地址,从0开始       
  290.         I2C_Start();                   //起始信号
  291.         I2C_SendByte(SlaveAddress+1);  //发送设备地址+读信号
  292.         REG_data=I2C_RecvByte();       //读出寄存器数据
  293.         I2C_SendACK(1);                //接收应答信号
  294.         I2C_Stop();                    //停止信号
  295.         return REG_data;
  296. }
  297. //**************************************
  298. //初始化MPU6050
  299. //**************************************
  300. void InitMPU6050()
  301. {
  302.         Single_WriteI2C(PWR_MGMT_1, 0x00);        //解除休眠状态
  303.         Single_WriteI2C(SMPLRT_DIV, 0x07);
  304.         Single_WriteI2C(CONFIG, 0x06);
  305.         Single_WriteI2C(GYRO_CONFIG, 0x18);
  306.         Single_WriteI2C(ACCEL_CONFIG, 0x01);
  307. }
  308. //**************************************
  309. //合成数据
  310. //**************************************
  311. int GetData(uchar REG_Address)
  312. {
  313.         char H,L;
  314.         H=Single_ReadI2C(REG_Address);
  315.         L=Single_ReadI2C(REG_Address+1);
  316.         return (H<<8)+L;   //合成数据
  317. }
  318. //**************************************
  319. //在1602上显示10位数据
  320. //**************************************
  321. void Display10BitData(int value,uchar x,uchar y)
  322. {
  323.         value/=64;                                                        //转换为10位数据
  324.         lcd_printf(dis, value);                        //转换数据显示
  325.         DisplayListChar(x,y,dis,4);        //启始列,行,显示数组,显示长度
  326. }
  327. //**************************************
  328. //显示温度
  329. //**************************************
  330. /*
  331. void display_temp()
  332. {         Temp_h=Single_ReadI2C(TEMP_OUT_H); //读取温度
  333.         Temp_l=Single_ReadI2C(TEMP_OUT_L); //读取温度
  334.         Temperature=Temp_h<<8|Temp_l;     //合成温度
  335.         Temperature = 35+ ((double) (Temperature + 13200)) / 280; // 计算出温度
  336.         lcd_printf(dis,Temperature);     //转换数据显示
  337.         DisplayListChar(11,1,dis,4);     //启始列,行,显示数组,显示位数
  338. }
  339. */
  340. //*********************************************************
  341. //主程序
  342. //*********************************************************
  343. void main()
  344. {
  345.         delay(500);                //上电延时               
  346.         InitLcd();                //液晶初始化
  347.         InitMPU6050();        //初始化MPU6050
  348.         delay(150);
  349.         while(1)
  350.         {
  351.                 Display10BitData(GetData(ACCEL_XOUT_H),2,0);        //显示X轴加速度
  352.                 Display10BitData(GetData(ACCEL_YOUT_H),7,0);        //显示Y轴加速度
  353.                 Display10BitData(GetData(ACCEL_ZOUT_H),12,0);        //显示Z轴加速度
  354.                 Display10BitData(GetData(GYRO_XOUT_H),2,1);        //显示X轴角速度
  355.                 Display10BitData(GetData(GYRO_YOUT_H),7,1);        //显示Y轴角速度
  356.                 Display10BitData(GetData(GYRO_ZOUT_H),12,1);        //显示Z轴角速度
  357.                 delay(5000);
  358.         }
  359. }
  360.          /*
  361.     在论坛上潜水几个月了,跟大家学习两轮平衡车的制作,获益良多。
  362. 在调试传感器数据和滤波时写了一个串口工具,趁这个周末整理
  363. 了一下,共享出来,希望能对初学者们有所帮助。
  364.     功能比较简单,主要是接收单片机发送来的3个整型数据,以图形显示。
  365. 可以向单片机发送几个字节,用作控制目的。单片机发送的数据以0xFF作为
  366. 帧结束标志,每个整型数以5个字节表示,具体参照下面的函数。
  367.     没有经过全面测试,如果你想用但有bug,可以反馈给我 :)

  368.                                            小皮2005
  369.                                            2012.12.08                                                                                  


  370. =============================================================
  371. void Print_Show(int data1, int data2, int data3)
  372. {
  373.         SeriPush2Bytes(data1);             
  374.         SeriPush2Bytes(data2);             
  375.         SeriPush2Bytes(data3);             
  376.         uart_transmit(0xff);
  377. }


  378. void SeriPush2Bytes(int value)
  379. {
  380.         unsigned char t_char;
  381.         if(value < 0) {
  382.                 value = -value;
  383.                 uart_transmit(0xf0);
  384.         }
  385.         else {
  386.                 uart_transmit(0xf5);
  387.         }
  388.         t_char = value/256;
  389.         if(t_char > 127)        uart_transmit(0x80);
  390.         else        uart_transmit(0x00);
  391.         uart_transmit(t_char & 0x7f);
  392.         t_char = value%256;
  393.         if(t_char > 127)        uart_transmit(0x80);
  394.         else        uart_transmit(0x00);
  395.         uart_transmit(t_char & 0x7f);
  396. }

  397. void uart_transmit(char c)
  398. {
  399.         while (!(UCSRA & DATA_REGISTER_EMPTY));
  400.         UDR=c;
  401. }

复制代码

出0入0汤圆

 楼主| 发表于 2013-1-31 21:44:27 | 显示全部楼层
不太成熟,希望多讨论和指点,谢谢大家。

出0入0汤圆

发表于 2013-1-31 22:08:53 | 显示全部楼层
给一堆代码就想吃现成饭?

出0入0汤圆

 楼主| 发表于 2013-2-1 08:01:39 | 显示全部楼层

出0入0汤圆

 楼主| 发表于 2013-2-1 13:39:26 | 显示全部楼层
本帖最后由 123bac 于 2013-2-1 13:40 编辑

得到得的数据2D 30 30 30 30 31 2D 30 30 30 30 31 2D 30 30 30 30 31 0D 0A 2D 30 30 30 30 31 2D 30 30 30 30 31 2D 30 30 30 30 31 2D 30 30 30 30 31 20 30 30 35 31 31 2D 30 30 30 30 31 0D 0A 2D 30 30 30 30 31 2D 30 30 30 30 31 2D 32 38 38 30 30 2D 30 30 30 30 31 2D 30 30 30 30 31 2D 30 30 30 30 31 0D 0A 2D 30 30 31 32 39 2D 30 30 30 30 31 2D 30 30 30 30 31 2D 30 30 30 30 31 2D 30 30 30 30 31 2D 30 30 30 30 31 0D 0A 2D 30 30 30 30 31 2D 30 30 30 30 31 2D 30 30 30 30 31 2D 30 30 30 30 31 2D 30 30 30 30 31 2D 31 35 33 37 30 0D 0A 2D 30 30 30 30 31 2D 30 30 30 30 31 2D 30 30 30 30 31 2D 30 30 32 31 31 2D 30 30 30 30 31 2D 30 30 30 30 31 0D 0A 2D 30 30 30 30 31 2D 30 32 33 30 35 2D 30 30 30 30 31 2D 30 30 30 30 31 2D 30 30 30 30 31 2D 30 30 30 30 31 0D 0A 2D 30 30 30 30 31 2D 30 30 30 30 31 2D 30 30 30 30 31 2D 30 30 30 30 31 2D 30 30 30 30 31 2D 30 30 30 30 31 0D 0A 2D 30 30 30 30 31 2D 30 30 30 30 31 2D 30 30 30 30 31 2D 30 30 30 30 31 2D 30 30 30 34 37

出0入0汤圆

 楼主| 发表于 2013-2-1 13:52:14 | 显示全部楼层
[img][/img]

出0入0汤圆

 楼主| 发表于 2013-2-1 13:53:13 | 显示全部楼层
波形

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-3-3 10:23:21 | 显示全部楼层
Mark  学习了去

出0入0汤圆

发表于 2013-3-3 11:25:32 | 显示全部楼层
123bac 发表于 2013-2-1 13:53
波形

有没有波形那个软件

出0入0汤圆

发表于 2013-4-1 09:21:35 | 显示全部楼层
123bac 发表于 2013-2-1 13:39
得到得的数据2D 30 30 30 30 31 2D 30 30 30 30 31 2D 30 30 30 30 31 0D 0A 2D 30 30 30 30 31 2D 30 30 3 ...

你返回的数据,是16进制的数字,你以ascii码显示,或是字符方式显示,就是你能看懂的数值了。

出0入0汤圆

发表于 2013-4-1 09:24:02 | 显示全部楼层
30zero 发表于 2013-3-3 11:25
有没有波形那个软件

这有个波形软件,可以用,不知道能不能符合你要求。
英文网站,需要一点英文基础,看懂不难的。
https://code.google.com/p/serialchart/

出0入0汤圆

发表于 2013-11-26 11:24:04 | 显示全部楼层
有没有角度补偿算法的呀

出0入0汤圆

发表于 2014-1-5 03:05:05 | 显示全部楼层
现在有个很好的显示波形的软件,匿名的四轴的上位机。我空间说说有图片,分别显示加速度和角度。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-2 19:38

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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