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.

Założenia

Danymi dla programu jest opis obwodu w postaci pliku tekstowego, o formacie wzorowanym na formacie danych dla programu SPICE.

Opis formatu danych

·         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.

Wiersz reprezentująca rezystor

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Ω.

Wiersz reprezentująca kondensator

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.

Wiersz reprezentująca niezależne źródło prądowe

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.

Wiersz reprezentująca źródło prądowe sterowane napięciem

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.

Przykład najprostszego modelu reprezentującego wzmacniacz operacyjny

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

Działanie programu analizy liniowej RLC

Etap 1 - interpretacja pliku opisującego obwód

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;  

    }

}

Przykład definicji typów zmiennych i deklaracji zmiennych

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];

 Przykład dopisywania rezystora do macierzy G

 

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;

Przykład dopisywania źródła prądowego sterowane napięciem do macierzy G

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;

Przykład dopisywania niezależnego źródła prądowego do macierzy I

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;

Etap 2 - analiza częstotliwościowa obwodu

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ę.

Testowanie i wykorzystanie programu

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

 

Sprawozdanie

Dokonać liniowej analizy wzmacniacza tranzystorowego i porównać wyniki otrzymane przy pomocy programu z wynikami uzyskanymi na papierze.