这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 采用stm32f103CB硬件I2C1/2(自制硬件)中断/DMA访问,四轴开源

共296条 10/30 |‹ 8 9 10 11 12 13 ›| 跳转至
助工
2015-03-22 22:01:09     打赏
91楼
看看,谢谢你的贡献!

菜鸟
2015-03-23 11:01:02     打赏
92楼
楼主你的串级PID是怎样的?和让四轴飞的一样吗?

高工
2015-03-23 12:31:58     打赏
93楼

其实串级PID都是一样的(也有人用并级的),主要还是姿态要解的好,不然啥控制都没用的。

下面是代码:

/****************主函数运行*************************************/

                if(++ tmrBase1ms >= 4){
                    tmrBase1ms = 0;

                    commanderGetRPY(&eulerRollDesired, &eulerPitchDesired, &eulerYawDesired);
                    IMUupdate(&ANGL.X, &ANGL.Y, &ANGL.Z,
                                            GYRO.X, GYRO.Y, GYRO.Z, ACCEL.X, ACCEL.Y, ACCEL.Z);
                    
                    Kalman_Filter(ANGL.X, ANGL.Y, ANGL.Z,
                                                GYRO.X, GYRO.Y, GYRO.Z,
                                                &eulerRollActual, &eulerPitchActual, &eulerYawActual);
#if 0
                    controllerCorrectAttitudePID(eulerRollActual, eulerPitchActual, eulerYawActual,
                                                                            eulerRollDesired, eulerPitchDesired, eulerYawDesired,
                                                                            &ANGL_out.X, &ANGL_out.Y, &ANGL_out.Z);
#endif
//#if 0
                    controllerCorrectAttitudePID(eulerRollActual, eulerPitchActual, eulerYawActual,
                                                                            eulerRollDesired, eulerPitchDesired, eulerYawDesired,
                                                                            &rollRateDesired, &pitchRateDesired, &yawRateDesired);

                    controllerCorrectRatePID(GYRO.X, GYRO.Y, GYRO.Z,
                                                                        rollRateDesired, pitchRateDesired, yawRateDesired,
                                                                        &ANGL_out.X, &ANGL_out.Y, &ANGL_out.Z);
                    
//#endif
                    distributePower(thrust, ANGL_out.X, ANGL_out.Y, ANGL_out.Z,
                                                    &motorPowerLeft, &motorPowerRight, &motorPowerFront, &motorPowerRear);
                }



/*************子函数*********************/

void controllerCorrectRatePID(
    float rollRateActual, float pitchRateActual, float yawRateActual,
    float rollRateDesired, float pitchRateDesired, float yawRateDesired,
    float* rollOut, float* pitchOut, float* yawOut)
{
#ifdef PidRateAdd
    pidSetDesired(&pidRollRate, rollRateDesired);
    TRUNCATE_SINT16(rollOutput, pidUpdate(&pidRollRate, rollRateActual, TRUE));

    pidSetDesired(&pidPitchRate, pitchRateDesired);
    TRUNCATE_SINT16(pitchOutput, pidUpdate(&pidPitchRate, pitchRateActual, TRUE));

    pidSetDesired(&pidYawRate, yawRateDesired);
    TRUNCATE_SINT16(yawOutput, pidUpdate(&pidYawRate, yawRateActual, TRUE));
    *rollOut = rollOutput;
    *pitchOut = pitchOutput;
    *yawOut = yawOutput;
#else
    TRUNCATE_SINT16(rollOutput, rollRateDesired);

    TRUNCATE_SINT16(pitchOutput, pitchRateDesired);

    TRUNCATE_SINT16(yawOutput, yawRateDesired);

    *rollOut = rollOutput;
    *pitchOut = pitchOutput;
    *yawOut = yawOutput;
#endif

}

void controllerCorrectAttitudePID(
        float eulerRollActual, float eulerPitchActual, float eulerYawActual,
        float eulerRollDesired, float eulerPitchDesired, float eulerYawDesired,
        float* rollRateDesired, float* pitchRateDesired, float* yawRateDesired)
{
    float yawError;
    pidSetDesired(&pidRoll, eulerRollDesired);
    *rollRateDesired = pidUpdate(&pidRoll, eulerRollActual, TRUE);

    // Update PID for pitch axis
    pidSetDesired(&pidPitch, eulerPitchDesired);
    *pitchRateDesired = pidUpdate(&pidPitch, eulerPitchActual, TRUE);

    // Update PID for yaw axis
  yawError = eulerYawDesired - eulerYawActual;

  if (yawError > 180.0)
    yawError -= 360.0;
  else if (yawError < -180.0)
    yawError += 360.0;

  pidSetError(&pidYaw, yawError);
    *yawRateDesired = pidUpdate(&pidYaw, eulerYawActual, FALSE);
}



/***************pid函数***********************/


float pidUpdate(PidObject* pid, const float measured,
    const bool updateError)
{
    float output;
    if (updateError)
    {
        pid->err = pid->desired - measured;
    }

    pid->integ += pid->err * IMU_UPDATE_DT;

    if (pid->integ > pid->iLimit)
    {
        pid->integ = pid->iLimit;
    }
    else if (pid->integ < -pid->iLimit)
    {
        pid->integ = -pid->iLimit;
    }

    pid->deriv = (pid->err - pid->prevError) * IMU_UPDATE_FREQ;

    pid->outP = pid->kp * pid->err;
    pid->outI = pid->ki * pid->integ;
    pid->outD = pid->kd * pid->deriv;

    output = (pid->kp * pid->err) +
        (pid->ki * pid->integ) +
        (pid->kd * pid->deriv);
    
    pid->prevError = pid->err;

     return output;
}


菜鸟
2015-03-28 11:24:20     打赏
94楼
看看来了

菜鸟
2015-03-28 11:45:38     打赏
95楼
来看看了,如何

菜鸟
2015-03-30 17:29:54     打赏
96楼
来看看

菜鸟
2015-03-31 10:23:59     打赏
97楼
正在研究四轴,下载来看看。谢谢分享

菜鸟
2015-04-01 09:21:57     打赏
98楼
好的,谢谢楼主的分享

菜鸟
2015-04-01 14:58:00     打赏
99楼
我们确实需要学习了

菜鸟
2015-04-03 14:52:00     打赏
100楼
学习学习。

共296条 10/30 |‹ 8 9 10 11 12 13 ›| 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]