root/applications/pmsm/simulator_zdenek/ekf_example/pmsm_mod.cpp @ 1104

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

props

  • Property svn:eol-style set to native
Line 
1/* model synchronniho motoru s permanentnimi magnety
2
3   PMSM v plovouci radove carce - fyzikalni model!
4   
5   31.5.2007
6
7   Upraven vypocet momentu M = Fmag*Isq!! (nikoliv M = Fs*Isq!!)
8   31.5.2007    doplnen vypocet zatezneho uhlu (beta)
9*/
10
11#define _USE_MATH_DEFINES
12#include <math.h>
13#include "pmsm_mod.h"
14
15double x[10]; // (isx,isy,wme,theta_e,M,Fsd,Isd,Isq,Mz,beta)            ... beta = zatezny uhel
16
17void init_pmsm(double *param, double *REL);
18void pmsm_double(double usx, double usy, double h, unsigned int vypocet);
19
20// pomocne funkce
21static double uhel(double x, double y);
22
23static double Isx,Isy,wme,Mz,M,Fs,Isd,Isq;
24static double Rs,Ls,Fmag,Bfric,p,kp,J;
25// Rs=odpor stator; Ls=statorova indukcnost (synchronni reaktance)
26// p=pocet polparu, kp=konst. Parkovy transf.,
27// J=moment setrvacnosti (J<0 ... nekonecny)
28
29static double Uref, Iref, Wref, Mref, Fref, Thetaref; // referencni hodnoty
30
31static double dIsx,dIsx1,dIsx2,dIsx3,dIsy,dIsy1,dIsy2,dIsy3;
32static double dTheta,dTheta1,dTheta2,dTheta3;
33static double dw,dw1,dw2,dw3;
34
35static double A,B,C,D,E,F,G;
36
37static double Fsq;
38
39
40/////////////////// POMOCNE FUNKCE //////////////////////////////////
41double uhel(double x, double y)
42{
43  double th;
44
45  if (x==0)
46    if (y==0) th=0.;
47        else if (y>0) th=M_PI/2.;
48             else th=-M_PI/2.;
49  else
50    th=atan(y/x);
51
52  if (x<0) th+=M_PI;
53
54  return th;
55}
56
57
58void init_pmsm(double *param, double *REL)
59{
60  unsigned int i;
61
62  Rs=*(param);
63  Ls=*(param+1);
64  Fmag=*(param+2);
65  Bfric=*(param+3);
66
67  p=*(param+4);
68  kp=*(param+5);
69  J=*(param+6);
70
71  Uref=*REL;
72  Iref=*(REL+1);
73  Wref=*(REL+2);
74  Thetaref=*(REL+3);
75  Mref=*(REL+4);
76  Fref=*(REL+5);
77
78// definice konstant modelu
79  A=Rs/Ls;
80  B=Fmag/Ls*Wref/Iref;
81  C=Uref/Iref/Ls;
82  D=Bfric/J;
83  E=kp*p*p*Fmag/J*Iref/Wref;
84  F=p/J*Mref/Wref;
85  G=Wref/Thetaref;
86
87// definice pocatecnich hodnot
88  dIsx=0;dIsx1=0;dIsx2=0;dIsx3=0;dIsy=0;dIsy1=0;dIsy2=0;dIsy3=0;
89  dTheta=0;dTheta1=0;dTheta2=0;dTheta3=0;
90  dw=0;dw1=0;dw2=0;dw3=0;
91}
92
93void pmsm_double(double usx, double usy, double h, unsigned int vypocet)
94// vypocet<5...Euler, vypocet>4 ... Adams 4.radu
95{
96// (isx,isy,wme,theta_e,M,Fs,Mz)
97  // vypocty diferenci
98  dIsx=-A*x[0]+B*x[2]*sin(x[3]*Thetaref)+C*usx;
99  dIsy=-A*x[1]-B*x[2]*cos(x[3]*Thetaref)+C*usy;
100  dTheta=G*x[2];
101
102  if (J>0)
103    dw=E*(x[1]*cos(x[3]*Thetaref)-x[0]*sin(x[3]*Thetaref))-D*x[2]-F*x[8];
104  else
105    dw=0;
106
107// integrace
108  if (vypocet<5)  // Euler
109  { x[0]+=dIsx*h;
110    x[1]+=dIsy*h;
111    x[2]+=dw*h;
112    x[3]+=dTheta*h;
113  }
114  else                  // Adams 4.radu
115  { x[0]+=h/24*(55*dIsx-59*dIsx1+37*dIsx2-9*dIsx3);
116    x[1]+=h/24*(55*dIsy-59*dIsy1+37*dIsy2-9*dIsy3);
117    x[2]+=h/24*(55*dw-59*dw1+37*dw2-9*dw3);
118    x[3]+=h/24*(55*dTheta-59*dTheta1+37*dTheta2-9*dTheta3);
119  }
120
121  // uprava theta tak, aby bylo stale v rozmezi (-pi,pi)
122  if (x[3]>M_PI/Thetaref) x[3]-=(2*M_PI/Thetaref);
123  if (x[3]<-M_PI/Thetaref) x[3]+=(2*M_PI/Thetaref);
124
125  // zamena diferenci
126  dIsx3=dIsx2;dIsx2=dIsx1;dIsx1=dIsx;
127  dIsy3=dIsy2;dIsy2=dIsy1;dIsy1=dIsy;
128  dTheta3=dTheta2;dTheta2=dTheta1;dTheta1=dTheta;
129  dw3=dw2;dw2=dw1;dw1=dw;
130
131  // vypocet Isd, Isq
132  x[6]=x[0]*cos(x[3]*Thetaref)+x[1]*sin(x[3]*Thetaref);         // Isd
133  x[7]=x[1]*cos(x[3]*Thetaref)-x[0]*sin(x[3]*Thetaref);         // Isq
134
135  // vypocet toku statoru Fsd - neni normovany!!
136  x[5]=Ls*x[6]*Iref+Fmag;
137
138  // Vypocet momentu
139  x[4]=kp*p*Fmag*Iref/Mref*(x[1]*cos(x[3]*Thetaref)-x[0]*sin(x[3]*Thetaref));
140
141  // vypocet zatezneho uhlu
142  Fsq=Ls*x[7]*Iref;
143  x[10]=uhel(x[5],Fsq);
144}
Note: See TracBrowser for help on using the browser.