Ce document montre comment réaliser un circuit intégrateur de tension, c'est-à-dire un filtre qui pour une tension d'entrée VE(t) fournit une tension de sortie VS(t) de la forme :
où K est une constante (homogène à un temps) positive ou négative. Cette relation peut aussi s'écrire :
Si VE est une tension constante, notée E, on a :
La tension VS(t) croît ou décroît indéfiniment. Un filtre intégrateur est donc, par définition, instable pour une tension constante. Un petit décalage sur la tension d'entrée provoque inévitablement une dérive (plus ou moins rapide) de la tension de sortie.
La fonction de transfert en régime sinusoïdal est :
Elle tend vers l'infini lorsque la pulsation tend vers zéro.
La réalisation d'un intégrateur capable d'intégrer une constannte, ou plus généralement un signal comportant une composante de fréquence nulle, est très difficile en raison de l'instabilité pour cette fréquence. Il faut donc distinguer deux usages de l'intégrateur :
Dans le premier cas, on réalisera un intégrateur dont la fonction de transfert a la forme pour les fréquences supérieures ou égales à fmin mais pas pour la fréquence nulle.
Dans le second cas, une tension constante est intégrée et il faudra donc mettre en œuvre un moyen de ramener à zéro la tension de sortie après une dérive trop importante de sa valeur. La durée de fonctionnement d'un tel intégrateur sera nécessairement limitée.
Dans ce document, on présente une réalisation et une étude expérimentale des deux types d'intégrateur.
Les mesures sont réalisées avec l'Analog Discovery 2 et avec le logiciel Waveforms. L'oscilloscope et le générateur de signaux ont une précision de 14 bits.
Le circuit intégrateur le plus simple est un filtre RC passe-bas :
Figure pleine pageSa fonction de transfert est :
La fréquence de coupure à - 3 dB est . Lorsque , elle prend la forme approchée suivante :
qui est bien celle d'un intégrateur avec .
Supposons que l'on souhaite intégrer un signal périodique dont la fréquence est 1 kHz. La fréquence de coupure doit être 10 Hz, ce que l'on peut réaliser avec C=1 μF et R=16 kΩ. Voici la réponse fréquentielle de ce filtre :
import numpy as np from matplotlib.pyplot import * R = 16e3 C = 1e-6 f = np.logspace(0,5,1000) H = 1/(1+1j*R*C*2*np.pi*f) GdB = 20*np.log10(np.absolute(H)) phi = np.angle(H) figure(figsize=(8,8)) subplot(211) plot(f,GdB) grid() xscale('log') ylabel(r"$G_{dB}$",fontsize=16) subplot(212) plot(f,phi*180/np.pi) grid() ylim(-180,0) xscale('log') ylabel(r"$\varphi\ (\rm deg)$",fontsize=16)fig1.pdf
Le domaine intégrateur se repère sur ces courbes : le déphasage doit être de -90 degrés (ou 90 degrés) et GdB doit décroître de 20 dB par décade. Ce domaine s'étend bien de 10 kHz à l'infini comme prévu. Au delà de 100 kHz, il faut s'attendre à un comportement non purement capacitif du condensateur mais cet effet sera négligeable pour un signal périodique de fréquence 1 kHz.
Ce circuit intégrateur a deux inconvénients :
Ces deux inconvénients peuvent être éliminés en plaçant après le filtre RC un montage amplificateur inverseur (voir Amplificateur de tension pour l'étude complète de ce montage). Voici le schéma de l'ensemble :
Figure pleine pageLe gain de l'amplificateur dans sa bande passante est :
Pour reprendre l'exemple précédent, un gain de 10 permettrait d'obtenir une tension d'amplitude 1 V en sortie (à partir de 10 V en entrée). La bande passante du montage non inverseur est alors de 100 kHz (voir Amplificateur de tension), ce qui nous garantit un comportement intégrateur de 1 kHz à 100 kHz. Une modélisation plus précise peut être faite en supposant que la fonction de transfert de l'ALI est de type passe-bas du premier ordre, ce qui est en principe le cas pour un ALI compensé en fréquence :
La fonction de transfert du montrage amplificateur s'écrit :
H_RC = 1/(1+1j*R*C*2*np.pi*f) mu = 1e5 Gmax = 10 fo = 10 Ha = Gmax/(1+1j*f*Gmax/(mu*fo)) H = H_RC*Ha GdB = 20*np.log10(np.absolute(H)) phi = np.angle(H) figure(figsize=(8,8)) subplot(211) plot(f,GdB) grid() xscale('log') ylabel(r"$G_{dB}$",fontsize=16) subplot(212) plot(f,phi*180/np.pi) grid() ylim(-180,0) xscale('log') ylabel(r"$\varphi\ (\rm deg)$",fontsize=16)fig2.pdf
La prévision initiale était trop optimiste : le domaine intégrateur ne va pas au delà de 10 kHz. Même de 1 kHz à 10 kHz, cet intégrateur est moins bon que le simple filtre RC. Il faut donc opter pour un compromis entre la qualité de l'intégration et l'amplitude en sortie. Une autre solution, plus complexe, serait de mettre en série deux amplificateurs non inverseur de gain plus faible, afin d'augmenter la largeur de bande passante de l'amplification.
Lorsqu'on réalise un intégrateur avec un ALI, on préfère généralement le montage décrit ci-après car il permettra aussi de faire une intégration à fréquence nulle.
Un intégrateur de signaux effectue l'intégration à partir d'une fréquence minimale fmin; il n'intègre pas une tension constante (fréquence nulle). Voici le schéma d'un intégrateur de signaux construit autour d'un ALI :
Figure pleine pageLe courant entrant dans IN- étant négligeable, le courant traverse la résistance R1 et le dipôle d'impédance :
On a donc :
On a de plus :
où est le gain de l'ALI (gain en boucle ouverte). Cette seconde égalité n'est valable que si l'ALI fonctionne en régime linéaire. En première approche, on utilise le modèle d'ALI idéal, défini par :
L'hypothèse 2 a déjà été utilisée. L'hypothèse 1 implique que . L'hypothèse 3 implique que la tension de sortie ne dépend pas de la résistance de charge Rc. Dans ce montage, l'entrée IN- a donc un potentiel nul. On obtient pour l'ALI idéal :
avec :
Si on enlève l'hypothèse 1, on obtient :
La fonction de transfert est celle d'un filtre passe-bas du premier ordre de pulsation de coupure , dont le domaine intégrateur commence à la pulsation . L'avantage de ce filtre par rapport au filtre RC est que son gain dans la bande passante est Gmax au lieu de 1 pour le filtre RC. Si est à deux décades de la fréquence de coupure, on pourra ainsi avoir un gain de -20 dB à cette pulsation si Gmax=10 (contre -40 dB pour le filtre RC) et un gain de 0 dB si Gmax=100.
Reprenons l'exemple précédent où il s'agit d'intégrer un signal périodique de fréquence 1 kHz, avec Gmax=10. On reprend les valeurs du filtre RC : R=16 kΩ et C=1 μF. On a donc R1=1,6 kΩ, une valeur un peu faible mais acceptable (l'impédance d'entrée est à peu près égale à R1).
Voici la réponse fréquentielle du montage intégrateur, en tenant compte de la fonction de transfert de l'ALI :
R1 = 1.6e3 R = 16e3 C = 1e-6 mu = 1e5 fo = 10 Gmax = R/R1 f = np.logspace(0,5,1000) Z2 = R/(1+1j*R*C*2*np.pi*f) A = mu/(1+1j*f/fo) H = -A/(1+(1+A)*R1/Z2) GdB = 20*np.log10(np.absolute(H)) phi = np.angle(H) figure(figsize=(8,8)) subplot(211) plot(f,GdB) grid() xscale('log') ylabel(r"$G_{dB}$",fontsize=16) subplot(212) plot(f,phi*180/np.pi) grid() ylim(0,180) xscale('log') ylabel(r"$\varphi\ (\rm deg)$",fontsize=16) xlabel("f (Hz)",fontsize=16)fig3.pdf
La courbe de déphasage montre que le comportement intégrateur (déphasage de -90 degrés) est a peu près réalisé de 1 kHz à 100 kHz, ce qui est suffisant pour intégrer un signal dont le fondamental se trouve à 1 kHz. On constate aussi que ce montage et bien meilleur que le précédent (filtre RC avec amplificateur non inverseur) dont le comportement intégrateur ne va pas au delà de 10 kHz. Il apparaît donc que le fait de placer le condensateur dans la boucle de rétroaction améliore grandement le résultat.
Pour obtenir Gmax=100, on ne peut pas réduire R1 car cela abaisserait trop l'impédance d'entrée. On doit donc augmenter R d'un facteur 10 et diminuer C d'un facteur 10 :
R1 = 1.6e3 R = 160e3 C = 100e-9 mu = 1e5 fo = 10 f = np.logspace(0,5,1000) Z2 = R/(1+1j*R*C*2*np.pi*f) A = mu/(1+1j*f/fo) H = -A/(1+(1+A)*R1/Z2) GdB = 20*np.log10(np.absolute(H)) phi = np.angle(H) figure(figsize=(8,8)) subplot(211) plot(f,GdB) grid() xscale('log') ylabel(r"$G_{dB}$",fontsize=16) subplot(212) plot(f,phi*180/np.pi) grid() ylim(0,180) xscale('log') ylabel(r"$\varphi\ (\rm deg)$",fontsize=16) xlabel("f (Hz)",fontsize=16)fig4.pdf
La grande valeur de gain à fréquence nulle peut être un inconvénient. Pour annuler ce gain, il suffit d'ajouter un condensateur en série avec R1 :
Figure pleine pageSoit . La fonction de transfert pour un ALI idéal s'écrit :
Il s'agit d'un filtre passe-bande dont la pulsation du maximum est :
Rappelons que la fréquence de coupure du premier circuit (filtre passe-bas) est :
Le domaine de pulsations qui réalise l'intégration commence à et on se fixe comme objectif d'avoir un gain de 0 dB à cette pulsation. On doit avoir , condition qui s'écrit aussi :
Voici un exemple, qui donne un gain de 0 dB à 1 kHz :
R1 = 16e3 C1 = 1e-6 R = 1.6e6 C = 10e-9 mu = 1e5 fo = 10 Z1 = R1+1/(1j*C1*2*np.pi*f) f = np.logspace(-1,5,1000) Z2 = R/(1+1j*R*C*2*np.pi*f) A = mu/(1+1j*f/fo) H = -A/(1+(1+A)*Z1/Z2) GdB = 20*np.log10(np.absolute(H)) phi = np.angle(H) figure(figsize=(8,8)) subplot(211) plot(f,GdB) grid() xscale('log') ylabel(r"$G_{dB}$",fontsize=16) subplot(212) plot(f,phi*180/np.pi) grid() ylim(0,180) xscale('log') ylabel(r"$\varphi\ (\rm deg)$",fontsize=16) xlabel("f (Hz)",fontsize=16)fig5.pdf
Si l'on veut que le domaine intégrateur commence à 100 Hz, il faut augmenter RC et R1C1 d'un facteur 10, mais sans changer le rapport R/R1.
R1 = 160e3 C1 = 1e-6 R = 16e6 C = 10e-9 mu = 1e5 fo = 10 Z1 = R1+1/(1j*C1*2*np.pi*f) f = np.logspace(0,5,1000) Z2 = R/(1+1j*R*C*2*np.pi*f) A = mu/(1+1j*f/fo) H = -A/(1+(1+A)*Z1/Z2) GdB = 20*np.log10(np.absolute(H)) phi = np.angle(H) figure(figsize=(8,8)) subplot(211) plot(f,GdB) grid() xscale('log') ylabel(r"$G_{dB}$",fontsize=16) subplot(212) plot(f,phi*180/np.pi) grid() ylim(0,180) xscale('log') ylabel(r"$\varphi\ (\rm deg)$",fontsize=16) xlabel("f (Hz)",fontsize=16)fig6.pdf
Pour conclure, résumons la méthode de calcul des résistances et capacités. On note ωt la pulsation de travail, c'est-à-dire la pulsation à partir de laquelle on veut un comportement intégrateur.
En pratique, cela conduit à des valeurs de R et C1 grandes, d'autant plus que la fréquence de travail est basse. Pour la résistance, on peut difficilement dépasser 10 MΩ. Pour le condensateur, on ne doit pas dépasser 10 μF.
On réalise un intégrateur dont la fréquence de travail est 1 kHz avec C=10,1 nF, R=1460 kΩ, R1=14,9 kΩ et C1=1,01 μF mais dans un premier temps on ne place pas le condensateur C1. Voici la réponse fréquentielle théorique pour ces valeurs :
R1 = 14.9e3 R = 1.46e6 C = 10.1e-9 C1 = 1e-6 mu = 1e5 fo = 10 f = np.logspace(0,6,1000) Z1 = R1+1/(1j*C1*2*np.pi*f) Z2 = R/(1+1j*R*C*2*np.pi*f) A = mu/(1+1j*f/fo) H = -A/(1+(1+A)*Z1/Z2) GdB = 20*np.log10(np.absolute(H)) phi = np.angle(H) figure(figsize=(8,8)) subplot(211) plot(f,GdB) grid() xscale('log') ylabel(r"$G_{dB}$",fontsize=16) subplot(212) plot(f,phi*180/np.pi) grid() ylim(0,180) xscale('log') ylabel(r"$\varphi\ (\rm deg)$",fontsize=16) xlabel("f (Hz)",fontsize=16) fm = f GdBm = GdB phim = phifig7.pdf
L'ALI utilisé est un TL081 (ALI à entrées JFET). Le gain élevé (100) à fréquence nulle nécessite une correction du décalage d'entrée (voir Amplificateur de tension), ce qui se fait avec un potentiomètre branché entre les bornes OFFSET N1 et OFFSET N2, dont le curseur est relié à la borne -10 V de la double alimentation. Lorsque VE=0, on tourne le potentiomètre de manière à annuler la tension en sortie.
Voici l'entrée et la sortie pour une tension d'entrée sinusoïdale de 1 kHz et d'amplitude 5 V :
[t,Ve,Vs] = np.loadtxt("integrateur-RCR1-sinus1kHz-10ms.csv",unpack=True,skiprows=1,delimiter=',') figure(figsize=(16,6)) plot(t*1e3,Ve,label=r"$V_E$") plot(t*1e3,Vs,label=r"$V_S$") grid() xlabel("t (ms)",fontsize=16) ylabel("Volts",fontsize=16) legend(loc="upper right",fontsize=16) xlim(0,5) ylim(-10,10)fig8.pdf
On observe un petit décalage (offset) de la tension de sortie alors que nous avions fait la correction avec une tension constante. Voici une analyse spectrale pour une durée de 100 ms, avec un niveau maximal ramené à 0 dB pour l'entrée (voir Analyse spectrale d'un signal numérique pour la fonction de calcul du spectre) :
from numpy.fft import fft,fftfreq from scipy.signal.windows import get_window def spectre(s,Te,win,nz): N = len(s) if win=='rect': w = np.ones(N) a = 1 elif win=='hamming': w = get_window('hamming',N) a = 0.54 elif win=='hann': w = get_window('hann',N) a = 0.5 elif win=='blackman': w = get_window('blackman',N) a = 0.42 else: return None p = int(np.log(nz*N)/np.log(2))+1 Np = 2**p u = np.concatenate((s*w,np.zeros(Np-N))) tfd = fft(u)/N/a freq = np.arange(Np)*1/(Np*Te) return freq,fftfreq(Np,d=Te),tfd
[t,Ve,Vs] = np.loadtxt("integrateur-RCR1-sinus1kHz-100ms.csv",unpack=True,skiprows=1,delimiter=',') Te = t[1]-t[0] f,f1,tfd_Ve = spectre(Ve,Te,'blackman',10) f,f1,tfd_Vs = spectre(Vs,Te,'blackman',10) dB_ref = np.max(20*np.log10(np.absolute(tfd_Ve))) figure(figsize=(18,8)) subplot(121) plot(f/1e3,20*np.log10(np.absolute(tfd_Ve))-dB_ref,label=r"$V_E$") grid() xlabel("f (kHz)",fontsize=16) ylabel("dB",fontsize=16) legend(loc="upper right",fontsize=16) xlim(-1,10) ylim(-150,20) subplot(122) plot(f/1e3,20*np.log10(np.absolute(tfd_Vs))-dB_ref,label=r"$V_S$") grid() xlabel("f (kHz)",fontsize=16) legend(loc="upper right",fontsize=16) xlim(-1,10) ylim(-150,20)fig9.pdf
Les harmoniques de rang 2 et 3 sont un peu amplifiés mais les distorsions sont négligeables (en dessous de -80 dB par rapport au fondamental). En revanche, la tension de décalage est bien visible (à -30 dB environ). Il semble que la correction du décalage d'entrée (décalage entre IN- et IN+) par le montage potentiométrique ne soit pas stable. Une autre manière de corriger ce problème est d'annuler le gain à fréquence nulle et c'est justement la fonction du condensateur C1, que nous ajoutons donc. Voici les spectres avec ce condensateur :
[t,Ve,Vs] = np.loadtxt("integrateur-RCR1C1-sinus1kHz-100ms.csv",unpack=True,skiprows=1,delimiter=',') Te = t[1]-t[0] f,f1,tfd_Ve = spectre(Ve,Te,'blackman',10) f,f1,tfd_Vs = spectre(Vs,Te,'blackman',10) dB_ref = np.max(20*np.log10(np.absolute(tfd_Ve))) figure(figsize=(18,8)) subplot(121) plot(f/1e3,20*np.log10(np.absolute(tfd_Ve))-dB_ref,label=r"$V_E$") grid() xlabel("f (kHz)",fontsize=16) ylabel("dB",fontsize=16) legend(loc="upper right",fontsize=16) xlim(-1,10) ylim(-150,20) subplot(122) plot(f/1e3,20*np.log10(np.absolute(tfd_Vs))-dB_ref,label=r"$V_S$") grid() xlabel("f (kHz)",fontsize=16) legend(loc="upper right",fontsize=16) xlim(-1,10) ylim(-150,20)fig10.pdf
Le spectre de la sortie confirme la disparition de la tension de décalage. Avec ce circuit, on peut d'ailleurs avoir un décalage important sur la tension d'entrée :
[t,Ve,Vs] = np.loadtxt("integrateur-RCR1C1-sinus1kHz-offset-10ms.csv",unpack=True,skiprows=1,delimiter=',') figure(figsize=(16,6)) plot(t*1e3,Ve,label=r"$V_E$") plot(t*1e3,Vs,label=r"$V_S$") grid() xlabel("t (ms)",fontsize=16) ylabel("Volts",fontsize=16) legend(loc="upper right",fontsize=16) xlim(0,5) ylim(-10,10)fig11.pdf
Voici les signaux pour une tension VE(t) de forme carrée et de fréquence 1 kHz :
[t,Ve,Vs] = np.loadtxt("integrateur-RCR1C1-carre1kHz-10ms.csv",unpack=True,skiprows=1,delimiter=',') figure(figsize=(16,6)) plot(t*1e3,Ve,label=r"$V_E$") plot(t*1e3,Vs,label=r"$V_S$") grid() xlabel("t (ms)",fontsize=16) ylabel("Volts",fontsize=16) legend(loc="upper right",fontsize=16) xlim(0,5) ylim(-10,10)fig12.pdf
La légère déformation de VE(t) juste après le front montant ou descendant provient de l'oscilloscope (Analog Discovery), probablement de l'étage d'entrée mais pas du traitement numérique car la fréquence d'échantillonnage est de 800 kHz. La bande passante de cet oscilloscope est de 10 MHz, ce qui en principe devrait suffire pour restituer un signal carré de 1 kHz. Voici les signaux obtenus avec un oscilloscope 8 bits de bande passante 70 MHz (picoscope 3204B) :
[t,Ve,Vs] = np.loadtxt("integrateur-RCR1C1-carre1kHz-10ms-picoscope.csv",unpack=True,skiprows=3,delimiter=';') figure(figsize=(16,6)) plot(t,Ve,label=r"$V_E$") plot(t,Vs,label=r"$V_S$") grid() xlabel("t (ms)",fontsize=16) ylabel("Volts",fontsize=16) legend(loc="upper right",fontsize=16) xlim(0,5) ylim(-10,10)fig13.pdf
Cet oscilloscope, dont la fréquence d'échantillonnage est ici de 9 MHz, restitue correctement la forme du signal d'entrée. Il révèle aussi un petit pic de tension sur le signal de sortie en même temps que le front montant ou descendant en entrée. Voici un détail (fréquence d'échantillonnage 250 MHz) :
[t,Ve,Vs] = np.loadtxt("integrateur-RCR1C1-carre1kHz-100us-picoscope.csv",unpack=True,skiprows=3,delimiter=';') figure(figsize=(16,6)) plot(t,Ve,label=r"$V_E$") plot(t,Vs,label=r"$V_S$") grid() xlabel("t (us)",fontsize=16) ylabel("Volts",fontsize=16) legend(loc="upper right",fontsize=16) xlim(-5,5) ylim(-10,10)fig14.pdf
Cette courbe révèle la présence d'une petite oscillation amortie en sortie. Celle-ci vient probablement d'un couplage entre la capacité C et l'impédance de sortie du montage, qui est inductive (voir Amplificateur de tension).
D'après la courbe de réponse fréquentielle théorique, l'intégration devrait fonctionner aussi à peu près à 500 Hz :
[t,Ve,Vs] = np.loadtxt("integrateur-RCR1C1-carre500Hz-10ms-picoscope.txt",unpack=True,skiprows=3) figure(figsize=(16,6)) plot(t,Ve,label=r"$V_E$") plot(t,Vs,label=r"$V_S$") grid() xlabel("t (ms)",fontsize=16) ylabel("Volts",fontsize=16) legend(loc="upper right",fontsize=16) xlim(0,5) ylim(-10,10)fig15.pdf
Bien que la courbure soit visible sur le signal de sortie, le résultat peut être considéré comme acceptable à cette fréquence. Voici le résultat pour une fréquence de 10 kHz :
[t,Ve,Vs] = np.loadtxt("integrateur-RCR1C1-carre10kHz-1ms-picoscope.txt",unpack=True,skiprows=3) figure(figsize=(16,6)) plot(t,Ve,label=r"$V_E$") plot(t,Vs,label=r"$V_S$") grid() xlabel("t (us)",fontsize=16) ylabel("Volts",fontsize=16) legend(loc="upper right",fontsize=16) xlim(0,500) ylim(-10,10)fig16.pdf
Voici la réponse fréquentielle obtenue expérimentalement (avec l'Analog Discovery et la fonction analyse de réseau du logiciel Waveforms). La courbe du modèle est tracé en trait interrompu. La résistance de charge est Rc=10 kΩ.
[f1,Ve_dB1,GdB1,phi1] = np.loadtxt("integrateur-RCR1C1-reponseFreq-1.csv",unpack=True,skiprows=1,delimiter=',') [f2,Ve_dB2,GdB2,phi2] = np.loadtxt("integrateur-RCR1C1-reponseFreq-2.csv",unpack=True,skiprows=1,delimiter=',') figure(figsize=(12,8)) subplot(211) plot(f1,GdB1,'b') plot(f2,GdB2,'b') plot(fm,GdBm,"k--",label='modèle') grid() ylabel(r"$G_{dB}$",fontsize=16) xscale('log') subplot(212) plot(f1,phi1,'b') plot(f2,phi2,'b') plot(fm,phim*180/np.pi,"k--",label="modèle") grid() xscale('log') ylabel(r"$\varphi\ (\rm deg)$",fontsize=16) xlabel(r"$f\ (\rm Hz)$",fontsize=16)fig17.pdf
La réponse fréquentielle du modèle est conforme à l'expérience jusqu'à 50 kHz. Au dessus de 100 kHz, l'écart est très grand. À partir de cette fréquence, il n'y a plus du tout intégration.
Nous définissons l'intégrateur complet comme un intégrateur qui opère sans limite basse de la fréquence (type 2 mentionné en introduction). Cet intégrateur donne en sortie une rampe (croissante ou décroissante) lorsqu'on lui applique en entrée une tension constante. C'est d'ailleurs une application importante de ce type d'intégrateur : générer une rampe dont la pente est proportionnelle à une tension constante. Si cette tension constante est appliquée pendant une durée variable, la valeur atteinte par la sortie à la fin de la rampe est proportionnelle à cette durée. On obtient ainsi un convertisseur temps-tension. Si la durée est fixée et la tension appliquée variable, le temps qu'il faut à la sortie pour atteindre une certaine valeur est proportionnel à la tension appliquée : on obtient un convertisseur tension-temps. Par exemple, les convertisseurs analogique-numérique à rampe fonctionnent au moyen d'un intégrateur et d'une conversion tension-temps.
Voici le schéma de cet intégrateur :
Figure pleine pageL'intégrateur fonctionne lorsque l'interrupteur K est ouvert. Pour un ALI idéal, sa fonction de transfert est :
C'est la même fonction de transfert que celle du filtre RC (et de l'intégrateur étudié précédemment) dans le domaine intégrateur mais à la différence de ces cas où le domaine intégrateur commence à une certaine fréquence, cet intégrateur fonctionne pour un signal de fréquence aussi basse que l'on souhaite, en particulier pour une fréquence nulle, c'est-à-dire une tension constante. Pour une tension constante VE=E, on a :
qui est une rampe croissante si E est négative, décroissante si E est positive. On supposera que Vs(0)=0.
La tension de sortie de l'ALI ne peut pas dépasser une certaine valeur positive ni descendre en dessous d'une certaine valeur négative. Pour le TL081, ces valeurs de saturation sont à peu près +/- 9 V pour une alimentation de +/- 10 V. Elles dépendent de la tension d'alimentation et du courant en sortie (voir Amplificateur de tension). Notons +/- Vsat les tensions de saturation (en réalité elles ne sont pas tout à fait opposées). Si E<0, la rampe est croissante et, lorsque Vs(t) atteint +Vsat, elle cesse d'augmenter et reste à cette valeur (l'ALI n'est plus en régime de fonctionnement linéaire). Pour faire revenir la sortie à son état initial (tension nulle), on ferme l'interrupteur, ce qui a pour effet de décharger le condensateur très rapidement. Le circuit est alors à nouveau disponible pour une intégration. Si l'application de la tension cesse avant la saturation, on doit aussi fermer l'interrupteur pour ramener la tension de sortie à zéro.
La difficulté de réalisation de cet intégrateur est une conséquence directe de la fonction réalisée : si une petite tension constante est présente en entrée (un offset non souhaité), celle-ci conduit à une dérive plus ou moins rapide de la tension de sortie jusqu'à l'atteinte de la tension de saturation. Or lorsque le système est au repos, c'est-à-dire lorsque VE=0, il existe tout de même une petite tension entre IN+ et IN- (tension de décalage d'entrée) et un petit courant vers IN- (positif ou négatif) qui conduisent inévitablement à une dérive de la tension en sortie. Il faut donc faire en sorte que cette dérive de tension soit négligeable pendant la durée de l'utilisation de l'intégrateur. Dans le cas de la génération d'une rampe, il faut que la dérive soit négligeable pendant le durée de l'application de la tension E constante, c'est-à-dire que l'augmentation de tension due à la dérive soit très faible devant celle due à la rampe. À cause de cette dérive, cette intégrateur n'est pas utilisable pour intégrer un signal périodique de longue durée; pour cela, il faut utiliser le montage étudié en partie 3, qui comporte une résistance R en parallèle avec C, ce qui a pour effet de limiter l'intégration aux pulsations supérieures à .
La figure suivante montre VE(t) et VS(t) si la tension E est appliquée pendant une durée T.
Figure pleine pageL'analyse précédente repose sur l'hypothèse d'un ALI idéal, dont le module de la fonction de transfert est infini. Voyons comment ces résultats sont modifiés si on tient compte de . Notons . La fonction de transfert s'écrit :
L'ALI est un TL081. L'interrupteur est un bouton poussoir.
On commence par observer le phénomène de dérive de la sortie lorsque VE=0. Voici la tension observée en sortie pour R1=10 kΩ et C=1,0 μF.
[t,Ve,Vs] = np.loadtxt("integrateur-10k-1uF-VeVs-100s.csv",unpack=True,skiprows=3,delimiter=',') t += 50 figure(figsize=(16,6)) plot(t,Ve,label=r"$V_E$") plot(t,Vs,label=r"$V_S$") grid() xlabel("t (s)",fontsize=16) ylabel("Volts",fontsize=16) legend(loc="upper right",fontsize=16) xlim(0,100) ylim(-10,10)fig18.pdf
On voit sur cette figure le moment où le condensateur est déchargé par une pression sur le bouton (à T=2,2 s) et le moment où Vs(t) atteint -Vsat. Voici les tensions avec une résistance R1=10 kΩ.
[t,Ve,Vs] = np.loadtxt("integrateur-100k-1uF-VeVs-100s.csv",unpack=True,skiprows=3,delimiter=',') t += 50 figure(figsize=(16,6)) plot(t,Ve,label=r"$V_E$") plot(t,Vs,label=r"$V_S$") grid() xlabel("t (s)",fontsize=16) ylabel("Volts",fontsize=16) legend(loc="upper right",fontsize=16) xlim(0,100) ylim(-10,10)fig19.pdf
La vitesse de dérive est proportionnelle à R1C (son sens est imprévisible). Si la durée T de l'impulsion est de l'ordre de la seconde, la deuxième configuration (avec R1=100 kΩ) pourrait convenir car la dérive est négligeable sur cette durée. Si une impulsion de hauteur E=1 V est appliquée en entrée, la valeur de Vs au bout de T=0,1 s est .
La première configuration (avec R1=10 kΩ) conviendrait pour une durée T inférieure à 1/10 seconde. Évidemment, il faudrait dans ce cas une impulsion de durée 10 fois plus courte pour atteindre 1 V. On voit donc que le produit R1C doit être bien choisi en fonction de la durée T, ou de son ordre de grandeur si celle-ci doit changer. La règle est assez simple : il faut choisir R1C afin que la variation de tension en sortie pour la durée T soit de l'ordre de Vsat/2.
La dérive observée vient à la fois de la tension de décalage d'entrée (tension de décalage entre IN+ et IN-, à ne pas confondre avec la tension d'erreur du système bouclé) et du courant de polarisation vers l'entrée IN-. Supposons que la dérive soit due seulement à une tension. Pour R1C=0,01 s, on observe une dérive de 9,5 V en 70 s, ce qui correspond à une tension en entrée de 1,2 mV. C'est effectivement l'ordre de grandeur de la tension de décalage d'entrée. Cette valeur correspond à un courant dans R1 de 0,12 μA. D'après la documentation du TL081, le courant de polarisation est d'environ 30 pA, beaucoup plus petit que ce courant. On en déduit que la dérive observée est due principalement au décalage de la tension d'entrée (input offset voltage). Cela signifie aussi qu'il y a peut-être moyen de le réduire en corrigeant mieux le décalage d'entrée (grace au montage d'un potentiomètre entre OFFSET N1 et OFFSET N2).
Pour que l'intégrateur soit utilisable, il faut faire la décharge du condensateur au moyen d'un interrupteur électronique. Un transistor à effet de champ (JFET canal N) peut jouer ce rôle, comme indiqué sur le schéma suivant :
Figure pleine pageLorsque la tension entre la grille et la source VGS est nulle, le transistor est passant : la résistance entre le drain et la source est d'environ 150 Ω, ce qui provoque une décharge rapide du condensateur. Lorsque la tension VGS a une valeur négative assez grande (typiquement en dessous de -5 à -10 V suivant le modèle de JFET), aucun courant ne passe entre le drain et la source et le transistor est donc équivalent à un interrupteur ouvert.
Nous utilisons le transistor 2N3819, dont le VGS(OFF) vaut -8 V. Sa caractéristique est donnée en annexe. Il faut appliquer une tension grille/source d'au moins - 8 V pour que le transistor soit non conducteur. Nous disposons d'une tension de -10 V par l'alimentation et nous souhaitons donc appliquer une tension grille/source de -10 V de manière à obtenir un état bloquant sur la plus large plage de tension (voir annexe). Or nous utilisons un générateur de signaux qui ne dépasse pas +/- 5 V. Si le transistor doit être piloté par la sortie logique d'un Arduino, on ne peut le faire qu'avec une tension positive par rapport à la masse. Il faut donc ajouter un dispositif de commande du transistor qui puisse fonctionner avec une tension entre 0 et 5 V. On peut pour cela utiliser un ampli-op configuré en comparateur. Les comparateurs sont des ampli-op optimisés pour cette tâche. Voici le schéma interne du comparateur LM393 :
La sortie est reliée au collecteur du transistor Q16 (sortie à collecteur ouvert). Lorsque l'entrée IN+ (notée +Input sur ce schéma) est à un potentiel plus élevé que l'entrée IN- (-Input), le transistor Q16 est passant donc la sortie est pratiquement à la masse. Lorsque V+<V-, le transistor est bloqué et le potentiel du collecteur de Q16 (donc de la sortie) n'est pas déterminé. Il faut donc ajouter une résistance à l'extérieur pour fixer le potentiel de la sortie lorsque V+<V-. Dans le cas présent, on alimente le LM393 en +/- 10 V (la borne indiquée comme la masse sur le schéma est reliée à -10 V) et on relie la sortie d'une part à la grille du JFET, d'autre part à la masse via une résistance de grande valeur :
Figure pleine pageLe potentiomètre P1 fixe le potentiel de l'entrée IN- du comparateur. Lorsque Vin>V-, la sortie du comparateur est à la masse (grace à la résistance) donc la grille du JFET est à la masse. Puisque la source est à la masse, la tension grille-source est nulle donc le transistor est passant et le condensateur se décharge. Lorsque Vin<V-, la sortie du comparateur est à -10 V donc le JFET est à l'état bloqué, ce qui permet au condensateur de se charger. Il faut remarquer que, lorsque la grille est à la masse, il y a bien une rétroaction sur l'ALI (par la résistance drain-source) qui permet de maintenir la source à la masse (car l'entrée IN+ est à la masse).
Remarque : il est possible d'utiliser un ampli-op ordinaire alimenté en +/- 10 V à la place du comparateur. Dans ce cas la résistance en sortie n'est pas nécessaire. L'inconvénient est que la sortie (donc la grille du JFET) passerait à +10 V lorsque Vin>V-. Cela ne pose pas de problème pour le fonctionnement du JFET mais le temps de monté ou de descente de la tension de grille serait plus grand. Par ailleurs, si l'ALI n'est pas rail-to-rail, on aurait en fait une tension de -8,5 V sur la grille et non pas -10 V lorsque Vin<V-. Si cette tension n'est pas suffisante pour rendre le JFET parfaitement bloquant, il faudra alimenter l'ALI en +/- 15 V.
Voici un test de ce circuit avec R1=100 kΩ et C=1,0 μF. Le potentiomètre P1 est réglé pour que V-=2,5 V. La commande sur Vin peut être un signal logique 0-3 V ou 0-5 V. La tension d'entrée est nulle : VE=0 V. On applique sur Vin des impulsions de 0 à 5 V avec une fréquence de 100 mHz, ce qui permet de décharger le condensateur de l'intégrateur toutes les 10 secondes. Voici la tension Vin et la tension VS(t) :
[t,Vin,Vs] = np.loadtxt("integrateur-100k-1uF-VinVs-50s.csv",unpack=True,skiprows=3,delimiter=',') t += 25 figure(figsize=(16,6)) subplot(211) plot(t,Vin) grid() ylabel(r"$V_{in}\ (\rm V)$",fontsize=16) xlim(0,50) ylim(-5,6) subplot(212) plot(t,Vs) grid() xlabel("t (s)",fontsize=16) ylabel(r"$V_s\ (\rm V)$",fontsize=16) xlim(0,50) ylim(-0.2,0.2)fig20.pdf
Entre deux décharges du condensateur (10 secondes), la dérive de la sortie atteint 100 mV. Cette valeur étant trop grande, il faut augmenter R1. Voici les signaux pour R1=1 MΩ.
[t,Vin,Vs] = np.loadtxt("integrateur-1000k-1uF-VinVs-50s.csv",unpack=True,skiprows=3,delimiter=',') t += 25 figure(figsize=(16,6)) subplot(211) plot(t,Vin) grid() ylabel(r"$V_{in}\ (\rm V)$",fontsize=16) xlim(0,50) ylim(-5,6) subplot(212) plot(t,Vs) grid() xlabel("t (s)",fontsize=16) ylabel(r"$V_s\ (\rm V)$",fontsize=16) xlim(0,50) ylim(-0.02,0.02)fig21.pdf
Comme prévu, la dérive est 10 fois plus petite : elle atteint 10 mV au bout de 10 s.
Si on veut générer une rampe dont la durée est de 5 s, avec une tension d'entrée de 1 V, la tension atteinte en sortie sera . Cette valeur est beaucoup plus grande que la dérive (500 fois plus).
Pour générer des rampes, on applique les deux signaux suivants :
[t,Vin,Ve] = np.loadtxt("integrateur-1000k-1uF-VinVe-50s.csv",unpack=True,skiprows=3,delimiter=',') t += 25 figure(figsize=(16,6)) plot(t,Vin,label=r"$V_{in}$") plot(t,Ve,label=r"$V_E$") grid() ylabel("Volts",fontsize=16) xlabel("t (s)",fontsize=16) xlim(0,50) ylim(-10,10) legend(loc='upper right',fontsize=16)fig22.pdf
L'impulsion positive sur l'entrée Vin permet de décharger le condensateur (initialisation de l'intégrateur). La tension constante appliquée sur VE commence peu de temps après : elle permet de générer la rampe en sortie.
Voici les tensions VE(t) et VS(t) :
[t,Ve,Vs] = np.loadtxt("integrateur-1000k-1uF-VeVs-rampe-50s.csv",unpack=True,skiprows=3,delimiter=',') t += 25 figure(figsize=(16,6)) plot(t,Ve,label=r"$V_E$") plot(t,Vs,label=r"$V_S$") grid() ylabel("Volts",fontsize=16) xlabel("t (s)",fontsize=16) xlim(0,50) ylim(-10,10) legend(loc='upper right',fontsize=16)fig23.pdf
L'absence de dérive visible lorsque la tension d'entrée est nulle montre que le système est bien réglé.
La tension VS étant négative, le courant s'écoule dans le JFET (lors de la décharge) de la source vers le drain, ce qui n'est pas la manière standard d'utiliser un JFET canal N. Cela ne pose pas de problème pour l'état passant (voir annexe) mais l'état bloquant (correspondant à la phase de charge du condensateur) n'est valable qu'au dessus d'une certaine tension, ici - 6 V. Voici le résultat pour une tension en entrée de 1,4 V :
[t,Ve,Vs] = np.loadtxt("integrateur-1000k-1uF-VeVs-rampe-50s-2.csv",unpack=True,skiprows=3,delimiter=',') t += 25 figure(figsize=(16,6)) plot(t,Ve,label=r"$V_E$") plot(t,Vs,label=r"$V_S$") grid() ylabel("Volts",fontsize=16) xlabel("t (s)",fontsize=16) xlim(0,50) ylim(-10,10) legend(loc='upper right',fontsize=16)fig24.pdf
La tension VS(t) cesse de diminuer alors que la tension en entrée est encore à 1 V. Le JFET 2N3819 redevient en effet conducteur pour un courant positif de la source vers le drain lorsque la tension drain/source descend en dessous de -6 V (voir annexe). Il est préférable d'utiliser le JFET canal N de manière standard, avec un courant positif du drain vers la source. Pour cela, il suffit d'appliquer une tension négative en entrée afin de générer une rampe croissante :
[t,Ve,Vs] = np.loadtxt("integrateur-1000k-1uF-VeVs-rampe-50s-3.csv",unpack=True,skiprows=3,delimiter=',') t += 25 figure(figsize=(16,6)) plot(t,Ve,label=r"$V_E$") plot(t,Vs,label=r"$V_S$") grid() ylabel("Volts",fontsize=16) xlabel("t (s)",fontsize=16) xlim(0,50) ylim(-10,10) legend(loc='upper right',fontsize=16)fig25.pdf
Dans ce cas, la tension en sortie peut dépasser 6 V (elle peut aller jusqu'à la tension de saturation de l'ALI, environ 8,5 V). Si la tension que l'on souhaite intégrer est positive, il suffira de placer un amplificateur inverseur pour changer son signe (ou bien on utilise un JFET canal P).
Si la tension à intégrer peut être positive ou négative, le circuit fonctionne à condition que la tension grille/source pour bloquer le transistor soit assez basse (tension négative) pour permettre l'excursion négative complète de VE(t). Dans l'exemple précédent, la plage de valeur de VS permise est +/- 6 V mais on peut l'augmenter en augmentant la tension d'alimentation.
Ce circuit peut servir à générer des rampes mais il y a bien d'autres applications. On peut par exemple s'en servir comme coulomb-mètre. Dans ce cas, on enlève la résistance R1 et le courant I1(t) est le courant à analyser. La quantité de charge injectée à l'instant t est :
L'intégrateur fournit donc une tension proportionnelle à cette quantité de charge.
On peut aussi s'en servir pour intégrer une force électromotrice d'induction aux bornes d'une petite bobine que l'on déplace dans un champ magnétique, ce qui permet d'obtenir le flux magnétique (on réalise ainsi un flux-mètre magnétique).
Pour résumer la méthode de conception de ce circuit, la constante R1C doit être choisie à environ un dixième de la durée de fonctionnement de l'intégrateur (10 s dans l'exemple précédent). L'intégrateur doit être réinitialisé (par décharge de son condensateur) après chaque cycle de fonctionnement.
Le 2N3819 est un transistor à effet de champ (JFET) canal N. Voici le circuit permettant d'obtenir sa caractéristique :
Figure pleine pageLa tension grille/source est imposée par une alimentation stabilisée en tension (entre 0 et -10 V). e(t) est une tension sinusoïdale délivrée par un générateur de signaux (GBF). La résistance R=10 Ω permet de mesurer le courant ID dans le sens drain vers source. Les mesures sont faites avec les deux entrées différentielles de l'Analog Discovery. La voie 1 sert à mesurer VDS et la voie 2 sert à mesurer la tension aux bornes de R. Voici la caractéristique (courant de drain en fonction de la tension drain/source) pour différentes valeurs de la tension grille/source.
R = 10 figure(figsize=(16,6)) [t,Vd,Ur] = np.loadtxt("2N3819-Vd-Id-R10-Vg=-10.csv",unpack=True,skiprows=1,delimiter=',') plot(Vd,Ur/R*1e3,label=r"$V_{GS}=-10\,\rm V$") [t,Vd,Ur] = np.loadtxt("2N3819-Vd-Id-R10-Vg=-9.csv",unpack=True,skiprows=1,delimiter=',') plot(Vd,Ur/R*1e3,label=r"$V_{GS}=-9\,\rm V$") [t,Vd,Ur] = np.loadtxt("2N3819-Vd-Id-R10-Vg=-8.csv",unpack=True,skiprows=1,delimiter=',') plot(Vd,Ur/R*1e3,label=r"$V_{GS}=-8\,\rm V$") [t,Vd,Ur] = np.loadtxt("2N3819-Vd-Id-R10-Vg=-7.csv",unpack=True,skiprows=1,delimiter=',') plot(Vd,Ur/R*1e3,label=r"$V_{GS}=-7\,\rm V$") [t,Vd,Ur] = np.loadtxt("2N3819-Vd-Id-R10-Vg=-6.csv",unpack=True,skiprows=1,delimiter=',') plot(Vd,Ur/R*1e3,label=r"$V_{GS}=-6\,\rm V$") [t,Vd,Ur] = np.loadtxt("2N3819-Vd-Id-R10-Vg=-5.csv",unpack=True,skiprows=1,delimiter=',') plot(Vd,Ur/R*1e3,label=r"$V_{GS}=-5\,\rm V$") [t,Vd,Ur] = np.loadtxt("2N3819-Vd-Id-R10-Vg=-4.csv",unpack=True,skiprows=1,delimiter=',') plot(Vd,Ur/R*1e3,label=r"$V_{GS}=-4\,\rm V$") [t,Vd,Ur] = np.loadtxt("2N3819-Vd-Id-R10-Vg=-3.csv",unpack=True,skiprows=1,delimiter=',') plot(Vd,Ur/R*1e3,label=r"$V_{GS}=-3\,\rm V$") [t,Vd,Ur] = np.loadtxt("2N3819-Vd-Id-R10-Vg=0.csv",unpack=True,skiprows=1,delimiter=',') plot(Vd,Ur/R*1e3,label=r"$V_{GS}=0\,\rm V$") grid() ylabel(r"$I_D\ (\rm mA)$",fontsize=16) xlabel(r"$V_{DS}\ (\rm V)$",fontsize=16) legend(loc="upper right",fontsize=16) ylim(-20,20)fig26.pdf
L'utilisation normale d'un transistor JFET se fait dans le domaine VDS>0. Le transistor est passant (avec la résistance minimale) lorsque VGS=0 V. Pour le rendre bloquant, il faut appliquer une tension grille/source négative d'au moins -4 V. Si l'on veut qu'il soit bloquant aussi pour VDS<0, il faut que la tension grille/source soit encore plus basse. Avec VGS=-10 V, le transistor est bloquant (c.a.d. équivalent à un interrupteur ouvert) pour VDS>-6 V (environ). Il faut remarquer que si VGS=0 V, il est passant dans les deux sens mais la caractéristique n'est pas symétrique. Dans le sens inverse, il y a la diode drain/source qui fait que le courant augmente très vite en dessous d'une certaine tension (environ -1 V). Dans le sens direct, il y a une zone ohmique à faible tension où VDS est à peu près proportionnelle à ID puis une saturation du courant ID se produit à plus haute tension.
Pour l'application du JFET en tant qu'interrupteur en parallèle du condensateur de l'intégrateur, il est possible de l'utiliser avec une tension VDS négative mais jusqu'à une certaine tension seulement. Lorsque VGS=0 V, le transistor est en effet passant dans les deux sens donc le condensateur se décharge quel que soit le signe de la tension VS (en sortie de l'intégrateur). Il est même probable qu'il se décharge plus vite dans le sens d'un courant de drain négatif. Lorsque VGS=-10 V, le transistor se comporte comme un interrupteur ouvert (et l'intégrateur peut fonctionner), mais seulement si VDS>-6 V. On pourrait d'ailleurs abaisser cette valeur en diminuant encore VGS. En conséquence, si l'on veut que l'intégrateur fonctionne quel que soit le niveau de tension atteint en sortie, il est préférable que celle-ci soit positive.