Table des matières PDF

Diagramme de Bode

1. Dispositif expérimental

Il s'agit de déterminer la réponse d'un système à une excitation sinusoïdale. Dans cet exemple, un filtre RC passe-bas est utilisé. La sortie SA1 de la centrale SysamSP5 fournit la tension sinusoïdale. L'entrée EA0 enregistre l'entrée du filtre (reliée à SA1), l'entrée EA1 enregistre la sortie du filtre, c.a.d. la tension aux bornes du condensateur.

2. Réponse à une tension sinusoïdale

Importation des modules et ouverture le l'interface :

import pycan.main as pycan
import numpy
import math
import time
import pylab
sys = pycan.Sysam("SP5")
            

On fixe la fréquence et le nombre d'échantillons par période :

f=723.0
ne=100
            

Période et période d'échantillonnage :

T=1.0/f
te=T/ne
            

Calcul des tensions à appliquer sur la sortie :

v1 = numpy.zeros(ne,numpy.double)
for k in range(ne):
    phi = 2.0*math.pi/ne*k
    v1[k] = 1.0*math.sin(phi)
            

Configuration de la sortie 1 en mode périodique :

sys.config_sortie(1,te*10**6,v1,-1)
            

Choix du nombre de périodes de l'acquisition et configuration des entrée EA0 et EA1 :

np=10 # nombre de périodes de l'acquisition
nea = ne*np
duree = nea*te
sys.config_entrees([0,1],[10.0,10.0])
sys.config_echantillon(te*10**6,nea)
            

On déclenche la sortie SA1 (appel asynchrone), on attend 1 seconde (pour être en régime permanent), on déclenche l'acquisition (appel synchrone) puis on stoppe la sortie :

sys.declencher_sorties(1,0)
 # cet appel retourne immédiatement
time.sleep(1)
sys.acquerir()
 # cet appel retourne lorsque l'acquisition est terminé
e
sys.stopper_sorties(1,0)
            

Récupération des temps et des tensions acquises, puis fermeture de l'interface :

t=sys.temps()
u=sys.entrees()
sys.fermer()
            

Calcul des valeurs moyennes et des écarts-types (moyennes quadratiques) :

mu0 = numpy.mean(u[0])
mu1 = numpy.mean(u[1])
rms0 = numpy.std(u[0])
rms1 = numpy.std(u[1])
            

On en déduit le gain et le cosinus du déphasage, puis le déphasage :

g = rms1/rms0
gdb = 20.0*math.log10(g)
cosphi = numpy.mean((u[0]-mu0)*(u[1]-mu1))/(rms0*rms1)
phi = math.acos(cosphi)*180.0/math.pi
            

Tracé de l'entrée et de la sortie du circuit RC :

pylab.plot(t[0],u[0])
pylab.plot(t[1],u[1])
pylab.axis([0,duree,-2.0,2.0])
pylab.grid()
pylab.xlabel('t (s)')
pylab.ylabel('u (V)')
pylab.text(duree/10,1.5,"f = %f Hz, GdB = %f,  phi = %f deg"%(f,gdb,phi))
pylab.show()
            
Réponse inusoïdale

3. Diagramme de Bode

On encapsule tout l'analyse de la réponse sinusoïdale dans une fonction dont les arguments sont : l'objet Sysam, la fréquence et l'amplitude de la sinusoïde à appliquer :

def analyser(sys,f,a):
    print("Frequence = %f"%f)
    ne = 50
    T=1.0/f
    te=T/ne
    v1 = numpy.zeros(ne,numpy.double)
    for k in range(ne):
        phi = 2.0*math.pi/ne*k
        v1[k] = a*math.sin(phi)
    sys.config_sortie(1,te*10**6,v1,-1)
    sys.config_entrees([0,1],[10.0,10.0])
    np=100 # nombre de périodes de l'acquisition
    nea = ne*np
    duree = nea*te
    sys.config_echantillon(te*10**6,nea)
    sys.declencher_sorties(1,0)
    time.sleep(1)
    sys.acquerir()
    sys.stopper_sorties(1,0)
    t=sys.temps()
    u=sys.entrees()
    mu0 = numpy.mean(u[0])
    mu1 = numpy.mean(u[1])
    rms0 = numpy.std(u[0])
    rms1 = numpy.std(u[1])
    g = rms1/rms0
    gdb = 20.0*math.log10(g)
    print("GdB = %f"%(gdb))
    cosphi = numpy.mean((u[0]-mu0)*(u[1]-mu1))/(rms0*rms1)
    print("cosphi = %f"%cosphi)
    phi = math.acos(cosphi)*180.0/math.pi
    print("phi = %f deg"%phi)
    return gdb,cosphi,phi
            

Choix des fréquences sur une échelle logarithmique et création des différents tableaux :

freq = numpy.logspace(start=2,stop=4,num=40)
gdb = numpy.zeros(freq.size,dtype=numpy.float32)
cosphi = numpy.zeros(freq.size,dtype=numpy.float32)
phi = numpy.zeros(freq.size,dtype=numpy.float32)
            

Choix de l'amplitude et boucle de calcul :

amplitude = 5.
for k in range(freq.size):
    gdb[k],cosphi[k],phi[k] = analyser(sys,freq[k],amplitude)
sys.fermer()
            

Tracé du diagramme de Bode :

pylab.figure()
pylab.semilogx(freq,gdb,'ro')
pylab.xlabel("f (Hz)")
pylab.ylabel("G")
pylab.figure()
pylab.semilogx(freq,cosphi,'ro')
pylab.xlabel("f (Hz)")
pylab.ylabel("cos(phi)")
pylab.figure()
pylab.semilogx(freq,phi,'ro')
pylab.xlabel("f (Hz)")
pylab.ylabel("phi (deg)")
pylab.show()
            
Gain décibel Cosinus phi Déphasage
Creative Commons LicenseTextes et figures sont mis à disposition sous contrat Creative Commons.