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

Разработка программного обеспечения на языке 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

Здесь описываются директивы препроцессора и глобальные определения, необходимые для работы программы - объявления функций и глобальных переменных.

Модуль mainpp

Содержит объявления всех глобальных переменных, функцию 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

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.