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

0x01 graphic

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 = 0x01 graphic

Pulsacja graniczna:

ωo = 0x01 graphic

Impedancja falowa

ZC = 0x01 graphic

Wstęp do programu

0x01 graphic

Rys.2. Główne okno programu

0x01 graphic

Rys.3. Wstawianie danych do obliczeń

0x01 graphic

Rys.4.Przykładowy przebieg współczynników tłumienia i fazowego.

0x01 graphic

Rys.5. Dobór parametrów dla dławika

0x01 graphic

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.