|
本帖最后由 liang_work 于 2013-10-4 23:58 编辑
如题,买回匿名四轴有一段时间,这一个月才有空开始搞一下。程式大体的框架基本看明白了,现在调PID,基本上能飞了,还算比较稳,但还由于机体不能自动回水平,还达不到最好的效果,现象如下,大家交流指点一下。
为了方便测试,我用一碳杆固定在机体的中点,与PITCH轴平行,平时就先用手拿着调一个轴PID。
1.单用P=8,I=D=0,机体越振越来越大,最后失控。没有办法收敛或在平衡振荡。
2.改为P=8,I=0,D=0.01,机体振动好很多,能保持平衡了,拿着碳杆,用手推拉PITCH方向,机体马上回位,在水平位置,轻微振两下,就停下了,推拉遥控器的摆杆,可以很好地控制机体的PITCH角度,松手摆杆,机体PITCH,马上回位(比用手推拉要慢上一点点),但在水平位置,基本上没有什么振动。
上面机体在没有飞起的表现,算是很不错了(就是不能自动回水平),我有用同样的方法测试了烈火的四轴,金星达的JD385,还其它一个厂家的成品四轴,我的机体和这几款成品四轴的表现都差不多。
但在飞起来后,就明显有差别了,上面三款成品的四轴,在飞起后,有外界的干扰或有摆杆信号后再回水平位,都很好,很快速反应。所以控制很简单,很容易。但我的四轴在飞起后,有外界的干扰或有摆杆信号后再回位时,却没有明显的回水平位的作,如果不向相反的方向打杆,就没有办法回到水平位置。这时的表现与在手上的测试完全不同。真搞不清楚是什么原因造成的。
3.也跟不少朋友请教,有的说,加I,我也试了,用P=8,I=0.05,D=0.1,积分的最大值限制为30(太大会失控),表现,也没有什么太大的改变,也有的朋友说,要用串级PID。但对串级PID了解不多,没有办法测试。
按我的想法,没有飞起时,加外界的干扰或有摆杆信号后再回中的情况,都有自动回到水平位置,说明程式的PID起到应有的作用了。但在飞起后,却又不行。办什么?请大N指点了,现在我算是跟这个问题干上了,在QQ上,见人就问你的机机能自动回位吗?嘿嘿。
下在的程式就是PID部分,大家帮参考一下:
//**********************************************************************
void CONTROL(float rol_now, float pit_now, float yaw_now, float rol_tar, float pit_tar, float yaw_tar)
{
//u16 moto1=0,moto2=0,moto3=0,moto4=0;
int16_t moto1=0,moto2=0,moto3=0,moto4=0;
vs16 throttle;
//******************
rol = rol_tar - rol_now;
pit = pit_tar - pit_now;
yaw = yaw_tar - yaw_now;
//******************
throttle = Rc_Get.THROTTLE - 1000; //1000-2000
if(throttle<0) throttle=0;
//********
//PID_ROL.IMAX = throttle/2;//ºá¹ö×î´óÖµ0£500
PID_ROL.IMAX = 30;
//Get_MxMi(PID_ROL.IMAX,1000,0);//Õâ¸öÓï¾ä£¬Ã»ÓÐÓõ½·µ»ØÖµ£¬ºÃÏóûÓÐÓõġ£
PID_PIT.IMAX = PID_ROL.IMAX;//¸©Ñö×î´óÖµ0£500
//PID_PIT.IMAX = 1000;
//******************P±ÈÀý
PID_ROL.pout = PID_ROL.P * rol;
PID_PIT.pout = PID_PIT.P * pit;
//******************I»ý·Ö
//ÔÚÓÍÃÅ´óÓÚ300£¬µ±Ç°ËÄÔªÊý½âËã³öµÄpit,rolСÓÚ´óÔ¼5¶È£¬¼°°Ú¸ËÐźŵÄÄ¿±ê½Ç¶ÈСÓÚ0.3ʱ£¬ÓÐI»ý·ÖÊä³ö¡£²»ÊǺÜÃ÷£¬Òª·ÖÎö¡£
//if(rol_tar*rol_tar<0.1 && pit_tar*pit_tar<0.1 && rol_now*rol_now<100 && pit_now*pit_now<100 && throttle>200)
//if(rol_tar*rol_tar<30 && pit_tar*pit_tar<30&& throttle>200)
if(throttle>200)
{
//PID_ROL.iout += PID_ROL.I * rol;
//PID_PIT.iout += PID_PIT.I * pit;
rol_i = rol_i+rol;
PID_ROL.iout = PID_ROL.I * rol_i;
pit_i = pit_i+pit;
PID_PIT.iout = PID_PIT.I * pit_i;
PID_ROL.iout = Get_MxMi(PID_ROL.iout,PID_ROL.IMAX,-PID_ROL.IMAX);//ÏÞÖÆ»ý·ÖÊä³ö²»´óÓÚ-500µ½+500,ºÃÏóҲûÓÐʲôÓá£
PID_PIT.iout = Get_MxMi(PID_PIT.iout,PID_PIT.IMAX,-PID_PIT.IMAX);
}
else //Èç¹ûÓÍÃÅֵСÓÚ200£¬»ý·ÖÏîÇå0
{
PID_ROL.iout = 0;
PID_PIT.iout = 0;
rol_i=0;
pit_i=0;
}
//******************D΢·Ö_prev
PID_ROL.dout = PID_ROL.D * MPU6050_GYRO_LAST.X;
PID_PIT.dout = PID_PIT.D * MPU6050_GYRO_LAST.Y;
//**************************************************ÏÂÃæΪYAW²¿·Ý
//******************YAW±ÈÀýP
PID_YAW.pout = PID_YAW.P * yaw;
//******************
//******************YAW΢·ÖD
vs16 yaw_d;
//************Èç¹û·½Ïò¶æ²»ÔÚÖе㣬
if(1450>Rc_Get.YAW || Rc_Get.YAW>1550)
{
yaw_d = MPU6050_GYRO_LAST.Z + (Rc_Get.YAW-1500);//*10;
GYRO_I.Z = 0;
}
else yaw_d = MPU6050_GYRO_LAST.Z;//·½Ïò¶æÔÚÖеãʱ£¬
//*****
PID_YAW.dout = PID_YAW.D * yaw_d;
//******************
PID_ROL.OUT = PID_ROL.pout + PID_ROL.iout - PID_ROL.dout;
PID_PIT.OUT = PID_PIT.pout + PID_PIT.iout - PID_PIT.dout;
PID_YAW.OUT = PID_YAW.pout + PID_YAW.iout - PID_YAW.dout;
//******************
if(throttle>200)//Èç¹ûÓÐÓÍÃÅ£¬ÔòÊä³öPWM
{
//moto1 = throttle - PID_ROL.OUT - PID_PIT.OUT + PID_YAW.OUT;
//moto2 = throttle + PID_ROL.OUT - PID_PIT.OUT - PID_YAW.OUT;
//moto3 = throttle + PID_ROL.OUT + PID_PIT.OUT + PID_YAW.OUT;
//moto4 = throttle - PID_ROL.OUT + PID_PIT.OUT - PID_YAW.OUT;
moto1 = throttle + PID_ROL.OUT + PID_PIT.OUT - PID_YAW.OUT;
moto2 = throttle - PID_ROL.OUT + PID_PIT.OUT + PID_YAW.OUT;
moto3 = throttle - PID_ROL.OUT - PID_PIT.OUT - PID_YAW.OUT;
moto4 = throttle + PID_ROL.OUT - PID_PIT.OUT + PID_YAW.OUT;
//*********
moto1 =Get_MxMi(moto1,990,0);
moto2 =Get_MxMi(moto2,990,0);
moto3 =Get_MxMi(moto3,990,0);
moto4 =Get_MxMi(moto4,990,0);
}
else
{
moto1 = 0;
moto2 = 0;
moto3 = 0;
moto4 = 0;
}
//******************
if(ARMED) Moto_PwmRflash(moto1,moto2,moto3,moto4); //ÒѽâËø£¬Êä³ö¡£
else Moto_PwmRflash(0,0,0,0);
//******************
}
//**********************************************************************/ |
|