def __actual_voltage(self, photo_current, saturation_current, nominal_thermal_voltage, nominal_voltage, operating_temperature): # TODO: I-V curve and P-V curve gets the sharp drop near open circuit voltage when irradiance dependence is taken into account # Irradiance dependence: single_voltage_irradiance_dependence = SingleVoltageIrradianceDependence(photo_current, saturation_current, self.shunt_resistance, self.number_of_cells_in_series, nominal_thermal_voltage) irradiance_dependent_voltage = single_voltage_irradiance_dependence.calculate(nominal_voltage) # Temperature dependence: # Based on equation (24) of [1] but taking into account that the unit of temperature_voltage_coefficient is [V/ºC] instead of [%/ºC]. (Note: Different datasheets use either of these units): return irradiance_dependent_voltage + self.temperature_voltage_coefficient * (operating_temperature - self.nominal_temperature)
def setUp(self): self.open_circuit_voltage = 42.1 # [V] self.photo_current = 3.506 # [A] Value for operating_temperature = 35 + 273 [K] and actual_irradiance = 900[W/m^2] self.nominal_saturation_current = 1.680e-07 # [A] # self.saturation_current = 4.00e-07 # [A] self.shunt_resistance = 1862 # [Ω] self.number_of_cells_in_series = 72 self.nominal_thermal_voltage = 0.0345 # self.operating_thermal_voltage = 0.0356 self.single_voltage_irradiance_dependence = SingleVoltageIrradianceDependence( self.photo_current, self.nominal_saturation_current, self.shunt_resistance, self.number_of_cells_in_series, self.nominal_thermal_voltage)
class TestSingleVoltageIrradianceDependence(unittest.TestCase): def setUp(self): self.open_circuit_voltage = 42.1 # [V] self.photo_current = 3.506 # [A] Value for operating_temperature = 35 + 273 [K] and actual_irradiance = 900[W/m^2] self.nominal_saturation_current = 1.680e-07 # [A] # self.saturation_current = 4.00e-07 # [A] self.shunt_resistance = 1862 # [Ω] self.number_of_cells_in_series = 72 self.nominal_thermal_voltage = 0.0345 # self.operating_thermal_voltage = 0.0356 self.single_voltage_irradiance_dependence = SingleVoltageIrradianceDependence( self.photo_current, self.nominal_saturation_current, self.shunt_resistance, self.number_of_cells_in_series, self.nominal_thermal_voltage) def test_calculate_irradiance_dependent_voltage(self): voltage_estimation = self.open_circuit_voltage irradiance_dependent_voltage = self.single_voltage_irradiance_dependence.calculate( voltage_estimation) # Since the given parameters are for the actual irradiance (900[W/m^2]) lower than the irradiance in Standard Test Condition (1000[W/m^2]), voltage should be less: self.assertLessEqual(irradiance_dependent_voltage, self.open_circuit_voltage) # Since the result consistently gives 41.848808741740136 [V], use it as a assertion if the code is broken in the future modification: self.assertAlmostEqual(irradiance_dependent_voltage, 41.849, delta=0.001)
class TestSingleVoltageIrradianceDependence(unittest.TestCase): def setUp(self): self.open_circuit_voltage = 42.1 # [V] self.photo_current = 3.506 # [A] Value for operating_temperature = 35 + 273 [K] and actual_irradiance = 900[W/m^2] self.nominal_saturation_current = 1.680e-07 # [A] # self.saturation_current = 4.00e-07 # [A] self.shunt_resistance = 1862 # [Ω] self.number_of_cells_in_series = 72 self.nominal_thermal_voltage = 0.0345 # self.operating_thermal_voltage = 0.0356 self.single_voltage_irradiance_dependence = SingleVoltageIrradianceDependence(self.photo_current, self.nominal_saturation_current, self.shunt_resistance, self.number_of_cells_in_series, self.nominal_thermal_voltage) def test_calculate_irradiance_dependent_voltage(self): voltage_estimation = self.open_circuit_voltage irradiance_dependent_voltage = self.single_voltage_irradiance_dependence.calculate(voltage_estimation) # Since the given parameters are for the actual irradiance (900[W/m^2]) lower than the irradiance in Standard Test Condition (1000[W/m^2]), voltage should be less: self.assertLessEqual(irradiance_dependent_voltage, self.open_circuit_voltage) # Since the result consistently gives 41.848808741740136 [V], use it as a assertion if the code is broken in the future modification: self.assertAlmostEqual(irradiance_dependent_voltage, 41.849, delta = 0.001)
def setUp(self): self.open_circuit_voltage = 42.1 # [V] self.photo_current = 3.506 # [A] Value for operating_temperature = 35 + 273 [K] and actual_irradiance = 900[W/m^2] self.nominal_saturation_current = 1.680e-07 # [A] # self.saturation_current = 4.00e-07 # [A] self.shunt_resistance = 1862 # [Ω] self.number_of_cells_in_series = 72 self.nominal_thermal_voltage = 0.0345 # self.operating_thermal_voltage = 0.0356 self.single_voltage_irradiance_dependence = SingleVoltageIrradianceDependence(self.photo_current, self.nominal_saturation_current, self.shunt_resistance, self.number_of_cells_in_series, self.nominal_thermal_voltage)