Санкт-Петербургский Государственный Университет Телекоммуникаций
Им. Проф. -Бруевича
Кафедра СС, СК и ВТ
Курсовая работа по программированию
“Анализ сигнала на выходе
электронной цепи”
Выполнил:
Студент группы СП-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[]
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.