Расчет на ЭВМ характеристик выходных сигналов электрических цепей

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    101,32 Кб
  • Опубликовано:
    2015-05-28
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

Расчет на ЭВМ характеристик выходных сигналов электрических цепей

Санкт-Петербургский государственный университет телекоммуникаций

им. проф. М.А. Бонч-Бруевича











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

по программированию на языке высокого уровня

на тему:  «Расчет на ЭВМ характеристик выходных сигналов электрических цепей»


Выполнил

Иванов В.О.



Санкт-Петербург

Введение

Целью данной курсовой работы является получение практических навыков в разработке и реализации проектов на языке программирования высокого уровня Си.

В данной работе необходимо:

. Проанализировать данную задачу, найти наиболее рациональный путь ее реализации.

. Составить алгоритм решения.

. Реализовать задачу на языке Си.

. Проверить работоспособность программы.

Необходимо написать программу, выполняющую следущие задачи:

. Формирование массивов входного и выходного сигнала.

. По заданному входному и выходному сигналу определить длительность переднего фронта входного и выходного сигнала.

. Записать эти данные на диск.

. Просмотр данных с диска.

. Сохранение, чтение и использование рабочего набора из файла.

Рисунок 1

программа алгоритм сигнал файл

Таблица 1

Идентификатор

Назначение

tn

Начальный момент времени наблюдения входного напряжения

Tk

Конечный момент времени наблюдения входного напряжения

Dt

Временной инетревал между двумя соседними отсчетами сигнала

N

Количество точек

T

Массив для хранения отсчетов времени

Uvx

Массив для хранения отсчетов входного сигнала

Uvix

Массив для хранения отсчетов вых. сигнала

t1

Текущие значения параметров вх. и вых. сигналов и вспомогательные переменные расчета параметров

i,j,max

переменная циклов

Number

переменная выбора в меню программы

EXIT

переменная выбора в меню завершения

Input, vxsig, vixsig, sec, fout, tm, ins, outsig, maxima, rrff

файловые переменные

MAXLEN,MAXSTR

Вспомогательные константы.


Структурное программирование - методология разработки программного обеспечения, в основе которой лежит представление программы в виде иерархической структуры блоков.

Любая программа представляет собой структуру, построенную из трёх типов базовых конструкций.

·              последовательное исполнение

·              ветвление

·              цикл

Повторяющиеся фрагменты программы (либо не повторяющиеся, но представляющие собой логически целостные вычислительные блоки) могут оформляться в виде т.н. функций. В этом случае в тексте основной программы, вместо помещённого в подпрограмму фрагмента, вставляется инструкция вызова подпрограммы.

Разработка программы ведётся пошагово, методом «сверху вниз».

Сначала пишется текст основной программы, в котором, вместо каждого связного логического фрагмента текста, вставляется вызов подпрограммы, которая будет выполнять этот фрагмент. Разработка заканчивается тогда, когда не останется ни одной ошибки, которая не была бы удалена. Такая последовательность гарантирует, что на каждом этапе разработки программист одновременно имеет дело с обозримым и понятным ему множеством фрагментов, и может быть уверен, что общая структура всех более высоких уровней программы верна. При сопровождении и внесении изменений в программу выясняется, в какие именно процедуры нужно внести изменения, и они вносятся, не затрагивая части программы, непосредственно не связанные с ними. Это позволяет гарантировать, что при внесении изменений и исправлении ошибок не выйдет из строя какая-то часть программы, находящаяся в данный момент вне зоны внимания программиста.

Теперь можно рассмотреть вариант деления программы на модули, количество и содержание которых будет определяться смысловым качеством необходимых функций. В нашем случае - это ввод данных, создание массивов входного и выходного сигнала, работа с дисковыми файлами (запись результатов и чтение с диска), а так же расчет времени переднего фронта входного и выходного сигнала. Такой формат записи функций позволит без особого труда ориентироваться в них и, при надобности изменить какой-либо отдельный модуль независимо от других.

Функция main является главной функцией связывающая все функции и модули программы. В ней объявляются глобальные переменные и массивы. Основной частью этой функции является меню, состоящее из цикла и конструкции выбора switch, позволяющее выполнять задачи, которые требует пользователь.

