求救!搞2.4G小四轴,调姿态平衡PID陷入了困境!
郁闷,搞了2个多月了,小四轴还是飞不起来,陷入了PID调试困境中,向各位求救了。2.4G小四轴,传感器用的是MPU6050,主控MCU stm8s105, UDI的碳纤维支架,X型模式控制,主控MCU读取加计和陀螺仪数据的周期是4ms,马达驱动频率15.6Khz, MCU主循环控制周期8ms。
通过四元数法解算出roll、pitch后,调用PID控制姿态的平衡。
PID函数如下:
int16_t Pid_ctrl(pid_typedef *pid, float measured, float gyro)
{
volatile float ierror, outpid;
volatile float outp, outi, outd;
volatile int16_t output;
//当前偏差
ierror = pid->setpoint - measured; //偏差:期望-测量值
if(ierror < 0)
fabserr = -ierror;
else
fabserr = ierror;
/*
if(fabserr <= 9) // 0.2 * 45
fk = 1.0;
else if(fabserr > 31.5) // (0.2 + 0.5) * 45
fk = 0;
else
fk = (31.5 - fabserr) / 22.5;
*/
fk = 1.0;
pid->integ += ierror * IMU_UPDATE_DT; //积分
if(pid->integ > pid->limit)
{
pid->integ = pid->limit;
}
else if(pid->integ < -pid->limit)
{
pid->integ = -pid->limit;
}
pid->deriv = -gyro;
if(fabserr > PID_DEAD_BAND) //PID 死区判断 PID_DEAD_BAND = 0.3
{
outp = pid->proportion * ierror;
outi = pid->integral * pid->integ * fk; // 变速积分
outd = pid->derivative * pid->deriv;
outpid = outp + outi + outd;
}
else
outpid = pid->lastoutput;
pid->lasterror = ierror;
pid->lastoutput = outpid;
output = (int16_t)outpid;
if(outpid > 0)
{
if((outpid - output) >= 0.5)
output += 1;
}
else
{
if((output - outpid) >= 0.5)
output -= 1;
}
if(output > OUTPUTMAX) //限幅
output = OUTPUTMAX;
else if(output < -OUTPUTMAX)
output = -OUTPUTMAX;
returnoutput;
}
马达PWM控制:
pwm.motor1val = pwm.thort - pitchpidout - rollpidout; // + yawpidout;
pwm.motor2val = pwm.thort + pitchpidout - rollpidout; //- yawpidout;
pwm.motor3val = pwm.thort + pitchpidout + rollpidout; //+ yawpidout;
pwm.motor4val = pwm.thort - pitchpidout + rollpidout; // - yawpidout;
给的参数是P = 1.2I = 0.8D = 0.18, 单独调roll和Pitch时在外界的干扰下能快速平衡,已经看出来只有微小的晃动,打印角度显示在+/-5度的范围内跳变,很多时候没有超过3度。 但整合后飞不起来,一开始推油门就往一边倾斜,油门推大了就翻了。 为什么会这样呢?
另外发现一个问题是,马达转起来后,用手抓住四轴固定,观察打印出来的ACC和GYRO数据都在跳变的很大,解算出来的角度也在+/-4度范围内跳变,这是否对姿态的平衡影响很大?
急盼各位高手指教啊。
估计还是参数没调好,或者是姿态解算的不准,或者是震动太大导致姿态不准
我也打算做个小的
楼主能上个图吗,想看看你的四轴啥样的 同求,共同学习{:tongue:}
页:
[1]