Анализ сигнала на выходе электрической цепи

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    21,55 Кб
  • Опубликовано:
    2015-07-21
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Анализ сигнала на выходе электрической цепи












Курсовая работа

по программированию

на тему:

Анализ сигнала на выходе электрической цепи

Содержание

Введение

. Описание задачи:

. Анализ поставленной задачи

. Разработка структуры программы

. Тестирование программы

Заключение

Использованная литература

Приложение

Введение

Целью этой курсовой работы является получение навыков в разработке программного обеспечения на языке C, а также анализ и решение поставленной задачи и обоснование выбранных методов реализации программы.

. Описание задачи:

Имеется электрическая цепь, на вход которой подаётся определённый сигнал Uвх. Необходимо по заданному входному сигналу определить сигнал на выходе цепи (Uвых )

Входной сигнал задаётся на временном отрезке в соответствии с графиком:


Рабочий набор:

T нач = 0, t кон = 20

t1 = 10

a = 50В

b = 0.75 1/c

c = 5 1/c

Сигнал на выходе формируется в соответствии с передаточной характеристикой:


Рабочий набор:

U1 = 20 В

U2 = 100 В

Также требуется рассчитать длительность переднего фронта входного и выходного сигнала

2. Анализ поставленной задачи

Рассмотрим график входного сигнала. Он описывается данной функцией:

На промежутке от t нач до t1: Uvx(t) =

На промежутке от t 1 до t кон: Uvx(t) =

Выходной сигнал описан функцией, которая зависит от входного сигнала:


Очевидно, что на графике отражены две функции. Одна из них описывается уравнением:

Uвых(Uвх) = U1 / U2 * Uвх

Вторая формула:

Uвых(Uвх) = U2

Таким образом, можно ввести систему уравнений для выходного сигнала:

Uвых ( Uвх ) = U1 / U2 * Uвх при Uвх < U1

Uвых( Uвх ) = U2, при Uвх > U1

Таким образом, график функции Uвых(Uвх(t)) будет выглядеть вот так:


3. Разработка структуры программы

Программа разбита на функции, выполняющие свои задачи. Функции будут сгруппированы в модули, решающие схожие задачи. Возможны различные варианты организации структуры - программа может состоять из единственного файла, но гораздо целесообразнее разбить ее на модули. Разбиение на модули может происходить по-разному, но исходя из задач программы, в которые входит, помимо вычислений, и работа с файлами, как для ввода, так и для вывода данных, были выделены главный модуль, являющийся связующим звеном и содержащий меню программы, модуль, отвечающий за вычисления и модуль, отвечающий за работу с файлами. Роль массивов в реализации функций программы существенна - эта структура данных, представляющая собой набор элементов одного типа, позволяет нам с легкостью хранить и обращаться к данным программы независимо от их объема. Программа состоит из следующих модулей:

Заголовочный файл mainheader.h

Здесь описываются директивы препроцессора и глобальные определения, необходимые для работы программы - объявления функций и глобальных переменных.

Модуль mainpp

Содержит объявления всех глобальных переменных, функцию main() а также функции input_data() и display_data()

Глобальные переменные:

Массивы времени, входных и выходных данных

double time[N];Uvx[N]; Uvix[N];

Переменные рабочего набора

double t_begin = 0, t_end = 20, t_1 = 10;a = 50, b = 0.75, c = 5;U1 = 20, U2 = 100;

Функция main() является главной связующей между всеми модулями и функциями программы. В ней объявляются массивы данных и переменные рабочего набора и содержится главный цикл, который выполняется до тех пор, пока пользователь не выберет опцию выхода.

void Input_data() - функция, позволяющая ввести рабочие данные.

void display_data() - функция, выводящая на экран массивы времени, входного и выходного напряжения в виде таблицы.

Модуль calc.cpp

В этом модуле содержатся все функции вычислений.

void form_time() - функция, формирующая массив времени

void form_Uvx() - функция, формирующая массив входных данных

void form_Uvix() - функция, формирующая массив выходных данных

void getfront( double arr[N], frontside side ) - рассчитывает и выводит на экран тип и длительность указанного в переменной side фронта, где side - enumeration, принимающий значения LEFT и RIGHT

Модуль file_io.cpp

void read_data() - читает набор данных из файла data.txt

void write_data() - записывает в файл data.txt рабочие данные и массивы времени, входного и выходного напряжения в виде таблицы.

void output_arrays() - выводит массивы времени, входного и выходного напряжения в виде таблицы.в файлы array_time.txt, array_Uvx.txt и array_Uvix.txt в формате, удобном для чтения в программе Maxima.


Тесты, подтверждающие правильность работы программы. Расчёты сделаны в wxMaxima. Большой сигнал (а = 50)

time

Uvx

Uvx Maxima

Uvix

Uvix Maxima

0

0.00000

0

0.00000

0

2

38.84349

38.843

100.00000

100

4

47.51065

47.511

