Subversion Repositories FlightCtrl

Compare Revisions

Ignore whitespace Rev 2094 → Rev 2095

/branches/dongfang_FC_rewrite/analog.c
308,16 → 308,25
}
 
void measureGyroActivity(int16_t newValue) {
gyroActivity += abs(newValue);
gyroActivity += (uint32_t)((int32_t)newValue * newValue);
}
 
#define GADAMPING 10
#define GADAMPING 6
void dampenGyroActivity(void) {
uint32_t tmp = gyroActivity;
tmp *= ((1<<GADAMPING)-1);
tmp >>= GADAMPING;
gyroActivity = tmp;
static uint8_t cnt = 0;
if (++cnt >= IMUConfig.gyroActivityDamping) {
cnt = 0;
gyroActivity *= (uint32_t)((1L<<GADAMPING)-1);
gyroActivity >>= GADAMPING;
}
}
/*
void dampenGyroActivity(void) {
if (gyroActivity >= 2000) {
gyroActivity -= 2000;
}
}
*/
 
void analog_updateGyros(void) {
// for various filters...
370,10 → 379,6
tempOffsetGyro[axis] = (rawGyroValue(axis) - gyroOffset.offsets[axis]) * GYRO_FACTOR_PITCHROLL;
}
 
if (gyroDWindowIdx >= GYRO_D_WINDOW_LENGTH) {
gyroDWindowIdx = 0;
}
 
/*
* Now process the data for attitude angles.
*/
383,16 → 388,34
gyro_ATT[PITCH] = tempOffsetGyro[PITCH];
gyro_ATT[ROLL] = tempOffsetGyro[ROLL];
 
/*
measureGyroActivity(tempOffsetGyro[PITCH]);
measureGyroActivity(tempOffsetGyro[ROLL]);
*/
measureGyroActivity(gyroD[PITCH]);
measureGyroActivity(gyroD[ROLL]);
 
// Yaw gyro.
// We measure activity of yaw by plain gyro value and not d/dt, because:
// - There is no drift correction anyway
// - Effect of steady circular flight would vanish (it should have effect).
// int16_t diff = yawGyro;
// Yaw gyro.
if (IMUConfig.imuReversedFlags & IMU_REVERSE_GYRO_YAW)
yawGyro = gyroOffset.offsets[YAW] - sensorInputs[AD_GYRO_YAW];
else
yawGyro = sensorInputs[AD_GYRO_YAW] - gyroOffset.offsets[YAW];
 
measureGyroActivity(yawGyro*IMUConfig.yawRateFactor);
// diff -= yawGyro;
// gyroD[YAW] -= gyroDWindow[YAW][gyroDWindowIdx];
// gyroD[YAW] += diff;
// gyroDWindow[YAW][gyroDWindowIdx] = diff;
 
// gyroActivity += (uint32_t)(abs(yawGyro)* IMUConfig.yawRateFactor);
measureGyroActivity(yawGyro);
 
if (++gyroDWindowIdx >= IMUConfig.gyroDWindowLength) {
gyroDWindowIdx = 0;
}
}
 
void analog_updateAccelerometers(void) {
/branches/dongfang_FC_rewrite/analog.h
109,7 → 109,7
*/
extern int16_t gyro_PID[2];
extern int16_t gyro_ATT[2];
#define GYRO_D_WINDOW_LENGTH 3
#define GYRO_D_WINDOW_LENGTH 8
extern int16_t gyroD[2];
extern int16_t yawGyro;
extern volatile uint16_t ADCycleCount;
/branches/dongfang_FC_rewrite/attitude.c
228,7 → 228,10
uint8_t axis;
int32_t temp;
 
uint16_t ca = gyroActivity >> 9;
debugOut.analog[13] = gyroActivity / 65536L;
 
uint16_t ca;
ca = gyroActivity >> 12;
debugOut.analog[14] = ca;
 
uint8_t gyroActivityWeighted = ca / IMUConfig.rateTolerance;
/branches/dongfang_FC_rewrite/configuration.c
223,10 → 223,11
 
void IMUConfig_default(void) {
IMUConfig.gyroPIDFilterConstant = 1;
IMUConfig.gyroDWindowLength = 3;
IMUConfig.gyroDFilterConstant = 1;
IMUConfig.accFilterConstant = 10;
IMUConfig.rateTolerance = 120;
IMUConfig.yawRateFactor = 4;
IMUConfig.gyroActivityDamping = 24;
 
gyro_setDefaultParameters();
}
/branches/dongfang_FC_rewrite/configuration.h
120,6 → 120,7
uint8_t imuReversedFlags;
uint8_t gyroPIDFilterConstant;
uint8_t gyroDWindowLength;
uint8_t gyroDFilterConstant;
uint8_t accFilterConstant;
 
126,7 → 127,7
uint8_t zerothOrderCorrection;
uint8_t rateTolerance;
 
uint8_t yawRateFactor;
uint8_t gyroActivityDamping;
uint8_t driftCompDivider; // 1/k (Koppel_ACC_Wirkung)
uint8_t driftCompLimit; // limit for gyrodrift compensation
} IMUConfig_t;
/branches/dongfang_FC_rewrite/heightControl.c
179,7 → 179,7
debugOut.analog[10] = dThrottleP;
debugOut.analog[11] = dThrottleI;
debugOut.analog[12] = dThrottleD;
debugOut.analog[13] = heightError/10;
//debugOut.analog[13] = heightError/10;
 
int16_t dThrottle = dThrottleI + dThrottleP - dThrottleD;
 
/branches/dongfang_FC_rewrite/uart0.c
101,8 → 101,8
"heightP ", //10
"heightI ",
"heightD ",
"heightErr/10 ",
"gyroAvtivity ",
"gyroActivity ",
"ca ",
"GActivityDivider", //15
"NaviMode ",
"NaviStatus ",