刚才说到DMP移植,要上资料。 
圆点博士的库: 
我们移植的并不是官方的库,而是圆点博士的库,还包括他的I2C,两者是配套使用的。这个移植要比官方的简单。但是很想给官方和圆点博士点建议,多用点宏定义,不要老是retuen 0/1/2...绕晕了,还有那个发送用串口发送字符用起来太麻烦了,还要自己数多少个字符。添加圆点博士的文件到工程里面,该include的就include。 
首先初始I2C、DMP、MPU6005如下: 
        uart_init(115200);         //串口初始化为115200 
        //引用圆点博士的I2C程序,这里跟我们平常没有什么区别 
        ANBT_I2C_Configuration();                //IIC初始化 
        AnBT_DMP_MPU6050_Init();                        //6050DMP初始化 
复制代码 
 
我稍微将他的程序改了下,一些英文的被我改为中文了,因为不习惯。^_^ 
 
 
接着定义一些变量,变量的意义如下: 
        short gyro[3], accel[3], sensors;//陀螺仪存放数组,加速度存放数组,返回状态量 
        unsigned char more; 
        long quat[4];//四元数存放数组 
        float Yaw=0.00,Roll,Pitch;//欧拉角 
        float q0=1.0f,q1=0.0f,q2=0.0f,q3=0.0f;//计算姿态过程用到的变量 
复制代码 
 
接着用库函数读出四元数 
dmp_read_fifo(gyro, accel, quat, &sensor_timestamp, &sensors,&more);         
复制代码 
计算欧拉角,里面包含了上面所说的将四元数转化为欧拉角的公式。 
                 if(sensors&INV_WXYZ_QUAT) 
                 { 
                         q0=quat[0] / q30; 
                         q1=quat[1] / q30; 
                         q2=quat[2] / q30; 
                         q3=quat[3] / q30; 
                         Pitch = asin(-2 * q1 * q3 + 2 * q0* q2)* 57.3; // pitch 
                         Roll = atan2(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2* q2 + 1)* 57.3; // roll 
                         Yaw =         atan2(2*(q1*q2 + q0*q3),q0*q0+q1*q1-q2*q2-q3*q3) * 57.3;                 
        //         printf("pitch: %.2f    roll:%.2f                yaw:%.2f\r\n",Pitch,Roll,Yaw);                //普通串口输出 
                        Data_Send_Status(Pitch,Roll,Yaw,gyro,accel); 
                        delay_init(72); 
                 }            
复制代码 
最后写一个符合你上位机通讯协议的发送程序,我的是匿名四轴最新版上位机,函数如下: 
/*函数功能:根据匿名最新上位机协议写的显示姿态的程序 
*具体原理看匿名的讲解视频 
*/ 
 
void Data_Send_Status(float Pitch,float Roll,float Yaw,int16_t *gyro,int16_t *accel) 
{ 
        unsigned char i=0; 
        unsigned char _cnt=0,sum = 0; 
        unsigned int _temp; 
        u8 data_to_send[50]; 
 
        data_to_send[_cnt++]=0xAA; 
        data_to_send[_cnt++]=0xAA; 
        data_to_send[_cnt++]=0x01; 
        data_to_send[_cnt++]=0; 
 
        _temp = (int)(Roll*100); 
        data_to_send[_cnt++]=BYTE1(_temp); 
        data_to_send[_cnt++]=BYTE0(_temp); 
        _temp = 0-(int)(Pitch*100); 
        data_to_send[_cnt++]=BYTE1(_temp); 
        data_to_send[_cnt++]=BYTE0(_temp); 
        _temp = (int)(Yaw*100); 
        data_to_send[_cnt++]=BYTE1(_temp); 
        data_to_send[_cnt++]=BYTE0(_temp); 
 
        data_to_send[3] = _cnt-4; 
        //和校验 
        for(i=0;i<_cnt;i++) 
                sum+= data_to_send; 
        data_to_send[_cnt++]=sum; 
 
        //串口发送数据 
        for(i=0;i<_cnt;i++) 
                AnBT_Uart1_Send_Char(data_to_send); 
} 
复制代码 
然后就可以了,就是这么简单! 
最后把线接对,就可以了,还有把匿名的上位机视频真的好好看看,不然你有时都不知道你错在哪里!!!!!!!!!! 
传上移植好的工程文件: 
如果你想用官方的东西去移植也是可以的,我没有试过,但是我研究过别人的程序,我觉得跟圆点博士库的最大区别在于下面这个函数。实际上圆点博士已经讲初始化的步骤都包含在这个函数里面,这样子我们就不用一步一步去做,要了解究竟要做什么,去看这个函数就好。里面的内容一打开跟别人官方库移植的一对比你就会清楚的,官方的移植没有包含在这个函数里面而已。都差不多。 
AnBT_DMP_MPU6050_Init();                        //6050DMP初始化 
复制代码 
上传官方文档: 
阿莫上传文件太慢了,我直接上传到百度云盘给链接吧 
DMP官方工程:http://pan.baidu.com/s/1pJoF4pl  
用库但是思路跟上面移植差不多的工程:http://pan.baidu.com/s/1eQimoIe(没有试验过,不能保证可以运行) 
就先写到这里了,以后如果有什么补充再发多几个帖子。卡尔曼滤波等问题还没有学会,等学会了也发个帖子。 
如果有大神发现什么错误,跟我说下!!互相学习转载 
 
 |