root/applications/pmsm/simulator_zdenek/regulace.cpp @ 1416

Revision 278, 4.2 kB (checked in by smidl, 16 years ago)

props

  • Property svn:eol-style set to native
Line 
1/********************************************
2
3        Vector control of PMSM Drive
4
5        Control - floating point
6
7        Z. Peroutka
8
9Rev. 16.3.2008
10
11*********************************************/
12
13#define _USE_MATH_DEFINES
14
15#include <math.h>
16#include "nastaveni_regulatoru_float.h"
17#include "regulace.h"
18
19
20void init_regulace(double Ls, double Fpm, double kp, double p, double TV);
21void vektor_regulace(double Idw, double Iqw, double Urm_max, double Ww, double *u, double Isx, double Isy, double theta, double rychlost, double Ucn_2, double Uc, double Ucn, unsigned int rezim);
22
23static double pi_reg(double epsilon, double Kpf, double Kif, double MAX, double MIN, double *S);
24static double uhel(double x, double y);
25static void filtr(double U, double *Uf, double kt);
26
27// regulatory proudu
28static double ud, uq, alfa, beta;
29static double Sid, Siq, Surm;
30
31// omezeni momentu
32static double Iqwmax, Iqw_reg;
33static double Idw_urm;
34
35// regulator rychlosti
36static double Sw;
37
38static double U;
39static double Um, Urmf;          // velikost napeti
40
41// odvazbovaci obvod - blok vypocet napeti
42static double Kodv_ud, Kodv_uind;
43
44static double Isd, Isq, Fs, Fmag, moment, K_Fs, K_moment;
45static double Ismaxf2, tmp_omezeni;
46
47double Treg;
48
49/////////////////// POMOCNE FUNKCE //////////////////////////////////
50double uhel(double x, double y)
51{
52  double th;
53
54  if (x==0)
55    if (y==0) th=0.;
56        else if (y>0) th=M_PI/2.;
57             else th=-M_PI/2.;
58  else
59    th=atan(y/x);
60
61  if (x<0) th+=M_PI;
62
63  return th;
64}
65
66
67double pi_reg(double epsilon, double Kpf, double Kif, double MAX, double MIN, double *S)
68{
69  double out;
70
71  out=Kpf*epsilon+*S;
72  if (out>MAX) out=MAX;
73  else if (out<MIN) out=MIN;
74  else
75    *S+=Kif*epsilon;
76
77  return out;
78}
79
80void filtr(double U, double *Uf, double kt)
81{
82  double Ufpom;
83
84  Ufpom=*Uf;
85  *Uf=Ufpom+kt*(U-*Uf);
86}
87
88//////////////////////////////////////////////////////////////////////////
89
90
91void init_regulace(double Ls, double Fpm, double kp, double p, double TV)
92{
93  double Kpd;   // pomocna velicina
94
95  // parametry pro odvazbeni
96  Fmag=Fpm;
97
98  Sid=0;        // nulovani integracni slozky
99  Siq=0;
100
101  Surm=0;        // nulovani integracni slozky
102  Urmf=0;        // filtrovane napeti Urm
103
104  // omezeni momentu kvuli momentu zvratu - omezeni pomoci frmax
105  Ismaxf2=Ismax*Ismax;
106
107  // blok VYPOCET NAPETI
108  Kodv_ud=Ls;
109  Kodv_uind=Fmag;
110
111  // regulator rychlosti
112  Sw=0;
113
114  Treg=TV;
115}
116
117void vektor_regulace(double Idw, double Iqw, double Urm_max, double Ww, double *u, double Isx, double Isy, double theta, double rychlost, double Ucn_2, double Uc, double Ucn, unsigned int rezim)
118{
119  // vypocet Isd, Isq
120  Isd=Isx*cos(theta)+Isy*sin(theta);
121  Isq=Isy*cos(theta)-Isx*sin(theta);
122
123  Iqw_reg=pi_reg(Ww-rychlost,Kpw,Kpw*Treg/Tiw,MAXw,-MAXw,&Sw);
124  if (rezim==0)
125    Iqw_reg=Iqw;          // vyrazeni reg. rychlosti
126  if (rezim==2)           // zkouska max. momentu
127    Iqw_reg=Iqwmax;       // Iqw = sqrt(Imax^2-Idw^2)
128
129  // Regulator odbuzovani
130  Idw_urm=pi_reg(Urm_max-Urmf,Kpurm,Kpurm*Treg/Tiurm,0.,MINurm,&Surm);
131
132  // regulace proudu Id, Iq
133  ud=pi_reg(Idw_urm-Isd,Kpi,Kpi*Treg/Tii,MAXi,-MAXi,&Sid);
134
135  // omezeni max. momentu (resp. max. Iqw) s ohledem na max. proud
136  tmp_omezeni=Ismaxf2-Idw_urm*Idw_urm;
137  if (tmp_omezeni<0) Iqwmax=0;
138  else Iqwmax=sqrt(tmp_omezeni);
139
140  if (Iqw_reg>Iqwmax) Iqw_reg=Iqwmax;
141  if (Iqw_reg<-Iqwmax) Iqw_reg=-Iqwmax;
142  uq=pi_reg(Iqw_reg-Isq,Kpi,Kpi*Treg/Tii,MAXi,-MAXi,&Siq);
143
144///////// Vypocet napeti - "ODVAZBENI"
145  ud-=Kodv_ud*rychlost*Iqw_reg;
146  uq+=Kodv_ud*rychlost*Idw_urm+Kodv_uind*rychlost;
147
148  // omezeni - saturace napeti - stejne omezeni jako u reg. proudu
149  if (ud>MAXi) ud=MAXi;
150  if (ud<-MAXi) ud=-MAXi;
151  if (uq>MAXi) uq=MAXi;
152  if (uq<-MAXi) uq=-MAXi;
153
154  ////////////// KONEC ODVAZBENI /////////////////////////////////////////
155
156  // velikost a poloha vektoru napeti
157  Um=sqrt(ud*ud+uq*uq);
158  alfa=uhel(ud,uq);
159
160  // vypocet polohy vektoru napeti ve stojicim souradnem systemu
161  beta=alfa+theta;
162
163  // vypocet Urmf pro dalsi periodu vzorkovani
164  filtr(Um/Ucn_2,&Urmf,Treg/Tfurm);
165
166// saturation of modulation depth going to PWM
167  if (Um>Ucn_2*Urm_max) Um=Ucn_2*Urm_max;  // linear modulation area only - ensure max. modulation depth
168
169/////// PRECHOD ZPET DO SIMULACE //////////////
170  *u=Um;
171  *(u+1)=beta;
172
173}
Note: See TracBrowser for help on using the browser.