Ce document présente le calcul du champ magnétique créé par une bobine à symétrie axiale et de son coefficient d'auto-inductance, par résolution numérique de l'équation de Poisson pour le potentiel vecteur.
Nous faisons la résolution par éléments finis avec le logiciel libre Finite Element Method Magnetic. Nous utilisons l'interface pour Python (pyfemm), qui permet de piloter le logiciel depuis un script Python (le logiciel doit être installé). Ce script permet de définir une géométrie complexe dépendant d'un ou de plusieurs paramètres et d'obtenir des tracés de champ sur des courbes particulières. Les commandes de l'interface Python sont des répliques des opérations que l'on effectue lorsqu'on utilise directement l'interface utilisateur. Il faut donc bien se familiariser avec cette interface avant d'aborder l'écriture des scripts Python.
Le logiciel FEMM permet d'effectuer la résolution numérique d'un problème de magnétostatique (ou d'électrostatique ou de diffusion thermique) par la méthode des éléments finis. Il résout les problèmes bidimensionnels, en géométrie plane ou axisymétrique. Contrairement au logiciel FreeFEM, dont l'utilisation pour un problème de magnétostatique est exposée dans Équation de Poisson : méthode des éléments finis, le logiciel FEMM peut être utilisé sans aucune connaissance sur la méthode des éléments finis ni même des équations de la magnétostatique. Le système magnétique est en effet défini directement par ses caractéristiques physiques.
La bobine étudiée est identique à celle étudiée dans Bobine épaisse : différences finies.
On considère une bobine à symétrie axiale, modélisée par une densité de courant volumique orthoradiale.
Figure pleine pageLa bobine est un tore de section rectangulaire, de longueur , d'épaisseur e et de rayon moyen a.
Le potentiel vecteur vérifie l'équation de Poisson en coordonnées cylindriques :
En présence d'un noyau en matériau ferromagnétique doux (fer ou ferrite), la perméabilité magnétique dans le noyau est .
Le champ magnétique (rotationnel du potentiel vecteur) est :
On définit aussi le nombre de spires N et l'intensité du courant If dans le fil.
L'énergie magnétique (énergie à fournir pour établir le champ) s'écrit :
où V désigne le volume de la bobine (volume du tore). L'énergie s'exprime aussi à l'aide du coefficient d'auto-inductance :
Il s'en suit que l'auto-inductance L peut être calculée par :
où est la densité de courant pour If=1 A. L'auto-inductance dépend du nombre de spires : elle est proportionnelle à N2. Pour une taille de bobine donnée, elle dépend donc du diamètre du fil. Il peut être intéressant de calculer l'auto-inductance pour N=1, valeur qu'il faudra multiplier par N2. La valeur pour N=1 est obtenue avec un courant total dans une section du tore de 1 ampère.
On commence par définir le type de problème à résoudre (magnétostatique) et la géométrie (axisymétrique) :
import femm import numpy as np import matplotlib.pyplot as plt from os.path import exists femm.openfemm() femm.newdocument(0) # 0 : magnetic, 1 : electrostatic, 2 ; heat flow, 3 : current flow femm.mi_probdef(0, 'meters', 'axi', 1.0e-8, 0, 30)
On définit les paramètres géométriques pour la bobine et un éventuel noyau; l'unité est le mètre (comme défini ci-dessus).
Rb = 1/16 # rayon moyen de la bobine e = 1/32# épaisseur de la bobine lb = 5/32 # longueur de la bobine ln = lb # longueur du noyau zn = 0 # position du noyau R1 = 400e-3 # rayon du domaine noyau = False If = 1 # courant dans le fil df = 1e-3 #diamètre du fil N = e/df*lb/df # nombre de spires
La fonction mi_addmaterial permet de définir un matériau par ses propriétés physiques. Il y a 13 propriétés mais la fonction mi_addmaterial a un nombre de paramètres variables. Nous n'utilisons que les 5 premiers paramètres :
Nous n'utilisons pas la densité de courant pour définir les courants dans la bobine (voir plus loin). La conductivité électrique du cuivre est définie par principe mais elle ne sert pas dans notre simulation.
Voici les trois matériaux :
femm.mi_addmaterial('Air', 1, 1) femm.mi_addmaterial('Cuivre', 1, 1, 0, 0, 58) femm.mi_addmaterial('Fer', 1000, 1000)
Le courant dans la bobine est défini par un circuit (qui correspond au fil) :
femm.mi_addcircprop('1+',If,1)
La bobine et le noyau sont définis géométriquement par deux rectangles. Les coordonnées sont dans l'ordre (r,z).
femm.mi_drawrectangle(Rb-e/2,-lb/2,Rb+e/2,lb/2) if noyau: femm.mi_drawrectangle(0,zn-ln/2,Rb-e/2,zn+ln/2)
On affecte les matériaux Air et Fer aux domaines correspondants :
femm.mi_addblocklabel(0,R1/2) # air femm.mi_selectlabel(0,R1/2) femm.mi_setblockprop('Air', 0, 1e-3, '<None>', 0, 0, 0) femm.mi_clearselected() if noyau: femm.mi_addblocklabel((Rb-e/2)/2,0) # fer femm.mi_selectlabel((Rb-e/2)/2,0) femm.mi_setblockprop('Fer', 0 1e-3, '<None>', 0, 0, 0) femm.mi_clearselected()
Le second argument de la fonction mi_setblockprop indique que la finesse du maillage est donnée par le troisième argument.
Pour le domaine de cuivre de la bobine, on précise le circuit et le nombre de spires. La densité de courant est :
femm.mi_addblocklabel(Rb,0) femm.mi_selectlabel(Rb,0) femm.mi_setblockprop('Cuivre', 0 ,1e-3, '1+', 0, 0,N) femm.mi_clearselected()
Le circuit 1+ est affecté au rectangle qui définit la bobine. On pourrait tout aussi bien définir la densité de courant dans mi_addmaterial('Cuivre',..) et ne pas définir de circuit.
Remarquons que la densité de courant est uniforme sur une section du tore donc le modèle correspond a des fils de section carrée.
Il faut définir une frontière globale pour le domaine et de la condition limite sur cette frontière. Dans le cas présent, cette frontière doit être relativement loin de la bobine et elle doit simuler un milieu ouvert, c'est-à-dire un milieu sans frontière. La fonction mi_makeABC permet de définir une série de cercles concentriques à la périphérie du domaine, avec des conditions limites sur ces cercles qui permettent de simuler un milieu ouvert. On doit préciser le nombre de cercle (entre 1 et 10), le rayon, les coordonnées du centre et la condition sur le plus grand cercle (0 pour Dirichlet, 1 pour Neumann).
femm.mi_makeABC(5,R1,0,0,0) # frontière ouverte
La dernière étape consiste à sauvegarder la configuration dans un fichier et à lancer l'analyse puis la résolution numérique.
femm.mi_zoomnatural() femm.mi_saveas('aimant-bobine.fem') femm.mi_analyze() femm.mi_loadsolution()
Voici le calcul de l'auto-inductance et, pour comparaison, celle obtenue avec le modèle du solénoïde infini (sans noyau) :
femm.mo_selectblock(Rb,0) LL = femm.mo_blockintegral(0) # intégrale de Atheta*j print("L = ",LL) #solénoide infini LLinf = 4*np.pi*1e-7*np.pi*Rb**2*N**2/lb print("L(inf) = ",LLinf)
Pour finir, on trace le champ magnétique sur l'axe de la bobine et dans le plan z=0 :
z = np.linspace(-0.4,0.4,1000) Bz = np.zeros(len(z)) for k in range(len(z)): v = femm.mo_getpointvalues(0,z[k]) Bz[k] = v[2] plt.figure() plt.plot(z,Bz) plt.xlabel('z') plt.ylabel('Bz (r=0)') plt.grid() np.savetxt("bobine-Bz(r=0).txt",np.array([z,Bz]).T) r = np.linspace(0,0.4,1000) Bz = np.zeros(len(r)) for k in range(len(r)): v = femm.mo_getpointvalues(r[k],0) Bz[k] = v[2] plt.figure() plt.plot(r,Bz) plt.xlabel('r') plt.ylabel('Bz (z=0)') plt.grid() np.savetxt("bobine-Bz(z=0).txt",np.array([r,Bz]).T) plt.show() femm.closefemm()
Voici les lignes de champ magnétique :
Voici le champ sur l'axe de la bobine :
from matplotlib.pyplot import * import numpy as np [z,Bz] = np.loadtxt("bobine-Bz(r=0).txt",unpack=True) figure(figsize=(10,5)) plot(z,Bz) xlabel('z (m)',fontsize=18) ylabel('Bz (r=0) (T)',fontsize=18) grid()fig1.pdf
On peut comparer au champ sur l'axe d'une bobine constituée de spires de rayons a, dont l'expression analytique est connue :
mu0 = 4*np.pi*1e-7 If = 1.0 # courant dans le fil a = Rb = 1/16 # rayon de la bobine e = 1/32# épaisseur de la bobine lb = 5/32 # longueur de la bobine df = 1e-3 #diamètre du fil N = e/df*lb/df # nombre de spires Bz_spires = mu0*N*If/(2*lb)*((z+lb/2)/(a**2+(z+lb/2)**2)**(1/2)-(z-lb/2)/(a**2+(z-lb/2)**2)**(1/2)) figure(figsize=(10,5)) plot(z,Bz) plot(z,Bz_spires,"r--") xlabel('z',fontsize=16) ylabel(r'$B_z (T)$',fontsize=16) grid()fig2.pdf
Pour le champ sur l'axe, la bobine épaisse est équivalente à une bobine d'épaisseur négligeable dont le rayon est égal au rayon moyen.
Voici le champ dans le plan z=0 :
[r,Bz] = np.loadtxt("bobine-Bz(z=0).txt",unpack=True) figure(figsize=(10,5)) plot(r,Bz) xlabel('r (m)',fontsize=18) ylabel('Bz (z=0) (T)',fontsize=18) grid()fig3.pdf
Voici les valeurs de l'auto-inductance (en henry) :
L = 1.402811982050394 L(inf) = 2.3530970576022523
La valeur donnée par le modèle du solénoïde infini est nettement plus grande.
Voici les résultats avec une bobine deux fois plus longue :
[z,Bz] = np.loadtxt("bobine-2-Bz(r=0).txt",unpack=True) figure(figsize=(10,5)) plot(z,Bz) xlabel('z (m)',fontsize=18) ylabel('Bz (r=0) (T)',fontsize=18) grid()fig4.pdf
mu0 = 4*np.pi*1e-7 If = 1.0 # courant dans le fil a = Rb = 1/16 # rayon de la bobine e = 1/32# épaisseur de la bobine lb = 5/32*2 # longueur de la bobine df = 1e-3 #diamètre du fil N = e/df*lb/df # nombre de spires Bz_spires = mu0*N*If/(2*lb)*((z+lb/2)/(a**2+(z+lb/2)**2)**(1/2)-(z-lb/2)/(a**2+(z-lb/2)**2)**(1/2)) figure(figsize=(10,5)) plot(z,Bz) plot(z,Bz_spires,"r--") xlabel('z',fontsize=16) ylabel(r'$B_z (T)$',fontsize=16) grid()fig5.pdf
[r,Bz] = np.loadtxt("bobine-2-Bz(z=0).txt",unpack=True) figure(figsize=(10,5)) plot(r,Bz) xlabel('r (m)',fontsize=18) ylabel('Bz (z=0) (T)',fontsize=18) grid()fig6.pdf
L = 3.32682784289769 L(inf) = 4.706194115204505
Nous avons vérifié que cercle définissant le bord du domaine n'est pas trop petit : une augmentation d'un facteur 2 de son rayon a très peu d'effet sur la valeur de l'auto-inductance.
Le noyau est en fer doux, de perméabilité relative 1000.
Voici les lignes de champ magnétique :
Voici le champ sur l'axe de la bobine :
from matplotlib.pyplot import * import numpy as np [z,Bz] = np.loadtxt("bobine-noyau-Bz(r=0).txt",unpack=True) figure(figsize=(10,5)) plot(z,Bz) xlabel('z (m)',fontsize=18) ylabel('Bz (r=0) (T)',fontsize=18) grid()fig7.pdf
et le champ dans le plan z=0 :
[r,Bz] = np.loadtxt("bobine-noyau-Bz(z=0).txt",unpack=True) figure(figsize=(10,5)) plot(r,Bz) xlabel('r (m)',fontsize=18) ylabel('Bz (z=0) (T)',fontsize=18) grid()fig8.pdf
Voici l'auto-inductance :
L = 5.799335307148285 L(inf) = 2.3530970576022523
La présence du noyau augmente l'auto-inductance d'un facteur 4,1.
Voici les résultats avec une bobine deux fois plus longue :
[z,Bz] = np.loadtxt("bobine-2-noyau-Bz(r=0).txt",unpack=True) figure(figsize=(10,5)) plot(z,Bz) xlabel('z (m)',fontsize=18) ylabel('Bz (r=0) (T)',fontsize=18) grid()fig9.pdf
[r,Bz] = np.loadtxt("bobine-2-noyau-Bz(z=0).txt",unpack=True) figure(figsize=(10,5)) plot(r,Bz) xlabel('z (m)',fontsize=18) ylabel('Bz (z=0) (T)',fontsize=18) grid()fig10.pdf
L = 27.73946443527697 L(inf) = 4.706194115204505
Pour cette bobine plus longue, la présence du noyau augmente l'auto-inductance d'un facteur 8,4. Plus la bobine est longue, plus la présence du noyau augmente l'auto-inductance. L'effet maximal est obtenu avec un noyau de forme torique, qui donne une augmentation de l'ordre de la perméabilité magnétique relative.
Le déplacement du noyau permet de faire varier l'auto-inductance :
[z,Bz] = np.loadtxt("bobine-3-noyau-Bz(r=0).txt",unpack=True) figure(figsize=(10,5)) plot(z,Bz) xlabel('z (m)',fontsize=18) ylabel('Bz (r=0) (T)',fontsize=18) grid()fig11.pdf
[r,Bz] = np.loadtxt("bobine-3-noyau-Bz(z=0).txt",unpack=True) figure(figsize=(10,5)) plot(r,Bz) xlabel('r (m)',fontsize=18) ylabel('Bz (z=0) (T)',fontsize=18) grid()fig12.pdf
L = 21.8181992403772 L(inf) = 4.706194115204505