Модуль data_work.с

Модуль представляет собой набор подпрограмм позволяющих:

вводить данные с файла - input_data_from_file;

ввод данных с клавиатуры - vvod;

полный ввод значений с файла и всех элементов массива -load_massives;

Модуль позволяет изменять значения входные данные:

1)      Начальное, конечное, промежуточное значение времени - tk,tn,t1;

3)      Напряжение - U1,U2,U3,U4;

Для ввода в главной функции main.c передаются в качестве указателей.

Модуль mass_construct.с

Модуль состоит из функций входного get_in_signal и выходного сигнала from_out_signal. Они отвечают за формирование массивов входного и выходного сигнала в n равноотстоящих точах, через промежуток времени dt, рассчитывающийся по формуле dt=(tk-tn)/(n-1).

Модуль inpuls.с

Задача этого модуля состоит в вычислении длительности сигнала переднего фронта входного и выходного сигнала. Состоит этот модуль всего из одной функции dli_front, т.к. формула для расчета длительности импульса одинакова как для входного так и для выходного сигнала. Расчет длительности заключается в следующем алгоритме:

1)      Нахождение максимального напряжения Umax.

2)      Ищем количество точек удовлетворяющих следующему условию Umax*0.1<=U[i]<=Umax*0.9; и умножаем это количество на разницу во времени между соседнестоящими точками (dt).

Модуль save_in_file_and_read.c

Этот модуль состоит из функций:

) save_to_file -сохраняет данные каждого массива на диск в отдельные файлы, благодаря чему мы можем пользоваться получившимися данными, независимо друг от друга. Так же эта функция формирует выходной файл output.txt, содержащий удобную таблицу со всеми получившимися результатами и входными данными. Вдобавок для упрощения построения графиков в maxima она сохраняет специальный код, пользуясь которым можно без лишней затраты времени построить графики.

) read_res_from_file - считывает результаты с дискового файла.

При запуске программы пользователю предлагается выбор с 8-ю возможными операциями:

. Table of Signals - ввывод на экран таблицы с данными

. Forward doration- расчет переднего фронта входного и выходного сигнала.

. Input data - ввод данных с клавиатуры

. Save in file - сохранение таблицы в файл и кода для построения графиков в файл maxima

. Input data from file - чтение начальных данных с файла

. Read results from file - чтение результатов с файла

. Load massives - полное чтение данных и массивов с файла

. Exit - Выход из программы

Функция main.с

#include "save_in_file_and_read.h"

#include "add.h"

#include "mass_construct.h"

#include "data_work.h"

#include "inpuls.h"main(void) {t[MAXSTR], Uvx[MAXSTR], Uvix[MAXSTR];tn = -10, tk = 25, t1 = 20, U1 = 100, U2 = 95, U3 = 10, U4 = 50;n = 250;number;((number = get_choice()) != EXIT) {(number) {1:_in_signal(tn, tk, t1, n, U1, U2, Uvx, t);_out_signal(U3, U4, n, Uvx, Uvix);(n, t, Uvx, Uvix);;2:_in_signal(tn, tk, t1, n, U1, U2, Uvx, t);_out_signal(U3, U4, n, Uvx, Uvix);(dli_front(n, tn, tk, Uvx), dli_front(n, tn, tk, Uvix));;3:(&tn, &tk, &t1, &n, &U1, &U2, &U3, &U4);;4:_to_file(n, tn, tk, t1, U1, U2, U3, U4, t, Uvx, Uvix);;5:_from_file(&tn, &tk, &t1, &n, &U1, &U2, &U3, &U4);;6:_res_from_file();;7:_massives(&n, &tn, &tk, &t1, &U1, &U2, &U3, &U4, Uvx, Uvix, t); ;: ;

}("For continning press Enter\n");();

}0;

}

Модуль data_work.с

#include "add.h"

#include "inpuls.h"vvod(double *tn, double *tk, double *t1,*n, double *U1, double *U2, double *U3, double *U4) {

