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

 












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

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

на тему:

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




Содержание


Введение

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

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

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

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

Заключение

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

Приложение



Введение


Целью этой курсовой работы является получение навыков в разработке программного обеспечения на языке 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 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