mirror of
https://github.com/betaflight/betaflight.git
synced 2025-07-17 21:35:44 +03:00
Merge pull request #394 from ledvinap/feature-blackbox-amperage
blackbox - add amperageLatest logging
This commit is contained in:
commit
12a1cc5ffe
5 changed files with 29 additions and 7 deletions
|
@ -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)},
|
{"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},
|
{"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
|
#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[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},
|
{"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:
|
case FLIGHT_LOG_FIELD_CONDITION_VBAT:
|
||||||
return feature(FEATURE_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:
|
case FLIGHT_LOG_FIELD_CONDITION_NOT_LOGGING_EVERY_FRAME:
|
||||||
return masterConfig.blackbox_rate_num < masterConfig.blackbox_rate_denom;
|
return masterConfig.blackbox_rate_num < masterConfig.blackbox_rate_denom;
|
||||||
|
|
||||||
|
@ -726,6 +730,11 @@ static void writeIntraframe(void)
|
||||||
writeUnsignedVB((vbatReference - blackboxCurrent->vbatLatest) & 0x3FFF);
|
writeUnsignedVB((vbatReference - blackboxCurrent->vbatLatest) & 0x3FFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (testBlackboxCondition(FLIGHT_LOG_FIELD_CONDITION_AMPERAGE)) {
|
||||||
|
// 12bit value directly from ADC
|
||||||
|
writeUnsignedVB(blackboxCurrent->amperageLatest);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef MAG
|
#ifdef MAG
|
||||||
if (testBlackboxCondition(FLIGHT_LOG_FIELD_CONDITION_MAG)) {
|
if (testBlackboxCondition(FLIGHT_LOG_FIELD_CONDITION_MAG)) {
|
||||||
for (x = 0; x < XYZ_AXIS_COUNT; x++)
|
for (x = 0; x < XYZ_AXIS_COUNT; x++)
|
||||||
|
@ -811,13 +820,17 @@ static void writeInterframe(void)
|
||||||
|
|
||||||
writeTag8_4S16(deltas);
|
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;
|
int optionalFieldCount = 0;
|
||||||
|
|
||||||
if (testBlackboxCondition(FLIGHT_LOG_FIELD_CONDITION_VBAT)) {
|
if (testBlackboxCondition(FLIGHT_LOG_FIELD_CONDITION_VBAT)) {
|
||||||
deltas[optionalFieldCount++] = (int32_t) blackboxCurrent->vbatLatest - blackboxLast->vbatLatest;
|
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
|
#ifdef MAG
|
||||||
if (testBlackboxCondition(FLIGHT_LOG_FIELD_CONDITION_MAG)) {
|
if (testBlackboxCondition(FLIGHT_LOG_FIELD_CONDITION_MAG)) {
|
||||||
for (x = 0; x < XYZ_AXIS_COUNT; x++)
|
for (x = 0; x < XYZ_AXIS_COUNT; x++)
|
||||||
|
@ -936,7 +949,7 @@ void startBlackbox(void)
|
||||||
blackboxHistory[1] = &blackboxHistoryRing[1];
|
blackboxHistory[1] = &blackboxHistoryRing[1];
|
||||||
blackboxHistory[2] = &blackboxHistoryRing[2];
|
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
|
//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++)
|
for (i = 0; i < motorCount; i++)
|
||||||
blackboxCurrent->motor[i] = motor[i];
|
blackboxCurrent->motor[i] = motor[i];
|
||||||
|
|
||||||
blackboxCurrent->vbatLatest = vbatLatest;
|
blackboxCurrent->vbatLatest = vbatLatestADC;
|
||||||
|
blackboxCurrent->amperageLatest = amperageLatestADC;
|
||||||
|
|
||||||
#ifdef MAG
|
#ifdef MAG
|
||||||
for (i = 0; i < XYZ_AXIS_COUNT; i++)
|
for (i = 0; i < XYZ_AXIS_COUNT; i++)
|
||||||
|
@ -1225,6 +1239,10 @@ static bool blackboxWriteSysinfo()
|
||||||
|
|
||||||
xmitState.u.serialBudget -= strlen("H vbatref:%u\n");
|
xmitState.u.serialBudget -= strlen("H vbatref:%u\n");
|
||||||
break;
|
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:
|
default:
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,6 +35,7 @@ typedef struct blackboxValues_t {
|
||||||
int16_t servo[MAX_SUPPORTED_SERVOS];
|
int16_t servo[MAX_SUPPORTED_SERVOS];
|
||||||
|
|
||||||
uint16_t vbatLatest;
|
uint16_t vbatLatest;
|
||||||
|
uint16_t amperageLatest;
|
||||||
|
|
||||||
#ifdef BARO
|
#ifdef BARO
|
||||||
int32_t BaroAlt;
|
int32_t BaroAlt;
|
||||||
|
|
|
@ -32,6 +32,7 @@ typedef enum FlightLogFieldCondition {
|
||||||
FLIGHT_LOG_FIELD_CONDITION_MAG,
|
FLIGHT_LOG_FIELD_CONDITION_MAG,
|
||||||
FLIGHT_LOG_FIELD_CONDITION_BARO,
|
FLIGHT_LOG_FIELD_CONDITION_BARO,
|
||||||
FLIGHT_LOG_FIELD_CONDITION_VBAT,
|
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_0,
|
||||||
FLIGHT_LOG_FIELD_CONDITION_NONZERO_PID_D_1,
|
FLIGHT_LOG_FIELD_CONDITION_NONZERO_PID_D_1,
|
||||||
|
|
|
@ -31,7 +31,8 @@ uint16_t batteryWarningVoltage;
|
||||||
uint16_t batteryCriticalVoltage;
|
uint16_t batteryCriticalVoltage;
|
||||||
|
|
||||||
uint8_t vbat = 0; // battery voltage in 0.1V steps
|
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 amperage = 0; // amperage read by current sensor in centiampere (1/100th A)
|
||||||
int32_t mAhDrawn = 0; // milliampere hours drawn from the battery since start
|
int32_t mAhDrawn = 0; // milliampere hours drawn from the battery since start
|
||||||
|
@ -55,7 +56,7 @@ void updateBatteryVoltage(void)
|
||||||
uint16_t vbatSampleTotal = 0;
|
uint16_t vbatSampleTotal = 0;
|
||||||
|
|
||||||
// store the battery voltage with some other recent battery voltage readings
|
// 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
|
// calculate vbat based on the average of recent readings
|
||||||
for (index = 0; index < BATTERY_SAMPLE_COUNT; index++) {
|
for (index = 0; index < BATTERY_SAMPLE_COUNT; index++) {
|
||||||
|
@ -114,7 +115,7 @@ void updateCurrentMeter(int32_t lastUpdateAt)
|
||||||
static int64_t mAhdrawnRaw = 0;
|
static int64_t mAhdrawnRaw = 0;
|
||||||
|
|
||||||
amperageRaw -= amperageRaw / 8;
|
amperageRaw -= amperageRaw / 8;
|
||||||
amperageRaw += adcGetChannel(ADC_CURRENT);
|
amperageRaw += (amperageLatestADC = adcGetChannel(ADC_CURRENT));
|
||||||
amperage = currentSensorToCentiamps(amperageRaw / 8);
|
amperage = currentSensorToCentiamps(amperageRaw / 8);
|
||||||
|
|
||||||
mAhdrawnRaw += (amperage * lastUpdateAt) / 1000;
|
mAhdrawnRaw += (amperage * lastUpdateAt) / 1000;
|
||||||
|
|
|
@ -42,9 +42,10 @@ typedef enum {
|
||||||
} batteryState_e;
|
} batteryState_e;
|
||||||
|
|
||||||
extern uint8_t vbat;
|
extern uint8_t vbat;
|
||||||
extern uint16_t vbatLatest;
|
extern uint16_t vbatLatestADC;
|
||||||
extern uint8_t batteryCellCount;
|
extern uint8_t batteryCellCount;
|
||||||
extern uint16_t batteryWarningVoltage;
|
extern uint16_t batteryWarningVoltage;
|
||||||
|
extern uint16_t amperageLatestADC;
|
||||||
extern int32_t amperage;
|
extern int32_t amperage;
|
||||||
extern int32_t mAhDrawn;
|
extern int32_t mAhDrawn;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue