Помощь в написании студенческих работ
Антистрессовый сервис

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

КурсоваяПомощь в написанииУзнать стоимостьмоей работы

Здесь описываются директивы препроцессора и глобальные определения, необходимые для работы программы — объявления функций и глобальных переменных. Void write_data () — записывает в файл data. txt рабочие данные и массивы времени, входного и выходного напряжения в виде таблицы. Void display_data () — функция, выводящая на экран массивы времени, входного и выходного напряжения в виде таблицы… Читать ещё >

Анализ сигнала на выходе электрической цепи (реферат, курсовая, диплом, контрольная)

Курсовая работа по программированию на тему:

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

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

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

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

4. Тестирование программы Заключение Использованная литература Приложение

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

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

Имеется электрическая цепь, на вход которой подаётся определённый сигнал 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];

double Uvx[N];

double Uvix[N];

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

double t_begin = 0, t_end = 20, t1 = 10;

double a = 50, b = 0.75, c = 5;

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

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

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

time

Uvx

Uvx Maxima

Uvix

Uvix Maxima

0.0

0.0

38.84 349

38.843

100.0

47.51 065

47.511

100.0

49.44 455

49.445

100.0

49.87 606

49.876

100.0

49.97 235

49.972

100.0

0.227

0.227

0.1 135

0.0113

0.0

1.3 055*10^-7

0.0

5.15 274*10^-7

0.0

4.67 878*10^-12

0.0

2.33 939*10^-11

0.0

2.12 417*10^-16

0.0

1.6 209*10^-15

0.0

9.64 375*10^-21

0.0

4.82 187*10^-20

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

Time

Uvx

UvxMaxima

Uvix

UvixMaxima

0.5 826 524

0.583

2.9 132 619

2.9133

0.7 126 597

0.713

3.5 632 985

3.5633

0.7 416 683

0.742

3.7 083 413

3.7083

0.7 481 409

0.748

3.7 407 047

3.7407

0.7 495 852

0.75

3.7 479 259

3.7479

0.340

3.40 457*10^-5

0.1 702

1.70 229*10^-4

0.0

1.54 582*10^-9

0.0

7.72 911*10^-9

0.0

7.1 817*10^-14

0.0

3.50 909*10^-13

0.0

3.18 626*10^-18

0.0

1.59 313*10^-17

0.0

1.44 656*10^-22

0.0

7.23 281*10^-22

Заключение

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

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

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

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

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

Приложение

Исходный код

mainheader.h

#pragma once

#include

#include

#include

#define N 11

enum front

{

DECREASING = 0,

INCREASING = 1,

NOFRONT

};

enum frontside

{

LEFT = 0, //передний фронт

RIGHT //задний

};

extern double time[N];

extern double Uvx[N];

extern double Uvix[N];

extern double t_begin, t_end, t1;

extern double a, b, c;

extern double U1, U2;

extern double timedelta;

void read_data ();

void write_data ();

void output_arrays ();

void form_time ();

void form_Uvx ();

void form_Uvix ();

void getfront (double arr[N], frontside side);

main.cpp

#include «mainheader.h»

double time[N];

double Uvx[N];

double Uvix[N];

double t_begin = 0, t_end = 20, t1 = 10;

double a = 50, b = 0.75, c = 5;

double U1 = 20, U2 = 100;

double timedelta=0;

void display_data ()

{

printf («%25s%20s%20snn», «time», «Uvx», «Uvix»);

for (int i = 0; i < N; i++)

{

printf («%5d%20.3lf%20.7lf%20.7lfn», i+1, time[i], Uvx[i], Uvix[i]);

}

}

void input_data ()

{

printf («1) T_begin: %10.3lfn», t_begin);

printf («2) T_end: %10.3lfn», t_end);

printf («3) T1: %10.3lfn», t1);

printf («4) a: %10.3lfn», a);

printf («5) b: %10.3lfn», b);

printf («6) c: %10.3lfn», c);

printf («7) U1: %10.3lfn», U1);

printf («8) U2: %10.3lfn», U2);

printf («nEnter variable number and value. 0 to exit menu. n»);

char op = '1';

while (op ≠ '0')

{

scanf («%c», &op);

switch (op)

{

case '1':

{

scanf («%lf», &t_begin);

printf («OKn»);

break;

}

case '2':

{

scanf («%lf», &t_end);

printf («OKn»);

break;

}

case '3':

{

scanf («%lf», &t1);

printf («OKn»);

break;

}

case '4':

{

scanf («%lf», &a);

printf («OKn»);

break;

}

case '5':

{

scanf («%lf», &b);

printf («OKn»);

break;

}

case '6':

{

scanf («%lf», &c);

printf («OKn»);

break;

}

case '7':

{

scanf («%lf», &U1);

printf («OKn»);

break;

}

case '8':

{

scanf («%lf», &U2);

printf («OKn»);

break;

}

default:

//printf («Unrecognised»);

break;

}

}

}

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

