Table des matières Python

Détecteur d'inductance mutuelle

1. Introduction

Ce document décrit un système permettant de détecter et de mesurer un couplage par inductance mutuelle entre une bobine et un autre circuit. La bobine est utilisée pour réaliser un oscillateur LC. La présence d'un circuit secondaire fermé à proximité de la bobine (autre bobine en circuit fermé ou pièce métallique non magnétique) engendre une modification de la fréquence d'oscillation, en raison du couplage par inductance mutuelle entre les deux circuits.

La détection de la variation de fréquence (par exemple au moyen d'une boucle à verrouillage de phase) permet de détecter la présence du circuit secondaire et éventuellement de mesurer le coefficient d'inductance mutuelle.

2. Étude du système

2.a. Mise en équation

oscillateurLC.svgFigure pleine page

Une bobine, d'inductance propre L1 et de résistance r1, associée à un condensateur de capacité C et à une résistance R, permet de constituer un filtre LC passe-bande, dont la tension d'entrée est Ve, la tension de sortie Vs. Un amplificateur à impédance d'entrée très grande permet de réaliser la fonction :

Ve=g(Vs)

La fonction g doit présenter une décroissance de la pente comme indiqué sur la figure.

On s'intéresse tout d'abord à la réponse fréquentielle du filtre LC en calculant sa fonction de transfert H(f) :

import numpy as np
from matplotlib.pyplot import *
from numpy.fft import fft
from scipy.signal import blackman
from scipy.integrate import odeint

R=1000
C=1e-6
L1=47e-3
r1=8.5

f = np.linspace(400,1000,100000)
w = 2*np.pi*f
Y = 1j*C*w+1/(r1+1j*L1*w) # admittance bobine-condensateur
H = 1/(R*Y+1) # fonction de transfert du filtre
G = np.absolute(H)
phi = np.angle(H)
figure(figsize=(8,8))
subplot(211)
plot(f,G)
grid()
xlabel("f (Hz)")
ylabel("G")
subplot(212)
plot(f,phi)
grid()
xlabel("f (Hz)")
ylabel(r"$\phi$")
             

La fréquence d'oscillation du filtre en boucle avec un amplificateur à gain réel est la fréquence qui annule de déphasage :

f0 = f[np.argmin(np.absolute(phi))]
             
print(f0)
--> 733.561335613356
reponseFiltrereponseFiltre.pdf

Si l'oscillateur était linéaire, la condition d'oscillation du système serait H(f)g=1. Il devrait avoir le gain :

Gmax = G.max()
g0 = 1/Gmax       
             
print(g0)
--> 1.179952096763931

Il est en réalité impossible de régler le gain exactement à cette valeur. On adopte donc une fonction de gain non linéaire avec un gain à faible tension supérieur à g0. Pour la simulation, on utilise la fonction tangente hyperbolique :

def g(V): #amplificateur non linéaire
    return 1.4*np.tanh(V)

Vs = np.linspace(-2,2,1000)
Ve = g(Vs)
figure()
plot(Vs,Ve)
grid()
xlabel("Vs")
ylabel("Ve")
             
gainAmpli.svgFigure pleine page

Lorsque la tension Vs est faible, le gain est supérieur à g0 donc l'amplitude des oscillations est croissante. La réduction du gain effectif lorsque l'amplitude augmente permet de stabiliser l'amplitude des oscillations. Voici le tracé du gain effectif :

figure()
plot(Vs,Ve/Vs)
plot([-2,2],[g0,g0])
xlabel("Vs")
ylabel("Ve/Vs")
grid()
             
gainEffectif.svgFigure pleine page

Effectuons la mise en équation du système, en prenant en compte la présence du circuit secondaire, qui est caractérisé par une inductance propre L2 et une résistance r2. L'inductance mutuelle est notée M.

Les inconnues sont Ve,Vs,i1,i2,ic. Les 5 équations sont :

Vs=L1di1dt+r1i1-Mdi2dt(1)Ve=R(i1+ic)+Vs(2)ic=CdVsdt(3)L2di2dt+r2i2=Mdi1dt(4)

Après élimination de ic et Ve et en définissant x=Vs, y=i1 et z=i2, on obtient le système d'équations :

x=L1dydt+r1y-Mdzdt(5)g(x)=R(y+Cdxdt)+x(6)L2dzdt+r2z=Mdydt(7)

Il s'agit d'un système algébro-différentiel que l'on peut mettre aisément sous la forme Y'=f(Y) :

dxdt=1RC(g(x)-x)-yC(8)dydt=L2L1L2-M2(x-r1y-r2ML2z)(9)dzdt=ML1L2-M2(x-r1y)-L1r2L1L2-M2z(10)

2.b. Simulation

Voici une fonction qui effectue le calcul pour une durée T, un nombre de points N et une condition initiale Y0. Elle fait aussi l'analyse spectrale de x afin de déterminer la fréquence d'oscillation.

def integration(T,Y0,N,R,C,L1,r1,M,L2,r2,g):
    t = np.linspace(0,T,N)
    a=1/(R*C)
    b=L2/(L1*L2-M*M)
    c=r2*M/L2
    d=M/(L1*L2-M*M)
    e=L1*r2/(L1*L2-M*M)
    def systeme(Y,t):
        dY0 = a*(g(Y[0])-Y[0])-Y[1]/C
        dY1 = b*(Y[0]-r1*Y[1]-c*Y[2])
        dY2 = d*(Y[0]-r1*Y[1])-e*Y[2]
        return [dY0,dY1,dY2]
    Y = odeint(systeme,Y0,t,rtol=1e-6,atol=1e-6)
    x = Y[:,0]
    y = Y[:,1]
    z = Y[:,2]
    xe = x[N//2:N]
    xe = np.concatenate((xe*blackman(N//2),np.zeros(6*N//2)))
    Ne = len(xe)
    h = t[1]-t[0]
    spectre = np.absolute(fft(xe))*2.0/Ne/0.42
    freq = np.arange(Ne)*1/(Ne*h)
    f = freq[spectre[0:Ne//2].argmax()]
    return (t,x,y,z,freq,spectre,f)
              

Voyons tout d'abord la tension Vs en l'absence d'inductance mutuelle :

R=1000
C=1e-6
L1=47e-3
r1=8.5
M=0
L2=0.28e-3
r2=0.6

N=100000
T=1
Y0 = [0.01,0,0]
(t1,x1,y1,z1,freq1,spectre_x1,f1) = integration(T,Y0,N,R,C,L1,r1,M,L2,r2,g)
figure(figsize=(12,4))
subplot(211)
plot(t1,x1)
xlim(0,0.1)
grid()
ylabel("Vs")
subplot(212)
plot(t1,x1)
xlim(0.1,0.12)
xlabel("t (s)")
ylabel("Vs")
grid()
              
signal1signal1.pdf

L'amplificateur non linéaire permet d'obtenir des oscillations dont l'amplitude tend vers une valeur constante. Bien sûr, l'amplitude obtenue dans cette simulation provient de la forme particulière de la courbe de gain. Ce qui nous importe ici est la fréquence de ces oscillations, qu'on obtient par analyse spectrale :

figure()
plot(freq1,spectre_x1)
xlabel("f (Hz)")
grid()
xlim(600,800)              
               
spectre1spectre1.pdf

Le maximum nous donne la fréquence d'oscillation :

print(f1)
--> 733.4212371428571

que l'on peut comparer à la fréquence d'oscillation pour un amplificateur linéaire (fréquence qui annule le déphasage du filtre) :

print(f0)
--> 733.561335613356

Lorsqu'on augmente la précision des calculs, en réduisant la tolérance définie dans odeint et en augmentant le nombre de points du tracé du déphasage, on constate que l'écart entre ces deux valeurs se réduit, ce qui suggère que ces deux fréquences sont égales (bien que l'amplificateur ne soit pas linéaire).

Voyons l'influence de l'inductance mutuelle. On choisit l'inductance propre du circuit secondaire et sa résistance. L'inductance mutuelle maximale est L1L2 .

Mmax = np.sqrt(L1*L2)*0.999              
               
print(Mmax)
--> 0.0036240437580139675
M = 5e-4            
               
(t2,x2,y2,z2,freq2,spectre_x2,f2) = integration(T,Y0,N,R,C,L1,r1,M,L2,r2,g)
figure(figsize=(12,4))
subplot(211)
plot(t2,x2)
xlim(0,0.1)
grid()
ylabel("Vs")
subplot(212)
plot(t2,x2)
xlim(0.1,0.12)
xlabel("t (s)")
ylabel("Vs")
grid()             
               
signal2signal2.pdf
figure()
plot(freq1,spectre_x1,label='M=0')
plot(freq2,spectre_x2,label='M=%0.2g'%M)
xlabel("f (Hz)")
legend(loc='upper left')
grid()
xlim(720,750)                
               
spectre2spectre2.pdf

En présence du circuit secondaire, l'oscillation a une fréquence légèrement plus grande et une amplitude plus faible. Il s'agira de mesurer cette variation de fréquence au moyen d'une boucle à verrouillage de phase, ou bien avec un compteur numérique. Voyons l'influence du signe de l'inductance mutuelle :

(t3,x3,y3,z3,freq3,spectre_x3,f3) = integration(T,Y0,N,R,C,L1,r1,-M,L2,r2,g)
figure()
plot(freq1,spectre_x1,label='M=0')
plot(freq3,spectre_x3,label='M=-%0.2g'%M)
xlabel("f (Hz)")
legend(loc='upper left')
grid()
xlim(720,750) 
    
spectre3spectre3.pdf

Il y a toujours augmentation de la fréquence, ce qui montre que le signe de l'inductance mutuelle n'est pas détectable.

Voici la fréquence d'oscillation en fonction de l'inductance mutuelle :

liste_M = np.linspace(0,2e-3,50)
liste_f = []
for M in liste_M:
    (t1,x1,y1,z1,freq1,spectre_x1,f1) = integration(T,Y0,N,R,C,L1,r1,M,L2,r2,g)
    liste_f.append(f1)

figure(figsize=(8,8))
subplot(211)
plot(np.array(liste_M)*1000,liste_f)
grid()
xlim(0,1)
ylim(720,760)
ylabel("f (Hz)")
subplot(212)
plot(np.array(liste_M)*1000,liste_f)
grid()
ylabel("f (Hz)")
xlabel("M (mH)")
            
frequencesfrequences.pdf

La fréquence d'oscillation augmente avec l'inductance mutuelle. Si l'inductance mutuelle dépasse une certaine valeur, l'oscillateur ne fonctionne plus, comme le confirme l'exemple ci-dessous :

M=1.8e-3
(t2,x2,y2,z2,freq2,spectre_x2,f2) = integration(T,Y0,N,R,C,L1,r1,M,L2,r2,g)
figure(figsize=(12,4))
subplot(211)
plot(t2,x2)
xlim(0,0.1)
grid()
ylabel("Vs")
subplot(212)
plot(t2,x2)
xlim(0.1,0.12)
xlabel("t (s)")
ylabel("Vs")
grid()       
            
signal4signal4.pdf

Cette valeur de l'inductance mutuelle (1.9mH) est bien inférieure à la valeur maximale (3,6mH) mais elle est assez grande pour conduire à un amortissement des oscillations. Pour obtenir des oscillations avec cette inductance mutuelle, il faut augmenter le gain de l'amplificateur :

def g(V): #amplificateur non linéaire
    return 1.9*np.tanh(V)
M=1.8e-3
(t2,x2,y2,z2,freq2,spectre_x2,f2) = integration(T,Y0,N,R,C,L1,r1,M,L2,r2,g)
figure(figsize=(12,4))
subplot(211)
plot(t2,x2)
xlim(0,0.1)
grid()
ylabel("Vs")
subplot(212)
plot(t2,x2)
xlim(0.1,0.12)
xlabel("t (s)")
ylabel("Vs")
grid()  
             
signal5signal5.pdf

Il faudra donc ajuster le gain de l'amplificateur à un niveau assez élevé pour assurer l'oscillation dans le domaine d'inductance mutuelle à explorer.

3. Réalisation

L'amplificateur est réalisé au moyen d'un ALI en montage non-inverseur :

oscillateurLC-complet.svgFigure pleine page

À la fréquence d'oscillation (environ 700 Hz), le gain du montage non-inverseur est :

G=1+RbRa

Par réglage du potentiomètre que constitue Rb, on ajuste ce gain à une valeur supérieure à g0. On peut réaliser par exemple G=1,5 avec Rb=2,4. La tension aux bornes de Rb est alors Vb=0,51Vs. Lorsque cette tension dépasse environ 0,8 V, une des diodes devient passante. Lorsqu'elle passe en dessous de -0,8 V, l'autre diode devient passante. Il se produit donc une réduction du gain pour |Vs| égal à environ 1,6 V, ce qui devrait stabiliser l'amplitude des oscillations à une valeur proche de celle-ci, soit environ 2,4 V en sortie de l'ALI.

On commence par régler l'oscillateur sans la bobine 2. Si Rb est assez faible, aucune oscillation n'est observée. On augmente Rb jusqu'à observer des oscillations stables. Cela se produit pour Rb=1,15, ce qui correspond à un gain G=1,2.

En approchant la bobine 2 dans l'axe de la bobine 1, on constate que l'amplitude des oscillations diminue, conformément aux prévisions théoriques. La variation de fréquence est imperceptible sans analyse spectrale. Lorsque la bobine 2 est trop proche, c'est-à-dire lorsque l'inductance mutuelle est trop grande, les oscillations disparaissent, conformément à ce qui était prévu. Il faut donc augmenter le gain (en augmentant Rb) de manière à obtenir des oscillations stables pour la position la plus proche de la bobine 2 souhaitée.

La bobine 2 que nous utilisons pour ce test est plus petite que la bobine 1, si bien qu'on peut l'introduire à l'intérieur de celle-ci. Ses caractéristiques sont L2=0,28mH et r2=0,60Ω. Nous augmentons Rb tout juste assez pour que les oscillations soient maintenues lorsque la bobine 2 est placée contre la bobine 1, sans entrer dans cette dernière. La valeur est Rb=1,3, ce qui correspond à une gain G=1,3.

Voici le spectre de la tension Ve sans la bobine 2

def analyse(t,x):
    N = len(x)
    xe = np.concatenate((x*blackman(N),np.zeros(6*N)))
    Ne = len(xe)
    h = t[1]-t[0]
    spectre = np.absolute(fft(xe))*2.0/Ne/0.42
    freq = np.arange(Ne)*1/(Ne*h)
    f = freq[spectre[0:Ne//2].argmax()]
    return (freq,spectre,f)
    
[t,V] = np.loadtxt("oscillation-1.txt")
(freq,spectre,f) = analyse(t,V)
figure(figsize=(8,8))
subplot(211)
plot(freq,spectre)
grid()
ylabel(r"$V_e (V)$")
xlabel("f (Hz)")
xlim(0,5e3)
ylim(0,0.5)
subplot(212)
plot(freq,spectre)
xlim(720,800)
ylim(0,0.5)
grid()
ylabel(r"$V_e (V)$")
xlabel("f (Hz)")
              
print(f)
--> 732.4358957875294
oscillation-1oscillation-1.pdf

et voici le spectre des oscillations en présence de la bobine 2, placée contre la première.

print(f)
--> 735.0073500735008
oscillation-2oscillation-2.pdf

Il y a bien une augmentation de la fréquence comme le prévoyait la simulation.

Afin de pouvoir augmenter encore l'inductance mutuelle en plaçant la bobine 2 à l'intérieur de la bobine 1, nous augmentons le gain. La résistance est alors Rb=3,4, soit un gain G=1,7.

Voici le spectre du signal sans la bobine 2 :

print(f)
--> 732.2930372160865
oscillation-3oscillation-3.pdf

L'augmentation du gain a fait baisser très légèrement la fréquence d'oscillation.

Voici le spectre du signal avec la bobine 2 placée contre la première :

print(f)
--> 734.864491502058
oscillation-4oscillation-4.pdf

Voici le spectre du signal lorsque la bobine 2 est placée à l'intérieur de la bobine 1, ce qui correspond au maximum d'inductance mutuelle réalisable.

print(f)
--> 797.7222629369152
oscillation-5oscillation-5.pdf

Il est intéressant de considérer le cas où l'on introduit un tube de fer dans la bobine. Après avoir réglé le gain de l'amplificateur pour que l'oscillateur fonctionne toujours avec le tube, voici le spectre du signal sans le tube :

print(f)
--> 732.2930372160865
oscillation-6oscillation-6.pdf

et avec le tube en fer à l'intérieur :

print(f)
--> 687.0068700687008
oscillation-7oscillation-7.pdf

Dans ce cas, nous observons une diminutation de la fréquence d'oscillation. Cela s'explique par le ferromagnétisme du fer, qui a pour conséquence une augmentation de L1 et donc un abaissement de la fréquence d'oscillation. Avec le tube en fer utilisé ici, cet effet d'augmentation de l'auto-inductance l'emporte sur l'effet des courants induits dans le tube.

Pour comparaison, voici le spectre du signal lorsqu'on introduit un tube d'aluminium dans la bobine 1 :

print(f)
--> 740.5788343597723
oscillation-8oscillation-8.pdf

Dans ce cas, on a bien une augmentation de la fréquence.

Creative Commons LicenseTextes et figures sont mis à disposition sous contrat Creative Commons.