mirror of
https://github.com/iNavFlight/inav.git
synced 2025-07-26 09:45:33 +03:00
Merge pull request #9116 from iNavFlight/dzikuvx-dsp-acc-zero
Acc processing with DSP
This commit is contained in:
commit
710891f84d
3 changed files with 41 additions and 8 deletions
|
@ -577,4 +577,18 @@ void arm_scale_f32(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Floating-point vector multiplication, equivalent of CMSIS arm_mult_f32.
|
||||||
|
*/
|
||||||
|
void arm_mult_f32(
|
||||||
|
float * pSrcA,
|
||||||
|
float * pSrcB,
|
||||||
|
float * pDst,
|
||||||
|
uint32_t blockSize)
|
||||||
|
{
|
||||||
|
for (uint32_t i = 0; i < blockSize; i++) {
|
||||||
|
pDst[i] = pSrcA[i] * pSrcB[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -206,4 +206,5 @@ float calc_length_pythagorean_3D(const float firstElement, const float secondEle
|
||||||
#ifdef SITL_BUILD
|
#ifdef SITL_BUILD
|
||||||
void arm_sub_f32(float * pSrcA, float * pSrcB, float * pDst, uint32_t blockSize);
|
void arm_sub_f32(float * pSrcA, float * pSrcB, float * pDst, uint32_t blockSize);
|
||||||
void arm_scale_f32(float * pSrc, float scale, float * pDst, uint32_t blockSize);
|
void arm_scale_f32(float * pSrc, float scale, float * pDst, uint32_t blockSize);
|
||||||
|
void arm_mult_f32(float * pSrcA, float * pSrcB, float * pDst, uint32_t blockSize);
|
||||||
#endif
|
#endif
|
|
@ -82,6 +82,9 @@ static EXTENDED_FASTRAM pt1Filter_t accVibeFilter[XYZ_AXIS_COUNT];
|
||||||
static EXTENDED_FASTRAM filterApplyFnPtr accNotchFilterApplyFn;
|
static EXTENDED_FASTRAM filterApplyFnPtr accNotchFilterApplyFn;
|
||||||
static EXTENDED_FASTRAM void *accNotchFilter[XYZ_AXIS_COUNT];
|
static EXTENDED_FASTRAM void *accNotchFilter[XYZ_AXIS_COUNT];
|
||||||
|
|
||||||
|
static EXTENDED_FASTRAM float fAccZero[XYZ_AXIS_COUNT];
|
||||||
|
static EXTENDED_FASTRAM float fAccGain[XYZ_AXIS_COUNT];
|
||||||
|
|
||||||
PG_REGISTER_WITH_RESET_FN(accelerometerConfig_t, accelerometerConfig, PG_ACCELEROMETER_CONFIG, 5);
|
PG_REGISTER_WITH_RESET_FN(accelerometerConfig_t, accelerometerConfig, PG_ACCELEROMETER_CONFIG, 5);
|
||||||
|
|
||||||
void pgResetFn_accelerometerConfig(accelerometerConfig_t *instance)
|
void pgResetFn_accelerometerConfig(accelerometerConfig_t *instance)
|
||||||
|
@ -105,6 +108,17 @@ void pgResetFn_accelerometerConfig(accelerometerConfig_t *instance)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void updateAccCoefficients(void) {
|
||||||
|
|
||||||
|
for (uint8_t i = 0; i < XYZ_AXIS_COUNT; i++) {
|
||||||
|
//Float zero
|
||||||
|
fAccZero[i] = (float)accelerometerConfig()->accZero.raw[i];
|
||||||
|
//Float gain
|
||||||
|
fAccGain[i] = (float)accelerometerConfig()->accGain.raw[i] / 4096.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
static bool accDetect(accDev_t *dev, accelerationSensor_e accHardwareToUse)
|
static bool accDetect(accDev_t *dev, accelerationSensor_e accHardwareToUse)
|
||||||
{
|
{
|
||||||
accelerationSensor_e accHardware = ACC_NONE;
|
accelerationSensor_e accHardware = ACC_NONE;
|
||||||
|
@ -280,6 +294,7 @@ bool accInit(uint32_t targetLooptime)
|
||||||
acc.accTargetLooptime = targetLooptime;
|
acc.accTargetLooptime = targetLooptime;
|
||||||
acc.accClipCount = 0;
|
acc.accClipCount = 0;
|
||||||
accInitFilters();
|
accInitFilters();
|
||||||
|
updateAccCoefficients();
|
||||||
|
|
||||||
for (int axis = 0; axis < XYZ_AXIS_COUNT; axis++) {
|
for (int axis = 0; axis < XYZ_AXIS_COUNT; axis++) {
|
||||||
acc.extremes[axis].min = 100;
|
acc.extremes[axis].min = 100;
|
||||||
|
@ -477,15 +492,20 @@ static void performAcclerationCalibration(void)
|
||||||
// saveConfigAndNotify will trigger eepromREAD and in turn call back the accelerometer gain validation
|
// saveConfigAndNotify will trigger eepromREAD and in turn call back the accelerometer gain validation
|
||||||
// that will set ENABLE_STATE(ACCELEROMETER_CALIBRATED) if all is good
|
// that will set ENABLE_STATE(ACCELEROMETER_CALIBRATED) if all is good
|
||||||
saveConfigAndNotify();
|
saveConfigAndNotify();
|
||||||
|
//Recompute all coeffs
|
||||||
|
updateAccCoefficients();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void applyAccelerationZero(const flightDynamicsTrims_t * accZero, const flightDynamicsTrims_t * accGain)
|
static void applyAccelerationZero(void)
|
||||||
{
|
{
|
||||||
accADC[X] = (accADC[X] - accZero->raw[X]) * accGain->raw[X] / 4096;
|
float tmp[XYZ_AXIS_COUNT];
|
||||||
accADC[Y] = (accADC[Y] - accZero->raw[Y]) * accGain->raw[Y] / 4096;
|
|
||||||
accADC[Z] = (accADC[Z] - accZero->raw[Z]) * accGain->raw[Z] / 4096;
|
//Apply zero
|
||||||
|
arm_sub_f32(accADC, fAccZero, tmp, XYZ_AXIS_COUNT);
|
||||||
|
//Apply gain
|
||||||
|
arm_mult_f32(tmp, fAccGain, accADC, XYZ_AXIS_COUNT);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -493,9 +513,7 @@ static void applyAccelerationZero(const flightDynamicsTrims_t * accZero, const f
|
||||||
*/
|
*/
|
||||||
void accGetMeasuredAcceleration(fpVector3_t *measuredAcc)
|
void accGetMeasuredAcceleration(fpVector3_t *measuredAcc)
|
||||||
{
|
{
|
||||||
for (int axis = 0; axis < XYZ_AXIS_COUNT; axis++) {
|
arm_scale_f32(acc.accADCf, GRAVITY_CMSS, measuredAcc->v, XYZ_AXIS_COUNT);
|
||||||
measuredAcc->v[axis] = acc.accADCf[axis] * GRAVITY_CMSS;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -530,7 +548,7 @@ void accUpdate(void)
|
||||||
|
|
||||||
if (!ARMING_FLAG(SIMULATOR_MODE_SITL)) {
|
if (!ARMING_FLAG(SIMULATOR_MODE_SITL)) {
|
||||||
performAcclerationCalibration();
|
performAcclerationCalibration();
|
||||||
applyAccelerationZero(&accelerometerConfig()->accZero, &accelerometerConfig()->accGain);
|
applyAccelerationZero();
|
||||||
}
|
}
|
||||||
|
|
||||||
applySensorAlignment(accADC, accADC, acc.dev.accAlign);
|
applySensorAlignment(accADC, accADC, acc.dev.accAlign);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue