onduleur monophasé connecté à un réseau alternatif

Written by:
Revision/release date:
nicolas.cherix@imperix.ch
A, 2015.02.09
Tutoriel n°2
ONDULEUR MONOPHASÉ CONNECTÉ À
UN RÉSEAU ALTERNATIF
Rédigé par :
Points abordés :
imperix SA, Rte. de l’Industrie 17, 1950 Sion, Switzerland
Nicolas Cherix <nicolas.cherix@imperix.ch>
– Utilisation des librairies de fonctions
– Mise en place d’une machine d’état
1 INTRODUCTION
Ce tutoriel décrit la procédure à suivre pour contrôler un convertisseur AC/DC bidirectionnel à
l’aide de la BoomBox. L’application consiste à interfacer une source DC au réseau 50Hz afin
d’injecter ou de prélever de l’énergie sur ce réseau.
Le système considéré est représenté à la Figure 1, ses principaux paramètres électriques étant
indiqués dans le Tableau 1 :
L
Ug
Ig S1
S3
Eg
S2
UDC
S4
Figure 1 : Schéma électrique simplifié du système considéré.
Nom
Valeur nom.
Spécification
Capteur utilisé
# Canal
Ug
Ig
UDC
fS
L
50 VRMS
20 ARMS
100 VDC
20 kHz
0.5 mH
Tension réseau au point d’injection
Courant injecté dans le réseau
Tension du bus DC (fixe)
Fréquence de commutation
Inductance de lissage
LEM LV25-P
LAH50-P
LEM LV25-P
N.A.
N.A.
1
0
3
N.A.
N.A.
Tableau 1 : Paramètres électriques du système considéré.
L’approche proposée ici – et présentée dans l’exemple de code – consiste à régler le courant
injecté dans le réseau dans un référentiel tournant (type DQ) synchronisé à la tension réseau. Le
principal intérêt de cette approche est lié à la facilité avec laquelle les réglages des flux de
puissance active et réactive peuvent être découplés. De plus, l’ensemble des mécanismes
couramment utilisés dans les applications triphasées peuvent être réutilisés. En revanche, cela
exige d’émuler les composantes manquantes par rapport à un système triphasé, d’où l’utilisation
d’un émulateur dédié (fictive-axis emulation). Ce principe est détaillé dans [2]. Il correspond à la
structure de contrôle illustrée à la Figure 2.
EXEMPLE D’APPLICATION
Onduleur monophasé connecté à un réseau alternatif
Par ailleurs, au-delà du réglage proprement dit, les transformations de coordonnées utilisées
exigent de disposer d’une information précise quant à la phase de la tension réseau. C’est
l’objectif poursuivi au travers de l’utilisation d’une boucle à verrouillage de phase (PLL, phaselocked loop) que l’on peut également repérer sur la Figure 2 :
Figure 2 : Structure de contrôle complète avec fictive-axis emulation et réglage de type DQ. Source [2 ].
D’autres approches sont naturellement possibles, comme par exemple l’utilisation d’un
régulateur de type Proportionnel-Résonant (PR) placé dans un référentiel stationnaire. Cette
approche est largement décrite dans [5]. La section 4.a traitant de la machine d’état abordera
notamment comment d’autres stratégies peuvent être aisément intégrées au code utilisateur.
2 MISE EN PLACE DU HARDWARE
Quatre signaux de commande sont nécessaires (S1, S2, S3, S4). Par ailleurs, trois mesures sont
requises, quelle que soit la stratégie de réglage. Ces grandeurs sont montrées dans le Tableau 1.
2.a CONFIGURATION DES ENTRÉES ANALOGIQUES
La configuration des entrées analogiques se fait de manière identique à l’approche décrite dans
le tutorial n°1 « Configuration des mesures et des interruptions. » Pour cet exemple, on retiendra
les paramètres décrits dans le Tableau 2 :
Nom
# Canal
Capteur
Sensibilité
Limites
Gain Bbox
Limites Bbox
Ug
Ig
UDC
1
0
3
LEM LV25-P
LAH50-P
LEM LV25-P
250 / 47k [V/V]
50 [mV/A]
250 / 47k [V/V]
[-80V ; 80V]
[-10A ; 10A]
[80V ; 120V]
8
4
8
[-3.4V ; 3.4V]
[-2.0V ; 2.0V]
[3.4V ; 5.1V]
Tableau 2 : Paramètres de configuration des entrées analogiques de la Boombox.
2
EXEMPLE D’APPLICATION
Onduleur monophasé connecté à un réseau alternatif
3 CONFIGURATION DU SOFTWARE
3.a CONFIGURATION DES PWMS
Comme dans le tutoriel n°1, la configuration des modulateurs PWM se fait en deux étapes :
 Configuration du générateur de fréquence
