# convertisseur fréquence - tension à monostable portes NOR.
import numpy as np
import matplotlib.pyplot as plt

# durée nombre de points...
N=50000
dt=1e-6
f=1000
duree=6/f
dt=duree/N

# valeurs composants
Vdd=10
R=1430
C=1e-7
tau=R*C

# tableaux vides
Ve=np.zeros(N)
Vs=np.zeros(N)
VA=np.zeros(N)
VB=np.zeros(N)
uc=np.zeros(N)
t=np.zeros(N)

# signal en entrée
for i in range(N):
    Ve[i]=-np.cos(2*np.pi*f*i*dt)*Vdd
    t[i]=i*dt

# conditions initiales
uc[0]=0
VA[0]=Vdd
VB[0]=Vdd
Vs[0]=0

# méthode d'Euler
for i in range(N-1):

    uc[i+1]=uc[i]+(Vdd-VB[i])/tau*dt # équation différentielle
    VB[i+1]=uc[i]+VA[i]              # loi des mailles

    if VB[i+1]>=Vdd/2:               # basculement porte 2
        Vs[i+1]=0

    else:
        Vs[i+1]=Vdd

    if Ve[i+1]>=Vdd/2 or Vs[i+1]>=Vdd/2: # basculement porte 1 (non ou)
        VA[i+1]=0

    else:
        VA[i+1]=Vdd

Vsmoy=round(sum(Vs)/len(Vs),2) # valeur moyenne de Vs

# affichage graphe
plt.figure(figsize=(15,4))
plt.plot(t,Ve,label="Ve(t) en entrée")
plt.plot(t,Vs,'r',label="Vs(t) en sortie")
plt.plot(t,uc,'g',label='uc(t)')
plt.legend()
titre="Vsmoy ="+str(Vsmoy)+" V / fréquence réelle : "+str(f)+"Hz"
plt.title(titre)
plt.xlabel("t en s")
plt.ylabel("Vs")
plt.grid()
plt.show()



