Анализ сигнала на выходе электронной цепи. Анализ и нахождения наиболее рационального решения. Нахождение длительности заднего фронта входного и выходного сигналов

Страницы работы

Фрагмент текста работы

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

Им. Проф. -Бруевича

Кафедра СС, СК и ВТ

Курсовая работа по программированию

“Анализ сигнала на выходе

электронной цепи”

Выполнил:

Студент группы СП-12

Принял:

Преподаватель

СПб 2012

Цель работы

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

Алгоритмы решения поставленной задачи

•  Получение задания

•  Анализ и нахождения наиболее рационального решения

•  Общение с преподавательским составом

•  Начало практической работы

•  Планирование и представления структуры кода

•  Реализация кода на языке Си

•  Исправление ошибок

•  Сдача и защита курсового проекта

Постановка задачи.

В данной работе требуется написать программу, с помощью которой можно выполнить следующие действия:

1.  Ввод данных с клавиатуры

2.  Вычислить значения входного и выходного сигналов в n-равноотстоящих точках.

3.  Нахождение длительности заднего фронта входного и выходного сигналов.

4.  Вывод на экран таблицы со значениями входного и выходного сигналов.

5.  Запись этих данных в файл.

6.  Построение графиков входного и выходного сигналов.

7.  Просмотр данных с файла.

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

Имеется электрическая цепь, на вход которой подается определенный сигнал Uвх, а на выходе получается определенный сигнал Uвых. Необходимо определить длительность заднего фронта.

Входной сигнал

Рабочий набор:

T_начальное = 10

T_конечное = 50

t1=30

U1=100 В

a=0.2

b=0.2

Передаточная характеристика

  

Рабочий набор:  Uвх = 10 В Uвых = 50  В

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

Структура программы имеет большое значение, особенно в таких моментах, как уровень восприятия кода(“читабельность”). Так же не менее важным моментом является «наглядность».

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

Структура программы

main.c

function.c

function.h

В main.c – сдержится основная функция main, которая является главной связующей с нашими функциями и модулями. Так же введен рабочий набор и вызов основных функций.  Сделано меню экрана, которое занимает большую часть модуля. Так же рассматривался вариант очистки экрана. Но задача  требует непосредственно работы в данными – этот вариант был отвергнут.

В func.c – в данном модуле заключены все функции реализации. Каждая функция названа так, что бы было понятно её назначение. Они непосредственно связаны с меню в функции main.

В func.h – в данном модуле содержится инициализация всех функций. С помощью данного модуля можно легко узнать, что происходит в пограмме.

Так же нам понадобится знание использования Debugging windows -> watches. Т.к. он способствует нахождению проблем в подсчёте данных.

Интерфейс(меню) :

•  Ввод данных с клавиатуры

•  Считать информацию с файла

•  Вывод результата на монитор

•  Записать результаты в файл

•  Записать данные в 3 разных файла и запуск wxMaxima для построения графика

•  Выход из программы

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

Рабочий набор:

T_начальное = 10

T_конечное = 50

t1=30

U1=100 В

Uвх = 10 В

Uвых = 50  В

a=0.2

b=0.2

n(кол-во шагов)=21

Полученные результаты, записанные в фаил:

Time |      Uente |      Uexit 

10.00000 |    0.00000  |    0.00000 

12.00000 |   32.96800 |   50.00000

14.00000 |   55.06710 |   50.00000

16.00000 |   69.88058 |   50.00000

18.00000 |   79.81035 |   50.00000

20.00000 |   86.46647 |   50.00000 

22.00000 |   90.92820 |   50.00000 

24.00000 |   93.91899 |   50.00000 

26.00000 |   95.92378 |   50.00000 

28.00000 |   97.26763 |   50.00000 

30.00000 |   98.16844 |   50.00000 

32.00000 |   66.20903 |   50.00000

34.00000 |   44.56311 |   50.00000 

36.00000 |   29.95327 |   50.00000 

38.00000 |   20.11499 |   50.00000 

40.00000 |   13.49998 |   50.00000 

42.00000 |    9.05672  |   45.28361 

44.00000 |    6.07423  |   30.37117  

46.00000 |    4.07318  |   20.36589  

48.00000 |    2.73100  |   13.65502  

50.00000 |    1.83095  |    9.15475

Длительность заднего фронта входного сигнала: 10.000000

Длительность заднего фронта выходного сигнала: 8.000000

Попробуем изменить вводные данные:

T_начальное = 0

T_конечное = 60

t1=20                                   

U1=90 В

a=0.2

b=0.2

n(кол-во шагов)=10

Uвх = 20 В

Uвых = 40  В

Полученные результаты, записанные в фаил:

      Time  |      Uente     |      Uexit   

0.00000   |    0.00000  |    0.00000   

6.66667   |   66.27626 |   40.00000  

13.33333 |   83.74649 |   40.00000  

20.00000 |   88.35159 |   40.00000 

26.66667 |   23.60921 |   40.00000  

33.33333 |    6.24555  |   12.49110  

40.00000 |    1.64785  |    3.29571  

46.66667 |    0.43448  |    0.86895  

53.33333 |    0.11453  |    0.22907 

60.00000 |    0.03019  |    0.06038

Длительность заднего фронта входного сигнала: 6.666667

