Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define IN_MAIN
- #include "sim.h"
- /*-------------------------------------------------------------------------*/
- #include <math.h>
- #include <stdio.h>
- //#include <io.h>
- #include "zbiory\ela.h"
- #include "zbiory/limit.C"
- #include "zbiory/kat.c"
- #define p2 1.414213562 /* pierwiastek z 2 */
- #define p3 1.732050808 /* pierwiastek z 3 */
- #define p6 2.449489743 /* pierwiastek z 6 */
- #define M_PI 3.1415926535897932384626433832795
- #define TWZG 0.1*M_PI // przelicznik z czasu rzeczywistego na wzgledny
- // TWZG=2*PI*fsieci [ms]
- int M=7; /* liczba calkowanych zmiennych - model silnika */
- int Np=2,Nk=5; /* nr. pierwszego i ostatniego r.r. ukladu regulacji */
- /*------------------------------------------------------------------------*/
- /* Parametry silnika o mocy 1.5 kW typ 2Sg90L4 */
- /*------------------------------------------------------------------------*/
- double Rs=0.0584,Rr=0.0559,Lm=2.171,Ls=2.246,Lr=2.246,JJ=38.4*3.0;
- double omegaR; /* predkosc katowa wirnika */
- double isx,isy; /* skladowe pradu stojana */
- double frx,fry; /* skladowe strumienia skojarzonego wirnika */
- double usx,usy; /* skladowe napiecia stojana */
- double me,m0; /* moment elektromagnetyczny i obciazenia */
- double fr; /* modul strumienia skojarzonego wirnika */
- double is; /* modul pradu stojana */
- double us; /* modul napiecia stojana */
- double omegaU; /* zadana pulsacja napiecia stojana */
- double US; /* zadany modul napiecia stojana */
- double USX,USY; /* zadane skladowe napiecia stojana */
- double ud; /* napiecie w obwodzie posredniczacym pradu stalego */
- //wartosci zadane
- double omegaRzad=1.0; // zadana czestotliwosc napiecia stojana
- double frzad=1.0; // zadany strumien skojarzony wirnika
- //nastawy regulatorów
- double kpomegaR, kiomegaR, kpfr, kifr, kpd, kid, kpq, kiq;
- //zmienne w układzie sterowania
- double ro;
- double usd, usq;
- /*------------------------------------------------------------------------*/
- /* Deklaracje zmiennych globalnych */
- /*------------------------------------------------------------------------*/
- double w,a1,a2,a3,a4,a5,a6,a7; /* wspolczynniki w modelu silnika */
- //double tau; /* czas wzgledny */
- //double h,ht; /* krok calkowania rzeczywisty i wzgledny */
- //double trapH; /* krok obliczen dla ukladu regulacji */
- //double Timp; /* okres impulsowania */
- //double impuls=0.0; /* czas do odmierzania zalaczenia ukladu regulacji */
- double t0,t1,t2;/* czasy zalaczen wektorow */
- double roU=0.0; /* kat polozenia wektra napiecia stojana */
- //float tab[7]; /* tablica rysowanych na ekranie danych */
- int SYNCH; /* zmienna do synchronizacji z PWM */
- int wek; /* numer wektora wyjsciowego falownika 0-1-2-3-4-5-6-7 */
- int sek; /* numer sektora polozenia wektora napiecia 1-2-3-4-5-6 */
- //double DD[8][4];
- /*---------------------------------------------*/
- /* Deklaracje zmiennych */
- /*---------------------------------------------*/
- double t,tau; /* czas,czas wzgledny */
- double h,ht=1; /* czas wzgledny, krok calkowania */
- double Timp,impuls;
- double YY[32];
- double DD[8][4];
- float tab[7];
- double TIME_s, TIME;
- double zmienna1, zmienna2, zmienna3, zmienna4; //przykładowe zmienne
- double E_omega, P_omega, I_omega, E_isq, P_isq, I_isq, Usq_zad, E_fr, I_fr, P_fr;
- /*------------------------------------------*/
- /* deklaracje funkcji dolaczonych w PROJECT */
- /*------------------------------------------*/
- double limit(double wejscie, double ograniczenie);
- double nzero(double x,double ogr);
- void PWMU_3WR(/* Wielkosci WEJsciowe: */
- double US, // zadany modul napiecia wyjsciowego
- double roU, // zadany kat polozenia wektora napiecia wyjsciowego
- double ud, // napiecie stale w obwodzie posredniczacym
- double Timp, // okres impulsowania
- double h, // krok calkowania
- /* Wielkosci WYJsciowe - zwracane: */
- double *usx, // skladowa X chwilowego napiecia wyjsciowego
- double *usy, // skladowa Y chwilowego napiecia wyjsciowego
- double *t0, // czas t0 wektora zerowego
- double *t1, // czas t1 wektora aktywnego
- double *t2, // czas t2 wektora aktywnego
- int *SYNCH, // znacznik poczatku okresu impulsowania - do synchronizacji PWM z ukladem regulacji
- int *wektor, // numer wektora wyjsciowego falownika 0-1-2-3-4-5-6-7
- int *sektor // numer sektora polozenia wektora napiecia 1-2-3-4-5-6
- );
- /*-------------------------------------------------------------------------*/
- /* Uklad rownan rozniczkowych */
- /*-------------------------------------------------------------------------*/
- void F4DERY(double DV[32], double V[32])
- {
- tau=V[01]; /* zmienne calkowane */
- isx=V[1]; isy=V[2];
- frx=V[3]; fry=V[4];
- omegaR=V[5];
- DV[0]=1; /* Czas */
- /* rownania modelu silnika */
- DV[1]=a1*isx+a2*frx+omegaR*a3*fry+a4*usx;
- DV[2]=a1*isy+a2*fry-omegaR*a3*frx+a4*usy;
- DV[3]=a5*frx+a6*isx-omegaR*fry;
- DV[4]=a5*fry+a6*isy+omegaR*frx;
- DV[5]=((frx*isy-fry*isx)*Lm/Lr-m0)/JJ;
- }
- /*------------------------------------------------------------------*/
- /* rownania rozniczkowe ukladu regulacji */
- /*------------------------------------------------------------------*/
- void TRAPDERY(double DV[32], double V[32])
- {
- //WPROWADZIC ZALEZNOSCI
- // regulator predkosci katowej wirnika
- // regulator strumienia wirnika
- // regulator pradu isd
- // regulator pradu isq
- }
- /*-------------------------------------------------------------------------*/
- #include "zbiory\PAR.C"
- #include "zbiory\F4.C"
- #include "zbiory/TRAPEZ.C"
- void onStartup()
- {
- /*-------------------------------------------------------------------------*/
- /* Wczytanie wartosci poczatkowych */
- /*-------------------------------------------------------------------------*/
- ht=0.005; /* krok calkowania w milisekundach */
- h=ht*TWZG; /* krok calkowania przeliczony na czas wzgledny */
- Timp=.2*TWZG; // okres impulsowania falownika
- m0=0.1; // moment obciazenia
- ud=1.72; // napiecie w obwodzie posredniczacym pradu stalego
- //omegaRzad=1.0; // zadana czestotliwosc napiecia stojana
- omegaRzad=1.0; // zadana czestotliwosc napiecia stojana
- frzad=1.0; // zadany strumien skojarzony wirnika
- //dla sterowania skalarnego
- omegaU=1.0; // zadana pulsacja napiecia stojana
- US=1.0; // zadany modul napiecia stojana
- /*---------------------*/
- /* nastawy regulatorow */
- /*---------------------*/
- // predkosci
- kpomegaR=50;
- kiomegaR=.1;
- // strumienia wirnika
- kpfr=50;
- kifr=.005;
- // pradu w osi d
- kpd=5;
- kid=.5;
- // pradu w osi q
- kpq=1;
- kiq=50;
- /*-------------------------------------------------*/
- /* Obliczanie wspolczynnikow rownan modelu silnika */
- /*-------------------------------------------------*/
- w=Ls*Lr-Lm*Lm;
- a1=-(Rs*Lr*Lr+Rr*Lm*Lm)/(Lr*w);
- a2=Rr*Lm/(Lr*w); a3=Lm/w; a4=Lr/w;
- a5=-Rr/Lr; a6=Rr*Lm/Lr;
- a7=w/Lr;
- }
- /*-------------------------------------------------------------------------*/
- /*--------------P R O G R A M G L O W N Y--------------------------------*/
- /*-------------------------------------------------------------------------*/
- void simmain()
- {
- /*deklaracje zmiennych lokalnych */
- double Y[32]; /* zmienne calkowane modelu silnika */
- double X[32]; /* zmienne calkowane ukladu regulacji */
- int i,J; /* liczniki petli */
- int LL=0;
- /*-------------------------------------------------------------------------*/
- /* Obliczanie warunkow poczatkowych do rownan rozniczkowych */
- /*-------------------------------------------------------------------------*/
- for (J=0;J<M;J++) Y[J]=0; // zerowe warunki poczatkowe
- for (J=0;J<M;J++) X[J]=0; // dla zmiennych ukladu sterowania - zerowe
- /*-------------------------------------------------------------------------*/
- /* Petla glowna */
- /*-------------------------------------------------------------------------*/
- do
- {
- //for (J=0;J<(Nk+1);J++) YY[J]=Y[J];
- TIME+=ht;
- zmienna1=1; zmienna2=12; zmienna3=-4; zmienna4=8;
- // Prędkosc katowa
- E_omega = omegaRzad - omegaR;
- P_omega = kpomegaR*E_omega;
- I_omega += kiomegaR*ht*E_omega;
- if(I_omega > 1) I_omega = 1;
- if(I_omega < -1) I_omega = -1;
- isq_zad = P_omega + I_omega;
- if(isq_zad > 1) isq_zad = 1;
- if(isq_zad < 0) isq_zad = 0;
- // transformacja isq
- isq=-isx*sin(ro)+isy*cos(ro);
- E_isq = isq_zad - isq;
- P_isq = kpq*E_isq;
- I_isq += kiq*ht*E_isq;
- if(I_isq> 1) I_isq = 1;
- if(I_isq < -1) I_isq = -1;
- Usq_zad = P_isq + I_isq;
- if(Usq_zad > 1) Usq_zad = 1;
- if(Usq_zad < 0) Usq_zad = 0;
- /* kat poloľenia wektora napi©cia stojana */
- roU+=omegaU*h; // narastanie kata
- if(roU>2*M_PI) roU-=2*M_PI; // ograniczenie zakresu kata roU
- if(roU<0) roU+=2*M_PI; // ograniczenie zakresu kata roU
- // Psi
- E_fr = frzad - fr;
- P_fr = kpf * E_fr;
- I_fr = kif * ht * E_fr;
- if(I_fr > 1) I_fr = 1;
- if(I_fr < -1) I_fr = -1;
- isd_zad = P_fr + I_fr;
- if(isd_zad > 1) isd_zad = 1;
- if(isd_zad < 0) isd_zad = 0;
- // transformacja is alfa do isd
- isd=isx*cos(ro)+isy*sin(ro);
- E_isd = isd_zad - isd;
- P_isd = kpd*E_isd;
- I_isd += kid*ht*E_isq;
- if(I_isd> 1) I_isd = 1;
- if(I_isd < -1) I_isd = -1;
- Usd_zad = P_isd + I_isd;
- if(Usd_zad > 1) Usd_zad = 1;
- if(Usd_zad < 0) Usd_zad = 0;
- usx = cos(ro) * Usd_zad - sin(ro) * Usq_zad
- usy = sin(ro) * Usd_zad + cos(ro) * Usq_zad
- US = sqrt(pow(Usx_zad, 2) + pow(Usy_zad, 2));
- if(SYNCH) // uklad sterowania
- {
- /* obliczenie zmiennych obserwowanych */
- is=sqrt(isx*isx+isy*isy); // modul strumienia stojana
- fr=sqrt(frx*frx+fry*fry); // modul strumienia skojarzonego wirnika
- me=(frx*isy-fry*isx)*Lm/Lr; // moment elektromagnetyczny silnika
- /* obliczenie zmiennych do ukladu sterowanie */
- //WPROWADZIC ZALEZNOSCI
- /* wywolanie podprogramu - Regulatory PI */
- TRAPEZ(Np,Nk,Timp,X);
- // transformacja napiec dq -> xy, ro jest położeniem osi d względem układu nieruchomego
- // obliczenie zadanego modulu napiecia stojana
- // wyznaczenie kata polozenia wektoran napiecia stojana
- }
- /* PWM napieciowy */
- PWMU_3WR(US,roU,ud,Timp,h,&usx,&usy,&t0,&t1,&t2,&SYNCH,&wek,&sek);
- /*-------------------------------------------------------------------------*/
- /* Rozwiazanie ukladu rownan rozniczkowych */
- /*-------------------------------------------------------------------------*/
- F4(M,h,Y); // SILNIK rownania rozniczkowe - rozwiazanie metoda RK4
- /* skokowe zmieny wielkosci zadanych i zaklocajacych */
- if(TIME>450) m0=1;
- if(TIME>700) frzad=0.6;
- if(TIME>850) frzad=1;
- if(TIME>900) m0=0.1;
- if(TIME>1200) omegaRzad=-1.0;
- if(TIME>1500) m0=1.2;
- if(TIME>1700) m0=-1.5;
- if(TIME>1850) m0=0.2;
- //if(TIME>50) {zmienna1=11; zmienna2=2; zmienna3=-14; zmienna4=18; }
- //if(TIME>60) {zmienna1=-1; zmienna2=-2; zmienna3=4; zmienna4=8; }
- /*-------------------------------------------------------------------------*/
- /* Grafika */
- /*-------------------------------------------------------------------------*/
- } while(WinSimTick());
- }
- /*------------------------------------------------------------*/
- /* obliczenie czasow zalaczen kluczy falownika */
- /* Modulacja szerokosci impulsow przez obrot wektora napiecia */
- /* 4 wektory aktywne, zmiana kolejnosci wektorow aktywnych */
- /* zadawane sa: MODUL i KAT POLOZENIA wektora napiecia */
- /*------------------------------------------------------------*/
- #include <math.h>
- void PWMU_3WR(/* Wielkosci WEJsciowe: */
- double US, // zadany modul napiecia wyjsciowego
- double roU, // zadany kat polozenia wektora napiecia wyjsciowego
- double ud, // napiecie stale w obwodzie posredniczacym
- double Timp, // okres impulsowania
- double h, // krok calkowania
- /* Wielkosci WYJsciowe - zwracane: */
- double *usx, // skladowa X chwilowego napiecia wyjsciowego
- double *usy, // skladowa Y chwilowego napiecia wyjsciowego
- double *t0, // czas t0 wektora zerowego
- double *t1, // czas t1 wektora aktywnego
- double *t2, // czas t2 wektora aktywnego
- int *SYNCH, // znacznik poczatku okresu impulsowania - do synchronizacji PWM z ukladem regulacji
- int *wektor, // numer wektora wyjsciowego falownika 0-1-2-3-4-5-6-7
- int *sektor // numer sektora polozenia wektora napiecia 1-2-3-4-5-6
- )
- {
- static double impuls=0.0;
- static int NroU;
- static int idu1,idu2,idu0a,idu0b;
- static int cykl=-1;
- static double USX,USY;
- static double wt;
- static int temp=0;
- static int sektor_old;
- /* Wektory napiecia falownika */
- static double ux[7]={0,p2/p3,p2/(p3*2),-p2/(p3*2),-p2/p3,-p2/(p3*2),p2/(p3*2)};
- static double uy[7]={0,0,p2/2,p2/2,0,-p2/2,-p2/2};
- impuls+=h;
- if (impuls>Timp)
- {
- if (roU>2*M_PI) roU-=2*M_PI;
- if (roU<0) roU+=2*M_PI;
- NroU=(int)floor(roU/(M_PI/3));
- switch(NroU)
- {
- case 0: idu0a=0; idu1=1; idu2=2; idu0b=7; *sektor=1; break;
- case 1: idu0a=7; idu1=2; idu2=3; idu0b=0; *sektor=2; break;
- case 2: idu0a=0; idu1=3; idu2=4; idu0b=7; *sektor=3; break;
- case 3: idu0a=7; idu1=4; idu2=5; idu0b=0; *sektor=4; break;
- case 4: idu0a=0; idu1=5; idu2=6; idu0b=7; *sektor=5; break;
- case 5: idu0a=7; idu1=6; idu2=1; idu0b=0; *sektor=6; break;
- }
- USX=US*cos(roU); USY=US*sin(roU);
- wt=ux[idu1]*uy[idu2]-uy[idu1]*ux[idu2];
- *t1=Timp*(USX*uy[idu2]-USY*ux[idu2])/(ud*wt);
- *t2=Timp*(-USX*uy[idu1]+USY*ux[idu1])/(ud*wt);
- *t0=Timp-*t1-*t2;
- if (*t0<0.0) *t0=0.0;
- impuls-=Timp;
- if(*sektor==sektor_old) cykl*=-1;
- *SYNCH=1;
- temp=1;
- sektor_old=*sektor;
- }
- /* wyznaczenie napiecia na wyjsciu falownika */
- if (cykl==1)
- { // cykl: t0/2..t1..t2..t0/2
- if (impuls<=*t0/2) {*usx=0; *usy=0; *wektor=idu0a; if(temp) temp=0; else *SYNCH=0;}
- else if (impuls<=(*t0/2+*t1)) {*usx=ud*ux[idu1]; *usy=ud*uy[idu1]; *wektor=idu1; }
- else if (impuls<=(*t0/2+*t1+*t2)) {*usx=ud*ux[idu2]; *usy=ud*uy[idu2]; *wektor=idu2; }
- else {*usx=0; *usy=0; *wektor=idu0b; }
- }
- else
- { // cykl: t0/2..t2..t1..t0/2
- if (impuls<=*t0/2) {*usx=0; *usy=0; *wektor=idu0b; if(temp) temp=0; else *SYNCH=0;}
- else if (impuls<=(*t0/2+*t2)) {*usx=ud*ux[idu2]; *usy=ud*uy[idu2]; *wektor=idu2; }
- else if (impuls<=(*t0/2+*t2+*t1)) {*usx=ud*ux[idu1]; *usy=ud*uy[idu1]; *wektor=idu1; }
- else {*usx=0; *usy=0; *wektor=idu0a; }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement