program iv_curve_azur_mpp
implicit none
! Declaracion de variables
real(8) :: Isc, Voc, Vmp, Imp
real(8) :: IL, I0, Rs, a
real(8) :: V, I, I_next, f, df, tol
real(8) :: P, P_max, V_mpp_calc, I_mpp_calc
integer :: step, iter, max_iter, num_steps
! Valores extraidos de la hoja de datos AZUR SPACE 3C44A
! Version MC/Air a X 500 concentracion
Isc = 7.66d0
Voc = 3.11d0
Vmp = 2.81d0
Imp = 7.54d0
! ---------------------------------------------------------
! Aproximacion inicial de los 4 parametros
! ---------------------------------------------------------
IL = Isc
a = 0.042 !0.15d0 ! Voltaje termico modificado aproximado
I0 = IL * exp(-Voc / a)
Rs = 0.016 !0.005d0 ! Resistencia en serie representativa (Ohms)
! Parametros del metodo numerico (Newton-Raphson)
tol = 1.0d-7
max_iter = 100
num_steps = 300 ! Resolucion de la curva a 100 steps
! Inicializar variables para almacenar el MPP
P_max = 0.0d0
V_mpp_calc = 0.0d0
I_mpp_calc = 0.0d0
! Imprimir encabezado en consola
print *, 'Voltaje(V) Corriente(A) Potencia(W)'
print *, '-----------------------------------------'
! Barrido de Voltaje de 0 a Voc
do step = 0, num_steps
V = (dble(step) / dble(num_steps)) * Voc
! Suposicion inicial para la corriente
I = IL
! Bucle iterativo de Newton-Raphson
do iter = 1, max_iter
f = I - IL + I0 * (exp((V + I * Rs) / a) - 1.0d0)
df = 1.0d0 + I0 * (Rs / a) * exp((V + I * Rs) / a)
I_next = I - f / df
! Comprobar convergencia
if (abs(I_next - I) < tol) exit
I = I_next
end do
! Evitar corrientes negativas
if (I < 0.0d0) I = 0.0d0
! Calcular potencia en este punto
P = V * I
! Evaluar si es el Punto de Maxima Potencia (MPP)
if (P > P_max) then
P_max = P
V_mpp_calc = V
I_mpp_calc = I
end if
! Imprimir los resultados en consola paso a paso
print '(F8.4, 4X, F8.4, 4X, F8.4)', V, I, P
end do
print *, '-----------------------------------------'
print *, 'Simulacion completada.'
print *, ' '
! Imprimir el resultado final del MPP en el monitor
print *, '--- Punto de Maxima Potencia (MPP) Calculado ---'
print '(A, F8.4, A)', 'IL : ', IL, ' V'
print '(A, F8.4, A)', 'I0 : ', I0, ' V'
print '(A, F8.4, A)', 'Rs : ', Rs, ' V'
print '(A, F8.4, A)', 'Voltaje (V_mpp) : ', V_mpp_calc, ' V'
print '(A, F8.4, A)', 'Corriente (I_mpp) : ', I_mpp_calc, ' A'
print '(A, F8.4, A)', 'Potencia (P_max) : ', P_max, ' W'
end program iv_curve_azur_mpp
To embed this project on your website, copy the following code and paste it into your website's HTML: