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
© Copyright 2024