Анализ сигнала на выходе электрической цепи
Разработка программного обеспечения на языке C. Определение сигнала на выходе цепи, формирование его передаточной характеристики. Расчет длительности переднего фронта входного и выходного сигнала. Выбор структуры, отладка и тестирование программы.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 26.09.2014 |
Размер файла | 83,0 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Курсовая работа
по программированию
на тему:
Анализ сигнала на выходе электрической цепи
Содержание
Введение
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
Здесь описываются директивы препроцессора и глобальные определения, необходимые для работы программы - объявления функций и глобальных переменных.
Модуль main.сpp
Содержит объявления всех глобальных переменных, функцию main() а также функции input_data() и display_data()
Глобальные переменные:
Массивы времени, входных и выходных данных
double time[N];
double Uvx[N];
double Uvix[N];
Переменные рабочего набора
double t_begin = 0, t_end = 20, t_1 = 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.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 |
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 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, t_1;
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, t_1 = 10;
double a = 50, b = 0.75, c = 5;
double U1 = 20, U2 = 100;
double timedelta=0;
void display_data()
{
printf("%25s%20s%20s\n\n", "time", "Uvx", "Uvix");
for (int i = 0; i < N; i++)
{
printf( "%5d%20.3lf%20.7lf%20.7lf\n", i+1, time[i], Uvx[i], Uvix[i] );
}
}
void input_data()
{
printf("1) T_begin: %10.3lf\n", t_begin);
printf("2) T_end: %10.3lf\n", t_end);
printf("3) T_1: %10.3lf\n", t_1);
printf("4) a: %10.3lf\n", a);
printf("5) b: %10.3lf\n", b);
printf("6) c: %10.3lf\n", c);
printf("7) U1: %10.3lf\n", U1);
printf("8) U2: %10.3lf\n", 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("OK\n");
break;
}
case '2':
{
scanf("%lf", &t_end);
printf("OK\n");
break;
}
case '3':
{
scanf("%lf", &t_1);
printf("OK\n");
break;
}
case '4':
{
scanf("%lf", &a);
printf("OK\n");
break;
}
case '5':
{
scanf("%lf", &b);
printf("OK\n");
break;
}
case '6':
{
scanf("%lf", &c);
printf("OK\n");
break;
}
case '7':
{
scanf("%lf", &U1);
printf("OK\n");
break;
}
case '8':
{
scanf("%lf", &U2);
printf("OK\n");
break;
}
default:
//printf("Unrecognised");
break;
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
char op;
while(true)
{
printf("\n\nEnter charachter:\n\n1) Form arrays\n2) Determine fronts\n3)
Output arrays to files\n4) Read data from file\n5) Input variables
manually\n6) Write data to file\n7) Display data\n8) Exit\n\n");
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 command\n");
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] <= t_1)
{
Uvx[i] = a * ( 1.0 - exp(-b * time[i]) );
}
else
{
Uvx[i] = a * ( 1.0 - exp(-b * time[i]) ) * exp(-c * ( time[i] - t_1 ));
}
}
}
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, &t_1);
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<N; 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()
{
FILE *f;
fopen_s(&f, "data.txt", "w");
fprintf(f, "tbegin %14.5lf\n", t_begin);
fprintf(f, "tend %14.5lf\n", t_end);
fprintf(f, "t1 %14.5lf\n", t_1);
fprintf(f, "a %14.5lf\n", a);
fprintf(f, "b %14.5lf\n", b);
fprintf(f, "c %14.5lf\n", c);
fprintf(f, "U1 %14.5lf\n", U1);
fprintf(f, "U28 %14.5lf\n", U2);
fprintf(f, "-------------------------------------------------------------");
fprintf(f, "| # | time | Uvx | Uvix |\n");
fprintf(f, "-------------------------------------------------------------");
for(int i = 0; i < N; i++)
{
fprintf(f, "|%14d|",i+1);
fprintf(f, "%14.2lf|",time[i]);
fprintf(f, "%14.5lf|",Uvx[i]);
fprintf(f, "%14.5lf|",Uvix[i]);
fprintf(f, "\n");
}
fclose(f);
}
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<N;i++)
{
fprintf(f1,"%20.7f\n",time[i]);
fprintf(f2,"%20.7f\n", Uvx[i]);
fprintf(f3,"%20.7f\n", Uvix[i]);
}
fclose(f1);
fclose(f2);
fclose(f3);
}
Размещено на Allbest.ru
Подобные документы
Разработка проектов на языке программирования высокого уровня. Составление алгоритма решения. Определение длительности переднего фронта входного, выходного сигнала. Работа с дисковыми файлами. Представление программы в виде иерархической структуры блоков.
курсовая работа [163,2 K], добавлен 28.05.2015Приведение выходного сигнала к аналитическому вид. Программа расчёта характеристик выходного сигнала электрической цепи. Таблица идентификаторов и описаний пользовательских подпрограмм. Построение графиков по массивам входного и выходного сигналов.
контрольная работа [594,2 K], добавлен 28.09.2012Описание объекта управления - флотомашина ФПМ-16. Определение передаточной функции формирующего фильтра сигнала помехи. Имитационное моделирование САУ при действии сигнала помехи. Определение соотношения "Сигнал/шум" на выходе фильтра и выходе САУ.
курсовая работа [1021,4 K], добавлен 23.12.2012Процедура формирования массивов отсчетов входного и выходного сигналов и времени; вычисление величины заданной характеристики выходного сигнала: функция нахождения длительности импульса; организация текстовых файлов; построение графиков в системе MathCad.
курсовая работа [75,9 K], добавлен 28.09.2012Описание архитектуры процессора TMS320C25. Моделирование фильтра в модуле FDATool программной среды Matlab. Алгоритм нерекурсивной фильтрации сигнала. Расчет массива отсчетов входного сигнала. Моделирование фильтра при различных частотах входного сигнала.
курсовая работа [119,2 K], добавлен 14.06.2015Разработка программного обеспечения, предназначенного для изменения характеристик исходного звукового сигнала с целью изменения характеристик его звучания. Алгоритмы обработки и фильтрации звукового сигнала, редактирование его, изменение темпа и уровня.
дипломная работа [1,8 M], добавлен 08.07.2008Тестирование и отладка программного обеспечения: понятие, принципы, этапы, цели и задачи. Тестирование методом сандвича как компромисс между восходящим и нисходящим подходами. Сущность метода "белого и черного ящика", отладки программного обеспечения.
курсовая работа [36,9 K], добавлен 21.07.2012Защита электрооборудования и сетей от тока короткого замыкания и перегрузок. Разработка программного обеспечения для расчета номинала предохранителя в электрической цепи. Выбор языка программирования. Требования к составу и параметрам технических средств.
курсовая работа [233,2 K], добавлен 31.03.2018Изучение этапов интеллектуализации средств измерений на основе цифровой микропроцессорной техники. Обзор возможностей языка Ассемблера для системного программирования средств измерений. Анализ формирования входного сигнала и записи его в массив Simple.
курсовая работа [1,6 M], добавлен 11.01.2012Порядок и методика моделирования входного сигнала, общие принципы представления сигналов математическими моделями. Взаимосвязь математических моделей с компьютерными, их место и значение на современном этапе. Пакеты для моделирования различных процессов.
реферат [1,1 M], добавлен 19.04.2009