100.00000

100

6

49.44455

49.445

100.00000

100

8

49.87606

49.876

100.00000

100

10

49.97235

49.972

100.00000

100

12

0.00227

0.00227

0.01135

0.0113

14

0.00000

1.03055*10^-7

0.00000

5.15274*10^-7

16

0.00000

4.67878*10^-12

0.00000

2.33939*10^-11

18

0.00000

2.12417*10^-16

0.00000

1.06209*10^-15

20

0.00000

9.64375*10^-21

0.00000

4.82187*10^-20

Малый сигнал (а = 0.75)

Time

Uvx

UvxMaxima

Uvix

UvixMaxima

0

0

0

0

2

0.5826524

0.583

2.9132619

2.9133

4

0.7126597

0.713

3.5632985

3.5633

6

0.7416683

0.742

3.7083413

3.7083

8

0.7481409

0.748

3.7407047

3.7407

10

0.7495852

0.75

3.7479259

3.7479

12

0.0000340

3.40457*10^-5

0.0001702

1.70229*10^-4

14

0.0000000

1.54582*10^-9

0.0000000

7.72911*10^-9

16

0.0000000

7.01817*10^-14

0.0000000

3.50909*10^-13

18

0.0000000

3.18626*10^-18

0.0000000

1.59313*10^-17

20

0.0000000

1.44656*10^-22

0.0000000

7.23281*10^-22

Заключение

Поставленная задача успешно проанализирована и решена, получены навыки разработки программного обеспечения на языке C, а также навыки отладки и тестирования программы. Так как программа имеет модульную структуру, легко осуществить ее возможное расширение. Например, возможно добавить графический интерфейс переписав меню, но не затрагивая остального кода; также программа может быть адаптирована под решение более сложной задачи путем расширения соответствующих функций вычислений.

программа сигнал передаточный цепь

Использованная литература:

1. Б. Керниган, Д. Ритчи - «Язык программирования С» 2011

2.      Герберт Шилдт - «Полный справочник по С» 2009

Приложение

Исходный код

mainheader.h

#pragma once

#include <stdio.h>

#include <math.h>

#include <stdlib.h>

#define N 11front

{= 0,= 1,

};frontside

{= 0, //передний фронт//задний

};double time[N];double Uvx[N];double Uvix[N];double t_begin, t_end, t_1;double a, b, c;double U1, U2;double timedelta;read_data();write_data();output_arrays();form_time();form_Uvx();form_Uvix();getfront( double arr[N], frontside side );

main.cpp

{("%25s%20s%20s\n\n", "time", "Uvx", "Uvix");(int i = 0; i < N; i++)

{( "%5d%20.3lf%20.7lf%20.7lf\n", i+1, time[i], Uvx[i], Uvix[i] );

}

}input_data()

{("1) T_begin: %10.3lf\n", t_begin);("2) T_end: %10.3lf\n", t_end);("3) T_1: %10.3lf\n", t_1);("4) a: %10.3lf\n", a);("5) b: %10.3lf\n", b);("6) c: %10.3lf\n", c);("7) U1: %10.3lf\n", U1);("8) U2: %10.3lf\n", U2);("\nEnter variable number and value. 0 to exit menu.\n");op = '1';( op != '0' )

{("%c", &op);(op)

{'1':

{("%lf", &t_begin);("OK\n");;

}'2':

{("%lf", &t_end);("OK\n");;

}'3':

{("%lf", &t_1);("OK\n");;

}'4':

{("%lf", &a);("OK\n");;

}'5':

{("%lf", &b);("OK\n");;

}'6':

{("%lf", &c);("OK\n");;

}'7':

{("%lf", &U1);("OK\n");;

}'8':

{("%lf", &U2);("OK\n");;

}:

//printf("Unrecognised");;

}

}

}_tmain(int argc, _TCHAR* argv[])

{op;(true)

{("\n\nEnter charachter:\n\n1) Form arrays\n2) Determine fronts\n3) arrays to files\n4) Read data from file\n5) Input variables \n6) Write data to file\n7) Display data\n8) Exit\n\n");(" %c", &op);(op)

{'1':

{_time();_Uvx();_Uvix();_data();;

}'2':

{("Uvx:\n");(Uvx, LEFT);(Uvx, RIGHT);("\nUvix:\n");(Uvix, LEFT);(Uvix, RIGHT);;

}'3':

{_arrays();("\nDone.\n");;

}'4':

{_data();("\nDone.\n");;

}'5':

{_data();;

}'6':

{_data();("\nDone.\n");;

}'7':

{_data();;

}'8':

{(0);;

}:

{("\nUnrecognised command\n");;

}

}

}0;

}

Calc.cpp

#include "mainheader.h"form_time()

{= (t_end - t_begin) / double(N - 1); (int i = 0; i < N; i++) // Формирование массива времени t

{[i] = t_begin + i * timedelta;

}

}form_Uvx()

