diff --git a/src/main/blackbox/blackbox.c b/src/main/blackbox/blackbox.c index f30e2c4f91..e0c82c4795 100644 --- a/src/main/blackbox/blackbox.c +++ b/src/main/blackbox/blackbox.c @@ -182,6 +182,7 @@ static const blackboxMainFieldDefinition_t blackboxMainFields[] = { {"rcCommand[3]", UNSIGNED, .Ipredict = PREDICT(MINTHROTTLE), .Iencode = ENCODING(UNSIGNED_VB), .Ppredict = PREDICT(PREVIOUS), .Pencode = ENCODING(TAG8_4S16), CONDITION(ALWAYS)}, {"vbatLatest", UNSIGNED, .Ipredict = PREDICT(VBATREF), .Iencode = ENCODING(NEG_14BIT), .Ppredict = PREDICT(PREVIOUS), .Pencode = ENCODING(TAG8_8SVB), FLIGHT_LOG_FIELD_CONDITION_VBAT}, + {"amperageLatest",UNSIGNED, .Ipredict = PREDICT(0), .Iencode = ENCODING(UNSIGNED_VB), .Ppredict = PREDICT(PREVIOUS), .Pencode = ENCODING(TAG8_8SVB), FLIGHT_LOG_FIELD_CONDITION_AMPERAGE}, #ifdef MAG {"magADC[0]", SIGNED, .Ipredict = PREDICT(0), .Iencode = ENCODING(SIGNED_VB), .Ppredict = PREDICT(PREVIOUS), .Pencode = ENCODING(TAG8_8SVB), FLIGHT_LOG_FIELD_CONDITION_MAG}, {"magADC[1]", SIGNED, .Ipredict = PREDICT(0), .Iencode = ENCODING(SIGNED_VB), .Ppredict = PREDICT(PREVIOUS), .Pencode = ENCODING(TAG8_8SVB), FLIGHT_LOG_FIELD_CONDITION_MAG}, @@ -633,6 +634,9 @@ static bool testBlackboxConditionUncached(FlightLogFieldCondition condition) case FLIGHT_LOG_FIELD_CONDITION_VBAT: return feature(FEATURE_VBAT); + case FLIGHT_LOG_FIELD_CONDITION_AMPERAGE: + return feature(FEATURE_CURRENT_METER); + case FLIGHT_LOG_FIELD_CONDITION_NOT_LOGGING_EVERY_FRAME: return masterConfig.blackbox_rate_num < masterConfig.blackbox_rate_denom; @@ -726,6 +730,11 @@ static void writeIntraframe(void) writeUnsignedVB((vbatReference - blackboxCurrent->vbatLatest) & 0x3FFF); } + if (testBlackboxCondition(FLIGHT_LOG_FIELD_CONDITION_AMPERAGE)) { + // 12bit value directly from ADC + writeUnsignedVB(blackboxCurrent->amperageLatest); + } + #ifdef MAG if (testBlackboxCondition(FLIGHT_LOG_FIELD_CONDITION_MAG)) { for (x = 0; x < XYZ_AXIS_COUNT; x++) @@ -811,13 +820,17 @@ static void writeInterframe(void) writeTag8_4S16(deltas); - //Check for sensors that are updated periodically (so deltas are normally zero) VBAT, MAG, BARO + //Check for sensors that are updated periodically (so deltas are normally zero) VBAT, Amperage, MAG, BARO int optionalFieldCount = 0; if (testBlackboxCondition(FLIGHT_LOG_FIELD_CONDITION_VBAT)) { deltas[optionalFieldCount++] = (int32_t) blackboxCurrent->vbatLatest - blackboxLast->vbatLatest; } + if (testBlackboxCondition(FLIGHT_LOG_FIELD_CONDITION_AMPERAGE)) { + deltas[optionalFieldCount++] = (int32_t) blackboxCurrent->amperageLatest - blackboxLast->amperageLatest; + } + #ifdef MAG if (testBlackboxCondition(FLIGHT_LOG_FIELD_CONDITION_MAG)) { for (x = 0; x < XYZ_AXIS_COUNT; x++) @@ -936,7 +949,7 @@ void startBlackbox(void) blackboxHistory[1] = &blackboxHistoryRing[1]; blackboxHistory[2] = &blackboxHistoryRing[2]; - vbatReference = vbatLatest; + vbatReference = vbatLatestADC; //No need to clear the content of blackboxHistoryRing since our first frame will be an intra which overwrites it @@ -1038,7 +1051,8 @@ static void loadBlackboxState(void) for (i = 0; i < motorCount; i++) blackboxCurrent->motor[i] = motor[i]; - blackboxCurrent->vbatLatest = vbatLatest; + blackboxCurrent->vbatLatest = vbatLatestADC; + blackboxCurrent->amperageLatest = amperageLatestADC; #ifdef MAG for (i = 0; i < XYZ_AXIS_COUNT; i++) @@ -1225,6 +1239,10 @@ static bool blackboxWriteSysinfo() xmitState.u.serialBudget -= strlen("H vbatref:%u\n"); break; + case 13: + blackboxPrintf("H currentMeter:%i,%i\n", masterConfig.batteryConfig.currentMeterOffset, masterConfig.batteryConfig.currentMeterScale); + + xmitState.u.serialBudget -= strlen("H currentMeter:%i,%i\n"); default: return true; } diff --git a/src/main/blackbox/blackbox.h b/src/main/blackbox/blackbox.h index b971feec59..59085249e9 100644 --- a/src/main/blackbox/blackbox.h +++ b/src/main/blackbox/blackbox.h @@ -35,6 +35,7 @@ typedef struct blackboxValues_t { int16_t servo[MAX_SUPPORTED_SERVOS]; uint16_t vbatLatest; + uint16_t amperageLatest; #ifdef BARO int32_t BaroAlt; diff --git a/src/main/blackbox/blackbox_fielddefs.h b/src/main/blackbox/blackbox_fielddefs.h index edf67998d3..26d862268f 100644 --- a/src/main/blackbox/blackbox_fielddefs.h +++ b/src/main/blackbox/blackbox_fielddefs.h @@ -32,6 +32,7 @@ typedef enum FlightLogFieldCondition { FLIGHT_LOG_FIELD_CONDITION_MAG, FLIGHT_LOG_FIELD_CONDITION_BARO, FLIGHT_LOG_FIELD_CONDITION_VBAT, + FLIGHT_LOG_FIELD_CONDITION_AMPERAGE, FLIGHT_LOG_FIELD_CONDITION_NONZERO_PID_D_0, FLIGHT_LOG_FIELD_CONDITION_NONZERO_PID_D_1, diff --git a/src/main/sensors/battery.c b/src/main/sensors/battery.c index 9766d40130..86539cb3ff 100644 --- a/src/main/sensors/battery.c +++ b/src/main/sensors/battery.c @@ -31,7 +31,8 @@ uint16_t batteryWarningVoltage; uint16_t batteryCriticalVoltage; uint8_t vbat = 0; // battery voltage in 0.1V steps -uint16_t vbatLatest = 0; // most recent unsmoothed raw reading from vbat adc +uint16_t vbatLatestADC = 0; // most recent unsmoothed raw reading from vbat ADC +uint16_t amperageLatestADC = 0; // most recent raw reading from current ADC int32_t amperage = 0; // amperage read by current sensor in centiampere (1/100th A) int32_t mAhDrawn = 0; // milliampere hours drawn from the battery since start @@ -55,7 +56,7 @@ void updateBatteryVoltage(void) uint16_t vbatSampleTotal = 0; // store the battery voltage with some other recent battery voltage readings - vbatSamples[(currentSampleIndex++) % BATTERY_SAMPLE_COUNT] = vbatLatest = adcGetChannel(ADC_BATTERY); + vbatSamples[(currentSampleIndex++) % BATTERY_SAMPLE_COUNT] = vbatLatestADC = adcGetChannel(ADC_BATTERY); // calculate vbat based on the average of recent readings for (index = 0; index < BATTERY_SAMPLE_COUNT; index++) { @@ -114,7 +115,7 @@ void updateCurrentMeter(int32_t lastUpdateAt) static int64_t mAhdrawnRaw = 0; amperageRaw -= amperageRaw / 8; - amperageRaw += adcGetChannel(ADC_CURRENT); + amperageRaw += (amperageLatestADC = adcGetChannel(ADC_CURRENT)); amperage = currentSensorToCentiamps(amperageRaw / 8); mAhdrawnRaw += (amperage * lastUpdateAt) / 1000; diff --git a/src/main/sensors/battery.h b/src/main/sensors/battery.h index f90395f5fc..23f918c7c3 100644 --- a/src/main/sensors/battery.h +++ b/src/main/sensors/battery.h @@ -42,9 +42,10 @@ typedef enum { } batteryState_e; extern uint8_t vbat; -extern uint16_t vbatLatest; +extern uint16_t vbatLatestADC; extern uint8_t batteryCellCount; extern uint16_t batteryWarningVoltage; +extern uint16_t amperageLatestADC; extern int32_t amperage; extern int32_t mAhDrawn;