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

Разработка проектов на языке программирования высокого уровня. Составление алгоритма решения. Определение длительности переднего фронта входного, выходного сигнала. Работа с дисковыми файлами. Представление программы в виде иерархической структуры блоков.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 28.05.2015
Размер файла 163,2 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

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

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

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

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

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

Выполнил

Иванов В.О.

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

Введение

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

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

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

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

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

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

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

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

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

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

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

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

Рисунок 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;

2) Количество расчетных точек - n;

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

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

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

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

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

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

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

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

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

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

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

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

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

Функция main.с

#include "save_in_file_and_read.h"

#include "add.h"

#include "mass_construct.h"

#include "data_work.h"

#include "inpuls.h"

int main(void) {

double t[MAXSTR], Uvx[MAXSTR], Uvix[MAXSTR];

double tn = -10, tk = 25, t1 = 20, U1 = 100, U2 = 95, U3 = 10, U4 = 50;

int n = 250;

int number;

while ((number = get_choice()) != EXIT) {

switch (number) {

case 1:

get_in_signal(tn, tk, t1, n, U1, U2, Uvx, t);

from_out_signal(U3, U4, n, Uvx, Uvix);

table(n, t, Uvx, Uvix);

break;

case 2:

get_in_signal(tn, tk, t1, n, U1, U2, Uvx, t);

from_out_signal(U3, U4, n, Uvx, Uvix);

table2(dli_front(n, tn, tk, Uvx), dli_front(n, tn, tk, Uvix));

break;

case 3:

vvod(&tn, &tk, &t1, &n, &U1, &U2, &U3, &U4);

break;

case 4:

save_to_file(n, tn, tk, t1, U1, U2, U3, U4, t, Uvx, Uvix);

break;

case 5:

vvod_from_file(&tn, &tk, &t1, &n, &U1, &U2, &U3, &U4);

break;

case 6:

read_res_from_file();

break;

case 7:

load_massives(&n, &tn, &tk, &t1, &U1, &U2, &U3, &U4, Uvx, Uvix, t);

break;

default:

break;

}

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

getchar();

}

return 0;

}

Модуль data_work.с

#include "add.h"

#include "inpuls.h"

void vvod(double *tn, double *tk, double *t1,

int *n, double *U1, double *U2, double *U3, double *U4) {

printf("Put new tn, tk, t1, U1, U2, U3, U4, n \n\n");

printf("Enter new tn = ");

scanf("%lf",tn);

printf("\nEnter new tk = ");

scanf("%lf",tk);

printf("\nEnter new t1 = ");

scanf("%lf",t1);

printf("\nEnter new n = ");

scanf("%d",n);

printf("\nEnter new U1 = ");

scanf("%lf",U1);

printf("\nEnter new U2 = ");

scanf("%lf",U2);

printf("\nEnter new U3 = ");

scanf("%lf",U3);

printf("\nEnter new U4 = ");

scanf("%lf",U4);

}