Le code suivant permet de configurer le générateur de fréquence #0 avec une période définie
par SWITCHING_PERIOD :
SetFreqGenPeriod(0, (int)(SWITCHING_PERIOD/FPGA_CLK_PERIOD));
 Configuration du modulateur PWM
Les lignes suivantes permettent d’utiliser le générateur de fréquence #0 défini ci-dessus sur les
canaux PWM #0 et #1. Elles sélectionnent également une porteuse triangulaire (TRIANGLE) pour
chacun des modulateurs correspondants, ainsi qu’un temps d’anti-chevauchement de 400ns :
ConfigPWMChannel(1, 0, TRIANGLE, (int)(400e-9/FPGA_CLK_PERIOD));
ConfigPWMChannel(2, 0, TRIANGLE, (int)(400e-9/FPGA_CLK_PERIOD));
La phase des deux canaux concernés peut également être ajustée en fonction des besoins. Dans
cet exemple, le choix de porteuses identiques mène directement à la génération d’une tension
de type 3 niveaux à la sortie du convertisseur. En revanche, l’utilisation d’une porteuse inversée
(INVTRIANGLE) ou l’utilisation d’une phase à 180° pour le second canal amènent à la génération
d’une tension à 2 niveaux uniquement.
SetPWMPhase(1, 0.0);
SetPWMPhase(2, 0.0);
Finalement, dans cet exemple, les canaux PWM ne sont pas immédiatement activés, puisqu’une
machine d’état sera responsable de gérer les différents modes de fonctionnement et ainsi,
également l’activation des canaux PWM.
3.b CONFIGURATION DE LA CONVERSION ANALOGIQUE-NUMERIQUE
Comme décrit dans le tutoriel n°1, il est nécessaire de définir les paramètres de conversion
analogique-numérique afin d’obtenir des grandeurs directement utilisables (porteuses de sens)
pour chacune des mesures. Pour ce faire, il suffit d’invoquer la fonction SetADCAdjustements() en
lui fournissant la sensibilité et l’offset désirés. Dans cet exemple, les paramètres à employer sont
les suivants :
SetADCAdjustments(0, 6.10e-3/4, 0.0);
SetADCAdjustments(1, 57.4e-3/8, 0.0);
SetADCAdjustments(3, 57.4e-3/8, 0.0);
// Nominal sensitivity and x4 gain (Ig)
// Nominal sensitivity and x8 gain (Ug)
// Nominal sensitivity and x8 gain (Udc)
Dans cette application, il est raisonnable d’effectuer l’échantillonnage au milieu de la période de
commutation, soit à la valeur moyenne de l’ondulation de courant. Pour ce faire, le
l’échantillonnage est placé au milieu de la période définie par le générateur de fréquence #0 :
ConfigSampling(0, 0.5);
3
EXEMPLE D’APPLICATION
Onduleur monophasé connecté à un réseau alternatif
3.c CONFIGURATION DES INTERRUPTIONS
Contrairement à l’exemple présenté dans le tutoriel n°1, cette application ne requiert qu’une
seule interruption, que l’on dirigera typiquement sur UserInterrupt1(). La configuration de cette
interruption peut alors raisonnablement être déclenchée au début de la période du générateur
de fréquence utilisé (le #0) au moyen de l’appel de fonction suivant :
RegisterExt1Interrupt(&UserInterrupt1, 0, 0.0, 0);
4 MISE EN PLACE DE L’APPLICATION
4.a DÉFINITION DE LA MACHINE D’ÉTAT DE L’APPLICATION
Dans cette application, plusieurs modes de fonctionnement peuvent être prévus. Par exemple :
1) Le mode STANDBY, qui correspond à l’état de repos, dans lequel le convertisseur est inactif.
2) Le mode CLOSEDLOOP, dans lequel le réglage de courant est effectif et le convertisseur
commute pour autant que les sorties PWM soient désinhibées (la commande enable a été
passée dans la console).
3) Le mode PASSIVELOAD, dans lequel aucun réglage n’est effectué. A l’opposé, les indices de
modulation sont générés directement de manière à produire des tensions sinusoïdales,
indépendamment de toute mesure. Ce mode peut typiquement être utilisé lors d’un fonctionnement dans une charge passive ou être employé à des fins de debug.
Bien entendu, suivant l’application et les besoins, d’autres modes de fonctionnement pourraient
être définis, correspondant à autre stratégie de réglage (p.ex. un réglage de type PR en référentiel fixe) ou correspondant à la commande d’un autre convertisseur (p.ex. en incluant le boost du
tutoriel n°1).
En pratique, ces trois modes de fonctionnement sont définis dans cet exemple au moyen d’un
type enum déclaré dans user.h. Leur gestion peut typiquement être effectuée par une machine
d’état qui commutera dans chaque interruption entre les tâches appropriées. Ce mécanisme
peut être simplement implémenté par une opération de type switch placée dans UserInterrupt1(). Une partie du code est alors exécutée différemment en fonction du mode de fonctionnement désiré. Ce mécanisme sera décrit à la section 4.b.
Par ailleurs, afin de gérer convenablement les transitions entre les différents états, il est recommandé d’utiliser une routine spécifique telle que la fonction SetOpMode() qui est proposée dans
le code. Cette routine a essentiellement pour attribution d’exécuter les tâches liées à la transition
d’état. Cela inclut typiquement l’activation/désactivation des canaux PWM, la commutation de
relais (via les sorties numériques) ou la modification/réinitialisation de valeurs de consigne. Un
exemple est donné ci-après :
switch (newmode){
case STANDBY:
case CLOSEDLOOP:
DeactivatePWMChannel(1);
DeactivatePWMChannel(2);
Ig_dq0_ref.real = 0.0;
Ig_dq0_ref.imaginary = 0.0;
break;
ActivatePWMChannel(1);
ActivatePWMChannel(2);
4
EXEMPLE D’APPLICATION
Onduleur monophasé connecté à un réseau alternatif
case PASSIVELOAD:
break;
ActivatePWMChannel(1);
ActivatePWMChannel(2);
break;
}
opmode = newmode;
}
4.b DÉROULEMENT DE L’INTERRUPTION PRINCIPALE
Comme dans de nombreuses applications de réglage, l’interruption principale comporte
typiquement plusieurs étapes :
1) Récupération des mesures à l’aide de la fonction GetADC(). L’instant d’échantillonnage exact
correspond à celui configuré plus tôt au travers de la fonction ConfigSampling().
2) Exécution des PLL et, dans le cas présent, de l’émulation d’axe fictif (FAE).
3) Switch en fonction du mode de fonctionnement désiré. Les principaux modes de fonctionnement comportent typiquement :
a) Transformation de coordonnées. Dans cet exemple, il s’agit de lignes de code suivantes,
qui correspondent à des routines pré-écrites et présentes dans le dossier API :
ABG2DQ0(&Ug_dq0, &Ug_ABG, theta);
ABG2DQ0(&Ig_dq0, &Ig_ABG, theta);
// Grid voltage
// Grid current
b) Exécution des algorithmes de réglage. Dans le cas du mode CLOSEDLOOP, il s’agit ici
essentiellement de l’appel des régulateurs de courant.
c) Transformation de coordonnées inverse, que l’on retrouve dans cet exemple au travers
de l’appel de fonction suivant :
DQ02ABG(&Eg_ABG, &Eg_dq0, theta);
// Compute the converter EMF in station. R. F.
d) Calcul et mise à jour des indices de modulation. C’est la tâche que l’on retrouve sous
forme des lignes suivantes dans le mode CLOSEDLOOP :
duty_a = 0.5 + 0.5* (Eg_ABG.real/Udc);
duty_b = 0.5 - 0.5* (Eg_ABG.real/Udc);
Alternativement, dans le mode OPENLOOP, la même tâche est effectuée entièrement à
priori au moyen des instructions suivantes :
duty_a = 0.5 + moddepth * sin(theta);
duty_b = 0.5 - moddepth * sin(theta);
4) Envoi des instructions de modulation aux modulateurs.
5) Mise à jour de la machine d’état (next state logic).
On notera ici que le prochain état est déterminé/calculé directement au sein de la section
principale de l’interruption. C’est un choix raisonnable dans la mesure où aucune condition de
transition n’est détectée (aucun changement d’état de s’effectue automatiquement). En
revanche, dès lors que des transitions d’état doivent s’effectuer automatiquement (p.ex. au
moment où une pré-charge est terminée), il est recommandé de mettre en place une routine
spécifique à la gestion de la machine d’état.
5
EXEMPLE D’APPLICATION
Onduleur monophasé connecté à un réseau alternatif
4.c DÉFINITION DES COMMANDES OFFERTES À L’UTILISATEUR
En plus de servir au blocage/déblocage de la BoomBox (commandes enable/disable), l’accès en
ligne de commande de la BoomBox permet à l’utilisateur de définir librement de nombreuses
fonctions. La définition des actions accessibles par la ligne de commande s’effectue dans le
fichier cli_commands.c.
Pour cet exemple, les commandes existantes peuvent être complétées par les actions suivantes :
a)
b)
c)
d)
e)
start, qui doit permettre de passer en mode CLOSEDLOOP.
stop, qui doit permettre de passer en mode STANBDY.
opmode, qui doit permettre de forcer le changement d’un état.
setid, qui a pour but de modifier la consigne de courant sur l’axe d.
setiq, qui a pour but de modifier la consigne de courant sur l’axe q.
Comme décrit dans le tutoriel n°1, la configuration de ces commandes se déroule comme suit :
1) Prototyper les fonctions qui effectueront les actions choisies et seront invoquées par la ligne
de commande. Dans le cas présent, il s’agit des prototypes suivants :
void DoStart(unsigned int argc, char *argv[]);
void DoStop(unsigned int argc, char *argv[]);
void DoOpMode(unsigned int argc, char *argv[]);
void SetId(unsigned int argc, char *argv[]);
void SetIq(unsigned int argc, char *argv[]);
2) Associer les commandes avec les fonctions correspondantes, c'est-à-dire « inscrire » les
fonctions définies ci-dessus parmi celles accessibles par ligne de commande. Pour ce faire, il
est nécessaire d’ajouter dans la fonction LoadCLIUserFunctions() les lignes suivantes :
fs_mkcmd_user("start", DoStart);
fs_mkcmd_user("stop", DoStop);
fs_mkcmd_user("opmode", DoOpMode);
fs_mkcmd_user("setid", SetId);
fs_mkcmd_user("setiq", SetIq);
3) Définir le contenu exact des fonctions, c'est-à-dire les actions qu’elles effectuent. Les détails
peuvent être trouvés dans l’exemple de code correspondant.
5 MISE EN PLACE DU RÉGLAGE
5.a CONFIGURATION ET EXÉCUTION DU RÉGULATEUR DE COURANT
De nombreuses routines pré-écrites sont disponibles dans le dossier API. C’est notamment le cas
de divers types de régulateurs et de PLLs. Par exemple, la mise en place du réglage de courant
suggéré dans cet exemple peut se faire en utilisant deux régulateurs de type PI placés sur les
axes d et q. Leur configuration se déroule en deux étapes :
 Création et configuration
