Файл: Национальный технический университет украины киевский политехнический институт кафедра систем автоматизированного проектирования.doc
Добавлен: 06.12.2023
Просмотров: 76
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
begin
F0:=Fc;
Fc:=1;
F1:=F1/F0;
end;
Procedure LowPassFilter_Batterworth_Order; { расчет порядка фильтра }
var order:double;
begin
order:=0.5*lg((pow10(0.1*Bf)-1)/
(pow10(0.1*Af)-1))/
lg(F1);
if order>MAX_ORDER then
begin
TextColor(LIGHTRED);
writeln('Программа не может рассчитать фильтр');
writeln('Требуемый порядок фильтра превышает ',MAX_ORDER);
writeln('Требуется порядок фильтра = ',order);
writeln('Нажмите Enter');ch:=#255;
while ch<>#13 do ch:=Readkey;
TextColor(LIGHTGREEN);
Halt(1);
end;
if order<=0 then
begin
TextColor(LIGHTRED);
writeln('Программа не может рассчитать фильтр');
writeln('Получен отрицательный или нулевой порядок фильтра = ',order);
writeln('Нажмите Enter');ch:=#255;
while ch<>#13 do ch:=Readkey;
TextColor(LIGHTGREEN);
Halt(1);
end;
N:=Trunc(order)+1;
if (N mod 2 = 1) then sect:= N div 2 + 1
else sect:= N div 2;
end;
Procedure LowPassFilter_Batterworth_Sigma0;{расчет радиуса полуокружности}
begin
sigma0:=pow(pow10(0.1*Af)-1,-1/(2*N));
end;
Procedure LowPassFilter_Batterworth_H;{расчет числителя передаточной функции}
begin
H := 1.0/sqrt(pow10(0.1*Af)-1);
Hi:=H;
end;
Procedure LowPassFilter_Batterworth_Poles;{расчет полюсов фильтра}
var i:integer;
begin
for i:=1 to sect do
begin
poles[sect-i+1].re:= - sigma0 * sin ((2*i-1)*Pi/(2*N));
poles[sect-i+1].im:= - sigma0 * cos ((2*i-1)*Pi/(2*N));
end;
{ при нечетном N звену первого порядка соответствует poles[1]}
end;
{ выбор схемной реализации и расчет номиналов }
Procedure LowPassFilter_Building;
var i : integer;
C : double;
delta : double;
beta : double;
gamma : double;
scale : double;
D:double;
begin
{ C задается таким образом, чтобы при денормировании получить 1.0}
C:=(2*pi*f0)/(pow10(Trunc(lg(f0))+1.0));
i:=1;
{ при нечетном N звену первого порядка соответствует poles[1]}
if (N mod 2 = 1) then {построение звена первого порядка}
begin
delta:= -poles[1].re;
sections[1].shem := invert; {на инвертирующем ОУ}
sections[1].C1 := C;
sections[1].R1 := 1/(C*Hi);
sections[1].R2 := 1/(C*delta);
i:=2;
Hi:=1;
end;
while i<=sect do {построение звена второго порядка}
begin
beta := -2*poles[i].re;
gamma:= sqr(poles[i].re)+sqr(poles[i].im);
sections[i].Q:=sqrt(gamma)/beta;
if sections[i].Q<=10 then with sections[i] do
begin
shem := MOS; {с многопетлевой обратной связью}
C1 := C;
scale:= 1.001*4*gamma*(Hi/gamma+1)/(beta*beta);
C2 := C1*scale;
D := beta*beta*C2*C2 - 4*C1*C2*gamma*(Hi/gamma+1);
R2 := 2*(Hi/gamma+1)/(beta*C2 + sqrt(D));
R1 := R2*gamma/Hi;
R3 := 1.0/(C1*C2*R2*gamma);
end
else with sections[i] do
begin
shem := bikvadrat; {биквадратное звено}
C1 := C;
R4 := 1.0/C1;
R1 := 1.0/(Hi*C1*C1*R4);
R2 := 1.0/(beta*C1);
R3 := 1.0/(R4*C1*C1*gamma);
end;
i:=i+1;
Hi:=1;
end;
end;
{ денормирование электрических параметров }
Procedure LowPassFilter_Denorming;
var i:integer;
begin
for i:=1 to sect do
begin
sections[i].R1:= sections[i].R1 * R0;
sections[i].R2:= sections[i].R2 * R0;
sections[i].R3:= sections[i].R3 * R0;
sections[i].R4:= sections[i].R4 * R0;
sections[i].C1:= sections[i].C1 / (R0*2*pi*f0);
sections[i].C2:= sections[i].C2 / (R0*2*pi*f0);
end;
end;
Procedure LowPassFilter_Info;{ вывод результатов расчета фильтра}
var i,j:integer;
f:text;
begin
Assign(f,txt_file);
Rewrite(f);
ClrScr;
writeln(' Результаты расчета ФНЧ с аппроксимацией АЧХ по Баттерворту ');
writeln('------------------------------------------------------------------------------');
writeln('Исходные данные : Частота среза Fc = ',Fc*F0:10:4,' Гц');
writeln(' Неравномерность Аф = ',Af :10:4,' дБ');
writeln(' Граничная частота F1 = ',F1*F0:10:4,' Гц');
writeln(' Затухание BФ = ',Bf :10:4,' дБ');
writeln('------------------------------------------------------------------------------');
writeln('порядок,тип звена Q С1,мкФ С2,мкФ R1,кОм R2,кОм R3,кОм R4,кОм ');
writeln('------------------------------------------------------------------------------');
writeln(f,' Результаты расчета ФНЧ с аппроксимацией АЧХ по Баттерворту ');
writeln(f,'------------------------------------------------------------------------------');
writeln(f,'Исходные данные : Частота среза Fc = ',Fc*F0:10:4,' Гц');
writeln(f,' Неравномерность Аф = ',Af :10:4,' дБ');
writeln(f,' Граничная частота F1 = ',F1*F0:10:4,' Гц');
writeln(f,' Затухание BФ = ',Bf :10:4,' дБ');
writeln(f,'------------------------------------------------------------------------------');
writeln(f,'Порядок фильтра = ',N);
writeln(f,'Количество звеньев = ',sect);
writeln(f,'------------------------------------------------------------------------------');
for i:=1 to sect do
begin
j:= whereY;
if sections[i].shem=invert then
begin
gotoxy( 1,j);writeln('1 инверт.ОУ');
gotoxy(24,j);writeln(sections[i].C1*1.0e+6:8:4);
gotoxy(42,j);writeln(sections[i].R1/1.0e+3:8:3);
gotoxy(51,j);writeln(sections[i].R2/1.0e+3:8:3);
writeln(f,'Звено первого порядка');
writeln(f,'на инвертирующем ОУ ');
writeln(f,'C1=',sections[i].C1*1.0e+6:10:4,' мкФ');
writeln(f,'R1=',sections[i].R1/1.0e+3:10:4,' кОм');
writeln(f,'R2=',sections[i].R2/1.0e+3:10:4,' кОм');
writeln(f,'---------------------');
end;
if sections[i].shem=MOS then
begin
gotoxy( 1,j);writeln('2 звено МОС');
gotoxy(15,j);writeln(sections[i].Q:8:4);
gotoxy(24,j);writeln(sections[i].C1*1.0e+6:8:4);
gotoxy(33,j);writeln(sections[i].C2*1.0e+6:8:4);
gotoxy(42,j);writeln(sections[i].R1/1.0e+3:8:3);
gotoxy(51,j);writeln(sections[i].R2/1.0e+3:8:3);
gotoxy(60,j);writeln(sections[i].R3/1.0e+3:8:3);
writeln(f,'Звено второго порядка');
writeln(f,'с многопетлевой ОС ');
writeln(f,'Q =',sections[i].Q:10:4);
writeln(f,'C1=',sections[i].C1*1.0e+6:10:4,' мкФ');
writeln(f,'C2=',sections[i].C2*1.0e+6:10:4,' мкФ');
writeln(f,'R1=',sections[i].R1/1.0e+3:10:4,' кОм');
writeln(f,'R2=',sections[i].R2/1.0e+3:10:4,' кОм');
writeln(f,'R3=',sections[i].R3/1.0e+3:10:4,' кОм');
writeln(f,'---------------------');
end;
if sections[i].shem=bikvadrat then
begin
gotoxy( 1,j);writeln('2 биквадрат.');
gotoxy(15,j);writeln(sections[i].Q:8:4);
gotoxy(24,j);writeln(sections[i].C1*1.0e+6:8:4);
gotoxy(42,j);writeln(sections[i].R1/1.0e+3:8:3);
gotoxy(51,j);writeln(sections[i].R2/1.0e+3:8:3);
gotoxy(60,j);writeln(sections[i].R3/1.0e+3:8:3);
gotoxy(69,j);writeln(sections[i].R4/1.0e+3:8:3);
writeln(f,'Звено второго порядка');
writeln(f,'биквадратное ');
writeln(f,'Q =',sections[i].Q:10:4);
writeln(f,'C1=',sections[i].C1*1.0e+6:10:4,' мкФ');
writeln(f,'R1=',sections[i].R1/1.0e+3:10:4,' кОм');
writeln(f,'R2=',sections[i].R2/1.0e+3:10:4,' кОм');
writeln(f,'R3=',sections[i].R3/1.0e+3:10:4,' кОм');
writeln(f,'R4=',sections[i].R4/1.0e+3:10:4,' кОм');
writeln(f,'---------------------');
end;
if (j = 20) then
begin
TextColor(LIGHTRED);
writeln('Нажмите Enter, чтобы посмотреть остальные звенья ');
ch:=#255;
while ch<>#13 do ch:=Readkey;
TextColor(LIGHTGREEN);
ClrScr;
GoToXY(1,1);
writeln('------------------------------------------------------------------------------');
writeln('порядок,тип звена Q С1,мкФ С2,мкФ R1,кОм R2,кОм R3,кОм R4,кОм ');
writeln('------------------------------------------------------------------------------');
end;
end;
writeln('------------------------------------------------------------------------------');
writeln('Порядок фильтра = ',N);
writeln('Количество звеньев = ',sect);
writeln('------------------------------------------------------------------------------');
Close(f);
TextColor(LIGHTRED);
writeln('Нажмите Enter');ch:=#255;
while ch<>#13 do ch:=Readkey;
TextColor(LIGHTGREEN);
end;
{ расчет АЧХ спроектированного фильтра }
Procedure LowPassFilter_AFC;
var g:text;
i,j:integer;
f,df,w:double;
K :complex;
pp :complex;
Hi , delta : double;
beta, gamma : double;
begin
Assign(g,tab_file);
Rewrite(g);
writeln(g,'Таблица значений ЛАЧХ фильтра нижних частот:');
writeln(g,'--------------------------------------------');
writeln(g,' Частота Ку ');
writeln(g,'----------------------------');
low_freq :=1.0;
high_freq:=F1*F0*2.0;
df:=high_freq/POINTS;
f:=0.0;
j:=1;
while j<=POINTS do
begin
w:=2*pi*f;
K.re :=1; K.im :=0;
for i:=1 to sect do
begin
if sections[i].shem=invert then
begin
with sections[i] do
begin
Hi:=1/(R1*C1);
delta:=1/(R2*C1);
end;
K.re :=K.re*Hi;
K.im :=K.im*Hi;
pp.re:= delta;
pp.im:= w;
_Div(K,pp,K);
end;
if sections[i].shem=MOS then
begin
with sections[i] do
begin
Hi :=1/( R1*R3*C1*C2 );
beta :=( 1/R1 + 1/R2 + 1/R3 )/C2;
gamma:=1/(R2*R3*C1*C2);
end;
K.re :=K.re*Hi;
K.im :=K.im*Hi;
pp.re:=gamma - w*w;
pp.im:=beta*w;
_Div(K,pp,K);
end;
if sections[i].shem=bikvadrat then
begin
with sections[i] do
begin
Hi :=1/(R1*R4*C1*C1);
beta :=1/(R2*C1);
gamma:=1/(R3*R4*C1*C1);
end;
K.re :=K.re*Hi;
K.im :=K.im*Hi;
pp.re:=gamma - w*w;
pp.im:=beta*w;
_Div(K,pp,K);
end;
end;
AFC[j]:=20*lg(_Abs(K));
writeln(g,f:8:2,' Гц ',AFC[j]:8:2,' дБ ');
f:=f+df;
j:=j+1;
end;
Close(g);
end;
{создание файла задания для моделирования АЧХ}
Procedure LowPassFilter_ALLTED;
var f:text;
i:integer;
k:integer; { узел для входа текущего звена }
r:integer;
c:integer;
qq:integer;
begin
Assign(f,atd_file);
Rewrite(f);
writeln(f,'OBJECT; ');
writeln(f,'SEARCH PRAM; ');
writeln(f,'CIRCUIT ARCFLT; ');
writeln(f,'Ein(1,0)=1; ');
k:=1; r:=1; c:=1; qq:=1;
for i:= 1 to sect do
begin
if sections[i].shem=invert then
with sections[i] do
begin
writeln(f,'R',r,'(',k ,',',k+1,')=',R2/1e+3:10:6,';'); r:=r+1;
writeln(f,'R',r,'(',k+1,',',k+2,')=',R1/1e+3:10:6,';'); r:=r+1;
writeln(f,'C',c,'(',k+1,',',k+2,')=',C1*1e+9:10:6,';'); c:=c+1;
writeln(f,'Q',qq,'(0,',k+1,',0,',k+2,')=k140ud12.oulm;'); qq:=qq+1;
k:=k+2;
end;
if sections[i].shem=MOS then
with sections[i] do
begin
writeln(f,'R',r,'(',k ,',',k+1,')=',R1/1e+3:10:6,';'); r:=r+1;
writeln(f,'R',r,'(',k+1,',',k+3,')=',R2/1e+3:10:6,';'); r:=r+1;
writeln(f,'R',r,'(',k+1,',',k+2,')=',R3/1e+3:10:6,';'); r:=r+1;
writeln(f,'C',c,'(',k+2,',',k+3,')=',C1*1e+9:10:6,';'); c:=c+1;
writeln(f,'C',c,'(',k+1,',', 0,')=',C2*1e+9:10:6,';'); c:=c+1;
writeln(f,'Q',qq,'(0,',k+2,',0,',k+3,')=k140ud12.oulm;'); qq:=qq+1;
k:=k+3;
end;
if sections[i].shem=bikvadrat then
with sections[i] do
begin
writeln(f,'R',r,'(',k ,',',k+1,')=',R1/1e+3:10:6,';'); r:=r+1;
writeln(f,'R',r,'(',k+1,',',k+4,')=',R2/1e+3:10:6,';'); r:=r+1;
writeln(f,'R',r,'(',k+1,',',k+2,')=',R3/1e+3:10:6,';'); r:=r+1;
writeln(f,'R',r,'(',k+2,',',k+3,')=',R4/1e+3:10:6,';'); r:=r+1;
writeln(f,'R',r,'(',k+3,',',k+6,')=',R4/1e+3:10:6,';'); r:=r+1;
writeln(f,'R',r,'(',k+4,',',k+5,')=',R4/1e+3:10:6,';'); r:=r+1;
writeln(f,'C',c,'(',k+1,',',k+4,')=',C1*1e+9:10:6,';'); c:=c+1;
writeln(f,'C',c,'(',k+5,',',k+6,')=',C1*1e+9:10:6,';'); c:=c+1;
writeln(f,'Q',qq,'(0,',k+1,',0,',k+4,')=k140ud12.oulm;'); qq:=qq+1;
writeln(f,'Q',qq,'(0,',k+5,',0,',k+6,')=k140ud12.oulm;'); qq:=qq+1;
writeln(f,'Q',qq,'(0,',k+3,',0,',k+2,')=k140ud12.oulm;'); qq:=qq+1;
k:=k+6;
end;
end;
writeln(f,'Gn(',k,',0)=0; ');
writeln(f,'& ');
writeln(f,'TASK; ');
writeln(f,'DC; ');
writeln(f,'AC; ');
writeln(f,'TF K1=V',k,'/UEin;');
writeln(f,'CONST LFREQ=',low_freq /1.0e+6:10:6,';');
writeln(f,'CONST UFREQ=',high_freq/1.0e+6:10:6,';');
writeln(f,'LPLOT DB.K1,PH.K1;');
writeln(f,'& ');
writeln(f,'END; ');
Close(f);
end;
Procedure LowPassFilter_Plot;
var Dr: Integer;
Mode: Integer;
i:integer;
A,max,scale:double;
st:string;
begin
Dr := VGA;
Mode:=2;
InitGraph(Dr,Mode,'c:\bp\bgi');
SetGraphMode(2);
max:=AFC[1];
for i:=1 to POINTS do if Abs(AFC[i])>max then max:=Abs(AFC[i]);
max:=(Round(max) div 10 + 1 )*10;
scale:=400/(max+5);
SetColor(LIGHTGRAY);
Rectangle(100,20,100+POINTS,420);
A:=0;
while A<=max do
begin
Line(100,20+Round((A+5)*scale),100+POINTS,20+Round((A+5)*scale));
Str(-Round(A):4,st);
OutTextXY(60,10+Round((A+5)*scale),st);
A:=A+10;
end;
SetColor(WHITE);
OutTextXY(60,10,'K, дБ');
A:=0; SetColor(LIGHTGRAY);
while A<=high_freq do
begin
i:= Round(POINTS*A/high_freq);
Line(100+i,20,100+i,420);
Str(Round(A):4,st);
OutTextXY(80+i,430,st);
A:=A+2*pow10(Trunc(Lg(high_freq/2)));
end;
SetColor(WHITE);
OutTextXY(130+POINTS,430,'f, Гц');
SetColor(LIGHTGREEN);
for i:=1 to POINTS-1 do
Line(100+i,20+Round(scale*(5-AFC[i])),101+i,20+Round(scale*(5-AFC[i+1])));
OutTextXY(100,460,'Press any key to exit');
readkey;
CloseGraph;
end;
Begin
ClrScr; TextColor(LIGHTGREEN);
GoToXY(20, 9); writeln('---------------------------------------------');
GoToXY(20,10); writeln('Программа расчета ARC - фильтра нижних частот');
GoToXY(20,11);
writeln(' с аппроксимацмей АЧХ по Баттерворту ');
GoToXY(20,12); writeln('---------------------------------------------');
GoToXY(20,17); writeln(' X.X. XXXXX ');
GoToXY(20,18); writeln(' студент гр. ДА-XX');
GoToXY(20,19); writeln(' ФЭЛ НТУУ "КПИ" ');
GoToXY(20,24); writeln(' Киев 2000 ');
TextColor(LIGHTCYAN+BLINK);
GoToXY(20, 1); write(' Нажмите Enter ');
ch:=#255;
while ch<>#13 do ch:=Readkey;
TextColor(LIGHTGREEN);
LowPassFilter_Parameters;
LowPassFilter_Norming;
LowPassFilter_Batterworth_Order;
LowPassFilter_Batterworth_H;
LowPassFilter_Batterworth_Sigma0;
LowPassFilter_Batterworth_Poles;
LowPassFilter_Building;
LowPassFilter_Denorming;
LowPassFilter_Info;
LowPassFilter_AFC;
LowPassFilter_ALLTED;
LowPassFilter_Plot;
End.
П2. Результаты расчета фильтра
с помощью разработанной программы
Результаты расчета ФНЧ с аппроксимацией АЧХ по Баттерворту
------------------------------------------------------------------------------
Исходные данные : Частота среза Fc = 500.0000 Гц
Неравномерность Аф = 2.0000 дБ
Граничная частота F1 = 800.0000 Гц
Затухание BФ = 30.0000 дБ
------------------------------------------------------------------------------
порядок,тип звена Q С1,мкФ С2,мкФ R1,кОм R2,кОм R3,кОм R4,кОм
------------------------------------------------------------------------------
2 звено МОС 0.5098 0.0100 0.0231 23.910 29.236 14.012
2 звено МОС 0.6013 0.0100 0.0280 26.504 24.785 13.644
2 звено МОС 0.9000 0.0100 0.0628 17.709 16.561 9.117
2 звено МОС 2.5629 0.0100 0.5090 6.219 5.815 3.201
------------------------------------------------------------------------------
Порядок фильтра = 8
Количество звеньев = 4
------------------------------------------------------------------------------
П3. График АЧХ фильтра, полученный с помощью разработанной программы
П4.Протокол расчета схемы фильтра
с помощью разработанной программы
Результаты расчета ФНЧ с аппроксимацией АЧХ по Баттерворту
------------------------------------------------------------------------------
Исходные данные : Частота среза Fc = 500.0000 Гц
Неравномерность Аф = 2.0000 дБ
Граничная частота F1 = 800.0000 Гц
Затухание BФ = 30.0000 дБ
------------------------------------------------------------------------------
Порядок фильтра = 8
Количество звеньев = 4
------------------------------------------------------------------------------
Звено второго порядка
с многопетлевой ОС
Q = 0.5098
C1= 0.0100 мкФ
C2= 0.0231 мкФ
R1= 23.9096 кОм
R2= 29.2360 кОм
R3= 14.0115 кОм
---------------------
Звено второго порядка
с многопетлевой ОС
Q = 0.6013
C1= 0.0100 мкФ
C2= 0.0280 мкФ
R1= 26.5037 кОм
R2= 24.7851 кОм
R3= 13.6438 кОм
---------------------