Sunteți pe pagina 1din 7

Laboratorul 1 - Utilizarea

blocurilor DLL programabile în C pentru


implementarea comenzilor numerice în cadrul programului de simulare
PSIM
Pentru elaborarea unui modul DLL se urmăreşte exemplul de programare în mediul Microsoft
C/C++ 5.0 sau 6.0.
Codul folosit pentru a genera semnalele de comandă, conform laboratorului, este următorul:
Tabel 1 – Cod în C pentru generare semnale PWM
// Nu se schimbă numele funcţiei, numărul variabilelor, tipul variabilei şi secvenţa
// Se poate schimba denumirea variabilelor (de ex.: variabila "t" poate fi denumită "Time")
// Variabile:
// t: timpul, această variabilă este transmisă de PSIM
// delt: pasul de calcul, această variabilă este transmisă de PSIM
// in: variabile de intrare pentru blocul DLL
// out: variabile de ieşire pentru blocul DLL, disponibile în PSIM
// Numărul maxim de variabile de intrare şi de ieşire este 20.
#include <math.h>
__declspec(dllexport) void simuser (t, delt, in, out)
// Toate variabilele trebuie definite de tipul "double"
double t, delt;
double *in, *out;
{ static int count=100, Ncount=100;
// variabila "count" este numărătorul care numără paşii de calcul delt; variabila "Ncount"
reprezintă numărul total de paşi de calcul care se efectuează într-o perioadă de comutaţie
// rapoartele de conducţie pentru întreruptoarele superioare ale invertorului: "a_A", "a_B" şi
"a_C"
static double a_A, a_B, a_C;
// referinţele sinusoidale pentru cele trei faze
static double r_A, r_B, r_C;
// parametrii modelului comenzii PWM: "Eps" este timpul curent în cadrul unei perioade de
comutaţie; "PWM_A", "PWM_B" şi "PWM_C" sunt comenzile ("on"="1" şi "off"="0") pentru
întreruptoarele superioare ale invertorului; FC[3] şi FD[3] reprezintă momentele de comutaţie
la nivelul perioadei de comutaţie curente
double Eps;
int PWM_A, PWM_B, PWM_C;
static double FC[3], FD[3];
// la prima iteraţie "count = Ncount" pentru calculul rapoartelor de conducţie; rapoartele de
conducţie se calculează doar atunci când "count = Ncount", adică la începutul fiecărei perioade
de comutaţie; atunci când cele 2 variabile sunt diferite NU se execută procedura IF
if ( count == Ncount)
{ count = 0; // se iniţializează numărătorul
r_A = in[0]; // se citesc referinţele de tensiune
r_B = in[1];
r_C = in[2];
a_A = r_A/100 + 0.5; // se calculează rapoartele de conducţie
a_B = r_B/100 + 0.5;
a_C = r_C/100 + 0.5;
if (a_A < 0.05) {a_A = 0.05;} // se limitează rapoartele de conducţie
if (a_A > 0.95) {a_A = 0.95;}
FC[0] = (1.0 - a_A)/(2.0);
FD[0] = a_A + FC[0];
if (a_B < 0.05) {a_B = 0.05;}
if (a_B > 0.95) {a_B = 0.95;}
FC[1] = (1.0 - a_B)/(2.0);
FD[1] = a_B + FC[1];
if (a_C < 0.05) {a_C = 0.05;}
if (a_C > 0.95) {a_C = 0.95;}
FC[2] = (1.0 - a_C)/(2.0);
FD[2] = a_C + FC[2]; }
// se execută la fiecare pas de calcul delt
count = count + 1;
// se calculează timpul curent "Eps" în cadrul perioadei de comutaţie curente
Eps = t/1e-3 - floor(t/1e-3); //perioada de comutaţie este egală cu 0.001s
// se calculează comenzile PWM la fiecare pas de calcul
if ((Eps>=FC[0])&&(Eps<=FD[0])) {PWM_A=1;}
else {PWM_A=0;}
if ((Eps>=FC[1])&&(Eps<=FD[1])) {PWM_B=1;}
else {PWM_B=0;}
if ((Eps>=FC[2])&&(Eps<=FD[2])) {PWM_C=1;}
else {PWM_C=0;}
// Ieşiri ale blocului DLL
out[0] = PWM_A;
out[1] = PWM_B;
out[2] = PWM_C;
out[3] = a_A;
out[4] = a_B;
out[5] = r_A; }
Fig. 1 – Schema de comandă implementată în PSIM

Referința este preluată printr-o comandă de input, apoi eșantionată pentru a pute fi comparată cu
purtătoarea. Purtătoarea este generată cu o funcție de counter cu 128 de valori. Dacă T ref < Count, T1
este în conducție și T4 este blocat și invers. Valoarea counterului se incrementează progresiv. Algoritmul
este impkementat pe fiecare braț al convertorului în parte. Există, deci trei referințe.

Fig. 2 - Strategia PWM cu eșantionare regulată simetrică


Fig. 3 – Graficele pentru faza reA și r_a

FIg. 4 – Tensiune la ieșire (sus) și curent la ieșire (jos) pentru prima ramură
Fig. 5 – Grafic T_A

Fig. 6 – Analiză FFT pe prima fază


Fig 7. – Semnal de referință și semnal purtător (sus) ,pulsuri generate în urma comparării (jos)

Fig. 8 – Curent pe un IGBT

S-ar putea să vă placă și