微型四轴飞行器

用51单片机做的四轴?以前别人这样说我们只能呵呵一笑说声逗比,但是现在的51早已不是当年的51,6路15位硬件PWM+2路CCP的16位硬件PWM,相当于是8路15位硬件PWM,mega328都可以直接秒掉,而mega328却正是市售MWC飞控的主控,mega328速度16MHZ,等效16MIPS,IAP15W4K61S4@28MHZ,等效25MIPS,运算速度也秒了mega328,也就是说,用51单片机做四轴绝对不成问题。

本人目前大二,做得不尽人意之处欢迎指教,不过麻烦说得别太专业化,我连模拟电路都还没学过,自动控制原理都还只自己看了一些些,太高深的懂不起,但是卡尔曼滤波,PID参数整定还是会的。
相关设计参数:
供电:1S锂电 350mah(600mah的在路上)
电机:720空心杯+59mm桨
MCU:IAP15W4K61S4@28MHZ
陀螺仪加速度计:MPU-6050
磁场传感计:HMC5883L
无线芯片:NRF24L01+
电机驱动MOS管:AO3400
MOS管保护用肖特基:BAT54ST
下载口防静电TVS:Rclamp0524P
机架:94*94mm
PCB厚度:1.2mm FR-4
软件相关参数:
姿态解算&电机控制频率:125HZ(8ms)
PWM频率:28KHZ 1000精度
滤波算法:卡尔曼滤波器
PID控制:PID=P*e(n)+I*[(e(n)+e(n-1)+...+e(0)]+D*[e(n)-e(n-1)]

浅谈PID整定和姿态解算
PID的整定是个让很多人都感到头痛的问题,在此,我想强调一句,PID整定必须建立在良好的姿态解算的基础上才能进行,否则根本没法弄出一个很好的效果。举个例子,我的这个四轴,用互补滤波进行姿态处理,P最多调到3。再调大由于姿态解算不过关,P越大输出的姿态震动越大,即使D调大系统也没法收敛,也就是说这个系统发散了。而用卡尔曼滤波我可以把P调到4.5而且回复也有力,飞起来也稳。
在姿态解算中,有很多种方法,我这采用的就是普通的姿态角,其他的解算方法还有四元素,欧拉角,等等,其实四元数还是要转化为欧拉角才能用于PID,不过四元数没有欧拉角中万向节死锁的问题。具体请百度:四元数,欧拉角,万向节死锁。在此不一一赘述。
我这的姿态解算原理比较简单,就是对三轴加速度的值进行三角函数运算即可。
举个例子,首先我从加速度计中获取数据。

    Accel_y= GetData(ACCEL_YOUT_H);    
    Accel_x= GetData(ACCEL_XOUT_H);           
    Accel_z= GetData(ACCEL_ZOUT_H);                                            

再进行转化,转化公式在MPU6050数据手册里有
    Angle_ax=(Accel_x)/8192;  
    Angle_az=(Accel_z)/8192; 
    Angle_ay=(Accel_y)/8192;    
好了,这里得到的就是我们需要的加速度的值,取值范围0-1,也就是多少个g,g是重力加速度这个就不用说了吧。
之后用反三角函数进行运算:
AngleAx=atan(Angle_ax/sqrt(Angle_ay*Angle_ay+Angle_az*Angle_az))*180/3.141592657; 
公式:X轴角度=arctan(Angle_ax/开根号(Angle_ay^2+Angle_az^2))
好了,这里得到的是弧度制的角度,再乘180除以π即可得到所需的角度值。
之后要对得到的值进行滤波,为什么要滤波呢,因为加速度计对震动特别敏感,一点震动就大姨妈,得到的角度值是不怎么准确的,不过大致在实际角度的上下。
而陀螺仪对震动不敏感,随便怎么震动都不会高潮。陀螺仪输出的数据是多少度一秒,据此进行积分,可以得到短时间内系统的姿态。不过陀螺仪有温飘,温度偏移一点他的误差就会大一点,故要用加速度计的值来对陀螺仪的值进行校准。修正他的温飘误差以及积分误差。这就是互补滤波的原理,短时间内以陀螺仪的值为准,长时间内以加速度计的值来对陀螺仪校准,二者优势互补,去掉不好的一面,这样得到的值就比较理想了。
互补滤波公式举例:Angle=0.95*(Angle-Angle_gy*dt)+0.05*AngleAx;
前面的0.95和0.05是对陀螺仪角度和角速度角度的权值,意思就是你相信哪个的程度更大一点,因为震动是双向的,故对加速度计进行低通滤波会使加速度计输出的值接近实际值,什么是低通滤波呢,打个比方,当前角度=0.95乘上次的角度+0.05乘测量的角度,这就是对测量值进行低通滤波,dt是积分时间,就是定时器定时的时间,我这取8ms,即dt=0.08。


至于卡尔曼滤波

就是一个先进行估计,再根据实际测量的值修改卡尔曼参数,最后再算误差,里面涉及到线性代数,概率论的相关知识

再谈PID,

得到了实时姿态,就知道了误差,知道了误差就要对电机进行控制,在PID中,P指比例,I指积分,D指微分,换种说法,P指回复力,P的输出值=P*误差;P越大偏差所引起的回复力越大。是系统能够回到0点的主要力。D是系统运动的阻力,D的输出值=D*(当前误差-前一次误差),D的存在能阻止系统运动。I是系统静差的消除力,比如你四轴的重心偏了,四轴会朝一边偏,对误差进行积分再乘以I即可消除这种机械结构引起的偏移。I的输出值=I*所有误差积分之和。
光有P存在的情况,系统一有偏差,就会立马回复,不过到0点时由于惯性,会继续运动,故光有P的话系统会震荡,根本停不下来。
故需要D,这个系统运动的克制力来对P进行压制,当PD呈一定比例时,系统就会稳定在一定的值,不过有可能会有点误差,这时就得靠I来修正。
I的原理决定了误差存在的时间约久,回复力越大,I可以理解是变相的回复力,专门用来修正PD没法消除的静差。


PID整定的方法
I和D置0,从小往大调P,调整至用手造成一个误差,感觉回复有力即可。网上所说的调整至等幅震荡不适合小四轴,你根本就不可能把这玩意弄到等幅震荡的状态。总得来说,P调至你觉得回复起来有点力度就行了,不要太过于纠结。
之后从小往大加大D,在D加大的过程中,会出现震荡减小,震荡最小,震荡增大的过程。震荡最小的那一点即very good。
调好PD之后如果系统有静差,适当加上I即可,I不能加大,加大了会导致系统震荡,适当为宜。
这个过程一定要会区分震荡的来源,到底是P引起的还是D引起的。这个口述讲不清,只有靠自己来体会。
调整好XY轴的PID后就该解决四轴自旋的问题了,一般来说XY轴的PID参数是一样的,调好一边,另一边直接复制过去就行。
自旋控制方法有2种,一种是对HMC5883的值进行PD控制。一种是对Z轴陀螺仪旋转速度进行PD控制,后面那种就够了,只不过需要飞前对陀螺仪偏差进行校准。这个PD参数不要太纠结,Z轴稍微给点控制就稳了,毕竟XY轴才是四轴飞起来的关键。
此外,PID的要求是系统的输出量要和被调量成正比,故大四轴比小四轴好调得多,因为大四轴有电调,电调调整的不是电机供电电压,而是力矩,也就是说大四轴输出信号和升力是成正比的,而小四轴不是,但是我们只需要他大概是正比关系就行了,也能好好滴做朋友的。推荐碳刷电机PWM频率为500HZ,空心杯最好是20KHZ以上。
调PID中各种问题及解决方法汇总:
四轴偏离一定角度即使加I也纠正不过来,也就是说四轴明明知道他自己偏了,就是纠正不过来,解决方法:加大P。
D无论怎么调四轴就是要震荡,根本停不下来,解决方法,减小P
系统有细微偏差:加点点I
发现无论怎么调PID根本就不能让四轴取得一个很好的效果:换滤波方案吧,什么梯度下降法,卡尔曼滤波算法都是很好的。
震动越大角度值和实际值偏离越大:陀螺仪装错位置了,在MPU6050模块下面弄点泡沫双面胶可以很好解决,原则上来讲MPU6050是不能太靠近轴的。

猜你喜欢

转载自blog.csdn.net/qq_15063463/article/details/82426981