Académique Documents
Professionnel Documents
Culture Documents
2. Principe de la modulation SV
On utilise la structure classique des 3 bras de commutateurs commandés par 3 comparateurs. Le signal
de référence est de forme triangulaire et de fréquence FPWM très grande devant la fréquence des signaux
ua, ub et uc (au moins 20x).
Pour respecter cette relation à la lettre et donc atteindre l'objectif, il faut calculer les durées T0 à T7 pour
chaque position angulaire de U . On en déduit les consignes de tension ua, ub et uc nécessaires.
Ce procédé n'est pas utilisé car il provoque de trop nombreux changements d'états (32 par période
PWM) et les pertes par commutation deviennent excessives.
Solution adoptée :
Le diagramme vectoriel est divisé en 6 secteurs de 60°
Dans chaque secteur, seuls 4 vecteurs U i sont utilisés pour produire U (les 2 vecteurs qui
encadrent le secteur, ainsi que U 0 et U 7 ) :
T T T T
secteur I : U 0 U 0 1 U1 2 U 2 7 U 7 Avec TS=T0+T1+T2+T7 : période PWM
TS TS TS TS
CREMMEL Marcel Page 4/25 TS électronique - 31/08/06
Application maquette d'étude EP10K20 – Générateur SVM triphasé pour moteur BLDC
T T T T
secteur II : U 0 U 0 2 U 2 3 U 3 7 U 7 Avec TS=T0+T2+T3+T7
TS TS TS TS
T T T T
secteur III : U 0 U 0 3 U 3 4 U 4 7 U 7 Avec TS=T0+T3+T4+T7
TS TS TS TS
T T T T
secteur IV : U 0 U 0 4 U 4 5 U 5 7 U 7 Avec TS=T0+T4+T5+T7
TS TS TS TS
T T T T
secteur V : U 0 U 0 5 U 5 6 U 6 7 U 7 Avec TS=T0+T5+T6+T7
TS TS TS TS
T T T T
secteur VI : U 0 U 0 6 U 6 1 U1 7 U 7 Avec TS=T0+T6+T7+T7
TS TS TS TS
A un instant donné, l'angle magnétique du moteur se trouve dans un des 6 secteurs. On calcule alors
les rapports cycliques nécessaires pour placer le vecteur U dans cette position.
Cette solution ne nécessite que 12 changements d'états par période PWM (pertes plus faibles) et réduit
aussi le nombre de calculs nécessaires.
Par exemple, dans le secteur I :
T T T T
U 0 U 0 1 U1 2 U 2 7 U 7 Avec TS=T0+T1+T2+T7 : période PWM
TS TS TS TS
Quand le vecteur U se déplace de 0° à 60°, la durée T1 de S1 varie du max à 0 tandis que la
durée T2 de S2 varie de 0 au max.
On choisit généralement : T0 = T7 pour des raisons de symétrie et limiter les composantes
harmoniques.
Pour obtenir un vecteur U de longueur m (m est l'indice de modulation), on calcule T0, T1, T2 et
T7 à partir du diagramme vectoriel :
T1 2 π 2 π
m sin m sin ω t
TS 3 3 3 3
T2 2 2
m sin m sin ω t
TS 3 3
T0 T7 TS T1 T2
TS TS 2
UaN
UbN
UcN
UaN
UbN
UcN
UaN
UbN
UcN
UaN
UbN
UcN
UaN
UbN
UcN
UaN
UbN
UcN
TS
T0 T5 T0 TB
TS T7 TS T0 T0
IV TS = T4+T5+T0+T7 T4 T5 TS TS
TS TS TS
T0 T5 T0 TA
TS T7 TS T0 T0
V TS = T5+T6+T0+T7 T5 T6 TS TS
TS TS TS
T0 TS T7 TS T0 T0 T1 T0 TB
VI TS = T6+T1+T0+T7 T6 T1
TS TS TS TS TS
Le rapport cyclique T0/TS est calculé comme suit :
T0 T7 TS TA TB 1 TA TB
1
TS TS 2.TS 2 TS TS
0,9
0,8
0,7
0,6
0,5
0,3
0,2
0,1
0
0 60 120 180 240 300 360
0,6
0,4
0,2
-0,2
-0,4
-0,6
-0,8
-1
0 60 120 180 240 300 360
Gene_CLK
PIN_91
CLK_18M432 INPUT
VCC CLK_18M432 EN_2K25
EN_72K
EN_4M608
inst2
Note : le moteur actuellement utilisé n'étant pas équipé de capteurs à effet Hall, on utilise un simulateur
("Simul_Hall") qui produit les 3 signaux H1, H2 et H3 déphasés de 60°. La fréquence est réglable avec
le codeur incrémental et détermine la vitesse de rotation du moteur.
Fonction : le codeur incrémental règle indépendamment la tension appliquée au moteur (quand LINE1
est à "0") et la vitesse de rotation du moteur (quand LINE1 est à "1"). Les signaux PWM1D à PWM3U
pilotent une interface de puissance (voir schéma plus loin) qui produit les 3 tensions inter-phases
sinusoïdales d'alimentation des 3 stators du moteur.
Avec le moteur utilisé (1 paire de pôles), la vitesse de rotation est réglable entre 0 et 1384tr/mn avec
une résolution de 21,97tr/mn.
La consigne de niveau (NV) a une résolution de 8 bits.
Le signal d'horloge CLK_18M432 est produit par l'oscillateur à quartz OSC1 et vaut 18,432MHz.
4. Gene_CLK
Div_32
On cherche à rendre
INPUT OUTPUT
l'ensemble du schéma
CLK_18M432 CLK OUT EN_2K25
VCC
EN
synchrone avec l'horloge
18,432MHz.
inst3 La fonction "Gene_CLK"
OUTPUT EN_72K produit des signaux de
Div_256 validation d'horloge (durée =
1 période 18,432MHz) avec
CLK OUT
une fréquence déterminée en
fonction des besoins :
inst1 EN_2K25 : 2,25KHz
DIV_4
EN_72K : 72kHz
CLK EN_CLK OUTPUT EN_4M608 EN_4M608 : 4,608MHz
inst
4.2 DIV_256
SUBDESIGN Div_256
(
CLK : INPUT;
OUT : OUTPUT;
)
VARIABLE Q[7..0] : DFF;
BEGIN
Q[].CLK=CLK;
Q[].D=Q[].Q+1;
OUT=Q[].Q==0;
END;
4.3 DIV_32
SUBDESIGN Div_32
(
CLK : INPUT;
EN : input;
OUT : OUTPUT;
)
VARIABLE Q[4..0] : DFFE;
BEGIN
Q[].CLK=CLK;
Q[].ena=EN;
Q[].D=Q[].Q+1;
OUT=(Q[].Q==0)&EN;
END;
5. Simul_Hall
AND2
EN_COD INPUT
VCC
inst4 Anti_rebonds
NOT
CODA INPUT
VCC IN OUT
inst12
EN decod_a_b CPT_UD NCO_H
CLK
A DIR UD POS[6..0] FREQ[6..0] H1 OUTPUT H1
inst3
B CLK CLK SENS CLK H2 OUTPUT H2
Anti_rebonds OUTPUT
H3 H3
NOT
CODB INPUT
VCC IN OUT inst15 inst5 inst
inst13
EN
CLK
inst2
CLK_18M432 INPUT
VCC
EN_2K25 INPUT
VCC
Les signaux CODA et CODB produits par le codeur incrémental passent par des fonctions anti-rebonds
indispensables compte-tenu de la fréquence d'horloge.
Le sens de chaque cran est détecté par la fonction "decod_a_b" :
DIR indique le sens au moment du sur CLK : "1" : CW et "0" : CCW
Les 2 premières bascules D permettent d'éliminer les effets des rebonds plus courts que 2 périodes
d'horloge validées : soit 2/2,25kHz = 889µS
5.2 Decod_a_b
SUBDESIGN decod_a_b
(
A, B : INPUT;
DIR, CLK : OUTPUT;
)
VARIABLE
DIR_FF : DFF;
BEGIN
DIR_FF.CLK = B;
DIR_FF.D = A;
DIR = DIR_FF.Q;
CLK = A & B;
END;
L'information de direction est échantillonnée sur A au de B.
Le signal CLK est produit par une fonction ET entre A et B.
5.3 CPT_UD
subdesign CPT_UD
(
UD, CLK : input;
POS[6..0] : output;
SENS : output;
)
variable Q[7..0] : dff;
begin
Q[].clk=CLK;
if UD then Q[].d=Q[].q+1;
else Q[].d=Q[].q-1;
end if;
if Q7.q then POS[6..0]=!Q[6..0];
else POS[6..0]= Q[6..0];
end if;
SENS=Q7.q;
end;
Les sur CLK sont comptés ou décomptés par la fonction CPT_UD :
5.4 NCO_H
subdesign NCO_H
( FREQ[6..0] : input;
CLK : input;
H1,H2,H3 : output;
)
variable
REG[22..0] : dff;
FREQW[22..0] : node;
QH[2..0] : dff;
begin
FREQW[22..7]=gnd; FREQW[6..0]=FREQ[6..0];
REG[].d = REG[].q + FREQW[];
REG[].clk = CLK;
QH[].clk = REG22.q;
if QH[].q==5 then QH[].d=0;
else QH[].d=QH[].q+1;
end if;
H1=(QH[].q==0) or (QH[].q==1) or (QH[].q==2);
H2=(QH[].q==1) or (QH[].q==2) or (QH[].q==3);
H3=(QH[].q==2) or (QH[].q==3) or (QH[].q==4);
end;
La structure est classique. Le registre et l'additionneur ont une taille de 23 bits pour obtenir la résolution
de réglage voulue.
La sortie REG22.q est utilisée comme signal d'horloge d'un compteur 3 bits modulo 6. Les 3 sorties sont
décodées pour produire les 3 signaux H1, H2 et H3 déphasés de 60°.
6. Reg_Niveau
AND2
EN_COD INPUT
VCC
inst4 Anti_rebonds
NOT
CODA INPUT
VCC IN OUT
inst12
EN decod_a_b Cpt_UD_Niv
CLK up/down
inst3
A DIR updow n
OUTPUT NIV[7..0]
B CLK clock q[7..0]
Anti_rebonds
NOT inst1
CODB INPUT
VCC IN OUT inst15
inst13
EN
CLK
inst2
CLK_18M432 INPUT
VCC
EN_2K25 INPUT
VCC
La structure est similaire à la fonction "Simul_Hall", mais elle ne comporte pas de fonction NCO.
La fonction de comptage des crans diffère aussi; elle ne nécessite pas de commentaires supplémentaires.
7. Gene_3SVM
OUTPUT SYNC
Capteur_Hall OUTPUT POS[7..0]
H1 INPUT OUTPUT SECT[2..0]
VCC H1 SECT[2..0]
H2 INPUT
VCC H2 PULSE_H ROM_TA
H3 INPUT
VCC H3 M_POS[7..0]
address[7..0] q[7..0]
CLK_18M432
EN_72K inst7 Modulation
inst ROM_TB
TA[7..0] TAM[7..0]
address[7..0] q[7..0] TB[7..0] TBM[7..0]
inst8 M[7..0]
inst1
M[7..0] INPUT
VCC
CALC_SVM LIMIT_3PWM
OUTPUT PWM1[7..0]
SECT[2..0] PWM_R[7..0] IN1[7..0] OUT1[7..0]
OUTPUT PWM2[7..0]
TA[7..0] PWM_Y[7..0] IN2[7..0] OUT2[7..0]
OUTPUT PWM3[7..0]
TB[7..0] PWM_B[7..0] IN3[7..0] OUT3[7..0]
LIM[5..0]
inst9
INPUT CLK
LIM[5..0]
VCC
INPUT
EN
CLK_18M432
VCC
EN_72K INPUT
VCC
inst4
La fonction produit 3 signaux numériques SVM codés en Bd sur 8 bits et déphasés de 120°. Ils sont
synchronisés sur les signaux des capteurs à effet Hall : H1, H2 et H3. Leurs niveaux sont réglables avec
les entrées NIV1, NIV2 et NIV3 codées en C2 (-128 à +127).
La structure utilise 2 ROM (taille = 256 octets) contenant les tables TA et TB (voir §2).
Les ROM sont adressées par M_POS[7..0] qui représente la position angulaire du moteur dans un des 6
secteurs. Le codage sur 8 bits donne une résolution de 60/256=0,235° magnétique.
Le secteur actuel est donné par SECT[2..0] qui évolue entre 0 et 5. Cette information est utilisée par la
fonction "CAL_SVM" qui calcule les rapports cycliques permettant de produire la tension
d'alimentation adéquate du moteur.
La fonction "Modulation" multiplie les valeurs TA[] et TB[] (en BN) avec l'indice de modulation M[] et
réalise donc le réglage de niveau. On ne garde que l'octet de poids fort du résultat.
La fonction "LIMIT_PWM" évite d'obtenir les rapports cycliques extrêmes de 0% et 100% et bloquer le
hachage des courants dans le moteur.
H1 INPUT
clock
VCC IN OUT OUTPUT SECT[2..0]
q[2..0]
EN clk_en
CLK inst13
inst Pulse_Hall OUTPUT PULSE_H
Anti_rebonds Cpt_Magn_pos
H1 PULSE_0 up counter
H2 INPUT
sclr
VCC IN OUT H2 PULSE_H
EN H3
clock q[7..0] OUTPUT M_POS[7..0]
CLK CLK
inst4 clk_en cout
inst6 cnt_en
Anti_rebonds
inst10
H3 INPUT
IN OUT
VCC NOT
EN OR2
CLK_18M432 INPUT inst11
VCC CLK
inst5 Cpt_Mesure_TH inst12
up counter
sclr
Periode_H
DFF Div_prog_16b
clock down counter
q[15..0] data[15..0]
sload
EN_72K INPUT clock
VCC cnt_en q[15..0] data[15..0]
enable q[15..0]
inst7 cout
inst8 clock
inst9
7.1.1 Anti_rebonds
Fonctions déjà décrites (§5.1)
7.1.2 Pulse_Hall
XOR
DFF
PRN
H1 INPUT
VCC D Q AND2
inst1
NOT OUTPUT PULSE_0
CLRN inst8 inst7
inst
XOR OR3
DFF
PRN OUTPUT PULSE_H
H2 INPUT
VCC D Q
inst4 inst2
CLRN
inst3
XOR
DFF
PRN
H3 INPUT
VCC D Q
CLK INPUT inst6
VCC
CLRN
inst5
7.4 Calc_SVM
Cette fonction effectue les calculs décrits dans le tableau du §2.5 pour obtenir les 3 rapports cycliques
PWMa, PWMb et PWMc. Les calculs dépendent du secteur dans lequel se trouve l'axe magnétique du
moteur; cette information est fournie par SECT[2..0].
Dans le tableau du §2.5, les valeurs des rapports cycliques PWMa, PWMb et PWMc sont comprises
entre 0 et 1. Dans la solution proposée, les rapports cycliques correspondants PWM_R, PWM_Y et
PWM_B sont des entiers positifs codés sur 8 bits, donc de valeurs comprises entre 0 et 255.
subdesign CALC_SVM
(
SECT[2..0]:input;
TA[7..0]:input;
TB[7..0]:input;
PWM_R[7..0]:output;
PWM_Y[7..0]:output;
PWM_B[7..0]:output;
)
variable
T0_x2[7..0]:node;
T0[7..0] :node;
begin
T0_x2[]=255-TA[]-TB[]+1; -- +1 pour éviter les dépassements
T0[6..0]=T0_x2[7..1]; T0[7]=GND;
case SECT[] is
when 0 => PWM_R[]=T0[];
PWM_Y[]=T0[]+TA[];
PWM_B[]=255-T0[];
when 1 => PWM_R[]=T0[]+TB[];
PWM_Y[]=T0[];
PWM_B[]=255-T0[];
when 2 => PWM_R[]=255-T0[];
PWM_Y[]=T0[];
PWM_B[]=T0[]+TA[];
when 3 => PWM_R[]=255-T0[];
PWM_Y[]=T0[]+TB[];
PWM_B[]=T0[];
when 4 => PWM_R[]=T0[]+TA[];
7.5 Modulation
La fonction "Modulation" multiplie les valeurs TA[] et TB[] (en BN) avec l'indice de modulation M[] et
réalise donc le réglage de niveau. On ne garde que l'octet de poids fort du résultat.
Multiply_8x8
Multiply_8x8
7.6 Limit_3PWM
Cette fonction évite d'obtenir les rapports cycliques extrêmes de 0% et 100% et bloquer le hachage des
courants dans le moteur.
subdesign LIMIT_3PWM
(
IN1[7..0]:input;
IN2[7..0]:input;
IN3[7..0]:input;
LIM[5..0]:input;
CLK:input;
EN :input;
OUT1[7..0]:output;
OUT2[7..0]:output;
OUT3[7..0]:output;
)
variable
LIM8[7..0]:node;
OUT1[7..0]:dffe;
OUT2[7..0]:dffe;
OUT3[7..0]:dffe;
begin
LIM8[7..6]=GND; LIM8[5..0]=LIM[5..0];
OUT1[].clk=CLK; OUT1[].ena=EN;
OUT2[].clk=CLK; OUT2[].ena=EN;
OUT3[].clk=CLK; OUT3[].ena=EN;
if IN1[]>255-LIM8[] then OUT1[]=255-LIM8[];
else if IN1[]>=LIM8[] then OUT1[]=IN1[];
else OUT1[]=LIM8[];
end if;
end if;
if IN2[]>255-LIM8[] then OUT2[]=255-LIM8[];
else if IN2[]>=LIM8[] then OUT2[]=IN2[];
else OUT2[]=LIM8[];
end if;
end if;
if IN3[]>255-LIM8[] then OUT3[]=255-LIM8[];
else if IN3[]>=LIM8[] then OUT3[]=IN3[];
inst
OUTPUT TEST
Comp_PWM
unsigned compare
Dead_Time
dataa[7..0] OUTPUT PWM1D
PDC1[7..0] INPUT agb COMP1 PWM1D
VCC datab[7..0] OUTPUT PWM1U
CLK_PWM PWM1U
inst8 CLK_EN
DELAY[5..0]
Comp_PWM inst4
unsigned compare
Dead_Time
dataa[7..0] OUTPUT PWM2D
PDC2[7..0] INPUT agb COMP1 PWM1D
VCC datab[7..0] OUTPUT PWM2U
CLK_PWM PWM1U
inst11 CLK_EN
DELAY[5..0]
Comp_PWM inst2
unsigned compare
Dead_Time
dataa[7..0] OUTPUT PWM3D
PDC3[7..0] INPUT agb COMP1 PWM1D
VCC datab[7..0] OUTPUT PWM3U
CLK_PWM PWM1U
inst12 CLK_EN
DELAY[5..0] INPUT
VCC DELAY[5..0]
CLK_18M432 INPUT
VCC
CLK_EN INPUT inst3
VCC
Cette fonction produit les 6 signaux PWM destinés à commander les 6 transistors des 3 bras de
commutateurs de l'interface de puissance. Les rapports cycliques de ces signaux sont déterminés par les
niveaux des signaux numériques PCD1[] à PCD3[].
Le cœur de la structure est le compteur-décompteur "UD_Counter" qui détermine la période des signaux
PWM et la résolution de réglage des rapports cycliques. Elle produit le signal numérique PTMR[] de
forme triangulaire.
Ce signal est comparé aux 3 entrées PCD1[] à PCD3[] par 3 fonctions "Comp_PWM". Les sorties
respectives passent à "1" quand le signal PTMR[] est supérieur à PCDx[].
Ces sorties pourraient piloter directement les commutateurs des 3 bras s'ils étaient parfaits.
Malheureusement les transistors qui les constituent ne commutent pas instantanément et il faut insérer
des temps morts à chaque transition pendant lesquelles les 2 commutateurs du pont sont simultanément
ouverts. On améliore ainsi considérablement le rendement du bras.
inst1
Up_Down_Cpt
up/down
updow n
CLK_PWM INPUT
VCC clock OUTPUT PTMR[7..0]
CLK_EN INPUT q[7..0]
VCC clk_en
Comp_Up
inst compare
dataa[7..0]
aeb
datab[]=254 SRFF
PRN
inst12 S Q
Comp_Down R
CLRN
compare inst14
dataa[7..0]
aeb
datab[]=1
inst13
On utilise un compteur-décompteur synchrone dont le mode de fonctionnement est déterminé par l'état
de la bascule RS synchrone :
état "0" : Up_Down_Cpt compte. La bascule est mise à "1" de façon synchrone quand l'état du
compteur est 254. Celui-ci passe alors à 255 avant de décompter.
état "1" : Up_Down_Cpt décompte. La bascule est mise à "0" de façon synchrone quand l'état du
compteur est 1. Celui-ci passe alors à 0 avant de compter.
Conclusion : évolution du compteur : 253-254-255-254-253-252- … 3-2-1-0-1-2-3-…254-255-254-…
Note : le signal CLK_EN ne passe à "1" qu'une période sur 4 de CLK_PWM à cause de la fonction
"Div_4" (voir page §4). La fréquence de comptage-décomptage de Up_Down_Cpt est donc de
18,432MHz/4 = 4,608MHz.
La fréquence du signal numérique PTMP[] est donc de 4,608MHz/(254*2)=9071Hz. Les signaux PWM
ont la même fréquence : valeur satisfaisante.
8.2 Comparaisons : relevés expérimentaux
Sortie du 1° comparateur
Sortie du 1° comparateur
PDC1[] proche de 0
Sortie du 1° comparateur
8.3 Dead_Time
Schéma original
NOT AND2 DFFE
PRN
OUTPUT PWM1D
inst6 D Q
inst7
XOR ENA
CLRN
inst9
DFFE
inst1 AND2 DFFE
PRN
COMP1 INPUT PRN
VCC D Q OUTPUT
D Q PWM1U
CLK_PWM INPUT
VCC
CLK_EN INPUT ENA
Dead_Time_Cpt inst3
VCC CLRN down counter ENA
inst11 sload CLRN
DELAY[5..0] INPUT inst10
VCC data[5..0]
q[5..0]
clock
cout
clk_en
cnt_en
inst2
NOT
inst5
inst5
Résultats de simulation :
Pour simplifier, on a utilisé une horloge CLK_PWM de 4MHz avec CLK_EN constamment à "1".
Le décompteur "Dead_Time_Cpt" est monté en monostable à déclenchement synchrone. Le
déclenchement est provoqué à chaque transition du signal COMP1 par le signal SLOAD produit par la
1° bascule D et la porte XOR associée.
Le décompteur est prépositionné à la valeur DELAY[] au déclenchement du monostable. La sortie
COUT passe alors à "0" jusqu'à ce que le compteur atteigne l'état 0 : la durée à l'état bas de COUT est
de DELAY[]xPériode_CLKPWM.
Le signal COUT est combiné avec COMP1R pour produire les signaux D1 et D2 conformes au résultat
attendu : temps mort entre les transitions (qd D1 et D2 sont à "0").
Les signaux D1 et D2 sont synchronisés avec l'horloge pour supprimer les "glitchs".
Le temps mort dure DELAY[] périodes d'horloge.
Note : le retard entre COMP1 et les signaux PWM est sans effet car tous les 6 signaux PWM sont
retardés de façon identique.
Attention : la structure ne fonctionne plus si la durée du signal COMP1 est plus courte que le temps
mort désiré.
COMP1
PWM1D
PWM1U
COMP1
PWM1D
PWM1U
Résultats conformes.
PWM1D
PWM1U
Conditions :
LIMIT[]=4
DELAY[]=2
Synchro externe sur de la sortie
H1
Bleu = PWM3
Rouge = PWM2
Noir = PWM1
Sensibilité : 1 V/div