first bits of cleanup
Some checks failed
EIVE/eive-obsw/pipeline/pr-main There was a failure building this commit
Some checks failed
EIVE/eive-obsw/pipeline/pr-main There was a failure building this commit
This commit is contained in:
@ -1,11 +1,11 @@
|
||||
#include <fsfw/datapool/PoolReadGuard.h>
|
||||
|
||||
#include <mission/controller/PowerController.h>
|
||||
|
||||
PowerController::PowerController(object_id_t objectId, bool enableHkSets)
|
||||
: ExtendedControllerBase(objectId),
|
||||
enableHkSets(enableHkSets),
|
||||
parameterHelper(this),
|
||||
stateOfChargeData(this) {}
|
||||
pwrCtrlCoreHk(this) {}
|
||||
|
||||
ReturnValue_t PowerController::initialize() {
|
||||
ReturnValue_t result = parameterHelper.initialize();
|
||||
@ -40,6 +40,9 @@ ReturnValue_t PowerController::getParameter(uint8_t domainId, uint8_t parameterI
|
||||
case 0x0:
|
||||
parameterWrapper->set(batteryInternalResistance);
|
||||
break;
|
||||
case 0x1:
|
||||
parameterWrapper->set(batteryMaximumCapacity);
|
||||
break;
|
||||
default:
|
||||
return INVALID_IDENTIFIER_ID;
|
||||
}
|
||||
@ -78,13 +81,18 @@ void PowerController::performControlOperation() {
|
||||
|
||||
ReturnValue_t PowerController::initializeLocalDataPool(localpool::DataPool &localDataPoolMap,
|
||||
LocalDataPoolManager &poolManager) {
|
||||
localDataPoolMap.emplace(pwrctrl::PoolIds::TOTAL_BATTERY_CURRENT, new PoolEntry<int16_t>({0}));
|
||||
localDataPoolMap.emplace(pwrctrl::PoolIds::OPEN_CIRCUIT_VOLTAGE_CHARGE,
|
||||
new PoolEntry<float>({0.0}));
|
||||
localDataPoolMap.emplace(pwrctrl::PoolIds::COULOMB_COUNTER_CHARGE, new PoolEntry<float>({0.0}));
|
||||
poolManager.subscribeForRegularPeriodicPacket({pwrCtrlCoreHk.getSid(), enableHkSets, 60.0});
|
||||
return returnvalue::OK;
|
||||
}
|
||||
|
||||
LocalPoolDataSetBase *PowerController::getDataSetHandle(sid_t sid) {
|
||||
switch (sid.ownerSetId) {
|
||||
case pwrctrl::STATE_OF_CHARGE_DATA:
|
||||
return &stateOfChargeData;
|
||||
case pwrctrl::CORE_HK:
|
||||
return &pwrCtrlCoreHk;
|
||||
default:
|
||||
return nullptr;
|
||||
}
|
||||
@ -105,53 +113,72 @@ ReturnValue_t PowerController::checkModeCommand(Mode_t mode, Submode_t submode,
|
||||
|
||||
void PowerController::calculateStateOfCharge() {
|
||||
// get time
|
||||
timeval now;
|
||||
Clock::getClock_timeval(&now);
|
||||
|
||||
// update EPS hk values
|
||||
// update EPS HK values
|
||||
ReturnValue_t result = updateEpsData();
|
||||
|
||||
float iBat = p60CoreHk.batteryCurrent.value + bpxBatteryHk.heaterCurrent.value +
|
||||
bpxBatteryHk.dischargeCurrent.value;
|
||||
|
||||
// Open Circuit Voltage Charge
|
||||
// ToDo: battery heater and battery discharge currents missing
|
||||
float vBatCorrected = p60CoreHk.batteryVoltage.value - iBat * batteryInternalResistance;
|
||||
uint8_t lookUpTableIdx;
|
||||
for (lookUpTableIdx = 24; lookUpTableIdx > 0; lookUpTableIdx--) {
|
||||
if (lookUpTableOcv[1][lookUpTableIdx] < vBatCorrected) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
// ToDo: check indexing
|
||||
float openCircuitVoltageCharge =
|
||||
lookUpTableOcv[0][lookUpTableIdx] +
|
||||
(vBatCorrected - lookUpTableOcv[1][lookUpTableIdx]) *
|
||||
(lookUpTableOcv[1][lookUpTableIdx + 1] - lookUpTableOcv[1][lookUpTableIdx]) /
|
||||
(lookUpTableOcv[0][lookUpTableIdx + 1] - lookUpTableOcv[0][lookUpTableIdx]);
|
||||
|
||||
// Coulomb Counter
|
||||
float coulombCounterCharge = 0;
|
||||
if (stateOfChargeData.coulombCounterCharge.value == 0)
|
||||
coulombCounterCharge = openCircuitVoltageCharge;
|
||||
else {
|
||||
double timeDiff = timevalOperations::toDouble(now - oldTime);
|
||||
coulombCounterCharge = stateOfChargeData.coulombCounterCharge.value + iBat * timeDiff;
|
||||
if (result != returnvalue::OK) {
|
||||
triggerEvent(power::DATASET_READ_FAILED);
|
||||
sif::info << "Power Controller::Reading of Datasets has failed" << std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
// commit TM
|
||||
// calculate total battery current
|
||||
iBat = p60CoreHk.batteryCurrent.value + bpxBatteryHk.heaterCurrent.value +
|
||||
bpxBatteryHk.dischargeCurrent.value;
|
||||
|
||||
calculateOpenCircuitVoltageCharge();
|
||||
calculateCoulombCounterCharge();
|
||||
|
||||
// commit to dataset
|
||||
{
|
||||
PoolReadGuard pg(&stateOfChargeData);
|
||||
stateOfChargeData.openCircuitVoltageCharge.value =
|
||||
charge2stateOfCharge(openCircuitVoltageCharge);
|
||||
stateOfChargeData.coulombCounterCharge.value = charge2stateOfCharge(coulombCounterCharge);
|
||||
stateOfChargeData.setValidity(true, true);
|
||||
PoolReadGuard pg(&pwrCtrlCoreHk);
|
||||
if (pg.getReadResult() == returnvalue::OK) {
|
||||
pwrCtrlCoreHk.totalBatteryCurrent.value = iBat;
|
||||
pwrCtrlCoreHk.openCircuitVoltageCharge.value = charge2stateOfCharge(openCircuitVoltageCharge);
|
||||
pwrCtrlCoreHk.coulombCounterCharge.value = charge2stateOfCharge(coulombCounterCharge);
|
||||
pwrCtrlCoreHk.setValidity(true, true);
|
||||
}
|
||||
}
|
||||
|
||||
// store time for next run
|
||||
oldTime = now;
|
||||
}
|
||||
|
||||
void PowerController::calculateOpenCircuitVoltageCharge() {
|
||||
float vBatCorrected = p60CoreHk.batteryVoltage.value - iBat * batteryInternalResistance;
|
||||
if (vBatCorrected >= lookUpTableOcv[1][100]) {
|
||||
triggerEvent(power::VOLTAGE_OUT_OF_BOUNDS, 0);
|
||||
sif::error << "Power Controller::Voltage is too high" << std::endl;
|
||||
return;
|
||||
} else if (vBatCorrected <= lookUpTableOcv[1][0]) {
|
||||
triggerEvent(power::VOLTAGE_OUT_OF_BOUNDS, 1);
|
||||
sif::error << "Power Controller::Voltage is too low" << std::endl;
|
||||
return;
|
||||
}
|
||||
uint8_t lookUpTableIdx = 99;
|
||||
while (lookUpTableOcv[1][lookUpTableIdx] > vBatCorrected) {
|
||||
lookUpTableIdx--;
|
||||
}
|
||||
|
||||
openCircuitVoltageCharge = linearInterpolation(
|
||||
vBatCorrected, lookUpTableOcv[1][lookUpTableIdx], lookUpTableOcv[1][lookUpTableIdx + 1],
|
||||
lookUpTableOcv[0][lookUpTableIdx], lookUpTableOcv[0][lookUpTableIdx + 1]);
|
||||
}
|
||||
|
||||
void PowerController::calculateCoulombCounterCharge() {
|
||||
if ((pwrCtrlCoreHk.coulombCounterCharge.value == 0) or
|
||||
(p60CoreHk.batteryVoltage.value > coulombCounterVoltageUpperThreshold and
|
||||
pwrCtrlCoreHk.coulombCounterCharge.value >= )) {
|
||||
coulombCounterCharge = openCircuitVoltageCharge;
|
||||
}
|
||||
|
||||
else {
|
||||
double timeDiff = timevalOperations::toDouble(now - oldTime);
|
||||
coulombCounterCharge = pwrCtrlCoreHk.coulombCounterCharge.value + iBat * timeDiff;
|
||||
}
|
||||
}
|
||||
|
||||
ReturnValue_t PowerController::updateEpsData() {
|
||||
std::vector<ReturnValue_t> results;
|
||||
{
|
||||
@ -185,3 +212,7 @@ ReturnValue_t PowerController::updateEpsData() {
|
||||
float PowerController::charge2stateOfCharge(float capacity) {
|
||||
return capacity / batteryMaximumCapacity;
|
||||
}
|
||||
|
||||
float PowerController::linearInterpolation(float x, float x0, float x1, float y0, float y1) {
|
||||
return y0 + (x - x0) * (y1 - y0) / (x1 - x0);
|
||||
}
|
||||
|
Reference in New Issue
Block a user