1
0
Fork 0
mirror of https://github.com/iNavFlight/inav.git synced 2025-07-23 16:25:26 +03:00

Fix integer division in accelerometer scaling to 1G; Optimize accumulated acceleration calculation

This commit is contained in:
Konstantin Sharlaimov (DigitalEntity) 2017-11-29 12:25:29 +10:00
parent 70bde5d51c
commit f81d5b2f4d
3 changed files with 20 additions and 11 deletions

View file

@ -458,7 +458,7 @@ static void applyAccelerationZero(const flightDynamicsTrims_t * accZero, const f
STATIC_FASTRAM float accumulatedMeasurements[XYZ_AXIS_COUNT];
STATIC_FASTRAM int accumulatedMeasurementCount;
void accUpdateAccumulatedMeasurements(void)
static void accUpdateAccumulatedMeasurements(void)
{
for (int axis = 0; axis < XYZ_AXIS_COUNT; axis++) {
accumulatedMeasurements[axis] += acc.accADCf[axis];
@ -473,11 +473,18 @@ void accUpdateAccumulatedMeasurements(void)
void accGetMeasuredAcceleration(t_fp_vector *measuredAcc)
{
#ifdef ASYNC_GYRO_PROCESSING
for (int axis = 0; axis < XYZ_AXIS_COUNT; axis++) {
measuredAcc->A[axis] = accumulatedMeasurements[axis] * GRAVITY_CMSS / accumulatedMeasurementCount;
accumulatedMeasurements[axis] = 0;
if (accumulatedMeasurementCount) {
for (int axis = 0; axis < XYZ_AXIS_COUNT; axis++) {
measuredAcc->A[axis] = accumulatedMeasurements[axis] * GRAVITY_CMSS / accumulatedMeasurementCount;
accumulatedMeasurements[axis] = 0;
}
accumulatedMeasurementCount = 0;
}
else {
for (int axis = 0; axis < XYZ_AXIS_COUNT; axis++) {
measuredAcc->A[axis] = acc.accADCf[axis] * GRAVITY_CMSS;
}
}
accumulatedMeasurementCount = 0;;
#else
for (int axis = 0; axis < XYZ_AXIS_COUNT; axis++) {
measuredAcc->A[axis] = acc.accADCf[axis] * GRAVITY_CMSS;
@ -494,14 +501,17 @@ void accUpdate(void)
for (int axis = 0; axis < XYZ_AXIS_COUNT; axis++) {
accADC[axis] = acc.dev.ADCRaw[axis];
}
if (!accIsCalibrationComplete()) {
performAcclerationCalibration();
return;
}
applyAccelerationZero(&accelerometerConfig()->accZero, &accelerometerConfig()->accGain);
alignSensors(accADC, acc.dev.accAlign);
for (int axis = 0; axis < XYZ_AXIS_COUNT; axis++) {
acc.accADCf[axis] = accADC[axis] / acc.dev.acc_1G;
acc.accADCf[axis] = (float)accADC[axis] / acc.dev.acc_1G;
}
if (accelerometerConfig()->acc_lpf_hz) {
@ -517,6 +527,10 @@ void accUpdate(void)
}
}
#endif
#ifdef ASYNC_GYRO_PROCESSING
accUpdateAccumulatedMeasurements();
#endif
}
void accSetCalibrationValues(void)