Program liniowej analizy obwodów RLC
Celem ćwiczenia jest stworzenie programu dokonującego analizy częstotliwościowej liniowych obwodów składających się z rezystorów, kondensatorów, cewek indukcyjnych, niezależnych źródeł prądowych i źródeł prądowych sterowanych napięciem.
Danymi dla programu jest opis obwodu w postaci pliku tekstowego, o formacie wzorowanym na formacie danych dla programu SPICE.
· Każdy wiersz tekstu reprezentuje jeden element obwodu lub komentarz.
· Każdy element obwodu musi mieć nazwę rozpoczynającą się literą określającą typ elementu.
· Wiersz opisujący element zaczyna się od jego nazwy.
· Nazwy rezystorów zaczynają się literą R.
· Nazwy kondensatorów zaczynają się literą C.
· Nazwy prądowych źródeł niezależnych zaczynają się literą I.
· Nazwy źródeł prądowych sterowanych napięciem zaczynają się literą G.
· Wszystkie węzły muszą być ponumerowane kolejnymi liczbami całkowitymi zaczynając od liczby 0.
· Węzeł 0 jest węzłem odniesienia (masy).
· Wiersz zaczynająca się znakiem * jest komentarzem.
Rx N1 N2 val
· Rx – nazwa rezystora (x reprezentuje dowolny ciąg znaków),
· N1 – pierwszy węzeł rezystora,
· N2 – drugi węzeł rezystora,
· val – wartość rezystancji w omach.
Wiersz - R1 7 8 1000 - reprezentuje rezystor o nazwie R1 włączony między węzły 7 i 8, o wartości rezystancji = 1000 Ω = 1 k Ω.
Wiersz - Rc 0 3 1e6 - reprezentuje rezystor o nazwie Rc włączony między węzły 0 i 3, o wartości rezystancji = 1e6 Ω = 1 MΩ.
Cx N1 N2 val
· Cx – nazwa kondensatora (x reprezentuje dowolny ciąg znaków),
· N1 – pierwszy węzeł kondensatora,
· N2 – drugi węzeł kondensatora,
· val – wartość pojemności w faradach.
Wiersz - C3 5 1 1e-12 - reprezentuje kondensator o nazwie C3 włączony między węzły 5 i 1, o wartości pojemności 1e-12 F = 1pF.
Wiersz - Cs 0 7 1e-9 - reprezentuje kondensator o nazwie Cs włączony między węzły 0 i 7, o wartości pojemności 1e-9 F = 1 nF.
Ix N+ N- val
· Ix – nazwa źródła prądowego (x reprezentuje dowolny ciąg znaków),
· N+ – dodatni węzeł źródła prądowego,
· N- – ujemny węzeł źródła prądowego,
· val – wydajność źródła w Amperach,
· dodatni prąd płynie od zacisku N+ przez źródło do zacisku N-.
Wiersz – I3 5 7 1e-3 – reprezentuje źródło prądowe o nazwie I3 włączone między węzły 5 i 7, o wydajności 1e-3A =1mA.
Wiersz – Io 0 3 1 – reprezentuje źródło prądowe o nazwie Io włączone między węzły 0 i 3, o wydajności 1A.
Gx N+ N- NC+ NC- val
· Gx – nazwa źródła prądowego (x reprezentuje dowolny ciąg znaków),
· N+ – dodatni węzeł źródła prądowego,
· N- – ujemny węzeł źródła prądowego,
· NC+ – dodatni węzeł sterujący źródła prądowego,
· NC- – ujemny węzeł sterujący źródła prądowego,
· val – wartość transkonduktancji w Simensach,
· dodatni prąd o wartości = val * (V(NC+) – V(NC-)) płynie od zacisku N+ przez źródło do zacisku N-.
Wiersz – G3 5 7 2 3 1e-3 – reprezentuje źródło prądowe o nazwie G3 włączone między węzły 5 i 7, o transkonduktancji 1e-3A =1mS i zaciskach sterujących 2, 3.
Wiersz – Gm 0 3 0 7 1 – reprezentuje źródło prądowe o nazwie Gm włączone między węzły 0 i 3, o transkonduktancji 1S i zaciskach sterujących 0, 7.
Dane wzmacniacza
· zaciski sterujące NC+ = 4, NC- = 5,
· zacisk wyjściowy: No = 7,
· impedancja wejściowa nieskończona,
· impedancja wyjściowa 50 Ω,
· wzmocnienie 10000 V/V.
Linie reprezentujące uproszczony model wzmacniacza
Go NC+ NC- 0 No 200
Ro No 0 50
Linie reprezentujące uproszczony model wzmacniacza po wstawieniu numerów węzłów
Go 4 5 0 7 200
Ro 7 0 50
W trakcie czytania pliku danych należy utworzyć rzeczywiste macierze (tablice typu double) konduktancji G, pojemności C, indukcyjności invL i zespolony wektor prądów węzłowych I. W dalszym etapie macierze te posłużą do utworzenia zespolonej macierzy admitancyjnej Y.
Określenie liczby węzłów niezależnych
int N = 0;//Liczba węzłów
int N1, N2, NC1, NC2; //Węzły zacisków elementów el.
string[] elementy; //Ciągi znaków podzielonego spacjami wiersza
char pierwsza_litera; //Pierwsza znak w wierszu
for (int k = 0; k < richTextBox1.Lines.Length; k++)
{
//Rozdzielenie lini tekstu na oddzielne ciągi znaków
elementy = richTextBox1.Lines[k].Split(new Char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
if (elementy.Length == 0) continue;
pierwsza_litera = elementy[0][0];
switch (pierwsza_litera)
{
case 'R':
case 'r':
case 'G':
case 'g':
case 'C':
case 'c':
case 'L':
case 'l':
N1 = Convert.ToInt32(elementy[1]);
N2 = Convert.ToInt32(elementy[2]);
N = Math.Max(N, N1);
N = Math.Max(N, N2);
break;
}
}
using MathNet.Numerics.LinearAlgebra.Complex;
using System.Numerics;
...
double[,] G = new double[N + 1, N + 1]; //Macierz konduktancji
double[,] C = new double[N + 1, N + 1]; //Macierz pojemności
double[,] invL = new double[N + 1, N + 1]; //Macierz ind.
Matrix Y = new DenseMatrix(N); //Macierz admitancji węzłowych
Vector I = new DenseVector(N); //Wektor prądów
Vector V = new DenseVector(N); //Wektor napięć węzłowych
double x; //Wartość elementu R, L, C, I, G
Plik opisu obwodu powinien być czytany wiersz po wierszu. Po przeczytaniu pierwszego znaku w wierszu – określającego rodzaj elementu – program powinien przeczytać jego opis i wpisać go do odpowiedniej macierzy.
string[] elementy; //Ciągi znaków podzielonego spacjami wiersza
char pierwsza_litera; //Pierwszy znak w wierszu
elementy = richTextBox1.Lines[k].Split(new Char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
pierwsza_litera = elementy[0][0];
N1 = Convert.ToInt32(elementy[1]);
N2 = Convert.ToInt32(elementy[2]);
x = Convert.ToDouble(elementy[3]);
x = 1 / x;
G[N1, N1] += x;
G[N2, N2] += x;
G[N1, N2] -= x;
G[N2, N1] -= x;
case 'G':
case 'g':
N1 = Convert.ToInt32(elementy[1]);
N2 = Convert.ToInt32(elementy[2]);
NC1 = Convert.ToInt32(elementy[3]);
NC2 = Convert.ToInt32(elementy[4]);
x = Convert.ToDouble(elementy[5]);
G[N1, NC1] += x;
G[N2, NC2] += x;
G[N1, NC2] -= x;
G[N2, NC1] -= x;
N1 = Convert.ToInt32(elementy[1]);
N2 = Convert.ToInt32(elementy[2]);
x = Convert.ToDouble(elementy[3]);
if (N1 > 0) I[N1 - 1] += -x;
if (N2 > 0) I[N2 - 1] += x;
Analizę częstotliwościową należy prowadzić od częstotliwości początkowej fstart do końcowej fstop, rozmieszczając między nimi, w zależności od potrzeb, dowolną liczbę punktów pomiarowych (obliczeniowych). Dla każdej z częstotliwości pomiarowych należy utworzyć zespoloną macierz Y, na podstawie opisu obwodu zawartego w macierzach G, C, invL.
Y[i - 1, k - 1] = new Complex(G[i, k], 2.0 * Math.PI * f * C[i, k] - invL[i, k] / (2.0 * Math.PI * f));
Do obliczenia wektora potencjałów węzłowych V należy posłużyć się metodą LU().Solve()
V = (Vector)Y.LU().Solve(I);
Wyniki działania programu – charakterystyki częstotliwościowe – należy przedstawić na wykresie Chart.
Danymi analizy częstotliwościowej steruje linia
.AC DEC liczba_punktów_na dekadę fstart fstop
Na przykład linia
.AC DEC 20 1 1e6
definiuje analizę częstotliwościową od 1 Hz do 1 MHz z 20 punktami pomiarowymi na dekadę.
W trakcie uruchamiania programu należy posłużyć się prostym plikiem danych zawierającym opis układu całkującego RC.
*Układ całkujący
Ii 0 1 1
Ri 0 1 1
R1 1 2 999
C1 2 0 1e-6
.AC DEC 20 1 1e6
Biegun transmitancji tego odwodu wypada dla częstotliwości f = 1/(2*π*1000*1e-6) = 159 Hz. Po uruchomieniu i przetestowaniu programu należy go wykorzystać do rozwiązania wybranych zadań przerabianych na przedmiocie Układy Analogowe.
Inny przykład
*Aktywny układ całkujący
Ii 0 1 1
Ri 0 1 1
R1 1 2 999
C1 2 3 1e-8
R2 2 3 10000
Gwo 0 3 2 0 200
Ro 3 0 50
.AC DEC 20 1 1e6
Dokonać liniowej analizy wzmacniacza tranzystorowego i porównać wyniki otrzymane przy pomocy programu z wynikami uzyskanymi na papierze.