diff --git a/shared/lib_battery_voltage.cpp b/shared/lib_battery_voltage.cpp index a30f7ca95..037fb11cf 100644 --- a/shared/lib_battery_voltage.cpp +++ b/shared/lib_battery_voltage.cpp @@ -178,7 +178,7 @@ voltage_t *voltage_table_t::clone() { return new voltage_table_t(*this); } -double voltage_table_t::calculate_voltage(double DOD) { +double voltage_table_t::calculate_voltage(double DOD, double I) { DOD = fmax(0., DOD); DOD = fmin(DOD, 100.); @@ -187,22 +187,22 @@ double voltage_table_t::calculate_voltage(double DOD) { row++; } - return fmax(slopes[row] * DOD + intercepts[row], 0); + return fmax(slopes[row] * DOD + intercepts[row], 0) - I * params->resistance; } void voltage_table_t::set_initial_SOC(double init_soc) { - state->cell_voltage = calculate_voltage(100. - init_soc); + state->cell_voltage = calculate_voltage(100. - init_soc, 0.0); } double voltage_table_t::calculate_voltage_for_current(double I, double q, double qmax, double) { double DOD = (q - I * params->dt_hr) / qmax * 100.; - return calculate_voltage(DOD) * params->num_cells_series; + return calculate_voltage(DOD, I / params->num_strings) * params->num_cells_series; } -void voltage_table_t::updateVoltage(double q, double qmax, double, const double, double) { +void voltage_table_t::updateVoltage(double q, double qmax, double I, const double, double) { double DOD = 100. * (1 - q / qmax); - state->cell_voltage = calculate_voltage(DOD); + state->cell_voltage = calculate_voltage(DOD, I / params->num_strings); } // helper fx to calculate depth of discharge from current and max capacities @@ -212,7 +212,7 @@ double voltage_table_t::calculate_max_charge_w(double q, double qmax, double, do double current = (q - qmax) / params->dt_hr; if (max_current) *max_current = current; - return calculate_voltage(0.) * current * params->num_cells_series; + return calculate_voltage(0., current / params->num_strings) * current * params->num_cells_series; } double voltage_table_t::calculate_max_discharge_w(double q, double qmax, double, double *max_current) { @@ -227,7 +227,7 @@ double voltage_table_t::calculate_max_discharge_w(double q, double qmax, double, dod = fmin(100, dod); dod = fmax(0, dod); double current = qmax * ((1. - DOD0 / 100.) - (1. - dod / 100.)) / params->dt_hr; - double p = calculate_voltage(dod) * current; + double p = calculate_voltage(dod, current / params->num_strings) * current; if (p > max_P) { max_P = p; max_I = current; @@ -288,7 +288,8 @@ double voltage_table_t::calculate_current_for_target_w(double P_watts, double q, auto DOD_upper = params->voltage_table[upper][0]; auto DOD_lower = params->voltage_table[lower][0]; if (DOD_new <= DOD_upper && DOD_new >= DOD_lower) { - double P = (q - (100. - DOD_new) * qmax/100) * (a * DOD_new + b); + current = (q - (100. - DOD_new) * qmax / 100); + double P = current * (a * DOD_new + b - current / params->num_strings * params->resistance); if (std::abs(P) > std::abs(P_best)) { P_best = P; DOD_best = DOD_new; diff --git a/shared/lib_battery_voltage.h b/shared/lib_battery_voltage.h index 550ba98d0..9b069261f 100644 --- a/shared/lib_battery_voltage.h +++ b/shared/lib_battery_voltage.h @@ -165,7 +165,7 @@ class voltage_table_t : public voltage_t { std::vector slopes; std::vector intercepts; - double calculate_voltage(double DOD); + double calculate_voltage(double DOD, double I); private: void initialize();