diff --git a/src/main/fc/tasks.c b/src/main/fc/tasks.c index 096a332ba7..d3924036a6 100644 --- a/src/main/fc/tasks.c +++ b/src/main/fc/tasks.c @@ -31,6 +31,7 @@ #include "cms/cms.h" #include "common/color.h" +#include "common/time.h" #include "common/utils.h" #include "config/feature.h" diff --git a/src/main/sensors/compass.c b/src/main/sensors/compass.c index 5d4d4c69ff..75eb9b53d3 100644 --- a/src/main/sensors/compass.c +++ b/src/main/sensors/compass.c @@ -71,6 +71,8 @@ mag_t mag; PG_REGISTER_WITH_RESET_FN(compassConfig_t, compassConfig, PG_COMPASS_CONFIG, 3); +#define COMPASS_READ_US 500 // Allow 500us for compass data read + void pgResetFn_compassConfig(compassConfig_t *compassConfig) { compassConfig->mag_alignment = ALIGN_DEFAULT; @@ -373,10 +375,16 @@ bool compassIsCalibrationComplete(void) uint32_t compassUpdate(timeUs_t currentTimeUs) { + static uint8_t busyCount = 0; + uint32_t nextPeriod = COMPASS_READ_US; + if (busBusy(&magDev.dev, NULL) || !magDev.read(&magDev, magADCRaw)) { // No action was taken as the read has not completed - schedulerIgnoreTaskExecRate(); - return 500; // Wait 500us between states + schedulerIgnoreTaskStateTime(); + + busyCount++; + + return nextPeriod; // Wait COMPASS_READ_US between states } for (int axis = 0; axis < XYZ_AXIS_COUNT; axis++) { @@ -419,6 +427,11 @@ uint32_t compassUpdate(timeUs_t currentTimeUs) } } - return TASK_PERIOD_HZ(TASK_COMPASS_RATE_HZ); + nextPeriod = TASK_PERIOD_HZ(TASK_COMPASS_RATE_HZ) - COMPASS_READ_US * busyCount; + + // Reset the busy count + busyCount = 0; + + return nextPeriod; } #endif // USE_MAG diff --git a/src/main/sensors/compass.h b/src/main/sensors/compass.h index 40203c47b5..1d30d62e77 100644 --- a/src/main/sensors/compass.h +++ b/src/main/sensors/compass.h @@ -27,7 +27,7 @@ #include "pg/pg.h" #include "sensors/sensors.h" -#define TASK_COMPASS_RATE_HZ 200 +#define TASK_COMPASS_RATE_HZ 300 // Type of magnetometer used/detected typedef enum {