void vvod_from_file(double *tn, double *tk, double *t1, int *n, double *U1,

double *U2, double *U3, double *U4) {

printf ("From what file input data? ");

char name[LONGNAME];

scanf("%s",name);

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

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

if (!input)

printf("File not found\n");

else {

char get[MAXLEN];

fgets(get, MAXLEN, input);

fscanf(input, "%lf %lf %lf %d %lf %lf %lf %lf", tn, tk, t1, n, U1, U2, U3, U4);

fclose(input);

}

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

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

{

printf("\nFrom what file scans the Massives and datas? ");

char name[LONGNAME];

scanf("%s",name);

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

FILE *in = fopen(name, "rb");

if (!in)

printf("File not found\n");

else {

char a[MAXLEN];

fgets(a, MAXLEN, in);

fgets(a, MAXLEN, in);

fgets(a, MAXLEN, in);

fscanf(in, "____________________n = %.1d\n_________", n);

fscanf(in, "___________tn = %.1lf\n_________", tn);

fscanf(in, "___________tk = %.1lf\n_________", tk);

fscanf(in, "___________t1 = %.1lf\n_________", t1);

fscanf(in, "___________U1 = %.1lf\n_________", U1);

fscanf(in, "___________U2 = %.1lf\n_________", U2);

fscanf(in, "___________U3 = %.1lf\n_________", U3);

fscanf(in, "___________U4 = %.1lf\n", U4);

printf("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);

printf("%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]);

printf("\n\n");

fgets(a, MAXLEN, in);

fgets(a, MAXLEN, in);

double 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);

printf("----------------------------------\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"

void 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;

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

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;

}

void 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"

double 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"

void 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");

fprintf(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++)

fprintf(outsig, "%15.3lf%\n", Uvix[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);

}

void 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 23

int get_choice(void);

void table(int n, double t[], double Uvx[], double Uvix[]);

void table2(double W1, double W2);

#endif/* _CENTR_H */

Файл data_work.h

#ifndef _DATA_WORK_H

#define_DATA_WORK_H

#include "add.h"

void vvod(double *tn, double *tk, double *t1,

int *n, double *U1, double *U2, double *U3, double *U4);

void vvod_from_file(double *tn, double *tk, double *t1, int *n,

double *U1, double *U2, double *U3, double *U4);

void 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"

double 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"

void get_in_signal(double tn, double tk, double t1, int n, double U1, double U2,

double Uvx[], double t[]);

void 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"

void 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[]);

void 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. Выходной сигнал

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

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

n = 1000; tn = -10 tk = 25; t1 = 20; U1 = 20; U2 = 15; U3 = 20; U4 = 20;

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

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

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

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

Второй набор данных:

n = 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, в соответствии со значениями входного сигнала. Выходной сигнал полностью расположен на линейной части передаточной характеристики.

Длительность фронта для большого сигнала:

Duration forward front of in signal = 7.99

Duration forward front of out signal = 1.05

Длительность фронта для малого сигнала:

Duration forward front of in signal = 7.99

Duration forward front of out signal = 7.99

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

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

Размещено на Allbest.ru


Подобные документы

  • Разработка программного обеспечения на языке C. Определение сигнала на выходе цепи, формирование его передаточной характеристики. Расчет длительности переднего фронта входного и выходного сигнала. Выбор структуры, отладка и тестирование программы.

    курсовая работа [83,0 K], добавлен 26.09.2014

  • Процедура формирования массивов отсчетов входного и выходного сигналов и времени; вычисление величины заданной характеристики выходного сигнала: функция нахождения длительности импульса; организация текстовых файлов; построение графиков в системе MathCad.

    курсовая работа [75,9 K], добавлен 28.09.2012

  • Приведение выходного сигнала к аналитическому вид. Программа расчёта характеристик выходного сигнала электрической цепи. Таблица идентификаторов и описаний пользовательских подпрограмм. Построение графиков по массивам входного и выходного сигналов.

    контрольная работа [594,2 K], добавлен 28.09.2012

  • Вычисление значения входного и выходного сигналов в n-равноотстоящих точках, вывод на экран таблицы. Структура программы: модули, список идентификаторов функций, интерфейс. Исходный код программы. Проверка расчетов в Maxima и построение графиков.

    курсовая работа [1,4 M], добавлен 14.07.2012

  • Составление оптимального расписания, где критерием оптимальности служит минимальное значение функции штрафа. Описание алгоритма и разработка программы на языке программирования высокого уровня Java в среде BlueJ. Проверка решения и построение графика.

    курсовая работа [67,1 K], добавлен 04.12.2012

  • Составление алгоритма и разработка в среде программирования Delphi 7 программы, вычисляющей макроэкономические индексы цен. Реализация программы в виде 4 форм и 1 диалогового окна. Описание алгоритма решения задачи. Текст программы, руководство оператора.

    курсовая работа [1,4 M], добавлен 04.06.2013

  • Функции формирования массива времени. Формирование массива входного напряжения, массива выходного напряжения. Функция вывода таблицы, расчета заданной точности, вывода титульного листа. Запись в файл массива времени. Блок–схема и текст программы.

    курсовая работа [155,6 K], добавлен 22.04.2012

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

    контрольная работа [103,9 K], добавлен 21.08.2013

  • Особенности разработки и реализации обучающей программы и схемы алгоритмов на языке программирования С++. Понятие равномерной и неравномерной дискретизации. Представление информации (составление кода) в виде таблицы перекодировки или многочлена.

    курсовая работа [704,6 K], добавлен 06.03.2013

  • Методы численного интегрирования. Характеристика основных составляющих структурного программирования. Решение задания на языке высокого уровня Паскаль. Построение графического решения задачи в пакете Matlab. Решение задания на языке высокого уровня C.

    курсовая работа [381,7 K], добавлен 10.05.2018

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