Анализ сигнала на выходе электрической цепи
Курсовая работа
по программированию
на тему:
Анализ сигнала на выходе электрической цепи
Содержание
Введение
. Описание задачи:
. Анализ поставленной задачи
. Разработка структуры программы
. Тестирование программы
Заключение
Использованная литература
Приложение
Введение
Целью этой курсовой работы является получение навыков в разработке программного обеспечения на языке 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.
4. Тестирование программы
Тесты, подтверждающие правильность работы программы. Расчёты сделаны в wxMaxima. Большой сигнал (а = 50)
timeUvxUvx MaximaUvixUvix Maxima00.0000000.000000238.8434938.843100.00000100447.5106547.511100.00000100649.4445549.445100.00000100849.8760649.876100.000001001049.9723549.972100.00000100120.002270.002270.011350.0113140.000001.03055*10^-70.000005.15274*10^-7160.000004.67878*10^-120.000002.33939*10^-11180.000002.12417*10^-160.000001.06209*10^-15200.000009.64375*10^-210.000004.82187*10^-20Малый сигнал (а = 0.75)
TimeUvxUvxMaximaUvixUvixMaxima0000020.58265240.5832.91326192.913340.71265970.7133.56329853.563360.74166830.7423.70834133.708380.74814090.7483.74070473.7407100.74958520.753.74792593.7479120.00003403.40457*10^-50.00017021.70229*10^-4140.00000001.54582*10^-90.00000007.72911*10^-9160.00000007.01817*10^-140.00000003.50909*10^-13180.00000003.18626*10^-180.00000001.59313*10^-17200.00000001.44656*10^-220.00000007.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
#include "mainheader.h"time[N];Uvx[N];Uvix[N];t_begin = 0, t_end = 20, t_1 = 10;a = 50, b = 0.75, c = 5;U1 = 20, U2 = 100;timedelta=0;display_data()
{("%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);
}
Больше работ по теме:
Предмет: Информационное обеспечение, программирование
Тип работы: Курсовая работа (т)
Новости образования
КОНТАКТНЫЙ EMAIL: [email protected]
Скачать реферат © 2017 | Пользовательское соглашение
ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