Wydział Elektryczny
Politechniki Lubelskiej
Instytut Podstaw Elektrotechniki i Elektrotechnologii
LABORATORIUM
KOMPUTEROWEGO WSPOMAGANIA PROJEKTOWANIA
Temat : Projekt filtru dolnoprzepustowego LC typu Π utworzonego w programie DELPHI
Grupa ED 6.3
Łupina Marcin
Machometa Jakub
Symulowany rodzaj filtru
Rys.1. Schemat filtru dolnoprzepustowego LC typu PI.
Obliczenia do projektu
Parametry łańcuchowe dla czwórnika typu Π:
A∏ = 1+Y1*Z
B∏ = Z
C∏ = Y1+Y2+Y1*Y2*Z
D∏ = 1+Y2*Z
Badany filtr jest filtrem symetrycznym toteż: Y1 = Y2
Y1 = jωC1 Y2 = jωC1 Z = jωL
Parametry łańcuchowe dla filtru z zastosowaniem liczb zespolonych:
A∏ = 1- ω2(LC)
B∏ = - jωL
C∏ = 2jωC + jω3(L+C2)
D∏ = 1- ω2(LC)
Częstotliwość graniczna:
f =
Pulsacja graniczna:
ωo =
Impedancja falowa
ZC∏ =
Wstęp do programu
Rys.2. Główne okno programu
Rys.3. Wstawianie danych do obliczeń
Rys.4.Przykładowy przebieg współczynników tłumienia i fazowego.
Rys.5. Dobór parametrów dla dławika
Rys.6. Okno z danymi katalogowymi
Opis procedur programu
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, Unit2, Math;
type
TForm1 = class(TForm)
GroupBox2: TGroupBox;
Edit7: TEdit;
Button1: TButton;
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Edit2: TEdit;
Button2: TButton;
GroupBox1: TGroupBox;
Label3: TLabel;
GroupBox3: TGroupBox;
Image1: TImage;
Image2: TImage;
Image3: TImage;
Button3: TButton;
Label4: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure drawC(c: array of TComplexNumber; r: bool; col: TColor; l: string; x,y: integer; cl:bool);
function czest(l,poj,f,i: double): TComplexNumber;
function complex(r,i: double):TComplexNumber;
procedure drawU(l,c,f: double);
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Unit3;
{$R *.dfm}
var cp: TComplexMath;
var ega: array of TComplexNumber;
function TForm1.complex(r,i: double):TComplexNumber;
begin
result.R:=r;
result.I:=i;
end;
procedure Tform1.drawC(c: array of TComplexNumber; r: bool; col: TColor; l: string; x,y: integer; cl:bool);
var i,yy: integer;
rr: TRect;
begin
rr.Top:=0;
rr.Left:=0;
rr.Right:=image2.Width;
rr.Bottom:=image2.Height;
if cl then image2.Canvas.FillRect(rr);
image2.Canvas.MoveTo(0,0);
image2.Canvas.Pen.Color:=col;
image2.Canvas.Font.Color:=col;
for i:=0 to image2.Width do
begin
if r then
yy:=round(c[i].r*20)
else
yy:=round(c[i].i*20);
yy:=round(image2.Height/2)-yy;
image2.Canvas.LineTo(i,yy);
end;
image2.Canvas.TextOut(x,y,l);
end;
function TForm1.czest(l,poj,f,i: double): TComplexNumber;
var
y,z,a,b,c,eg: TComplexNumber;
omega: double;
begin
omega:=2*pi*f;
z:=complex(0,omega*l);
y:=complex(0,omega*poj);
a:= cp.Add(complex(1,0),cp.Multiply(z,y));
b:= z;
c:= cp.Add(cp.Multiply(complex(2,0),y),cp.Multiply(cp.Square(y),z));
eg:=cp.Add(a,cp.SquareRoot(cp.Multiply(b,c)));
result:=eg;
end;
procedure TForm1.drawU(l,c,f: double);
var i,s,u2,i2,multi: integer;
y,z,a,b,cc,eg,zc,u2c: TComplexNumber;
omega: double;
r: TRect;
begin
r.Top:=0;
r.Left:=0;
r.Right:=image3.Width;
r.Bottom:=image3.Height;
image3.Canvas.FillRect(r);
multi:=10;
s:=image3.Height div 2;
image3.Canvas.MoveTo(0,s);
image3.Canvas.Pen.Color:=clBlack;
for i:=0 to image3.Width do
begin
image3.Canvas.LineTo(i,s+round(sin(degtorad(i mod 360))*multi));
end;
omega:=2*pi*f;
z:=complex(0,omega*l);
y:=complex(0,omega*c);
a:= cp.Add(complex(1,0),cp.Multiply(z,y));
b:= z;
cc:= cp.Add(cp.Multiply(complex(2,0),y),cp.Multiply(cp.Square(y),z));
zc:=cp.SquareRoot(cp.Divide(b,cc));
eg:=cp.Add(a,cp.SquareRoot(cp.Multiply(b,cc)));
image3.Canvas.MoveTo(0,s);
image3.Canvas.Pen.Color:=clBlue;
for i:=0 to image3.Width do
begin
u2:=round(cp.complexAbs(cp.Divide(complex(sin(degtorad(i mod 360)),0),eg))*multi);
if sin(degtorad(i mod 360))<0 then u2:=u2*-1;
image3.Canvas.LineTo(i,s+u2);
end;
image3.Canvas.MoveTo(0,s);
image3.Canvas.Pen.Color:=clGreen;
for i:=0 to image3.Width do
begin
u2c:=cp.Divide(complex(sin(degtorad(i mod 360)),0),eg);
i2:=round(cp.ComplexAbs(cp.Divide(u2c,zc))*multi);
if sin(degtorad(i mod 360))<0 then i2:=i2*-1;
image3.Canvas.LineTo(i,s+i2);
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
l,c,f0:double;
i:integer;
begin
l:=strtofloat(edit1.Text);
c:=strtofloat(edit2.Text)*10e-6;
f0:=(2/sqrt(c*l))/(2*pi); //wzór na f0
Label3.Caption:=Format('Wyliczona przez program: %.3fHz',[f0]);
image2.Canvas.MoveTo(0,0);
image2.Canvas.Pen.Color:=clBlack;
setLength(ega,image2.Width+1);
for i:=1 to image2.Width do
begin
ega[i]:=czest(l,c,f0*(i/image2.Width),i); // *(i/image2.Width) - krok przy rysowaniu wykresów a i b - chyba lepiej by wyglądało gdyby to rosło logarytmicznie nie liniowo
end;
drawC(ega,true,clRed,'a',5,5,true);
drawC(ega,false,clBlue,'b',5,25,false);
drawU(l,c,f0/2);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
cp := TComplexMath.Create(Form1);
end;
procedure TForm1.Button2Click(Sender: TObject);
var
f0, cl: double;
q: integer;
begin
f0:=strToFloat(edit7.Text)*1000;
cl:=math.Power(1/(pi*f0),2); //wzór na iloczyn cl
q:=MessageBox(form1.Handle,PChar(format('Iloczyczn indukcyjnosci i pojemnosci użytych w filtrze musi wynosic: %3.10f.'#10#13'Przykładowe elementy:'#10#13'Cewka L=1H'#10#13'Kondensator C=%3.0fuF'#10#13#10#13'Wstawic do obliczen?',[cl,cl*10e10])),PAnsiChar('Wyliczanie parametrów'),(MB_YESNO + MB_ICONASTERISK));
if q=6 then
begin
edit1.Text:='1';
edit2.Text:=floatToStr(round(cl*10e10));
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
Form3.ShowModal();
end;
end.
Wnioski końcowe
Założenie teoretyczne dotyczące projektowania filtru dolnoprzepustowego zostały pomyślnie wprowadzone do struktury programu Delphi. Wszelkie błędy które mogły wyniknąć z nie idealnego symulowanie pracy filtru w powyższym programie, wzięły się z mojej dość małej wiedzy na temat programowania w środowisku DELPHI. Wyznaczanie częstotliwości granicznej na podstawie jednej stałej wartości indukcyjności i zmiennej pojemności.