1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158
| # Créé par Lisa, le 14/10/2019
from tkinter import * #on utilise tkinter pour créer l'ihm
from pylab import * #on utilise Pylab pour faciliter le transfert du code Matlab sur Python
import matplotlib
matplotlib.use("TkAgg")
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2TkAgg
from matplotlib.figure import Figure
import tkinter as tk
from tkinter import ttk
import matplotlib.animation as animation
from matplotlib import style
def Ia(Va,Suns,TaC): #function Ia = Projet(Va,Suns,TaC)
# Tension appliqué au panneau, ensoleillement et temperature
# Ia = Projet(Va,G,T) = array voltage
# Ia,Va = courant, tension appliqué
# G = nombre de soleil (1 Soleil = 1000 W/m2)
# T = Tempétature en Deg C
k = 1.38e-23 #Costante de Boltzman
q = 1.60e-19 # charge d'un electron
# enter the following constants here, and the model will be
# calculated based on these. for 1000W/m2
A = 1.2 # "diode quality" factor, =2 for crystaline, <2 for amorphous
Vg = 1.12 # band gap voltage, 1.12eV for xtal Si, 1.75 for amorphous Si.
Ns = 36 # number of series connected cells (diodes)
T1 = 273 + 25
Voc_T1 = 21.06 /Ns # open cct voltage per cell at temperature T1
Isc_T1 = 3.80 # short cct current per cell at temp T1
T2 = 273 + 75
Voc_T2 = 17.05 /Ns # open cct voltage per cell at temperature T2
Isc_T2 = 3.92 # short cct current per cell at temp T2
TaK = 273 + TaC # array working temp
TrK = 273 + 25 # reference temp
# when Va = 0, light generated current Iph_T1 = array short cct current
# constant "a" can be determined from Isc vs T
Iph_T1 = Isc_T1 * Suns
a = (Isc_T2 - Isc_T1)/Isc_T1 * 1/(T2 - T1)
Iph = Iph_T1 * (1 + a*(TaK - T1))
Vt_T1 = k * T1 / q; # = A * kT/q
Ir_T1 = Isc_T1 / (exp(Voc_T1/(A*Vt_T1))-1)
Ir_T2 = Isc_T2 / (exp(Voc_T2/(A*Vt_T1))-1)
b = Vg * q/(A*k)
Ir = Ir_T1 * (TaK/T1)**(3/A) *exp(-b*(1/TaK - 1/T1))
X2v = Ir_T1/(A*Vt_T1) * exp(Voc_T1/(A*Vt_T1))
dVdI_Voc = - 1.15/Ns / 2; # dV/dI at Voc per cell
# from manufacturers graph
Rs = - dVdI_Voc - 1/X2v # series resistance per cell
# Ia = 0:0.01:Iph;
Vt_Ta = A * 1.38e-23 * TaK / 1.60e-19 #=A*kT/q
# Ia1 = Iph - Ir.*( exp((Vc+Ia.*Rs)./Vt_Ta) -1);
# solve for Ia: f(Ia) = Iph - Ia - Ir.*( exp((Vc+Ia.*Rs)./Vt_Ta) -1) = 0;
# Newtons method: Ia2 = Ia1 - f(Ia1)/f(Ia1)
Vc = Va/Ns
Ia = zeros(size(Vc))
# Iav = Ia;
for j in range(1,5):
Ia = Ia - (Iph - Ia - Ir*( exp((Vc+Ia*Rs)/Vt_Ta) -1))/ (-1 - (Ir*( exp((Vc+Ia*Rs)/Vt_Ta) -1))*Rs/Vt_Ta)
# Iav = [Iav;Ia]; % to observe convergence for debugging.
return Ia
class Interface(tk.Frame):
# Création de la fenêtre principale
IHM = Tk()
IHM.title('Interface Homme-Machine')
# création d'un widget Frame dans la fenêtre principale
Frame1 = Frame(IHM,borderwidth=2,relief=GROOVE)
Frame1.pack(side=LEFT,padx=10,pady=10)
Frame1.place(x=1200,y=10)
#On renomme le frame
Label(Frame1,text="Réglage de l'ensoleillement et de la température").pack(padx=10,pady=10)
#on met un scale horizontale dans le premier frame pour l'ensoleillement
Ensoleil = 0
ensoleillement= Scale(Frame1, orient='horizontal', from_=0, to=1000,resolution=0, tickinterval=100, length=350, variable=Ensoleil,label='Ensoleillement (W/m²)')
ensoleillement.pack(padx=10,pady=10)
Var1 = Entry(Frame1, textvariable= Ensoleil)
Var1.focus_set()
Var1.pack(side = LEFT, padx = 5, pady = 5)
Var1.place(x=240,y=55)
#on met un deuxième scale horizontale dans le premier frame pour la température
Temp= 0
Temperature= Scale(Frame1, orient='horizontal', from_=0, to=100,resolution=0, tickinterval=10, length=350, variable=Temp ,label='Température (°C)')
Temperature.pack(padx=10,pady=10)
Var2 = Entry(Frame1, textvariable= Temp)
Var2.focus_set()
Var2.pack(side = LEFT, padx = 5, pady = 5)
Var2.place(x=240,y=155)
# création d'un troisième widget Frame dans la fenêtre principale
Frame3 = Frame(IHM,borderwidth=2,relief=GROOVE)
Frame3.pack(side=LEFT,padx=10,pady=10)
Frame3.place(x=1200,y=550)
#On renomme le frame
Label(Frame3,text="Réglage du rapport cyclique du convertisseur Buck").pack(padx=10,pady=10)
#on met un scale horizontale dans le troisième frame pour le rapport cyclique
Rapp= 0.0
Rapport= Scale(Frame3, orient='horizontal', from_=0, to=1,resolution=0.01, tickinterval=0.1, length=350, variable=Rapp ,label='Rapport cyclique de Buck')
Rapport.pack(padx=10,pady=10)
Var4 = Entry(Frame3, textvariable= Rapp)
Var4.focus_set()
Var4.pack(side = LEFT, padx = 5, pady = 5)
Var4.place(x=240,y=55)
V=linspace(0,30,100) # On prend une centaine de valeur de V entre 0 et 30
#Le rapport cyclique entre 0 et 1
Vref=V*Rapp #on multiplie la tension d'entrée par le rapport cyclique
#ensoleillement entre 0 et 1
Suns=Ensoleil/1000
#I=f(v)
Itemp1=Ia(V,Suns,Temp)
I1=Itemp1/Rapp
#P=f(v)sans rapport cyclique
P11=V*Itemp1
#P=f(v)avec rapport cyclique
P1=Vref*I1
#tracer des courbes
fig = Figure(figsize=(12, 8), dpi=96)
a1 = fig.add_subplot(121)
a1.plot(V,Itemp1)
a1.plot(Vref,I1)
a1.axes.set_ylim(0, 10)
a1.grid()
a2 = fig.add_subplot(122)
a2.plot(V,P11)
a2.plot(Vref,P1)
a2.axes.set_ylim(0, 100)
a2.grid()
graph1 = FigureCanvasTkAgg(fig, IHM)
canvas1 = graph1.get_tk_widget()
canvas1.pack(side=LEFT)
IHM.mainloop() |
Partager