Table des matières Python

Flux magnétique généré par un rotor à aimants dans un stator

1. Introduction

Ce document s'intéresse aux machines synchrones triphasées dont le rotor est constitué d'aimants permanents. Les moteurs dits à courant continu sans balais (Brushless DC motors) appartiennent à cette famille. L'objectif est de calculer le flux magnétique généré par le rotor dans les bobines du stator, afin de calculer la force électromotrice générée par la rotation du rotor dans les bobines du stator (force contre-électromotrice dans un moteur) et le moment des forces magnétiques sur le rotor (couple moteur).

On donne aussi des résultats de calcul par éléments finis de champs générés par des stators à bobinage dentaire alimentés par un commutateur triphasé à 6 états.

2. Modèle bidimensionnel sans fer

Le stator est triphasé. Pour définir le modèle, considérons le cas le plus simple : un stator à 2 pôles (magnétiques) constitué de trois bobines (une bobine pour chaque phase) et un rotor à 2 pôles, constitué de deux aimants de forme cylindrique (aimantés dans la direction radiale) :

rotor2-stator3-fig.svgFigure pleine page

Pour chaque demi-bobine, le numéro indique la phase et le signe le sens de l'enroulement. Le rotor et le stator sont supposés assez longs pour qu'on puisse adopter un modèle bimensionnel des champs, par exemple pour le champ magnétique :

B=Br(r,θ)ur+Bθ(r,θ)uθ

Soit R le rayon moyen de l'entrefer. Nous définissons un modèle dans lequel l'angle θ est remplacé par x=Rθ et r par y, avec une condition limite périodique pour x :

rotor2-stator3-plat-fig.svgFigure pleine page

Les aimants et les bobines sont supposés très longs dans la direction z. Le calcul du champ magnétique généré par un aimant de longueur infinie et de section rectangulaire est fait dans Flux magnétique généré par un aimant permanent. Remarquons que ce modèle de machine ne comporte aucune partie en ferromagnétique doux, ce qui permet de faire le calcul du champ par une méthode intégrale. En réalité, la présence de parties en fer doux, aussi bien dans le stator que dans le rotor, modifie fortement la forme du champ magnétique et l'intensité du couple moteur. Voir à ce sujet le document Aimant et bobine : flux et force, qui montre l'influence des pièces en fer sur la force entre une bobine et un aimant.

Notons a la largeur de l'aimant et b son épaisseur. Son aimantation est supposée uniforme et constante :

M=Muy(1)

Par ailleurs, la perméabilité magnétique de l'aimant est supposée égale à 1, ce qui implique que l'aimant n'a aucun effet sur le champ créé par les bobines du stator. Chaque aimant est équivalent à deux courants opposés localisés sur ses extrémités (sur ses faces perpendiculaires à (Ox)). Ainsi les courants équivalents des faces voisines de deux aimants adjacents sont égaux. Il faut noter que ce rotor est très différent d'un rotor en fer doux (avec des encoches pour faire passer les bobines) en raison de la grande réluctance de l'aimant par rapport à celle du fer doux. Dans ce modèle, la présence des aimants n'a aucun effet sur le champ généré par le stator puisque leur réluctance est égale à celle du vide. Un modèle plus réaliste devra tenir compte de la perméabilité magnétique de l'aimant, mais le calcul développé ci-après n'est plus valable dans ce cas. De manière générale, la présence de parties de perméabilité relative différente de 1 complique beaucoup la résolution car l'aimantation de ces parties n'est pas connue a priori. Une résolution par différences finies ou par éléments finis permet de traiter ce cas. Dans le présent document, nous présentons un calcul du champ généré par les aimants sous forme d'intégrales, qui n'est valable qu'en l'absence de pièces en ferromagnétique doux.

Supposons que le centre de l'aimant soit à l'origine du repère. Le potentiel vecteur créé par cet aimant se calcule en considérant les courants surfaciques : un courant de densité surfacique Muz sur la face située en x=a/2, un courant de densité surfacique -Muz sur la face située en x=-a/2. Comme démontré dans Flux magnétique généré par un aimant permanent, la première crée dans l'espace le potentiel vecteur suivant :

