我现在打算用“战舰”板的相关例程稍加改写,用6050测量xyz的加速度并在lcd板上显示。为表达清晰,我将详细叙述本实验和我所遇到的问题如下: * 实验目的:用6050模块测量xyz三个方向的加速度并在lcd板上显示; * 实验进行:(1)思路:例程中已经得到xyz三个方向的原始数据 aacx 、aacy 以及 aacz,我所做的只是将它们在lcd上显示出来; (2)代码:我在例程中添加或改写了极少量的代码,且都是在主函数中改写的。 (I) 在主函数的 while(1) 程序段之前添加: LCD_ShowString(30,300,200,16,16," aacx: /65536"); LCD_ShowString(30,320,200,16,16," aacy: /65536"); LCD_ShowString(30,340,200,16,16," aacz: /65536"); LCD_ShowString(30,360,200,16,16," Ax: . cm/s2"); LCD_ShowString(30,380,200,16,16," Ay: . cm/s2"); LCD_ShowString(30,400,200,16,16," Az: . cm/s2"); (II) 在主函数的 while(1) 程序段内部添加: Ax = (float)((aacx/11386.0)*9800); //x轴加速度的数字量转换为模拟量且单位为cm/s2 Ay = (float)((aacy/11386.0)*9800); //y轴加速度的数字量转换为模拟量且单位为cm/s2 Az = (float)((aacz/11386.0)*9800); //z轴加速度的数字量转换为模拟量且单位为cm/s2 (III) 在主函数的 while(1) 程序段内部的 if((t%10)==0) 程序段内部添加: LCD_ShowNum(30+48,300,aacx,8,16); //显示aacx LCD_ShowNum(30+48,320,aacy,8,16); //显示aacy LCD_ShowNum(30+48,340,aacz,8,16); //显示aacz LCD_ShowNum(30+48+8,360,Ax/10,5,16); //显示整数部分 LCD_ShowNum(30+48+48+24,360,Ax%10,1,16); //显示小数部分 LCD_ShowNum(30+48+8,380,Ay/10,5,16); //显示整数部分 LCD_ShowNum(30+48+48+24,380,Ay%10,1,16); //显示小数部分 LCD_ShowNum(30+48+8,400,Az/10,5,16); //显示整数部分 LCD_ShowNum(30+48+48+24,400,Az%10,1,16); //显示小数部分 ** 遇到问题:从实验思路来看,这应该是一个很简单的事,但是我遇到了很“奇葩”的问题,如下: (I)从函数 “ MPU_Get_Accelerometer(&aacx,&aacy,&aacz); //得到加速度传感器原始数据 ” 中得到的数据远超65535的上限,如图1所示: (II)aacx、aacy、aacz 貌似不是测量的加速度,因为在6050模块保持静止时这三个数据依旧大的离谱,仍然如图1所示; (III)aacx、aacy、aacz 貌似与6050模块的运动状态没关系,反而与6050模块的角度有关系,当我将此模块由一个静止姿态迅速调整到另一个静止姿态时,这三个数据在前后稳定时的显示值差距非常大。如果的确测量的是加速度,那么前后两个姿态都是静止,按理说不会有差距,也就是说波形应当大体重合。这个如图2所示。 (IV)当aacx、aacy、aacz中有数值明显异常时,其对应的模拟量Ax、Ay、Az也会有错误。仍然以图1所示,aacz=9002 ——>Az=774.8cm/s2 是符合Az = (float)((aacz/11386.0)*9800); 运算的,至于其他两个显然不符合。 aacx、aacy的数据竟然有 千万数量级,显然是错误的。 ** 我的疑问:除了上面提到的问题我无法理解和解释外,我主要有以下问题: (I) aacx、aacy、aacz 是否的确如例程中所说的那样分别表示的是xyz三轴的加速度的原始值(从0-65535的数字量)? (II) 6050模块xyz加速度从数字量到模拟量的转换算法到底是怎样的(就以+-2g为例,是不是:0对应-2g、65535对应+2g、中间等距划分)? (III)匿名四轴上位机的“波形显示”界面的纵轴的数据有什么物理含义(就以图2为例,圈出来的0、6000、14000代表着什么)? 惑之不解,如鲠在喉。附上源代码,万望大牛们能指点小弟一二,感激不尽!
|