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

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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

1. Цель работы

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

Курсовая работа посвящена решению задач машинного анализа электрических цепей.

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

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

Входной сигнал задаётся на временном отрезке и представлен следующей формулой:


а также графиком:

Рабочий набор задан так:

,

,

.

,

,

,

. Анализ поставленной задачи

Рассмотрим, каким образом были получены аналитические выражения для расчета входного сигнала. Общий вид аналитического представления входного сигнала можно задать следующим образом:


Рассмотрим подробнее эти выражения. Начнем с  при .

Здесь уместно воспользоваться уравнением прямой:  

Располагаем координатами двух точек:  и

Точка

Результат подстановки


Получаем систему из двух уравнений:

Из второго уравнения вычитаем первое и получаем:


Теперь можно найти чему равняется :


Подставляем полученный результат во второе уравнения и вычисляем :


Окончательно:


Вывод аналитического выражения для

Располагаем координатами двух точек:  и

Точка Результат подстановки



Получаем систему из двух уравнений:


Подстановка  в уравнение  дает


Окончательно:


Обобщив выше сказанное, приходим к выражению:


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


по следующей формуле:


График выходного сигнала должен выглядеть следующим образом:


Длительность импульса

Находится по формуле

где count - количество точек, соответствующих условию:  то есть попадающих в область между t’ и t” (см. график ниже)

вычисляется по формуле

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

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

Программа разделена на следующие составляющие модули: .c - основной модуль, содержащий в себе главную функцию программы - функцию main, в которой происходит вызов функций, выполняющих стоящие перед программой задачи, объявление переменных, а так же реализация меню, которое делает доступ к использованию функций программы простым, быстрым и доступным обычному пользователю (далее клиент). Функция main разрабатывалась так, чтобы в ней содержалось как можно меньше кода. Это нужно для того, чтобы любой не знакомый с программой программист, открывший код данной программы мог легко и быстро в нем разобраться..c - модуль, содержащий реализацию функции menu, которая выполняет две задачи: 1) выводит на консоль список команд, выполняемых программой (каждой команде соответствует определенный номер в списке, который клиент вводит с клавиатуры при работе с программой) 2) возвращает значение, введенное с клавиатуры клиентом. Далее это значение передается оператору switch, осуществляющему работу меню, то есть возможность запуска выбранной команды. Запуск выбранной команды осуществляется путем вызова соответствующей выбранной команде функции программы. Приведем список команд, доступных в меню:

«0» -выход из программы

«1»- ввод данных с клавиатуры

«2»- вывод результатов на консоль

«3»-ввод данных из файла

«4»-сохранение данных в текстовый файл.

«5»- вывести только длительность импульса

Предпоследняя команда «сохранение данных в текстовый файл» сохраняет расчеты данных в четыре текстовых файла. Первый файл содержит столбец табуляции времени, второй файл столбец табуляции входного сигнала, третий файл - столбец выходного сигнала, в четвертый файл сохраняются вся таблица данных (n_ая точка, время, входной сигнал, выходной сигнал, длительность импульса входного и выходного сигнала, рабочий набор данных ).

Из сохраненных программой текстовых файлов, содержащих в себе лишь столбцы отдельных данных, с помощью программы wxMaxima можно построить график проводимых вычислений.

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

Логическая схема взаимосвязи между модулями программы.


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

. Реализация программы

Модуль main.c

Модуль main.c - это сердце программы. В данном модуле содержится лишь одна функция main. В этой функции объявлены все рабочие переменные, которые передаются другим функциям для работы. Основой функции main является оператор switch, содержащий в себе пять команд: 1) вызов функции enter_data, заполняющей рабочие переменные (ранее все рабочие переменные инициализированы нулями) введенными с клавиатуры значениями и вызов функции data_calculation, отвечающей за расчет данных.2) Вызов функций console_output_source_data и output_table_on_the_console. Первая отвечает за вывод на консоль введенных клиентом рабочих данных, а вторая за вывод таблицы табуляции на консоль. 3) Вызов функции input_from_file , которая осуществляет чтение данных из текстового файла. 4)Вызов функций print_time_and_UInput_and_UOutput_to_file и print_table_data_to_file , первая из которых сохраняет массив времени, входного сигнала и выходного сигнала в три текстовых файла, создающихся для возможности построить график проделанных вычислений в программе wxMaxima. 5) Выводит только длительность импульса входного и выходного сигнала на случай, если клиенту не нужно выводить всю таблицу табуляции (особенно если она очень длинная), нужно лишь узнать значение длительности импульса.

