Анализ сигнала на выходе электрической цепи
Курсовая
работа
по
программированию
на тему:
Анализ
сигнала на выходе электрической цепи
Содержание
Введение
.
Описание задачи:
.
Анализ поставленной задачи
.
Разработка структуры программы
.
Тестирование программы
Заключение
Использованная
литература
Приложение
Введение
Целью этой курсовой работы является получение
навыков в разработке программного обеспечения на языке 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
Здесь описываются директивы препроцессора и
глобальные определения, необходимые для работы программы - объявления функций и
глобальных переменных.
Модуль main.сpp
Содержит объявления всех глобальных переменных,
функцию 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);
}