- •1. Введение
- •2. Задание на проектирование
- •Установим взаимосвязь между кчх объекта и ее амплитудой и фазой .
- •3. Расчет кчх объекта в требуемом диапазоне частот
- •4. Расчет параметров настройки пи и пид-регуляторов
- •5. Определение устойчивости замкнутой аср
- •6. Оценка качества управления и выбор регулятора
- •7. Заключение
- •Приложение к курсовому проекту
- •1. Программа расчета параметров настройки пид регулятора
- •2. Программа расчета параметров настройки пид регулятора
- •3. Программа расчета частотных характеристик
7. Заключение
Замкнутая система с ПИД-регулятором при оптимальных параметрах настройки не обладает заданным запасом устойчивости, т.к. максимальное значение АЧХ при частотах от 3 до 8 превышает значения 1,62. Также по качеству управления ПИД-регулятор оказался не приемлемым для данной системы.
Приложение к курсовому проекту
1. Программа расчета параметров настройки пид регулятора
PROGRAM PIDREG;
const M=1.62;
eps=1.0E-06;
type index = array [1..20] of extended;
var X,Ya,Ba,Ca,Da,Yf,Bf,Cf,Df: index;
DFm: extended;
{ ***************************************************** }
procedure spline(n: integer; x,y: index; var b,c,d: index);
label 1,2,3;
var nm1,ib,i: integer;
t: extended;
begin
nm1:=n-1;
if (n<2) then goto 3;
if (n<3) then goto 2;
d[1]:=x[2]-x[1];
c[2]:=(y[2]-y[1])/d[1];
for i:=2 to nm1 do
begin
d[i]:=x[i+1]-x[i];
b[i]:=2.0*(d[i-1]+d[i]);
c[i+1]:=(y[i+1]-y[i])/d[i];
c[i]:=c[i+1]-c[i]
end;
{ Граничные условия }
b[1]:=-d[1];
b[n]:=-d[n-1];
c[1]:=0.0;
c[n]:=0.0;
if (n=3) then goto 1;
c[1]:=c[3]/(x[4]-x[2])-c[2]/(x[3]-x[1]);
c[n]:=c[n-1]/(x[n]-x[n-2])-c[n-2]/(x[n-1]-x[n-3]);
c[1]:=c[1]*d[1]*d[1]/(x[4]-x[1]);
c[n]:=-c[n]*d[n-1]*d[n-1]/(x[n]-x[n-3]);
{ *************************************** }
1: for i:=2 to n do
begin
t:=d[i-1]/b[i-1];
b[i]:=b[i]-t*d[i-1];
c[i]:=c[i]-t*c[i-1]
end;
c[n]:=c[n]/b[n];
for ib:=1 to nm1 do
begin
i:=n-ib;
c[i]:=(c[i]-d[i]*c[i+1])/b[i];
end;
b[n]:=(y[n]-y[nm1])/d[nm1]+d[nm1]*(c[nm1]+2.0*c[n]);
for i:=1 to nm1 do
begin
b[i]:=(y[i+1]-y[i])/d[i]-d[i]*(c[i+1]+2.0*c[i]);
d[i]:=(c[i+1]-c[i])/d[i];
c[i]:=3.0*c[i]
end;
c[n]:=3.0*c[n];
d[n]:=d[n-1];
goto 3;
2: b[1]:=(y[2]-y[1])/(x[2]-x[1]);
c[1]: = 0.0;
d[1]: = 0.0;
b[2]: = b[1];
c[2]: = 0.0;
d[2]: = 0.0;
3: ;
end;
{ ***************************************************** }
function seval(n: integer;u: extended; x,y,b,c,d: index):
extended;
label 1,2,3;
var j,k: integer;
dx: extended;
const i: integer = 1;
begin
if (i > n) or (i = n) then i: = 1;
if (u < x[i]) then goto 1;
if (u < x[i+1]) or (u=x[i+1]) then goto 3;
1: i:=1;
j:=n+1;
2: k: = ( i + j ) div 2;
if ( u < x[k] ) then j: = k;
if ( u > x[k] ) or ( u = x[k] ) then i: = k;
if (j>i+1) then goto 2;
3: dx:=u-x[i];
seval:=y[i]+dx*(b[i]+dx*(c[i]+dx*d[i]))
end;
{ ***************************************************** }
procedure Intplob(w,A,f: extended; var j: integer);
label 1,2;
var i,k: integer;
const n: integer=1;
begin
if (n=1) then
begin
X[1]:=w;
Ya[1]:=A;
Yf[1]:=f;
end;
if (n>1) then
begin
for i:=1 to n-1 do
begin
if (X[i]<w) then goto 1;
if (X[i]>w) then
begin
for k:=1 to (n-i) do
begin
X[n+1-k]:=X[n-k];
Ya[n+1-k]:=Ya[n-k];
Yf[n+1-k]:=Yf[n-k]
end;
X[i]:=w;
Ya[i]:=A;
Yf[i]:=f;
goto 2
end;
1: ;
end;
if (i=n-1) then
begin
X[n]:=w;
Ya[n]:=A;
Yf[n]:=f;
end
end;
2: j:=n;
spline(j,X,Ya,Ba,Ca,Da);
spline(j,X,Yf,Bf,Cf,Df);
n:=n+1;
end;
{ ***************************************************** }
procedure Virtob(w: extended; n: integer; var A,f: extended);
begin
A:=seval(n,w,X,Ya,Ba,Ca,Da);
f:=seval(n,w,X,Yf,Bf,Cf,Df)
end;
{ **************************************************** }
procedure Wsfunpid(n: integer);
label 1,2,3,4,5,6,7;
var w,dw,A,zA,f,g,zg,q,DF,zq,DTd,Kp,Ti,Td: extended;
Wf,Az,ZAz,Mrs,Wrs: extended;
{ ***************************************************** }
procedure MALT(R1,I1,R2,I2: extended; var R3,I3: extended);
begin
R3:= R1*R2-I1*I2;
I3:= R1*I2+R2*I1
end;
{ **************************************************** }
procedure DIVD(R1,I1,R2,I2: extended; var R3,I3: extended);
var R: extended;
begin
R:= R2*R2+I2*I2;
R3:= (R1*R2+I1*I2)/R;
I3:= (I1*R2-I2*R1)/R
end;
{ ***************************************************** }
procedure Wrg(w,Td,Ti,Kp: extended; var Rrg,Irg: extended);
begin
Rrg:=Kp;
Irg:=Kp*(Td*w-1.0/Ti/w)
end;
{ ********************************************************* }
function Azs(n: integer; w,Td,Ti,Kp: extended): extended;
var A,f: extended;
Rrg,Irg: extended;
Rrs,Irs,Rzs,Izs: extended;
begin
Virtob(w,n,A,f);
Wrg(w,Td,Ti,Kp,Rrg,Irg);
MALT(Rrg,Irg,A*cos(f),A*sin(f),Rrs,Irs);
DIVD(Rrs,Irs,1.0+Rrs,Irs,Rzs,Izs);
Azs:=sqrt(sqr(Rzs)+sqr(Izs))
end;
{ ***************************************************** }
begin
Td:=0.1;
DTd:=Td;
w:=4.0;
1: ;
dw:=0.1*w;
Virtob(w,n,A,f);
g:=-f-pi/2.0;
zq:=M*w*(M*cos(g)+Td*w*M*sin(g)
-sqrt(1.0+sqr(Td*w)))/A/(sqr(M)-1.0);
2: ;
w:=w+dw;
Virtob(w,n,A,f);
g:=-f-pi/2.0;
q:=M*w*(M*cos(g)+Td*w*M*sin(g)-sqrt(1.0+sqr(Td*w)))/A/(sqr(M)-1.0);
if ( q > zq ) then
begin
zq:=q;
zg:=g;
zA:=A;
goto 2
end;
if ( q < zq ) then
if ( abs(dw/w) < eps ) then
begin
w:=w-dw;
q:=zq;
g:=zg;
A:=zA;
goto 3
end
else
begin
zq:=q;
zg:=g;
zA:=A;
dw:=-dw/1.62;
goto 2
end;
3: ;
Kp:=sqr(M)*sin(g)*(1.0-Td*w/M/sin(g)/sqrt(1.0
+sqr(Td*w)))/(sqr(M)-1.0)/A;
Ti:=Kp/q;
Wf:=w;
DF:=M*sqr(w)*(M*sin(g)-Td*w/sqrt(1.0+sqr(Td*w)))/(sqr(M)-1.0)/A;
if ( DF > DFm ) then
begin
Td:=Td-DTd;
DTd:=DTd/1.62;
Td:=Td+DTd;
goto 1
end;
dw:=0.1*w;
ZAz:=Azs(n,w,Td,Ti,Kp);
4: ;
w:=w+dw;
Az:=Azs(n,w,Td,Ti,Kp);
if ( Az > 1.05*M ) then goto 6;
if ( Az > ZAz ) then
begin
ZAz:=Az;
goto 4
end;
if ( Az < ZAz ) then
begin
if ( abs(dw/w) < eps ) then goto 5;
ZAz:=Az;
dw:=-dw/1.62;
goto 4
end;
5: ;
Mrs:=ZAz;
Wrs:=w-dw;
if ( DTd/Td < eps ) then goto 7;
if ( abs((M-Mrs)/M) > 2.0*eps ) then
begin
6: ;
Td:=Td-DTd;
DTd:=DTd/1.62;
Td:=Td+DTd;
w:=Wf;
goto 1;
end
else
begin
Td:=Td+DTd;
w:=Wf;
goto 1
end;
7: ;
writeln(' ');
writeln(' Kp=',Kp:6:4);
writeln(' Tи=',Ti:6:4);
writeln(' Tд=',Td:6:4);
writeln(' Kp/Tи=',Kp/Ti:6:4);
writeln(' Резонансная частота Wp=',Wrs:6:4);
writeln(' Частота максимума вспом. функции WF=',Wf:6:4)
end;
{ ***************************************************** }
procedure Nastr;
var w,Am,Gm: extended;
n: integer;
begin
writeln(' ');
writeln(' Введите чувствительность DF');
readln(DFm);
writeln(' ');
writeln(' Введите значение частоты w1');
readln(w);
writeln(' Введите значение амплитуды КЧХ объекта A(w1)');
readln(Am);
writeln(' Введите значение фазы КЧХ объекта F(w1)');
readln(Gm);
Intplob(w,Am,Gm,n);
writeln(' ');
writeln(' Введите значение частоты w2');
readln(w);
writeln(' Введите значение амплитуды КЧХ объекта A(w2)');
readln(Am);
writeln(' Введите значение фазы КЧХ объекта F(w2)');
readln(Gm);
Intplob(w,Am,Gm,n);
writeln(' ');
writeln(' Введите значение частоты w3');
readln(w);
writeln(' Введите значение амплитуды КЧХ объекта A(w3)');
readln(Am);
writeln(' Введите значение фазы КЧХ объекта F(w3)');
readln(Gm);
Intplob(w,Am,Gm,n);
writeln(' ');
writeln(' Введите значение частоты w4');
readln(w);
writeln(' Введите значение амплитуды КЧХ объекта A(w4)');
readln(Am);
writeln(' Введите значение фазы КЧХ объекта F(w4)');
readln(Gm);
Intplob(w,Am,Gm,n);
writeln(' ');
Wsfunpid(n)
end;
{ ***************************************************** }
begin
Nastr
end.