Az=2μ0M4πy+b/2y-b/2ln(X2+Y2)dY=2μ0M4π[Yln(X2+Y2)-2Y+2Xarctan(YX)]Y=y+b/2Y=y-b/2(2)

avec X=x-a/2 . L'expression du potentiel vecteur créé par la face en x=-a/2 se déduit de la précédente en posant X=x+a/2 et en changeant le signe de M.

Soit Na le nombre d'aimants dans le rotor (nombre pair), c'est-à-dire le nombre de pôles. Les coordonnées du centre de l'aimant d'indice i sont notées xc,i,yc,i. Le potentiel vecteur Az(x,y) en un point de l'espace est la somme des potentiels vecteurs créés par les Na aimants mais il faut appliquer une condition limite périodique. Pour cela, il faut définir une portée maximale d'un aimant.

Le flux magnétique à travers une bobine se calcule comme ceci :

Φ= S(+ Az(x,y)dxdy-- Az(x,y)dxdy)(3)

Par exemple, pour la phase 1, la première intégrale se fait sur le côté 1+ de la bobine, la seconde sur le côté 1-. On obtient un flux pour chaque phase. Lorsqu'il y a plusieurs bobines par phase, il faut ajouter les flux des différentes bobines de chaque phase.

Lorsque les courants dans les trois phases du stator sont donnés, la variation du flux en fonction de la position du rotor permet de déterminer la résultante des forces sur le rotor (qui correspond à un moment de forces par rapport à l'axe de rotation). Comme il est démontré dans Flux magnétique généré par un aimant permanent, la force exercée par une bobine est l'intensité du courant dans cette bobine multipliée par le gradient du flux dans la bobine par rapport à la position de l'aimant. On a donc pour trois phases la composante selon (Ox) de la résultante :

Fx=i1dΦ1dx+i2dΦ2dx+i3dΦ3dx(4)

On calculera cette force dans le cas d'un stator alimenté par un Commutateur triphasé à 3 états. Les trois bobines sont connectées en étoile et on note A,B,C les trois bornes du montage étoile. Dans ce mode de commutation, une tension positive ou négative est appliquée entre deux bornes, par exemple A et B alors que la troisième est laissée libre. La tension appliquée subit un découpage dont le rapport cyclique détermine l'intensité du courant dans la bobine. L'intensité du courant dans chaque phase dépend de la tension effective appliquée, de la force contre-électromotrice et du temps. Un calcul complet du courant sort du cadre de ce document. Nous nous contentons ici de calculer la force lorsque la vitesse du rotor est assez faible pour que la force contre-électromotrice soit négligeable devant la tension appliquée. De plus, comme la vitesse est très faible, le courant atteint son régime stationnaire très rapidement à chaque état de commutation. On aura donc par exemple i1=I, i2=-I et i3=0. Les calculs par éléments finis présentés plus loin sont faits également avec cette hypothèse.

import numpy as np
from matplotlib.pyplot import *
                        
def fa(X,Y):
    return np.float64(Y)*np.log(np.float64(X)**2+np.float64(Y)**2)-2*np.float64(Y)+2*np.float64(X)*np.arctan(np.float64(Y)/np.float64(X))

def champAz_aimant(M,xc,yc,a,b,x,y):
    a2 = a/2
    b2 = b/2
    X = x-xc-a2
    A1 = M*(fa(X,y-yc-b2)-fa(X,y-yc+b2))
    X = x-xc+a2
    A2 = -M*(fa(X,y-yc-b2)-fa(X,y-yc+b2))
    return (A1+A2)/(2*np.pi)

Na = 2 # nombre d'aimants
e = 5 # espacement entre les aimants (degrés)
b = 10 # épaisseur des aimants
c=d=10 # dimensions d'un demi-bobine
f = 30 # distance entre deux demi-bobines
xb = 0
yb = 15 # position des bobines

def dessinSysteme(Na,b,e,xc1,yc1,c,d,f,yb):
    a = 360/Na-e 
    yc = yc1
    for k in range(-1,Na+1):
        xc = xc1+k*360/Na
        plot([xc-a/2,xc+a/2,xc+a/2,xc-a/2,xc-a/2],[yc+b/2,yc+b/2,yc-b/2,yc-b/2,yc+b/2],'k')
    for xb in [0,120,240]:
        for k in [-1,1]:
            xb2 = xb+k*f/2
            plot([xb2-c/2,xb2+c/2,xb2+c/2,xb2-c/2,xb2-c/2],[yb+d/2,yb+d/2,yb-d/2,yb-d/2,yb+d/2],'k')

def champAz(Na,b,e,xc1,yc1,x,y):
    # xc1,yc1 : position du premier aimant
    a = 360/Na-e 
    Az = 0
    M = 1
    yc = yc1
    for k in range(-Na,2*Na):
        xc = xc1+k*360/Na
        Az += champAz_aimant(M,xc,yc,a,b,x,y)
        M = -M
    return Az

figure(figsize=(16,6))
axes().set_aspect('equal')
x,y = np.meshgrid(np.linspace(-60,360,1000), np.linspace(-50,50,500))
xc1 = 90
yc1 = 0  
Az = champAz(Na,b,e,xc1,yc1,x,y)
contour(x,y,Az,levels=np.linspace(Az.min(),Az.max(),21))
dessinSysteme(Na,b,e,xc1,yc1,c,d,f,yb)
xlim(-60,360)
grid()
                    
fig1fig1.pdf

La fonction suivante calcule la valeur moyenne de Az sur une demi-bobine :

def moyAz(Na,b,e,xc1,yc1,x0,y0,c,d,N):
    #x0,y0 : centre du rectangle
    #c,d : dimensions du rectangle
    #N : nombre de points sur chaque dimension pour le calcul de l'intégrale
    x,y = np.meshgrid(np.linspace(x0-c,x0+c,N),np.linspace(y0-d,y0+d,N))
    Az = champAz(Na,b,e,xc1,yc1,x,y)
    return Az.mean()
                     

La fonction suivante calcule le flux pour une bobine :

def fluxBobine(Na,b,e,xc1,yc1,xb,yb,c,d,f,N):
    # xb,tb : centre de la bobine
    # c,d : dimensions des demi-bobines
    # f : largeur de la bobine (distance entre les centres des demi-bobines)
    return moyAz(Na,b,e,xc1,yc1,xb+f/2,yb,c,d,N)-moyAz(Na,b,e,xc1,yc1,xb-f/2,yb,c,d,N)
                     

Voici le calcul du flux dans la phase 1 pour le stator à 3 bobines :

N = 10
xc1 = np.linspace(0,360,200)
flux1 = np.zeros(len(xc1))
for k in range(len(xc1)):
    flux1[k] = fluxBobine(Na,b,e,xc1[k],yc1,xb,yb,c,d,f,N)
figure(figsize=(16,6))
plot(xc1,flux1)
grid()
                     
fig2fig2.pdf

Le flux dans les deux autres phases est identique mais déphasé de 120 et -120 degrés.

Un bobinage de stator, qu'il soit à encoche ou dentaire, peut être décrit par un ensemble de demi-bobines réparties régulièrement. La figure suivante montre le bobinage d'un stator bipolaire similaire au précédent mais où chaque phase comporte une paire de bobines diamétralement opposées. Il comporte donc 12 demi-bobines et peut être réalisé sur une pièce en fer comportant 6 dents (ou bien 12 encoches).

rotor2-stator6-fig.svgFigure pleine page

La fonction suivante calcule les flux pour les trois phases d'un stator :

from scipy.signal import convolve
from numpy.fft import fft
import math
                     
def fluxStator(Na,b,e,xc1,yc1,stator,yb,c,d,N):
    # stator : définition du stator, liste ['1+','3+', etc.]
    Ns = len(stator)
    f = 360/Ns
    flux = [0.0,0.0,0.0]
    for k in range(Ns):
        xb = k*f
        phi = moyAz(Na,b,e,xc1,yc1,xb+f/2,yb,c,d,N)
        n = int(stator[k][0])-1
        s = stator[k][1]
        if s=='+':
            flux[n] += phi
        else:
            flux[n] -= phi
    
    return flux
        
        
                     
stator = ['1+','3+','3-','2-','2+','1+','1-','3-','3+','2+','2-','1-']
xc1 = np.linspace(0,360,200)
flux1 = np.zeros(len(xc1))
flux2 = np.zeros(len(xc1))
flux3 = np.zeros(len(xc1))
for k in range(len(xc1)):
    flux = fluxStator(Na,b,e,xc1[k],yc1,stator,yb,c,d,N)
    flux1[k] = flux[0]
    flux2[k] = flux[1]
    flux3[k] = flux[2]
fem1 = convolve(-flux1,[1,-1],mode='same')
fem2 = convolve(-flux2,[1,-1],mode='same')
fem3 = convolve(-flux3,[1,-1],mode='same')
figure(figsize=(16,6))
plot(xc1,flux1)
plot(xc1,flux2)
plot(xc1,flux3)
xlabel("angle rotor (deg)",fontsize=16)
ylabel("flux",fontsize=16)
grid()
                     
fig3fig3.pdf
figure(figsize=(16,6))
plot(xc1[1:],fem1[1:])
plot(xc1[1:],fem2[1:])
plot(xc1[1:],fem3[1:])
xlabel("angle rotor (deg)",fontsize=16)
ylabel("fem",fontsize=16)
grid()
                     
fig4fig4.pdf

Cette forme de force électromotrice est obtenue pour une rotation du rotor à vitesse angulaire constante. Il y a un cycle du flux (et de la f.é.m.) par tour de rotor et les flux dans les trois phases sont déphasés de 120 degrés.

Voici une fonction qui permet de représenter le système (aimants et bobines du stator) :

def dessinSysteme(Na,b,e,xc1,yc1,stator,yb,c,d):
    a = 360/Na-e 
    yc = yc1
    color = ['r','b']
    ic = 0
    for k in range(-1,Na+1):
        xc = xc1+k*360/Na
        plot([xc-a/2,xc+a/2,xc+a/2,xc-a/2,xc-a/2],[yc+b/2,yc+b/2,yc-b/2,yc-b/2,yc+b/2],color[ic])
        ic = abs(ic-1)
    Ns = len(stator)
    f = 360/Ns
    for k in range(Ns):
            xb = k*f+f/2
            plot([xb-c/2,xb+c/2,xb+c/2,xb-c/2,xb-c/2],[yb+d/2,yb+d/2,yb-d/2,yb-d/2,yb+d/2],'k')
            text(xb,yb,stator[k],horizontalalignment='center')
                     

Voici les lignes de champ et la représentation du système :

figure(figsize=(16,6))
axes().set_aspect('equal')
x,y = np.meshgrid(np.linspace(-60,360,1000), np.linspace(-50,50,500))
Az = champAz(Na,b,e,0,0,x,y)
contour(x,y,Az,levels=np.linspace(Az.min(),Az.max(),21))
dessinSysteme(Na,b,e,0,0,stator,yb,c,d)
xlim(0,360)
grid()                 
                     
fig5fig5.pdf

Les forces électromotrices précédemment calculées sont en fait les opposées des dérivées des flux par rapport à x. Ces tableaux permettent donc de calculer la force pour un état de courant donné dans les phases. La figure suivante montre la force pour deux états de commutation successifs, correspondant à une rotation du champ de 60 degrés.

figure(figsize=(16,6))
(i1,i2,i3) = (1,-1,0)
Fx = i1*(-fem1)+i2*(-fem2)+i3*(-fem3)
plot(xc1[1:],Fx[1:],label='1,-1,0')
(i1,i2,i3) = (1,0,-1)
Fx = i1*(-fem1)+i2*(-fem2)+i3*(-fem3)
plot(xc1[1:],Fx[1:],label='1,0,-1')
xlabel("angle rotor (deg)",fontsize=16)
ylabel("Fx",fontsize=16)
legend(loc='upper right')
grid()
                      
fig6fig6.pdf

Il y a deux positions du rotor (espacées de 60 degrés) qui donnent un maximum positif de la force (c'est-à-dire du couple) et deux positions qui donnent un maximum négatif. La courbe de force se déplace de 60 degrés à chaque étape de commutation. Le rotor doit donc tourner aussi de 60 degrés et un tour de rotor doit se faire en une période du cycle de commutation.

3. Stators à bobinage dentaire

Les deux types de bobinage de stator (à encoches et dentaire) sont étudiés dans le document Champ magnétique généré par un stator, qui présente des calculs par éléments finis du champ glissant généré par différentes configurations de stator (pour une alimentation triphasée sinusoïdale). On s'intéresse ici aux stators à bobinage dentaire, que l'on rencontre sur les petits moteurs synchrones de type moteur à courant continu sans balais. L'exemple précédent est un moteur (ou une génératrice) comportant un stator bipolaire et un rotor bipolaire.

3.a. Stator et rotor à 4 pôles (6N4P)

Le stator comporte 6 bobines réalisées sur 6 dents. Chaque phase alimente une paire de bobines diamétralement opposées comme pour le stator pibolaire étudié plus haut mais les deux bobines d'une paire produisent des champs opposés au centre du stator (les sens des bobinages sont contraires). On obtient ainsi un stator quadripolaire, c'est-à-dire produisant un champ tournant à 4 pôles (ne pas confondre le nombre de pôle avec le nombre de dents). Ce stator fonctionne avec un rotor à 4 pôles.

rotor4-stator6-fig.svgFigure pleine page
stator = ['1-','1+','3-','3+','2-','2+','1-','1+','3-','3+','2-','2+']
Na = 4
figure(figsize=(16,6))
axes().set_aspect('equal')
x,y = np.meshgrid(np.linspace(-60,360,1000), np.linspace(-50,50,500))
xc1 = 0
yc1 = 0  
Az = champAz(Na,b,e,xc1,yc1,x,y)
contour(x,y,Az,levels=np.linspace(Az.min(),Az.max(),21))
dessinSysteme(Na,b,e,xc1,yc1,stator,yb,c,d)
xlim(0,360)
grid()            
            
fig7fig7.pdf

Voici les lignes de champ générées par le stator (pour un rotor en fer lisse) et le champ statorique dans l'entrefer. Les courants dans les trois phases sont (1,-1,0), ce qui correspond à un des 6 états d'une commande par commutation à 6 états.

lignes
[theta,Br,Btheta] = np.loadtxt("stator-6bobines-4poles-t=0.000.txt",unpack=True)
figure(figsize=(16,6))
title(r"$t = 0$",fontsize=16)
plot(theta*180/np.pi,Br*1e3,label=r"$B_r$")
plot(theta*180/np.pi,Btheta*1e3,label=r"$B_{\theta}$")
grid()
xlabel(r"$\theta\ (\rm deg)$",fontsize=16)
ylabel(r"$B\ (mT)$",fontsize=16)
legend(loc='upper right')
            
fig8fig8.pdf

Le champ statorique comporte bien 4 pôles (2 pôles nord et 2 pôles sud).

Ce type de stator est utilisé dans les moteurs à courant continu sans balais (Brushless DC motors, BLDC). La commande de ces moteurs se fait le plus souvent par une commutation à 6 états et, en conséquence, le champ tourne par saut de 60 degrés (à faible fréquence de commutation).

Voici les flux et les f.é.m. dans les trois phases :

xc1 = np.linspace(0,360,180)
flux1 = np.zeros(len(xc1))
flux2 = np.zeros(len(xc1))
flux3 = np.zeros(len(xc1))
for k in range(len(xc1)):
    flux = fluxStator(Na,b,e,xc1[k],yc1,stator,yb,c,d,N)
    flux1[k] = flux[0]
    flux2[k] = flux[1]
    flux3[k] = flux[2]
fem1 = convolve(-flux1,[1,-1],mode='same')
fem2 = convolve(-flux2,[1,-1],mode='same')
fem3 = convolve(-flux3,[1,-1],mode='same')
figure(figsize=(16,6))
plot(xc1,flux1)
plot(xc1,flux2)
plot(xc1,flux3)
xlabel("angle rotor (deg)",fontsize=16)
ylabel("flux",fontsize=16)
grid()
                     
fig9fig9.pdf
figure(figsize=(16,6))
plot(xc1[1:],fem1[1:])
plot(xc1[1:],fem2[1:])
plot(xc1[1:],fem3[1:])
xlabel("angle rotor (deg)",fontsize=16)
ylabel("fem",fontsize=16)
grid()
                     
fig10fig10.pdf

Un tour complet du rotor donne deux cycles du flux (et évidemment de la f.é.m.).

Voici la résultante des forces sur le rotor, pour deux états successifs :

figure(figsize=(16,6))
(i1,i2,i3) = (1,-1,0)
Fx = i1*(-fem1)+i2*(-fem2)+i3*(-fem3)
plot(xc1[1:],Fx[1:],label='1,-1,0')
(i1,i2,i3) = (1,0,-1)
Fx = i1*(-fem1)+i2*(-fem2)+i3*(-fem3)
plot(xc1[1:],Fx[1:],label='1,0,-1')
xlabel("angle rotor (deg)",fontsize=16)
ylabel("Fx",fontsize=16)
legend(loc='upper right')
grid()
                      
fig11fig11.pdf

La courbe se déplace de 30 degrés à chaque changement d'état. Le rotor doit donc tourner de 30 degrés. En conséquence, le rotor fait un tour pour deux périodes du cycle de commutation.

3.b. Stator à 4 pôles, rotor à 8 pôles (6N8P)

Le stator produisant un champ à 4 pôles est le même que pour la configuration 6N4P mais on double le nombre de pôles du rotor. Le rotor contient donc deux fois plus de pôles que le stator.

rotor8-stator6-fig.svgFigure pleine page
stator = ['1-','1+','3-','3+','2-','2+','1-','1+','3-','3+','2-','2+']
Na = 8
figure(figsize=(16,6))
axes().set_aspect('equal')
x,y = np.meshgrid(np.linspace(-60,360,1000), np.linspace(-50,50,500))
xc1 = 0
yc1 = 0  
Az = champAz(Na,b,e,xc1,yc1,x,y)
contour(x,y,Az,levels=np.linspace(Az.min(),Az.max(),21))
dessinSysteme(Na,b,e,xc1,yc1,stator,yb,c,d)
xlim(0,360)
grid()            
            
fig12fig12.pdf

Voici les flux dans les trois phases :

xc1 = np.linspace(1e-3,360-1e-3,180)
flux1 = np.zeros(len(xc1))
flux2 = np.zeros(len(xc1))
flux3 = np.zeros(len(xc1))
for k in range(len(xc1)):
    flux = fluxStator(Na,b,e,xc1[k],yc1,stator,yb,c,d,N)
    if not(math.isnan(flux[0])):
        flux1[k] = flux[0]
        flux2[k] = flux[1]
        flux3[k] = flux[2]
fem1 = convolve(-flux1,[1,-1],mode='same')
fem2 = convolve(-flux2,[1,-1],mode='same')
fem3 = convolve(-flux3,[1,-1],mode='same')
figure(figsize=(16,6))
plot(xc1,flux1)
plot(xc1,flux2)
plot(xc1,flux3)
xlabel("angle rotor (deg)",fontsize=16)
ylabel("flux",fontsize=16)
grid()
                     
fig13fig13.pdf

Les flux sont sinusoïdaux et en conséquence les f.é.m. le sont aussi. Pour ce stator à 6 bobines et 4 pôles magnétiques, le fait de passer de 4 pôles à 8 pôles dans le rotor permet d'obtenir une forme de f.é.m. quasi sinusoïdale. La vitesse angulaire du rotor est la moitié de celle du champ statorique. Dans une commande à 6 états, le rotor doit donc tourner par saut de 30 degrés. Le fait que la forme de la f.é.m. est quasi sinusoïdale est probablement sans importance dans le cas d'une commande à 6 états mais rend possible une commande sinusoïdale. Cependant, la forme du champ glissant généré par ce stator avec une alimentation triphasée sinusoïdale (non montrée ici) est loin d'être sinusoïdale. Pour obtenir une forme de champ sinusoïdale, il faut utiliser un stator à encoches.

Le nombre de cycles du flux par tour de rotor est 4.

Voici la résultante des forces sur le rotor :

figure(figsize=(16,6))
(i1,i2,i3) = (1,-1,0)
Fx = i1*(-fem1)+i2*(-fem2)+i3*(-fem3)
plot(xc1[1:],Fx[1:],label='1,-1,0')
(i1,i2,i3) = (1,0,-1)
Fx = i1*(-fem1)+i2*(-fem2)+i3*(-fem3)
plot(xc1[1:],Fx[1:],label='1,0,-1')
xlabel("angle rotor (deg)",fontsize=16)
ylabel("Fx",fontsize=16)
legend(loc='upper right')
grid()
                      
fig14fig14.pdf

La courbe de force se déplace de 15 degrés à chaque étape de commutation. Le rotor doit donc tourner de 15 degrés : sa vitesse de rotation est donc 4 fois plus faible que la fréquence du cycle de commutation.

3.c. Stator à 8 pôles, rotor à 14 pôles (12N14P)

La configuration 12N14P est très répandue dans les petits moteurs BLDC. Le stator comporte 12 bobines (sur 12 dents) et produit un champ à 8 pôles magnétiques. Le rotor comporte 14 pôles. Chaque phase alimente deux bobines adjacentes (2 dents voisines) et deux bobines diamétralement opposées. Ces deux bobines adjacentes sont alimentées en sens inverse. Deux bobines de la même phase diamétralement opposées sont bobinées dans le même sens et produisent donc un champ au centre dans le même sens. Le plus souvent, le rotor se trouve à l'extérieur.

rotor14-stator12-fig.svgFigure pleine page

Voici les lignes de champ statorique et la forme du champ dans l'entrefer :

lignes
[theta,Br,Btheta] = np.loadtxt("stator-12bobines-8poles-t=0.000.txt",unpack=True)
figure(figsize=(16,6))
title(r"$t = 0$",fontsize=16)
plot(theta*180/np.pi,Br*1e3,label=r"$B_r$")
plot(theta*180/np.pi,Btheta*1e3,label=r"$B_{\theta}$")
grid()
xlabel(r"$\theta\ (\rm deg)$",fontsize=16)
ylabel(r"$B\ (mT)$",fontsize=16)
legend(loc='upper right')
            
fig15fig15.pdf

Le champ dans l'entrefer comporte bien 8 pôles.

stator = ['1+','1-','1-','1+','3-','3+','3+','3-','2+','2-','2-','2+','1-','1+','1+','1-','3+','3-','3-','3+','2-','2+','2+','2-']
Na = 14
c = 7
figure(figsize=(16,6))
axes().set_aspect('equal')
x,y = np.meshgrid(np.linspace(-60,360,1000), np.linspace(-50,50,500))
xc1 = 0
yc1 = 0  
Az = champAz(Na,b,e,xc1,yc1,x,y)
contour(x,y,Az,levels=np.linspace(Az.min(),Az.max(),21))
dessinSysteme(Na,b,e,xc1,yc1,stator,yb,c,d)
xlim(0,360)
grid()            
            
fig16fig16.pdf

Voici les flux dans les trois phases :

xc1 = np.linspace(0,360,360)
flux1 = np.zeros(len(xc1))
flux2 = np.zeros(len(xc1))
flux3 = np.zeros(len(xc1))
for k in range(len(xc1)):
    flux = fluxStator(Na,b,e,xc1[k],yc1,stator,yb,c,d,N)
    if not(math.isnan(flux[0])):
        flux1[k] = flux[0]
        flux2[k] = flux[1]
        flux3[k] = flux[2]
fem1 = convolve(-flux1,[1,-1],mode='same')
fem2 = convolve(-flux2,[1,-1],mode='same')
fem3 = convolve(-flux3,[1,-1],mode='same')
figure(figsize=(16,6))
plot(xc1,flux1)
plot(xc1,flux2)
plot(xc1,flux3)
xlabel("angle rotor (deg)",fontsize=16)
ylabel("flux",fontsize=16)
grid()
                     
fig17fig17.pdf

Le nombre de cycles du flux par tour de rotor est 7.

Voici la résultante des forces sur le rotor :

figure(figsize=(16,6))
(i1,i2,i3) = (1,-1,0)
Fx = i1*(-fem1)+i2*(-fem2)+i3*(-fem3)
plot(xc1[1:],Fx[1:],label='1,-1,0')
(i1,i2,i3) = (1,0,-1)
Fx = i1*(-fem1)+i2*(-fem2)+i3*(-fem3)
plot(xc1[1:],Fx[1:],label='1,0,-1')
xlabel("angle rotor (deg)",fontsize=16)
ylabel("Fx",fontsize=16)
legend(loc='upper right')
grid()
                      
fig18fig18.pdf

La courbe de force se déplace de 360/7/6 degrés à chaque étape de commutation. Le rotor doit donc tourner de 360/7/6 degrés : sa vitesse de rotation est donc 7 fois plus faible que la fréquence du cycle de commutation.

3.d. Stator à 8 pôles, rotor à 10 pôles (12N10P)

Reprenons le stator précédent, comportant 12 bobines et produisant un champ à 8 pôles. Peut-on réduire le nombre de pôles du rotor ? Pour le savoir, nous essayons les valeurs 13, 12, 11, 10, 9 et 8 de nombre d'aimants. Nous constatons que seules les nombres 13, 11, 10 et 9 conduisent à une f.é.m. dans les trois phases (bien sur, ce résultat dépend du bobinage du stator). Voici les résultats obtenues pour 10 aimants (12N10P) :

stator = ['1+','1-','1-','1+','3-','3+','3+','3-','2+','2-','2-','2+','1-','1+','1+','1-','3+','3-','3-','3+','2-','2+','2+','2-']
Na = 10
c = 7
figure(figsize=(16,6))
axes().set_aspect('equal')
x,y = np.meshgrid(np.linspace(-60,360,1000), np.linspace(-50,50,500))
xc1 = 0
yc1 = 0  
Az = champAz(Na,b,e,xc1,yc1,x,y)
contour(x,y,Az,levels=np.linspace(Az.min(),Az.max(),21))
dessinSysteme(Na,b,e,xc1,yc1,stator,yb,c,d)
xlim(0,360)
grid()            
            
fig19fig19.pdf
xc1 = np.linspace(1e-3,360-1e-3,360)
flux1 = np.zeros(len(xc1))
flux2 = np.zeros(len(xc1))
flux3 = np.zeros(len(xc1))
for k in range(len(xc1)):
    flux = fluxStator(Na,b,e,xc1[k],yc1,stator,yb,c,d,N)
    if not(math.isnan(flux[0])):
        flux1[k] = flux[0]
        flux2[k] = flux[1]
        flux3[k] = flux[2]
fem1 = convolve(-flux1,[1,-1],mode='same')
fem2 = convolve(-flux2,[1,-1],mode='same')
fem3 = convolve(-flux3,[1,-1],mode='same')
figure(figsize=(16,6))
plot(xc1,flux1)
plot(xc1,flux2)
plot(xc1,flux3)
xlabel("angle rotor (deg)",fontsize=16)
ylabel("flux",fontsize=16)
grid()
                     
fig20fig20.pdf

Le nombre de cycles du flux par tour de rotor est 5.

figure(figsize=(16,6))
(i1,i2,i3) = (1,-1,0)
Fx = i1*(-fem1)+i2*(-fem2)+i3*(-fem3)
plot(xc1[1:],Fx[1:],label='1,-1,0')
(i1,i2,i3) = (1,0,-1)
Fx = i1*(-fem1)+i2*(-fem2)+i3*(-fem3)
plot(xc1[1:],Fx[1:],label='1,0,-1')
xlabel("angle rotor (deg)",fontsize=16)
ylabel("Fx",fontsize=16)
legend(loc='upper right')
grid()
                      
fig21fig21.pdf

La courbe de force se déplace de 360/5/6=12 degrés à chaque étape de commutation. Le rotor doit donc tourner de 12 degrés : sa vitesse de rotation est donc 7 fois plus faible que la fréquence du cycle de commutation.

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