Cette étape doit se dérouler à l’initialisation (dans UserInit()). Il s’agit de créer les pseudo-objets
correspondants ainsi que de les configurer. Les lignes de code suivantes sont nécessaires :
6
EXEMPLE D’APPLICATION
Onduleur monophasé connecté à un réseau alternatif
PIDController Id_reg, Iq_reg;
ConfigPIDController(&Id_reg, Kp, Ki, 0, 30.0, -30.0, SAMPLING_PERIOD, 10);
ConfigPIDController(&Iq_reg, Kp, Ki, 0, 30.0, -30.0, SAMPLING_PERIOD, 10);
La définition exacte du prototype de cette fonction se trouve dans le fichier API/controllers.h.
 Exécution
Cette étape consiste à exécuter de manière répétitive les régulateurs. L’invocation des régulateurs se déroule comme suit :
Eg_dq0.real =
Eg_dq0.imaginary =
Ug_dq0.real
+ RunPIController(&Id_reg, Ig_dq0_ref.real - Ig_dq0.real)
- OMEGA*LGRID*Ig_dq0.imaginary;
Ug_dq0.imaginary
+ RunPIController(&Iq_reg, Ig_dq0_ref.imaginary Ig_dq0.imaginary)
+ OMEGA*LGRID*Ig_dq0.real;
5.b CONFIGURATION ET EXÉCUTION DE LA PLL
Comme pour les régulateurs, plusieurs variantes de PLLs sont disponibles sous forme de routines
pré-écrites dans le dossier API. Par exemple, la mise en place d’une PLL monophasée basée sur
un filtre accordé de type SOGI (second-order generalized integrator) peut se faire au travers des
deux étapes suivantes :
 Création et configuration