Эти команды и есть воплощение в жизнь работы меню. Предусмотрена так же защита от некорректного ввода номера команды с помощью зарезервированного слова default , стоящего после последнего case . В случае если введенное с клавиатуры число не соответствует ни одной команде, программа выдаст на консоль сообщение о некорректности введенного номера. При этом работа программы не завершиться. Программа вновь откроет меню для выбора команды. Это осуществляется за счет работы цикла while , в условиях которого находится переменная, которой присвоено значение, возвращаемое функцией menu (о menu будет сказано чуть позже). Если в скобках содержащих условие цикла while будет помещена переменная, значение которой не равно нулю, условие будет истинным, а цикл будет выполняться. В теле цикла while находится оператор switch . Введенное при запросе номера команды число 0 служит для выхода из программы, так как в условиях цикла ЛОЖЬ и никакие функции из функции main не запускаются.

Переменные и массивы, объявляемые в функции main:

) double: length_input_signal(длительность импульса входного сигнала), length_output_signal(длительность импульса выходного сигнала), U(подаваемое напряжение), ULimit(пороговое напряжение), UMax(напряжение, которое является максимальным для выходного сигнала по свойствам передаточной характеристики), t_n(начальное время), t_m(время, в момент которого входное напряжение достигает максимальное значение), t_k(конечное время), time[MAXSIZE](массив времени), UInput[MAXSIZE](массив входного сигнала), UOutput[MAXSIZE](массив выходного сигнала).

) int: n(число шагов табулирования), choise(переменная, которой будет присвоено значение, возвращаемое функцией menu), zapolneno(переменная, введенная для защиты от неправильного выбора команды программы на определенном этапе работы)

Функция main включает в себя следующие заголовочные файлы: input.h, calc.h, output.h.

Эти файлы позволяют работать вызванным в функции main функциям.

Файл main.h

Этот заголовочный файл создан с целью уменьшить количество кода в программе. Он включает в себя: защиту от повторного включения, подключение к стандартным библиотечным функциям языка си (stdlib.h , stdio.h), осуществление перевода вывода на консоль на русский язык (подключение Windows.h), объявление про помощи директивы define констант MAXSIZE (400) и MLEN (30). Лучше, чтобы эти библиотечные функции подключались в отдельном файле и не загромождали код в рабочих функциях. Это улучшит читаемость кода программы.

Модуль menu.c

Модуль menu.c содержит единственную функцию menu, как говорилось выше, цель которой вывод на консоль нумерованного списка команд, исполняемых программой и возвращение значения, введенного клиентом с клавиатуры, соответствующего номеру команды. Рассмотрим более подробное устройство функции menu. В начале функции объявляется переменная w , далее 8 раз вызывается функция printf. Первый раз для печати заголовка «Menu». Далее пользователь увидит следующую таблицу:


Функция scanf сканирует значение выбор нужной команды, записав его в переменную w. Далее функция menu возвращает значение этой переменной.

Файл menu.h

Данный заголовочный файл включает в себя: защиту от повторного включения, прототип функции menu, подключение заголовочного файла main.h

Модуль input.c

Модуль содержит две функции: enter_data и input_from_file ,а так же включает в себя заголовочный файл input.h. _data

Эта функция принимает в себя через указатель следующие переменные: U, ULimit, UMax, t_n, t_m, t_k, n, zapolneno. С помощью функции scanf переменным даются введенные пользователем с клавиатуры значения.

В функции реализовано две защиты от некорректной работы:

) Защита от ввода некорректных данных реализуется условием (t_n < t_m и t_n < t_k и t_m < t_k и n > 0 и U >= 0 и ULimit >= 0 и UMax >= 0). Если это условие не выполняется, выводится сообщение о некорректности данных.

) Поскольку функция scanf возвращает значение, равное числу удачно прочитанных переменных (а их вводится всего 7) , то уместно здесь было сделать следующую проверку:

увеличивать переменную zapolneno на 1, после каждого удачного считывания. Далее при запросе вывода данных, проверяется условие того, что переменная zapolneno действительно равна 7._from_file

Функция позволяет читать данные из текстового файла, заполненного ранее программой. Имя текстового файла задается клиентом с клавиатуры. Функция заполняет по записанной в текстовый файл таблице массивы. Это необходимо в случае, если нужно вернуть программу в то состояние, в котором она была перед выводом расчетных данных. В функции реализована проверка корректности выбранного клиентом действия с помощью переменной zapolneno . Выражение fgets(buf, sizeof(buf),in_txt); пропускает лишние строчки и заголовки в текстовом файле. При этом не происходит считывания точки I (счетчика). Для пропуска этого столбца используется прием %*d- пропустить при считывании число целого типа. Так же есть проверка на существование самого читаемого файла. Если файл отсутствует, программа выводит соответствующее сообщение. Принимает в себя функция практически де же самые данные, что и функция enter_data.