{(int i = 0; i < N; i++) // Формирование массива Uvx

{(time[i] <= t_1)

{[i] = a * ( 1.0 - exp(-b * time[i]) );

}

{[i] = a * ( 1.0 - exp(-b * time[i]) ) * exp(-c * ( time[i] - t_1 ));

}

}

}form_Uvix()

{(int i = 0; i < N; i++) // Формирование массива Uvix

{(Uvx[i] < U1)

{[i] = U2 / U1 * Uvx[i];

}

{[i] = U2;

}

}getfront( double arr[N], frontside side )

{front = NOFRONT;frontlength = 0; //длина в шагах first = 0, second = 0; //индексы элементов для определения типа

фронтаUmax, Umin, UH, UL;( side == LEFT )

{= 0; second = 1;

}if ( side == RIGHT )

{= N-2; second = N-1;

}( arr[first] < arr[second] )

{= INCREASING;

}if ( arr[first] > arr[second] )

{= DECREASING;

}( side == LEFT )

{(int i = 1; i < N; i++)

{( (front == INCREASING && arr[i-1] < arr[i]) || (front == && arr[i-1] > arr[i]) )

{++;

}

{;

}

}

}( side == RIGHT )

{(int i = N-1; i > 0; i--)

{( (front == INCREASING && arr[i-1] < arr[i]) || (front == && arr[i-1] > arr[i]) )

{++;

}

{;

}

}

}( side == LEFT )

{( front == INCREASING ) { Umin = arr[0]; Umax = arr[frontlength]; }if ( front == DECREASING ) { Umin = arr[frontlength]; Umax = arr[0];

}

}if ( side == RIGHT )

{( front == INCREASING ) { Umin = arr[N-frontlength-1]; Umax = arr[N-

]; }if ( front == DECREASING ) { Umin = arr[N-1]; Umax = arr[N-]; }

}= Umin + 0.9*(Umax-Umin);= Umin + 0.1*(Umax-Umin);fronttime = 0;( side == LEFT )

{(int i = 0; i < frontlength; i++)

{( arr[i] >= UL && arr[i] <= UH ) fronttime += timedelta;

}

}if ( side == RIGHT )

{(int i = N-1; i > N-frontlength; i--)

{( arr[i] >= UL && arr[i] <= UH ) fronttime += timedelta;

}

}*frontside = ( side == LEFT? "Forward": "Back");*fronttype = ( front == DECREASING? "decreasing": "increasing");( front == NOFRONT )

{("There is no %s front.\n", frontside);;

}

{("%s front is %s, duration is %20.15lf steps %d \n", frontside, , fronttime, frontlength );

}

}

File_io.cpp

#include "mainheader.h"namespace std;skipchars(FILE* f, int number )

{( int i = 0; i <= number; i++)

{(f);

}

}read_data()

{*f;dummy[70];_s(&f, "data.txt", "r");(f, "%s %lf", &dummy, &t_begin);(f, "%s %lf", &dummy, &t_end);(f, "%s %lf", &dummy, &t_1);(f, "%s %lf", &dummy, &a);(f, "%s %lf", &dummy, &b);(f, "%s %lf", &dummy, &c);(f, "%s %lf", &dummy, &U1);(f, "%s %lf", &dummy, &U2);temp[255];(temp, 255, f);(temp, 255, f);

//fgets(temp, 255, f);(int i=0; i<N; i++)

{(f, 16);_s( f, "%lf", &(time[i]) );_s( f, "%*c%lf", &(Uvx[i]) );_s( f, "%*c%lf%*c", &(Uvix[i]) );(temp, 255, f);

}(f);

}write_data()

{*f;_s(&f, "data.txt", "w");(f, "tbegin %14.5lf\n", t_begin);(f, "tend %14.5lf\n", t_end);(f, "t1 %14.5lf\n", t_1);(f, "a %14.5lf\n", a);(f, "b %14.5lf\n", b);(f, "c %14.5lf\n", c);(f, "U1 %14.5lf\n", U1);(f, "U28 %14.5lf\n", U2);(f, "-------------------------------------------------------------");(f, "| # | time | Uvx | Uvix |\n");(f, "-------------------------------------------------------------");(int i = 0; i < N; i++)

{(f, "|%14d|",i+1);(f, "%14.2lf|",time[i]);(f, "%14.5lf|",Uvx[i]);(f, "%14.5lf|",Uvix[i]);(f, "\n");

}(f);

}output_arrays()

{*f1,*f2,*f3;_s(&f1,"array_time.txt","w");_s(&f2,"array_Uvx.txt", "w");_s(&f3,"array_Uvix.txt", "w");(int i=0;i<N;i++)

{(f1,"%20.7f\n",time[i]);(f2,"%20.7f\n", Uvx[i]);(f3,"%20.7f\n", Uvix[i]);

}(f1);(f2);(f3);

}

Похожие работы на - Анализ сигнала на выходе электрической цепи

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!