Cette étape doit se dérouler à l’initialisation (dans UserInit()). Comme pour les régulateurs, il s’agit
de créer les pseudo-objets correspondants et de les configurer :
SOGIPLL1Parameters SOGIPLL;
ConfigSOGIPLL1(&SOGIPLL, 10.0, 0.5, 0.1, OMEGA, SAMPLING_PERIOD);
Comme pour les régulateurs, SOGIPLL est ici une variable qui est inévitablement globale, qu’il
convient d’instancier en début de fichier user.c (ou d’une autre pseudo-classe contenant les
mécanismes de réglage).
Dans la seconde ligne, les paramètres 10.0 et 0.5 correspondent aux gains du régulateur PI
servant à verrouiller la boucle de phase, respectivement. Le paramètre 0.1 correspond au gain du
filtre SOGI. La définition exacte du prototype de cette fonction se trouve dans API/PLLs.h.
 Exécution
Cette étape consiste à exécuter de manière répétitive le régulateur contenu dans la PLL et à en
extraire l’angle de la tension réseau theta. Il s’agit donc d’une routine qui doit typiquement être
placée dans UserInterrupt1() :
theta = RunSOGIPLL1(&SOGIPLL,&Ug_ABG,Ug_measured);
5.c CONFIGURATION ET EXÉCUTION DU BLOC FAE
Les routines correspondant à ce bloc fonctionnel sont également disponibles dans le dossier API.
Comme pour les pseudo-objets précédents, on la mise en place se fait en deux étapes :
7
EXEMPLE D’APPLICATION
Onduleur monophasé connecté à un réseau alternatif
 Création et configuration
