以主函数为纲,逐个研究各个函数的作用。(备忘:roll翻滚角,pitch俯仰角,yow偏航角)
首先要明确,我们这个程序是在稳定飞行的基础上,进行定高,用到了mpu6050,hmc5883数字罗盘,ms5611气压计,气压定高。
mpu6050获取飞机当前重力加速度与各个轴的角度和角速度,先对加速度计和陀螺仪进行零偏校正,然后对原始数据进行加权平均滤波,消除部分震动影响,供内环pid使用。
为了增加飞机的稳定性,进行角度/角速度的串级pid滤波,内环角速度,外环角度,然后得出需要的四路pwm驱动电机,纠正姿态。
我的理解就是pid建立了一个mcu和电机之间的循环,mcu不断读取四轴的姿态,其中由于电机的震动,包含了大量的噪声,甚至覆盖了真实信息,但是
经过pid的滤波处理,得到相对精确的当前姿态坐标,与期望姿态(r,p,y=0)对比,得出电机需要的pwm波。在输出需要的pwm波之前,进行限幅处理,防止输出错误。
在main中,首先是各个定时器和传感器的初始化,电机使能,中断配置,四元数初始化,pid参数初始化,然后是while循环
在死循环里,loop.cnt_10ms那个没看懂,理解应该是当系统循环一次之后,标志清零,保证程序一直循环下去。
在ms5611文件里,采用软件i2c读取传感器寄存器的值,气压和温度,利用温度对气压数据进行温度补偿,在采集五次气压值的数据进行卡尔曼滤波。得出精确的气压值,return baroAlt。
在定高上面,还是利用pid在传感器得出的数据与电机之间建立一个循环,使飞机保持在一个高度不变,也就是气压不变,利用pid使气压保持在一个范围内。
但是就程序来看,我没有在程序中找到自动定高的值,我猜想他可能是由遥控器起飞,当飞机达到想要的高度时,由遥控器给定信号(油门回中),使飞机保持在当前高度不动。虽然也是定高,
但是与比赛的定高有所不同,所以这方面还是需要改进。我的想法是,比如我们想要定高一米,那么就要提前计算出一米高度的气压值,设定在主函数里,当检测到气压值等于这个值时,保持当前高度。
也就是还是利用pid在传感器获取的高度与期望高度之间建立循环。当低于期望高度时,电机稳定输出,匀速上升。当高于期望高度时,电机减速,缓慢下降。