shujianxiaoyao 发表于 2013-10-24 11:09:08

求救!搞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度范围内跳变,这是否对姿态的平衡影响很大?
急盼各位高手指教啊。

mahengyu 发表于 2013-10-24 17:29:56

估计还是参数没调好,或者是姿态解算的不准,或者是震动太大导致姿态不准

我也打算做个小的

楼主能上个图吗,想看看你的四轴啥样的

wenziheni 发表于 2013-11-2 16:33:37

同求,共同学习{:tongue:}
页: [1]
查看完整版本: 求救!搞2.4G小四轴,调姿态平衡PID陷入了困境!