Comme pour les autres pseudo-objets, cette étape doit se dérouler à l’initialisation (dans
UserInit()) via l’instanciation d’une structure ainsi que l’appel d’une routine de configuration :
FAEParameters FAE;
ConfigFAE(&FAE, RGRID, LGRID, SAMPLING_PERIOD);
Les paramètres utilisés RGRID et LGRID servent ici à configurer de manière intuitive la fonction de
transfert du bloc FAE. Il s’agit de constantes de pré-compilation définies dans user.h. La définition
exacte du prototype de cette fonction se trouve dans API/PLLs.h.
 Exécution
L’exécution du bloc FAE se déroule en même temps que la récupération des mesures et a pour
but d’émuler l’axe β du courant réseau. On retrouve alors typiquement :
Ig_ABG.imaginary = RunFAE(&FAE, Eg_ABG.imaginary - Ug_ABG.imaginary);
6 RÉFÉRENCES
[1] B. Bahrani, S. Kenzelmann and A. Rufer, “Multivariable-PI-based dq current control of voltage source
converters with superior axis decoupling capability,” in IEEE Trans. Ind. Electron., Vol. 58, N° 7, Jul. 2011.
[2] B. Bahrani, A. Rufer, S. Kenzelmann and L. Lopes, “Vector control of single-phase voltage-source
converters based on fictive-axis emulation,” in IEEE Trans. Ind. Appl., Vol. 47, N° 2, Apr. 2011.
[3] M. Ciobotaru, R. Teodorescu and F. Blaabjerg, “A new single-phase PLL structure based on a second-order
generalized integrator,” in Proc. PESC Conf., Rhodos, Greece, June 2006.
[4] F.J. Rodríguez, E. Bueno, M. Aredes, L.G.B. Rolim, F.A.S. Neves and M.C. Cavalcanti, “Discrete-time
implementation of second order generalized integrators for grid converters,” in Proc. IECON Conference,
Orlando, Nov. 2008.
[5] R. Teodorescu, F. Blaabjerg, M. Liserre, and P. C. Loh, “Proportional resonant controllers and filters for gridconnected voltage-source converters,” in IEE Proc. on Electr. Power Appl., Vol. 153, N°. 5, Sep. 2006.
8