{

char op;

while (true)

{

printf («nnEnter charachter: nn1) Form arraysn2) Determine frontsn3)

Output arrays to filesn4) Read data from filen5) Input variables

manuallyn6) Write data to filen7) Display datan8) Exitnn");

scanf («%c», &op);

switch (op)

{

case '1':

{

form_time ();

form_Uvx ();

form_Uvix ();

display_data ();

break;

}

case '2':

{

printf («Uvx:n»);

getfront (Uvx, LEFT);

getfront (Uvx, RIGHT);

printf («nUvix:n»);

getfront (Uvix, LEFT);

getfront (Uvix, RIGHT);

break;

}

case '3':

{

output_arrays ();

printf («nDone.n»);

break;

}

case '4':

{

read_data ();

printf («nDone.n»);

break;

}

case '5':

{

input_data ();

break;

}

case '6':

{

write_data ();

printf («nDone.n»);

break;

}

case '7':

{

display_data ();

break;

}

case '8':

{

exit (0);

break;

}

default:

{

printf («nUnrecognised commandn»);

break;

}

}

}

return 0;

}

Calc.cpp

#include «mainheader.h»

void form_time ()

{

timedelta = (t_end — t_begin) / double (N — 1);

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

{

time[i] = t_begin + i * timedelta;

}

}

void form_Uvx ()

{

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

{

if (time[i] <= t1)

{

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

}

else

{

Uvx[i] = a * (1.0 — exp (-b * time[i])) * exp (-c * (time[i] - t1));

}

}

}

void form_Uvix ()

{

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

{

if (Uvx[i] < U1)

{

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

}

else

{

Uvix[i] = U2;

}

}

}

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

{

front front = NOFRONT;

int frontlength = 0; //длина в шагах

int first = 0, second = 0; //индексы элементов для определения типа

фронта

double Umax, Umin, UH, UL;

if (side == LEFT)

{

first = 0; second = 1;

}

else if (side == RIGHT)

{

first = N-2; second = N-1;

}

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

{

front = INCREASING;

}

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

{

front = DECREASING;

}

if (side == LEFT)

{

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

{

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

DECREASING && arr[i-1] > arr[i]))

{

frontlength++;

}

else

{

break;

}

}

}

if (side == RIGHT)

{

for (int i = N-1; i > 0; i—)

{

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

DECREASING && arr[i-1] > arr[i]))

{

frontlength++;

}

else

{

break;

}

}

}

if (side == LEFT)

{

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

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

}

}

else if (side == RIGHT)

{

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

1]; }

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

frontlength-1]; }

}

UH = Umin + 0.9*(Umax-Umin);

UL = Umin + 0.1*(Umax-Umin);

double fronttime = 0;

if (side == LEFT)

{

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

{

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

}

}

else if (side == RIGHT)

{

for (int i = N-1; i > N-frontlength; i—)

{

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

}

}

char *frontside = (side == LEFT? «Forward»: «Back»);

char *fronttype = (front == DECREASING? «decreasing»: «increasing»);

if (front == NOFRONT)

{

printf («There is no %s front. n», frontside);

return;

}

else

{

printf («%s front is %s, duration is %20.15lf steps %d n», frontside,

fronttype, fronttime, frontlength);

}

}

File_io.cpp

#include «mainheader.h»

using namespace std;

void skipchars (FILE* f, int number)

{

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

{

fgetc (f);

}

}

void read_data ()

{

FILE *f;

char dummy[70];

fopen_s (&f, «data.txt», «r»);

fscanf (f, «%s %lf», &dummy, &t_begin);

fscanf (f, «%s %lf», &dummy, &t_end);

fscanf (f, «%s %lf», &dummy, &t1);

fscanf (f, «%s %lf», &dummy, &a);

fscanf (f, «%s %lf», &dummy, &b);

fscanf (f, «%s %lf», &dummy, &c);

fscanf (f, «%s %lf», &dummy, &U1);

fscanf (f, «%s %lf», &dummy, &U2);

char temp[255];

fgets (temp, 255, f);

fgets (temp, 255, f);

//fgets (temp, 255, f);

for (int i=0; i

{

skipchars (f, 16);

fscanf_s (f, «%lf», &(time[i]));

fscanf_s (f, «%*c%lf», &(Uvx[i]));

fscanf_s (f, «%*c%lf%*c», &(Uvix[i]));

fgets (temp, 255, f);

}

fclose (f);

}

void write_data ()

Uvx

void output_arrays ()

{

FILE *f1,*f2,*f3;

fopen_s (&f1," array_time.txt" ," w");

fopen_s (&f2," array_Uvx.txt", «w»);

fopen_s (&f3," array_Uvix.txt", «w»);

for (int i=0;i

{

fprintf (f1," %20.7fn", time[i]);

fprintf (f2," %20.7fn", Uvx[i]);

fprintf (f3," %20.7fn", Uvix[i]);

}

fclose (f1);

fclose (f2);

fclose (f3);

}

Показать весь текст
Заполнить форму текущей работой