diff --git a/src/main/config/config.c b/src/main/config/config.c index 829a396827..752eb85fd1 100755 --- a/src/main/config/config.c +++ b/src/main/config/config.c @@ -205,11 +205,11 @@ static void resetPidProfile(pidProfile_t *pidProfile) pidProfile->pidController = PID_CONTROLLER_BETAFLIGHT; #endif - pidProfile->P8[ROLL] = 45; + pidProfile->P8[ROLL] = 43; pidProfile->I8[ROLL] = 40; pidProfile->D8[ROLL] = 20; - pidProfile->P8[PITCH] = 60; - pidProfile->I8[PITCH] = 65; + pidProfile->P8[PITCH] = 58; + pidProfile->I8[PITCH] = 50; pidProfile->D8[PITCH] = 22; pidProfile->P8[YAW] = 70; pidProfile->I8[YAW] = 45; @@ -248,7 +248,7 @@ static void resetPidProfile(pidProfile_t *pidProfile) pidProfile->pidAtMinThrottle = PID_STABILISATION_ON; // Betaflight PID controller parameters - pidProfile->setpointRelaxRatio = 85; + pidProfile->setpointRelaxRatio = 30; pidProfile->dtermSetpointWeight = 200; pidProfile->yawRateAccelLimit = 220; pidProfile->rateAccelLimit = 0; diff --git a/src/main/flight/pid.c b/src/main/flight/pid.c index 02f7f4e0ae..dee35d6af7 100644 --- a/src/main/flight/pid.c +++ b/src/main/flight/pid.c @@ -260,10 +260,19 @@ static void pidBetaflight(const pidProfile_t *pidProfile, uint16_t max_angle_inc //-----calculate D-term (Yaw D not yet supported) if (axis != YAW) { - if (pidProfile->setpointRelaxRatio < 100) - dynC = c[axis] * powerf(rcInput[axis], 2) * relaxFactor[axis] + c[axis] * (1-relaxFactor[axis]); - else + static float previousSetpoint[3]; + dynC = c[axis]; + if (pidProfile->setpointRelaxRatio < 100) { dynC = c[axis]; + if (setpointRate[axis] > 0) { + if ((setpointRate[axis] - previousSetpoint[axis]) < previousSetpoint[axis]) + dynC = dynC * powerf(rcInput[axis], 2) * relaxFactor[axis] + dynC * (1-relaxFactor[axis]); + } else if (setpointRate[axis] < 0) { + if ((setpointRate[axis] - previousSetpoint[axis]) > previousSetpoint[axis]) + dynC = dynC * powerf(rcInput[axis], 2) * relaxFactor[axis] + dynC * (1-relaxFactor[axis]); + } + } + previousSetpoint[axis] = setpointRate[axis]; rD = dynC * setpointRate[axis] - PVRate; // cr - y delta = rD - lastRateError[axis]; lastRateError[axis] = rD;