1、前言
在之前的stm32基础篇中,已经实现了软模拟IIC,调用MPU的DMP库输出四元数转化为欧拉角,以及编写匿名上位机的通讯协议。
直接点击可以看。
从程序模块化设计的角度,现在每一个模块已经测试完毕,现在需要将各个模块组合在一起,使数据通用、逻辑顺序正确即可。
2、设计思路
在四旋翼整体设计中分析到,姿态数据的读取储存非常重要,所以安排在1KHz的程序里面。
并且这次我们需要引入一个新的全局变量——report,控制是否将飞控信息发送给匿名上位机,现在设计可以直接将report软件设置为1(默认上报),在后期系统整体设计的时候,可以将report通过遥控器数据改变,比如遥控器上的辅助通道3可以用来控制report的值。
并且新增一个数据结构体,将10个数据储存到专门的结构体中。
3、程序实现
/**
* 功能:MPU初始化封装
* 入口参数:
* 返回值:
*/
void MPU6050_Init(void)
{
MPU_Init();//自定义MPU初始化
while(mpu_dmp_init())
BEEP =! BEEP;//dmp库初始化
}
/**
* 功能:MPU获取数据
* 入口参数:结构体 &out_angle,&acc,&gyro
* 返回值:
*/
void MPU_GetData(void)
{
if(mpu_dmp_get_data(&out_angle.pitch,&out_angle.roll,&out_angle.yaw)==0)
{
MPU_Get_Accelerometer(&acc.x,&acc.y,&acc.z); //得到加速度传感器数据
MPU_Get_Gyroscope(&gyro.x,&gyro.y,&gyro.z); //得到陀螺仪数据
}
}
先看第一个程序,我们将之前的MPU_Init()和mpu_dmp_init(),结合到一起,并且在dmp未初始化完成时蜂鸣器提醒。
第二个程序是获取陀螺仪数据函数,也是将之前的三个数据获取函数封装为一个函数。这样主程序调用时简单明了。
if(Count_1ms>=1)
{
Count_1ms=0;
/*1000Hz任务*/
MPU_GetData();
if(report==1)//发送数据给上位机
{
usart1_report_imu(acc.x,acc.y,acc.z,gyro.x,gyro.y,gyro.z,(int)(out_angle.roll*100),(int)(out_angle.pitch*100),(int)(out_angle.yaw*10));
}
}
if(Count_25ms>=25)
{
Count_25ms=0;
/*20Hz遥控器接收PPM信号*/
PPM_DataArrange(PPM_Databuf);//PPM数据整理 存储在 Rc结构体 中
DataOutput_ToMOT(Rc_LOCK);
if(report==1)//发送数据给上位机
{
// usart1_report_pid(u16 rol_p,u16 rol_i,u16 rol_d,u16 pit_p,u16 pit_i,u16 pit_d,u16 yaw_p,u16 yaw_i,u16 yaw_d);
usart1_report_rc(Rc.THROTTLE,Rc.YAW,Rc.ROLL,Rc.PITCH,Rc.AUX1,Rc.AUX2,Rc.AUX3,Rc.AUX4,0,(int)((Rc.mot1-1000)/10),(int)((Rc.mot2-1000)/10),(int)((Rc.mot3-1000)/10),(int)((Rc.mot4-1000)/10),0);
}
}
在主程序中,我们首先调用第一个封装好的初始化函数,然后在1KHz的程序中调用GET_DATA()函数,这样我们就完成了对MPU数据的读取。
然后加入全局变量report,判断report的值来决定是否向上位机上传数据,并且report可以自己设计让遥控器实现什么样的操作来开启上报。
在上一次设计的遥控器数据中,也要上传给上位机,而通讯协议在之前的匿名上位机通讯协议分析中已经编写完成,只需要带入相应的数据即可
4、实验现象
图片左侧和右侧上方的数据有变化,说明陀螺仪数据读取、传输正常。
右侧中下方,节流阀,姿态角,辅助通道1、2,以及电机PWM的占空比显示正常,说明遥控器数据读取、解析、传输正常。
5、总结
程序设计到这里,大部分的工作已经完成了,还剩下最后的PID程序加入,以及PID的调参任务。从这次四轴的制作中可以看到,程序模块化设计非常简洁方便,初期只需要将一个大型任务分解为各个小任务,逐个击破,最后整合一起,就能完成我们想要的效果