printf("Put new tn, tk, t1, U1, U2, U3, U4, n \n\n");("Enter new tn = ");("%lf",tn);("\nEnter new tk = ");("%lf",tk);("\nEnter new t1 = ");("%lf",t1);("\nEnter new n = ");("%d",n);("\nEnter new U1 = ");("%lf",U1);("\nEnter new U2 = ");("%lf",U2);("\nEnter new U3 = ");("%lf",U3);("\nEnter new U4 = ");("%lf",U4);

}vvod_from_file(double *tn, double *tk, double *t1, int *n, double *U1,*U2, double *U3, double *U4) {("From what file input data? ");name[LONGNAME];("%s",name);("\n%s\n",name);* input = fopen(name, "rt");(!input)("File not found\n");{get[MAXLEN];(get, MAXLEN, input);(input, "%lf %lf %lf %d %lf %lf %lf %lf", tn, tk, t1, n, U1, U2, U3, U4);(input);

}load_massives(int *n,double *tn, double *tk, double *t1, double *U1,

double *U2, double *U3, double *U4, double Uvx[], double Uvix[], double time[])

{("\nFrom what file scans the Massives and datas? ");name[LONGNAME];("%s",name);("\n%s\n",name);*in = fopen(name, "rb");(!in)("File not found\n");{a[MAXLEN];(a, MAXLEN, in);(a, MAXLEN, in);(a, MAXLEN, in);(in, "____________________n = %.1d\n_________", n);(in, "___________tn = %.1lf\n_________", tn);(in, "___________tk = %.1lf\n_________", tk);(in, "___________t1 = %.1lf\n_________", t1);(in, "___________U1 = %.1lf\n_________", U1);(in, "___________U2 = %.1lf\n_________", U2);(in, "___________U3 = %.1lf\n_________", U3);(in, "___________U4 = %.1lf\n", U4);("n = %3.2d\n", *n);

printf("tn = %3.2lf\n", *tn);

printf("tk = %3.2lf\n", *tk);

printf("U1 = %3.2lf\n", *U1);

printf("U2 = %3.2lf\n", *U2);

printf("U3 = %3.2lf\n", *U3);

printf("U4 = %3.2lf\n\n", *U4);

fgets(a, MAXLEN, in);

fgets(a, MAXLEN, in);

fgets(a, MAXLEN, in);

fgets(a, MAXLEN, in);("%5s%12.9s%12.10s%12.10s\n", "No", "Time", "In signal", "Out signal");

for (int i = 0; i < *n; i++) {

fscanf(in, "%d%lf%lf%lf\n", &i, &time[i], &Uvx[i], &Uvix[i]);

printf("%5d%12.3lf%12.3lf%12.3lf\n", i, time[i], Uvx[i], Uvix[i]);("\n\n");

fgets(a, MAXLEN, in);

fgets(a, MAXLEN, in);dli_in_front, dli_out_front;

fscanf(in, "Duration input forward = %lf\n", &dli_in_front);

fscanf(in, "Duration output forward = %lf\n", &dli_out_front);("----------------------------------\n");

printf("Duration input forward = %5.3lf\n", dli_in_front);

printf("Duration output forward = %5.3lf\n", dli_out_front);

printf("----------------------------------\n\n");

fclose(in);

}

Модуль mass_construct.с

#include "add.h"

#include "mass_construct.h"get_in_signal(double tn, double tk, double t1, int n, double U1,

double U2, double Uvx[], double t[]) {

int i;

double dt, time;

time = tn;

dt = ((tk - tn) / (n - 1));

for (i = 0; i < n; i++) {

t[i] = time;

Uvx[i] = U1 * (1 - t[i] / tn);

else

if (t[i] > 0 && t[i] <= t1)

Uvx[i] = ((U2 - U1) / t1) * t[i] + U1;

else

if (t[i] > t1 && t[i] < tk)

Uvx[i] = (U2 / (t1 - tk))*(t[i] - tk);

else Uvx[i] = 0;

time += dt;

}from_out_signal(double U3, double U4, int n, double Uvx[], double Uvix[]) {

int i;

for (i = 0; i < n; i++) {

if (Uvx[i] <= 0)

Uvix[i] = 0;

else

if (Uvx[i] < U3)

Uvix[i] = U4 * Uvx[i] / U3;

else

Uvix[i] = U4;

}

Модуль inpuls.с

#include "add.h"

#include "inpuls.h"dli_front(int n, double tn, double tk, double signal[]) {

int j = 0;

double max;

max = signal[0];

for (int i = 1; i < n; i++)

if (signal[i] > max)

max = signal[i];

for (int i = 0; i < n; i++)

if ((signal[i] >= 0.1 * max) && (signal[i] <= 0.9 * max) && (signal[i] < signal[i + 1]))

j++;

return ((tk - tn) * j / (n - 1));

}

Модуль save_in_file_and_read.c

# #include "add.h"

#include "inpuls.h"save_to_file(int n, double tn, double tk, double t1, double U1, double U2,

double U3, double U4, double t[], double Uvx[], double Uvix[]) {

printf("\nWhere to save? ");

char name[LONGNAME];

scanf("%s",name);

printf("\n%s\n",name);

FILE* f_out = fopen(name, "wt");(f_out, "\n Start data: \n\n");

fprintf(f_out, "____________________n = %.1d\n_________", n);

fprintf(f_out, "___________tn = %.1lf\n_________", tn);

fprintf(f_out, "___________tk = %.1lf\n_________", tk);

fprintf(f_out, "___________t1 = %.1lf\n_________", t1);

fprintf(f_out, "___________U1 = %.1lf\n_________", U1);

fprintf(f_out, "___________U2 = %.1lf\n_________", U2);

fprintf(f_out, "___________U3 = %.1lf\n_________", U3);

fprintf(f_out, "___________U4 = %.1lf\n", U4);

fprintf(f_out, "\n ____Output Table____\n\n");

fprintf(f_out, "%6s%10s%15s%15s\n", "number", "time", "signal in", "out signal");

for (int i = 0; i < n; i++) fprintf(f_out, "%6d%10.3lf%15.3lf%15.3lf\n",

i + 1, t[i], Uvx[i], Uvix[i]);

fprintf(f_out, "__________________________________________\n\n");

fprintf(f_out, "Duration input forward = %5.3lf\n", dli_front(n, tn, tk, Uvx));

fprintf(f_out, "Duration output forward = %5.3lf\n", dli_front(n, tn, tk, Uvix));

fprintf(f_out, "___________________________________________\n");

fclose(f_out);

FILE* tm = fopen("time.txt", "wt");

for (int i = 0; i < n; i++)

fprintf(tm, "%10.3lf%\n", t[i]);

fclose(tm);

FILE* ins = fopen("in signal.txt", "wt");

for (int i = 0; i < n; i++)

fprintf(ins, "%15.3lf%\n", Uvx[i]);

fclose(ins);

FILE* outsig = fopen("out signal.txt", "wt");

for (int i = 0; i < n; i++)

fclose(outsig);

FILE* maxima = fopen("maxima.txt", "wt");

fprintf(maxima, "time: read_list(\"/users/Fafan08/NetBeansProjects/kuso44/time.txt\");\n");

fprintf(maxima, "in: read_list(\"/users/Fafan08/NetBeansProjects/kuso44/in signal.txt\");\n");

fprintf(maxima, "out: read_list(\"/users/Fafan08/NetBeansProjects/kuso44/out signal.txt\");\n");

fprintf(maxima, "wxplot2d (['discrete,time,in],[x,-25,35],[y,-20,120])$\n");

fprintf(maxima, "wxplot2d (['discrete,time,out],[x,-25,35],[y,-20,120])$\n");

fprintf(maxima, "wxplot2d (['discrete,in,out],[x,-25,120],[y,-20,120])$\n");

fclose(maxima);

}read_res_from_file(void) {

printf("\nWhat file to Display? ");

char name[LONGNAME];

scanf("%s",name);

printf("\n%s\n",name);

FILE* rrff = fopen(name, "rt");

if (!rrff) {

printf("\n Cant open file for reading\n");

} else {

char s[MAXMAS];

while (fgets(s, sizeof (s), rrff))

printf("%s", s);

printf("\n\n");

}

Заголовочные файлы

Файл add.h

#ifndef _ADD_H

#define_ADD_H

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define EXIT 8

#define MAXMAS 1000

#define MAXLEN 200

#define LONGNAME 23get_choice(void);table(int n, double t[], double Uvx[], double Uvix[]);table2(double W1, double W2);

#endif/* _CENTR_H */

Файл data_work.h

#ifndef _DATA_WORK_H

#define_DATA_WORK_H

#include "add.h"vvod(double *tn, double *tk, double *t1,

int *n, double *U1, double *U2, double *U3, double *U4);vvod_from_file(double *tn, double *tk, double *t1, int *n,

double *U1, double *U2, double *U3, double *U4);load_massives(int n, double Uvx[], double Uvix[], double time[]);

#endif/* _DATA_WORK_H */

Файл inpuls.h

#ifndef _INPULS_H

#define_INPULS_H

#include "add.h"dli_front(int n, double tn, double tk, double signal[]);

#endif/* _INPULS_H */

Файл massiv_construct.h

#ifndef _MASS_CONSTRUCT_H

#define_MASS_CONSTRUCT_H

#include "add.h"get_in_signal(double tn, double tk, double t1, int n, double U1, double U2,

double Uvx[], double t[]);from_out_signal(double U3, double U4, int n, double Uvx[], double Uvix[]);

#endif/* _MASS_CONTRUCT_H */

Файл save_in_file_and_read.h

#ifndef _SAVE_IN_FILE_AND_READ_H

#define_SAVE_IN_FILE_AND_READ_H

#include "add.h"save_to_file(int n, double tn, double tk, double t1, double U1, double U2,

double U3, double U4, double t[], double Uvx[], double Uvix[]);read_res_from_file(void);

