From 238770be129e133b9fe1a483a0d4d387d7836de8 Mon Sep 17 00:00:00 2001 From: Steve Evans Date: Sun, 15 Jun 2025 18:35:37 +0100 Subject: [PATCH 1/2] Use EDT voltage data if available --- src/main/sensors/voltage.c | 48 ++++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/src/main/sensors/voltage.c b/src/main/sensors/voltage.c index 7af2caa091..1028965c0d 100644 --- a/src/main/sensors/voltage.c +++ b/src/main/sensors/voltage.c @@ -35,6 +35,7 @@ #include "config/config_reset.h" #include "drivers/adc.h" +#include "drivers/dshot.h" #include "flight/mixer.h" #include "flight/pid.h" @@ -269,29 +270,46 @@ void voltageMeterESCInit(void) void voltageMeterESCRefresh(void) { + // Just check motor 0 EDT data validity + if (useDshotTelemetry && + ((dshotTelemetryState.motorState[0].telemetryTypes & (1 << DSHOT_TELEMETRY_TYPE_VOLTAGE)) != 0) && + (dshotTelemetryState.motorState[0].telemetryData[DSHOT_TELEMETRY_TYPE_VOLTAGE] > 0)) { + uint32_t accumulatedVoltage = 0; + for (int motor = 0; motor < getMotorCount(); motor++) { + accumulatedVoltage += dshotTelemetryState.motorState[motor].telemetryData[DSHOT_TELEMETRY_TYPE_VOLTAGE]; + } + voltageMeterESCState.voltageUnfiltered = 25 * accumulatedVoltage / getMotorCount(); + voltageMeterESCState.voltageDisplayFiltered = pt1FilterApply(&voltageMeterESCState.displayFilter, voltageMeterESCState.voltageUnfiltered); + } else #ifdef USE_ESC_SENSOR - escSensorData_t *escData = getEscSensorData(ESC_SENSOR_COMBINED); - if (escData) { - voltageMeterESCState.voltageUnfiltered = escData->dataAge <= ESC_BATTERY_AGE_MAX ? escData->voltage : 0; - voltageMeterESCState.voltageDisplayFiltered = pt1FilterApply(&voltageMeterESCState.displayFilter, voltageMeterESCState.voltageUnfiltered); + { + escSensorData_t *escData = getEscSensorData(ESC_SENSOR_COMBINED); + if (escData) { + voltageMeterESCState.voltageUnfiltered = escData->dataAge <= ESC_BATTERY_AGE_MAX ? escData->voltage : 0; + voltageMeterESCState.voltageDisplayFiltered = pt1FilterApply(&voltageMeterESCState.displayFilter, voltageMeterESCState.voltageUnfiltered); + } } #endif } void voltageMeterESCReadMotor(uint8_t motorNumber, voltageMeter_t *voltageMeter) { -#ifndef USE_ESC_SENSOR - UNUSED(motorNumber); - voltageMeterReset(voltageMeter); -#else - escSensorData_t *escData = getEscSensorData(motorNumber); - if (escData) { - voltageMeter->unfiltered = escData->dataAge <= ESC_BATTERY_AGE_MAX ? escData->voltage : 0; - voltageMeter->displayFiltered = voltageMeter->unfiltered; // no filtering for ESC motors currently. - } else { - voltageMeterReset(voltageMeter); + if (useDshotTelemetry && + ((dshotTelemetryState.motorState[motorNumber].telemetryTypes & (1 << DSHOT_TELEMETRY_TYPE_VOLTAGE)) != 0) && + (dshotTelemetryState.motorState[motorNumber].telemetryData[DSHOT_TELEMETRY_TYPE_VOLTAGE] > 0)) { + voltageMeter->unfiltered = 25 * dshotTelemetryState.motorState[motorNumber].telemetryData[DSHOT_TELEMETRY_TYPE_VOLTAGE]; + voltageMeter->displayFiltered = voltageMeter->unfiltered; // no filtering for ESC motors currently. + } else +#ifdef USE_ESC_SENSOR + { + escSensorData_t *escData = getEscSensorData(motorNumber); + if (escData) { + voltageMeter->unfiltered = escData->dataAge <= ESC_BATTERY_AGE_MAX ? escData->voltage : 0; + voltageMeter->displayFiltered = voltageMeter->unfiltered; // no filtering for ESC motors currently. + } else { + voltageMeterReset(voltageMeter); + } } - #endif } From 3da099c4b731793ae88da3ad5b7ca47cd5ec66f2 Mon Sep 17 00:00:00 2001 From: Steve Evans Date: Sun, 15 Jun 2025 18:52:55 +0100 Subject: [PATCH 2/2] Wrap in USE_DSHOT_TELEMETRY --- src/main/sensors/voltage.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/sensors/voltage.c b/src/main/sensors/voltage.c index 1028965c0d..f598e3e35e 100644 --- a/src/main/sensors/voltage.c +++ b/src/main/sensors/voltage.c @@ -270,6 +270,7 @@ void voltageMeterESCInit(void) void voltageMeterESCRefresh(void) { +#ifdef USE_DSHOT_TELEMETRY // Just check motor 0 EDT data validity if (useDshotTelemetry && ((dshotTelemetryState.motorState[0].telemetryTypes & (1 << DSHOT_TELEMETRY_TYPE_VOLTAGE)) != 0) && @@ -281,6 +282,7 @@ void voltageMeterESCRefresh(void) voltageMeterESCState.voltageUnfiltered = 25 * accumulatedVoltage / getMotorCount(); voltageMeterESCState.voltageDisplayFiltered = pt1FilterApply(&voltageMeterESCState.displayFilter, voltageMeterESCState.voltageUnfiltered); } else +#endif #ifdef USE_ESC_SENSOR { escSensorData_t *escData = getEscSensorData(ESC_SENSOR_COMBINED); @@ -294,12 +296,14 @@ void voltageMeterESCRefresh(void) void voltageMeterESCReadMotor(uint8_t motorNumber, voltageMeter_t *voltageMeter) { +#ifdef USE_DSHOT_TELEMETRY if (useDshotTelemetry && ((dshotTelemetryState.motorState[motorNumber].telemetryTypes & (1 << DSHOT_TELEMETRY_TYPE_VOLTAGE)) != 0) && (dshotTelemetryState.motorState[motorNumber].telemetryData[DSHOT_TELEMETRY_TYPE_VOLTAGE] > 0)) { voltageMeter->unfiltered = 25 * dshotTelemetryState.motorState[motorNumber].telemetryData[DSHOT_TELEMETRY_TYPE_VOLTAGE]; voltageMeter->displayFiltered = voltageMeter->unfiltered; // no filtering for ESC motors currently. } else +#endif #ifdef USE_ESC_SENSOR { escSensorData_t *escData = getEscSensorData(motorNumber);