Длительность заднего фронта выходного сигнала: 6.666667

Код программы

Файл main.c:

#include "fync.h"

#include <locale.h>

int main()

{

setlocale(LC_CTYPE,"Russian");

double Uent[MAX],Uexit[MAX],time[MAX],Fen,Fex;

double U=100;

double a=0.2;

double b=0.2;

double Tn=10;

double t1=30;

double Tk=90;

double Uen=10;

double Uex=50;

int n=500;

int cursor=0;

Time(Tn,time,Tk,n);

enter_signal(U, a, b, Tn, t1, Tk, time, Uent, n);

exit_signal(Uent, Uen, Uex, Uexit, n);

Fen=Front(Uent,time,n);

Fex=Front(Uexit,time,n);

while (cursor!=6)

{

printf("Выберите требуемую задачу\n1 -> Вывод данных с клавиатуры\n2 -> "

"Считать информацию с файла\n3 -> Вывод результата на монитор\n4 -> "

"Записать результат в фаил\n5 -> "

"Записать данные в 3 разных файла и открыть wxMaxima для построения графика\n6 -> "

"Выход из программы\n >:");

scanf("%d", &cursor);

switch(cursor)

{

case 1:vvod(&U, &a, &b, &Tn, &t1, &Tk, &Uen, &Uex, &n);

Time(Tn,time,Tk,n);

enter_signal(U, a, b, Tn, t1, Tk, time, Uent, n);

exit_signal(Uent, Uen, Uex, Uexit, n);

Fen=Front(Uent,time,n);

Fex=Front(Uexit,time,n);

break;

case 2:

reading_from_file(&U, &a, &b, &Tn, &t1, &Tk, &Uen, &Uex, &n);

Time(Tn,time,Tk,n);

enter_signal(U, a, b, Tn, t1, Tk, time, Uent, n);

exit_signal(Uent, Uen, Uex, Uexit, n);

Fen=Front(Uent,time,n);

Fex=Front(Uexit,time,n);

break;

case 3: vuvod(time,Uent,Uexit,n);

printf("Длительность заднего фронта входного сигнала: %lf\n",Fen);

printf("Длительность заднего фронта выходного сигнала: %lf\n\n",Fex);

break;

case 4: writting_to_file(time,Uent,Uexit,Fen,Fex,n);

break;

case 5: graphik_creation(Uent,Uexit,time,n);

system("graph.wxm");

break;

case 6: printf("Спасибо за пользование. Для выхода нажмите Enter.\n");

default : printf("Задаче не может быть выполнена.\n\n"); break;

}

}

return 0;

}

 Фаил func.с

#include "fync.h"

#include <math.h>

double U_ent(double U, double a, double b, double Tn, double t1, double Tk, double time)

{

if(time>=Tn && time<=t1 )

return U*(1-exp(-a*(time-Tn)));

if (time>t1 && time<=Tk)

return U*(1-exp(-a*(time-Tn)))*exp(-b*(time-t1));

else return 0;

}

double U_ex(double Uent, double Uen, double Uex)

{

return Uent*(Uex/Uen);

}

void Time(double Tn,double time[], double Tk, int n)

{

double shag=(Tk-Tn)/((n-1));

double mtime=Tn;

int i;

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

{

time[i]=mtime;

mtime+=shag;

}

}

void enter_signal(double U, double a, double b, double Tn, double t1, double Tk, double time[],double Uent[], int n)

{

int i;

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

{

Uent[i]=U_ent(U,a,b,Tn,t1,Tk,time[i]);

}

}

void exit_signal(double Uent[], double Uen, double Uex, double Uexit[],int n)

{

int i;

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

{

if (Uent[i]<=Uen)

Uexit[i]=U_ex(Uent[i],Uen,Uex);

else Uexit[i]=Uex;

}

}

int vvod(double* U, double* a, double* b, double* Tn, double* t1, double* Tk, double* Uen, double* Uex, int* n)

{

printf("Элементы входного сигнала\n"

"Введите U: ");

scanf("%lf",U);

printf("Введите a: ");

scanf("%lf",a);

printf("Введите b: ");

scanf("%lf",b);

printf("Введите начальное время: ");

scanf("%lf",Tn);

printf("Введите t1: ");

scanf("%lf",t1);

printf("Введите конечное время: ");

scanf("%lf",Tk);

printf("эллементы передаточной хар-ки\n"

"Введите Uвх: ");

scanf("%lf",Uen);

printf("Введите Uвых: ");

scanf("%lf",Uex);

printf("Введиет количество шагов: ");

scanf("%d",n);

return 0;

}

int reading_from_file(double* U, double* a, double* b, double* Tn, double* t1, double* Tk, double* Uen, double* Uex, int* n)

{

FILE* f=fopen("вход.txt","r");

if(!f){

printf("Фаил не создан...\n");

return 0;

}

fscanf(f,"%lf%lf%lf%lf%lf%lf%lf%lf%d",U,a,b,Tn,t1,Tk,Uen,Uex,n);

fclose(f);

return 0;

}

void vuvod(double time[],double Uent[],double Uexit[]

Похожие материалы

Информация о работе

Тип:
Курсовые работы
Размер файла:
143 Kb
Скачали:
0