#endif/* _SAVE_IN_FILE__AND_READ_H */

Исследование большого сигнала

Для данного исследования мне потребовался следующий набор данных:

n = 1000; tn = -10; tk = 25; t1 = 20; U1 = 100; U2 = 95; U3 = 13 U4 =50;

После построения графиков я увидел следующую картину:

График входного сигнала остался неизменным, а график выходного быстро возрастал и быстро убывал, то есть стремился к идеальному.

Рисунок 2. Входной сигнал

Рисунок 3. Выходной сигнал

Исследование малого сигнала

Первый набор данных:

После построения графиков я увидел следующую картину:

График выходного сигнала идентичен графику входного сигнала.

Рисунок 4. Входной

Рисунок 5. Выходной

Второй набор данных:= 1000; tn = -10; tk = 25; t1 = 20; U1 = 30; U2 = 25; U3 = 30; U4 = 60;

Графики показали увеличение значений выходного сигнала в два раза в соответствии со значениями входного сигнала.

Третий набор данных:

n = 1000; tn = -10; tk = 25; t1 = 20; U1 = 35; U2 = 30; U3 = 35; U4 = 105;

Графики показали увеличение значений выходного сигнала в 3 раза, в соответствии со значениями входного сигнала.

Рисунок 6. Входной и выходной

Смею предположить, что если ограничения напряжений U3 и U1 совпадают, то выявляется зависимость значений выходного сигнала, равная U4/U1, в соответствии со значениями входного сигнала. Выходной сигнал полностью расположен на линейной части передаточной характеристики.

Длительность фронта для большого сигнала:forward front of in signal = 7.99forward front of out signal = 1.05

Длительность фронта для малого сигнала:forward front of in signal = 7.99forward front of out signal = 7.99

В процессе разработки программы я получил практические навыки, что позволило мне закрепить знания, приобретенные мной по дисциплине Программировании на Языках Высокого Уровня.

Данная работа показала, как важно в программирование на языках высокого уровня уметь анализировать решение и реализацию задачи, сравнивать и сопоставлять различные методы и выбирать наиболее подходящие. Нужно не только решать поставленную перед тобой задачу, но и смотреть на перспективы её развития и усовершенствования.

Похожие работы на - Расчет на ЭВМ характеристик выходных сигналов электрических цепей

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!