Разработка системы виртуального осциллографа для наблюдения электрических сигналов

Тип работы:
Курсовая
Предмет:
Программирование


Узнать стоимость новой

Детальная информация о работе

Выдержка из работы

Оглавление

1. Введение

2. Задание на проектирование

3. Анализ предметной области

4. Требования к компонентам и к системе в целом

5. Исходные тексты программ

5.1 Класс SignalObject

5.2 Класс Ostsilograf

5.3 Класс Setka

5.4 Класс Signal

5.5 Класс Form2

6. Внешний вид компонент и приложений

7. Заключение

7.1 Выводы

7.2 Рекомендации

8. Список литературы

1. Введение

Целью данного проекта является создание системы виртуального осциллографа для наблюдения электрических сигналов. Слово «осциллограф» образовано от «осциллум» — колебания и «графо"-пишу. Отсюда и назначение этого измерительного прибора — отображать на экране кривые тока или напряжения как функции времени. Встречается и другое название этого прибора — осциллоскоп (от того же осциллум, и скопео-смотрю)-прибор для наблюдения формы колебаний. И хотя второе название более точное, в литературе на русском языке принято все же первое — осциллограф. Электронный осциллограф является одним из наиболее универсальных измерительных приборов, предназначенных для визуального наблюдения электрических сигналов и измерения их параметров. Электронный осциллограф представляет собой прибор, позволяющий изучать кривые, характеризующие изменение токов и напряжений в электрических цепях и дающий возможность измерять напряжение, фазу, частоту, длительность электрических процессов. Осциллографы широко применяются в промышленности и в научных исследованиях.

2. Задание на проектирование

Разработать систему виртуального осциллографа для наблюдения электрических сигналов.

3. Анализ предметной области

Осциллограф — прибор, предназначенный для исследования (наблюдения, записи; измерения) амплитудных и временнымх параметров электрического сигнала, подаваемого на его вход, либо непосредственно на экране, либо записываемого на фотоленте.

Применение

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

Классификация

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

· Осциллографы с периодической развёрткой для непосредственного наблюдения формы сигнала на экране (электронно-лучевом, жидкокристаллическом и т. д.) -- в зап. -европ. языках oscilloscop (e)

· Осциллографы с непрерывной развёрткой для регистрации кривой на фотоленте (шлейфовый осциллограф) -- в зап. -европ. языках oscillograph

По способу обработки входного сигнала

· Аналоговый

· Цифровой

По количеству лучей: однолучевые, двулучевые и т. д. Количество лучей может достигать 16-ти и более (n-лучевой осциллограф имеет nное количество сигнальных входов и может одновременно отображать на экране n графиков входных сигналов).

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

Также существуют осциллографы, совмещенные с другими измерительными приборами (напр. мультиметром).

Осциллограф также может существовать не только в качестве автономного прибора, но и в виде приставки к компьютеру (подключаемой через какой-либо порт: LPT, COM, USB, вход звуковой карты).

Устройство

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

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

Экран

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

Сигнальные входы

Осциллографы разделяются на одноканальные и многоканальные (2, 4, 6, и т. д. каналов на входе). Многоканальные осциллографы позволяют одновременно сравнивать сигналы между собой (формы, амплитуды, частоты и пр.)

Управление разверткой

Имеются значительные отличия в аналоговых и цифровых осциллографах. В цифровых осциллографах, строго говоря, не требуется синхронизация, так как при частоте обновления 1 сек и менее изображение на экране вполне читаемо визуально.

Режимы развертки:

· автоматический;

· ждущий;

· автоколебательный;

· однократный;

Триггер

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

Триггер в осциллографе -- это устройство, которое задерживает запуск развёртки до тех пор, пока не будут выполнены некоторые условия. Триггер имеет как минимум две настройки:

· Уровень сигнала: задаёт входное напряжение (в вольтах), при достижении которого запускается развёртка

· Тип запуска: по фронту или по спаду

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

Использование

Для работы с осциллографом предварительно необходимо произвести калибровку его канала (каналов). Калибровка производится после прогрева прибора (примерно минут 5). Калибратор встроен в большинство осциллографов. Для калибровки высокочастотных моделей желательно иметь шнур с двумя разъемами (на выход калибратора и на вход осциллографа) иначе возможны искажения сигнала. Для низкочастотных моделей возможно просто коснуться щупом выхода калибратора. Далее ручку вольт/дел. ставится так, чтобы сигнал калибратора занимал 2--4 деления на экране (то есть, если калибратор 1 вольт, — то на 250 милливольт). После этого канал включается на переменное напряжение и на экране появится сигнал. Далее, в зависимости от частоты калибратора, ручка развертки ставится в положение при котором видно не менее 5--7 периодов сигнала. Для частоты 1 килогерц частота развертки при которой каждый период занимает одно деление экрана равен 1 мс (одна миллисекунда). Далее необходимо убедиться, чтобы сигнал на протяжении этих 5−7 периодов попадал точно по делениям экрана. Для аналоговых осциллографов нормируется как правило ±4 деления от центра экрана, то есть на протяжении восьми делений должен совпадать точно. Если не совпадает, следует поворачивать ручку плавного изменения развертки добиваясь совпадения. Заодно проверяется амплитуда (размах) сигнала -- она должна совпадать с тем, что написано на калибраторе. Если не совпадает, то необходимо добиться совпадения, поворачивая ручку плавного изменения чувствительности вольт/дел. Необходимо помнить, что если установлена чувствительность канала в 250 милливольт, то сигнал в 1 вольт занимает при правильной настройке 4 деления. После калибровки прибор будет показывать сигнал точно. Теперь можно не только смотреть, но и измерять сигналы.

Допустим, имеется устройство на выходе которого заведомо известный по напряжению сигнал. Чувствительность вертикального отклонения (Вольт/дел) устанавливается так, чтобы отображаемый на экране сигнал не выходил за рамки экрана, щуп устанавливается в нужное место на плате, после чего на экране появится исследуемый сигнал. При необходимости развертка переключается в позицию удобную для наблюдения. Если сигнал превышает допустимую документацией осциллографа, то необходимо воспользоваться делителем с коэффициентом деления 1/10 или 1/100 и соблюдать правила электробезопасности. Можно измерять амплитуду и частоту сигнала подсчитывая деления по вертикали и горизонтали. Некоторые модели осциллографов оснащены системой которая подсвечивает часть луча и измеряет время этого подсвеченного участка, это удобно при измерении частоты или периода -- вручную выставляется длина подсвеченного участка, например, на начало и конец одного или нескольких периодов сигнала и на цифровом табло считывается значение в миллисекундах или иной временной единице. Амплитуда сигнала измеряется аналогично.

4. Требования к компонентам и к системе в целом

Данная система должна содержать компоненты, которые должны отвечать всем необходимым требованиям.

1) Компонент Setka. Данный компонент представляет из семя объект, унаследованный от PictureBox, так как в дальнейшем мы будем использовать его для рисования графиков. Данный компонент представляет собой экран для отображения электрических сигналов. От должен быть разделен вертикальными и горизонтальными линиями на части (квадраты). Четырем делениям по вертикали соответствует напряжение в 1 вольт. Одному делению по горизонтали соответствует частота в 1000 Гц или 1миллисекунда. Все параметры будут настраиваться в дальнейшем на главном компоненте, а размеры, по которым будут нарисованы деления должны быть известны заранее. Данная компонента содержит горизонтальную и вертикальную линию, которая разделяет экран на четыре доли. То есть эти линии являются центром окна. В них квадраты делятся на десять частей, образуя тем самым десятые доли деления. Данный компонент обладает свойствами изменения цвета линий, толщины линий и размера деления. В связи с этим можно установить желаемый интерфейс экрана для отображения и измерения электрических сигналов как переменного, так и постоянного тока.

2) Компонент Signal является настройщиком параметров электрических сигналов. На нем можно выбрать тип сигнала (гармонический или импульсный) и задать параметры сигналов для каждого типа. Для гармонического сигнала ими являются напряжение и частота, а для импульсного — напряжение, частота и время импульса (длительность).

3) Третий компонент — Ostsilograf. Он унаследован от класса UserControl и содержит в себе множество кнопок, ползунков и других элементов управления для реализации интерфейса, необходимого для функциональность, подобной реальному осциллографу. На нём так же находится описанный ранее компонент Setka для отображения сигналов. Данный компонент представляет возможность задания двух сигналов (двухканальный осциллограф). Для их задания необходима нажать на кнопку «Включить». Сразу загорится зеленая лампочка и разморозятся все компоненты. Далее необходимо нажать на кнопку «Сигнал…», откроется компонент Signal, в котором можно задать параметры сигнала выбранного типа. Затем следует установить флажок на номер канала и сигнал появится в окне осциллографа. Для изменения амплитуды и частоты нужно изменять соответственно развертку и длительность. Для перемещения по вертикали и горизонтали нужно изменять положение соответствующих ползунков. Сигнал можно заземлить, в этом случае можно нажать соответствующую кнопку, и появится луч. Также сигналы можно сохранять и открывать. Для изменения настроек экрана существует панель «Настройки экрана». Здесь можно изменить яркость, четкость и подсветку.

5. Исходные тексты программ

5.1 Класс SignalObject

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

using System;

using System. Collections. Generic;

using System. Linq;

using System. Text;

using System. Drawing;

namespace Mycomponent

{

[Serializable]

class SignalObject

{

int GarmGarm;

float UU;

float ff;

float titi;

public List< PointF> L; //список точек

public float koeffDlit; //коэффициент длительности

public float koeffRazv; //коэффициент рагвертки

public bool Ok; //если создается

public int micro; //микросекунды

public int koeffNastr;

double k1; //коеффициент для частоты

public SignalObject (int koeffNastr)

{

L = new List< PointF>();

koeffDlit = 1;

koeffRazv = 1;

Garm = -1;

micro = 1;

this. koeffNastr = koeffNastr;

}

public int Garm

{

get { return GarmGarm; }

set { GarmGarm = value; }

}

public float U

{

get { return UU; }

set { UU = value; }

}

public float f

{

get { return ff; }

set { ff = value; }

}

public float ti

{

get { return titi; }

set { titi = value; }

}

public void CalculateSin (int h, int start, int end)

{

k1 = 2 * (Math. PI) / (1000 * koeffNastr);

if (Garm == -1) { return; }

float p = start;

while (p ≠ end)

{

float y = (float)Math. Sin (p *koeffDlit*ff*k1/micro);

p += 1;

y = koeffNastr * (float)1. 41 * y * UU /koeffRazv;

L. Add (new PointF (p, y+h));

}

}

public void CalculateImp (int h, int start, int end)

{

float p = start;

float x = (float)Math. Pow (ff, -1);

float tp = (x — titi);

float y = h + koeffNastr * UU / koeffRazv;

while (p < end)

{

L. Add (new PointF (p, y));

p += koeffNastr * titi * 1000 * micro / (koeffDlit);

L. Add (new PointF (p, y));

L. Add (new PointF (p, h+0));

p += koeffNastr * tp * 1000 * micro / (koeffDlit);

L. Add (new PointF (p, h+0));

}

}

}

}

5.2 Класс Ostsilograf

Данный класс является основным в данной системе. Данный код описывает главный компонент Ostsilograf, который отображает интерфейс виртуального осциллографа и реализует взаимодействие между остальными компонентами. Здесь создаются сигнала заново или воспроизводятся из файла. Содержатся так же функции для изменения положения сигнала, его амплитуды и фазы. Здесь реализован интерфейс экрана (Настройки экрана), где можно установить подсветку экрана, яркость и четкость сигнала. Сигнал можно заземлить (для этого реализованы соответствующие функции). Сигнал можно сохранить и прочитать из файла, для этого созданы соответствующие функции, реализующие сериализацию и десериализацию. Данный компонент является двухканальным виртуальным осциллографом. Поэтому можно измерять как один, так и два сигнала, сравнивать их амплитуды и фазы.

using System;

using System. Collections. Generic;

using System. ComponentModel;

using System. Drawing;

using System. Data;

using System. Linq;

using System. Text;

using System. Windows. Forms;

using System. IO;

using System. Runtime. Serialization. Formatters. Binary;

namespace Mycomponent

{

public partial class Ostsilograf: UserControl

{

Color Col; //Цвет кривой

int h = 0; //толщина кривой

int x; //смещение

int y;

int y1;

int y2;

SignalObject So1;

SignalObject So2;

Boolean On; //включение

bool Kanal1; //каналы

bool Kanal2;

Pen pen; //перо

bool zemlya1; //заземление

bool zemlya2;

Color ColSetka;

string[] V_del1, V_del2, Dlit; //массивы для хранения параметров развертки и

длительности

public Ostsilograf ()

{

Col = Color. FromArgb (255,0,200,0);//цвет изображения

x = 0; //смещение

h = 3;

y = 0;

y1 = y;

y2 = y;

On = false; //ключено/выключено

Kanal1 = false;

Kanal2 = false;

pen = new Pen (Col, h);

zemlya1 = false;

zemlya1 = false;

InitializeComponent ();

this. button3. Enabled = true;

V_del1 = Zapolnenie_Razvertki (); //параметры развертки канала1

V_del2 = Zapolnenie_Razvertki (); //параметры развертки канала2

Dlit = Zapolnenie_Dlitelnosti (); //параметры длительности

comboBox3. Items. AddRange (V_del1);

comboBox4. Items. AddRange (V_del2);

comboBox2. Items. AddRange (Dlit);

}

//первый сигнал

private void button1_Click (object sender, EventArgs e)

{

signal1. Visible = true;

So1 = new SignalObject (setka1. SetkaSize);

So1. Ok = true;

if (So2 ≠ null)

{

So2. Ok = false;

}

}

private void setka1_Paint (object sender, PaintEventArgs e)

{

if (On == false) { return; }//осциллограф выключен

e. Graphics. TranslateTransform (-100+x, 0); //перемещение

//луч

if (Kanal1 == false & & Kanal2 == false & & zemlya1==false & & zemlya2==false)

{

e. Graphics. DrawLine (pen, -this. Width, y, this. Width, y);

}

//луч первого канала

if ((Kanal1 == false) & & zemlya1 == true)

{

e. Graphics. DrawLine (pen, -this. Width, y1, this. Width, y1);

}

//луч второго канала

if ((Kanal2 == false) & & zemlya2 == true)

{

e. Graphics. DrawLine (pen, -this. Width, y2, this. Width, y2);

}

//изображение первого сигнала

if (Kanal1 == true & & So1 ≠null)

{

Izobrajenie (So1, e);

}

//изображение второго сигнала

if (Kanal2 == true & & So2 ≠ null)

{

Izobrajenie (So2, e);

}

}

//функция изображения сигналов

private void Izobrajenie (SignalObject So, PaintEventArgs e)

{

if (So. Garm == 1)//сигнал гармонический

{

e. Graphics. DrawLines (pen, So.L. ToArray ());

}

else if (So. Garm == 0)//сигнал импульсный

{

for (int i = 0; i < So.L. Count — 1; i = i + 2)

{

e. Graphics. DrawLine (pen, So. L[i], So. L[i + 1]);

}

}

}

//вызов генератора сигналов

private void signal1_VisibleChanged (object sender, EventArgs e)

{

if (signal1. Visible == true)

{

return;

}

if (So1 ≠ null & & So1. Ok == true)

{

CreateNewSignal (y1, So1);

}

if (So2 ≠ null & & So2. Ok == true)

{

CreateNewSignal (y2, So2);

}

Refresh ();

}

//второй сигнал

private void button2_Click (object sender, EventArgs e)

{

signal1. Visible = true;

So2 = new SignalObject (setka1. SetkaSize);

So2. Ok = true;

if (So1 ≠ null)

{

So1. Ok = false;

}

}

//Перемещение по горизонтали

private void trackBar3_ValueChanged (object sender, EventArgs e)

{

x = trackBar3. Value;

Refresh ();

}

//Длительность

private void comboBox2_SelectedIndexChanged (object sender, EventArgs e)

{

if (So1 == null & & So2 == null) { return; }

string s = comboBox2. Text;

try

{

if (Kanal1 == true)

{

So1. koeffDlit = (float)Convert. ToDouble (s);

IzmenenieSignala (y1, So1);

}

if (Kanal2 == true)

{

So2. koeffDlit = (float)Convert. ToDouble (s);

IzmenenieSignala (y2, So2);

}

}

catch

{

return;

}

Refresh ();

}

//изменение сигнала

private void IzmenenieSignala (int z, SignalObject So)

{

if (So == null)

{

return;

}

So.L. Clear ();

if (So. Garm == 1)

{

So. CalculateSin (z, -this. Width, this. Width);

}

else if (So. Garm == 0)

{

So. CalculateImp (z, -this. Width, this. Width);

}

}

//Включить

private void button3_Click (object sender, EventArgs e)

{

if (On == false)

{

On = true;

pictureBox1. BackColor = Color. Green;

button3. Text = «Выключить»;

EnabledComp (true);

}

else

{

On = false;

pictureBox1. BackColor = System. Drawing. SystemColors. Control;

EnabledComp (false);

button3. Text = «Включить»;

return;

}

}

//Заморозка/отморозка компонент

private void EnabledComp (bool Ok)

{

menuStrip1. Enabled = Ok;

comboBox2. Enabled = Ok;

label3. Enabled = Ok;

groupBox1. Enabled = Ok;

groupBox2. Enabled = Ok;

groupBox3. Enabled = Ok;

groupBox4. Enabled = Ok;

groupBox5. Enabled = Ok;

groupBox6. Enabled = Ok;

setka1. Enabled = Ok;

}

//выбран первый канал

private void checkBox1_CheckedChanged (object sender, EventArgs e)

{

if (checkBox1. Checked == true)

{

Kanal1 = true;

}

else

{

Kanal1 = false;

}

Refresh ();

}

//создание нового сигнала

private void CreateNewSignal (int y, SignalObject So)

{

//гармонический сигнал

if (signal1. radioButton1. Checked == true & So ≠ null)

{

So. Garm = 1;

So.U = signal1. U;

So.f = signal1. f;

So.L. Clear ();

So. CalculateSin (y,-this. Width, this. Width);

}

//импульсный сигнал

if (signal1. radioButton2. Checked == true)

{

So. Garm = 0;

So.U = signal1. U;

So.f = signal1. f;

So. ti = signal1. ti;

So. CalculateImp (y, -this. Width, this. Width);

}

}

//выбран второй канал

private void checkBox2_CheckedChanged (object sender, EventArgs e)

{

if (checkBox2. Checked == true)

{

Kanal2 = true;

}

else

{

Kanal2 = false;

}

Refresh ();

}

//Яркость

private void trackBar2_Scroll (object sender, EventArgs e)

{

Color c = Color. FromArgb (255, 0, 200+ trackBar2. Value, 0);

pen. Color = c;

Refresh ();

}

//Четкость

private void trackBar4_Scroll (object sender, EventArgs e)

{

h = trackBar4. Value;

if (h < 0)

{

pen. Width = -trackBar4. Value;

}

else if (h == 0)

{

pen. Width = 1;

}

else

{

pen. Width = trackBar4. Value;

}

Refresh ();

}

//сохранение сигналов

private void сохранитьToolStripMenuItem_Click (object sender, EventArgs e)

{

if (Kanal1 == false & & Kanal2 == false)

{

MessageBox. Show («Включители сигнал (ы), который (е) нужно сохранить»);

return;

}

else if ((Kanal1 == true & & So1 == null) || (Kanal2 == true & & So2 == null))

{

MessageBox. Show («Первый сигнал пустой»);

return;

}

if (Kanal1 == true & & So1 ≠ null)

{

SaveSignal (So1);

}

if (Kanal2 == true & & So2 ≠ null)

{

SaveSignal (So2);

}

}

//функция сохранения сигнала

private void SaveSignal (SignalObject So)

*. dat";

if (sfd. ShowDialog () ≠ DialogResult. OK) return;

FileStream fs = new FileStream (sfd. FileName,

FileMode. Create);

if (fs == null) return;

BinaryFormatter BFormater = new BinaryFormatter ();

BFormater. Serialize (fs, So);

fs. Close ();

//открытие сигнала

private void открытьToolStripMenuItem_Click (object sender, EventArgs e)

{

if (Kanal1 == false & & Kanal2 == false)

{

MessageBox. Show («выберите канал для отображения сигнала»);

return;

}

if (Kanal1 == true)

{

So1 = OpenSignal ();

}

if (Kanal2 == true)

{

So2 = OpenSignal ();

}

Refresh ();

}

//функция открытия сигнала

private SignalObject OpenSignal ()

{

SignalObject So = new SignalObject (setka1. SetkaSize);

string str;

OpenFileDialog ofd = new OpenFileDialog ();

ofd. Filter = «dat |*. dat»;

if (ofd. ShowDialog () ≠ DialogResult. OK)

return null;

ofd. FilterIndex = 1;

str = ofd. FileName;

FileStream bfs = File. OpenRead (str);

BinaryFormatter bf = new BinaryFormatter ();

object о;

try

{

о = bf. Deserialize (bfs);

}

catch

{

MessageBox. Show («Данный файл не соответствует структуре сигнала»);

return null;

}

bfs. Close ();

//Убеждаемся в том, что объект нужного нам типа

So = о as SignalObject;

if (So ≠ null)

{

return So;

}

else

{

MessageBox. Show («Данный файл не соответствует структуре сигнала»);

return null;

}

}

//Подсветка

private void trackBar5_Scroll (object sender, EventArgs e)

{

Color c = Color. FromArgb (ColSetka. A, ColSetka. R, ColSetka. G, ColSetka. B +

trackBar5. Value);

setka1. BackColor = c;

Refresh ();

}

//Развертка канала 1

private void comboBox3_SelectedIndexChanged (object sender, EventArgs e)

{

if (So1 == null) { return; }

string s = comboBox3. Text;

try

{

if (Kanal1 == true)

{

So1. koeffRazv = (float)Convert. ToDouble (s);

IzmenenieSignala (y1, So1);

}

}

catch

{

return;

}

Refresh ();

}

//Развертка канала 2

private void comboBox4_SelectedIndexChanged (object sender, EventArgs e)

{

if (So2 == null) { return; }

string s = comboBox4. Text;

try

{

if (Kanal2 == true)

{

So2. koeffRazv = (float)Convert. ToDouble (s);

IzmenenieSignala (y2, So2);

}

}

catch

{

return;

}

Refresh ();

}

//вертикольное смещение первого сигнала

private void trackBar6_ValueChanged (object sender, EventArgs e)

{

if (Kanal1 == false & & Kanal2 == false & & zemlya1 == false & & zemlya2 ==

false)

{

y = -trackBar6. Value;

trackBar7. Value = -y;

}

y1 = -trackBar6. Value;

IzmenenieSignala (y1, So1);

Refresh ();

}

//вертикольное смещение второго сигнала

private void trackBar7_ValueChanged (object sender, EventArgs e)

{

if (Kanal1 == false & & Kanal2 == false & & zemlya1 == false & & zemlya2 ==

false)

{

y = -trackBar7. Value;

trackBar6. Value = -y;

}

y2 = -trackBar7. Value;

IzmenenieSignala (y2, So2);

Refresh ();

}

//Заземление первого канала

private void button4_Click (object sender, EventArgs e)

{

if (So1 ≠ null & & Kanal1 ≠ false & & zemlya1 == false)

{

Kanal1 = false;

zemlya1 = true;

}

else if (So1 ≠ null & & Kanal1 == false & & zemlya1 == true)

{

Kanal1 = true;

zemlya1 = false;

}

Refresh ();

}

//Заземление второго канала

private void button5_Click (object sender, EventArgs e)

{

if (So2 ≠ null & & Kanal2 ≠ false & & zemlya2 == false)

{

Kanal2 = false;

zemlya2 = true;

}

else if (So2 ≠ null & & Kanal2 == false & & zemlya2 == true)

{

Kanal2 = true;

zemlya2 = false;

}

Refresh ();

}

//переключение на миллисекунды

private void msToolStripMenuItem_Click (object sender, EventArgs e)

{

msTomks (1);

label1. Text = «мс»;

Refresh ();

}

//переключения на микросекунды

private void мксToolStripMenuItem_Click (object sender, EventArgs e)

{

msTomks (1000);

label1. Text = «мкс»;

Refresh ();

}

private void msTomks (int x)

{

if (So1 ≠ null)

{

So1. micro = x;

IzmenenieSignala (y1, So1);

}

if (So2 ≠ null)

{

So2. micro = x;

IzmenenieSignala (y2, So2);

}

}

[Category («Настройки сетки»)]

public int SetkaSize//размер ячейки сетки

{

get { return setka1. SetkaSize; }

set { setka1. SetkaSize = value; Invalidate (); }

}

[Category («Настройки сетки»)]

public int SetkaThickness

{

get { return setka1. SetkaThickness; }

set { setka1. SetkaThickness = value; Invalidate (); }

}

[Category («Настройки сетки»)]

public Color SelkaColor

{

get { return setka1. SetkaColor; }

set { setka1. SetkaColor = value; Invalidate (); }

}

[Category («Настройки сетки»)]

public Color SelkaBackColor

{

get { return setka1. SetkaBackColor; }

set { setka1. SetkaBackColor = value; ColSetka=value; Invalidate (); }

}

[Category («Настройки формы сигнала»)]

public Color SignalFormColor

{

get { return signal1. BackColor; }

set { signal1. BackColor = value; Invalidate (); }

}

[Category («Настройки параметров развертки и длительности»)]

public string[] Razvertka_V_DEL1

{

get

{

if (V_del1. Count () ≠ 0)

{

return V_del1;

}

return Zapolnenie_Razvertki ();

}

set { V_del1 = value; comboBox3. Items. Clear ();

comboBox3. Items. AddRange (V_del1); Invalidate (); }

}

[Category («Настройки параметров развертки и длительности»)]

public string[] Razvertka_V_DEL2

{

get

{

if (V_del2. Count () ≠ 0)

{

return V_del2;

}

return Zapolnenie_Razvertki ();

}

set { V_del2 = value; comboBox4. Items. Clear ();

comboBox4. Items. AddRange (V_del2); Invalidate (); }

}

[Category («Настройки параметров развертки и длительности»)]

public string[] Dlitelnost

{

get

{

if (Dlit. Count () ≠ 0)

{

return Dlit;

}

return Zapolnenie_Dlitelnosti ();

}

set { Dlit = value; comboBox2. Items. Clear (); comboBox2. Items. AddRange (Dlit);

Invalidate (); }

}

//заполнение массива развертки значениями по умолчанию

private string[] Zapolnenie_Razvertki ()

{

string[] S = new[]{

«0,1»,

«0,2»,

«0,25»,

«0,3»,

«0,5»,

«1»,

«2»,

«3»,

«4»,

«5»,

«6»,

«7»,

«8»,

«9»,

«10»,

«15»,

«20»,

«25»,

«30»,

«35»,

«40»,

«45»,

«50»,

«55»,

«60»,

«65»,

«70»,

«75»,

«80»,

«85»,

«90»,

«95»,

«100»,

«110»,

«120»,

«130»,

«140»,

«150»,

«160»,

«170»,

«180»,

«190»,

«200»

};

return S;

}

//заполнение длительности значениями по умолчанию

private string[] Zapolnenie_Dlitelnosti ()

{

string[] S = new[]{

«0,1»,

«0,2»,

«0,5»,

«1»,

«2»,

«5»,

«10»,

«20»,

«50»,

};

return S;

}

}

}

5.3 Класс Setka

Данный класс формирует реализацию экрана осциллографа. Он разделяет делит PictureBox на квадраты, а серединные линии ещё на десять долей.

using System;

using System. Collections. Generic;

using System. ComponentModel;

using System. Drawing;

using System. Data;

using System. Linq;

using System. Text;

using System. Windows. Forms;

namespace Window

{

public partial class Setka: PictureBox

{

int x; //размер клеток

int h; //толщина линий

Color Col; //цвет сетки

Pen p; //перо для рисования сетки

public Setka ()

{

x = 40;

h = 1;

Col = Color. Black;

InitializeComponent ();

}

[Category («Сетка»)]

public int SetkaSize

{

get { return x; }

set { x = value; OnChangeProperties (); }

}

[Category («Сетка»)]

public int SetkaThickness

{

get { return h; }

set { h = value; OnChangeProperties (); }

}

[Category («Сетка»)]

public Color SetkaColor

{

get { return Col; }

set { Col = value; OnChangeProperties (); }

}

[Category («Сетка»)]

public Color SetkaBackColor

{

get { return BackColor; }

set { BackColor = value; OnChangeProperties (); }

}

protected override void OnPaint (PaintEventArgs e)

{

base. OnPaint (e);

p = new Pen (Col, h);

for (int i = 0; i < this. Width; i = i + x)

{

e. Graphics. DrawLine (p, i, 0, i, this. Height);

}

//середина

int k = (int)Math. Round ((double)this. Width / ((double)x * 2));

int count = 0;

for (int i = 0; i < this. Height; i = i + x / 10)

{

e. Graphics. DrawLine (p, k * x — 2 * h, i, k * x + 2 * h, i);

if (count == 5)

{

e. Graphics. DrawLine (p, k * x — 4 * h, i, k * x + 4 * h, i);

count = 0;

}

count++;

}

for (int i = 0; i < this. Height; i = i + x)

{

e. Graphics. DrawLine (p, 0, i, this. Width, i);

}

k = (int)Math. Round ((double)this. Height/ ((double)x * 2));

count = 0;

for (int i = 0; i < this. Width; i = i + x / 10)

{

e. Graphics. DrawLine (p, i, k * x — 2 * h, i, k * x + 2 * h);

if (count == 5)

{

e. Graphics. DrawLine (p, i, k * x — 4 * h, i, k * x + 4 * h);

count = 0;

}

count++;

}

p. Dispose ();

}

private void OnChangeProperties ()

{

Invalidate ();

}

}

}

5.4 Класс Signal

Компонент Signal является настройщиком параметров электрических сигналов. На нем можно выбрать тип сигнала (гармонический или импульсный) и задать параметры сигналов для каждого типа. Для гармонического сигнала ими являются напряжение и частота, а для импульсного — напряжение, частота и время импульса (длительность).

using System;

using System. Collections. Generic;

using System. ComponentModel;

using System. Drawing;

using System. Data;

using System. Linq;

using System. Text;

using System. Windows. Forms;

namespace WindowsFormsControlLibrary1

{

public partial class Signal: UserControl

{

int UU; //напряжение

float F; //частота

//public double tp; //время паузы

float titi;

public Signal ()

{

UU = 1;

F = 1;

InitializeComponent ();

}

public int U

{

get { return UU; }

}

public float f

{

get { return F; }

}

public float ti

{

get { return titi; }

}

public void button1_Click (object sender, EventArgs e)

{

if (radioButton1. Checked == true)

{

string s = textBox1. Text;

try

{

UU = Convert. ToInt32(s);

}

catch

{

MessageBox. Show («Введенное значение не является числом!»);

return;

}

s = textBox2. Text;

try

{

F = Convert. ToInt32(s);

}

catch

{

MessageBox. Show («Введенное значение не является числом!»);

return;

}

this. Visible = false;

}

else if (radioButton2. Checked == true)

{

string s = textBox3. Text;

try

{

UU = Convert. ToInt32(s);

}

catch

{

MessageBox. Show («Введенное значение не является числом!»);

return;

}

s = textBox4. Text;

try

{

F = (float)Convert. ToDouble (s);

}

catch

{

MessageBox. Show («Введенное значение не является числом!»);

return;

}

s = textBox5. Text;

try

{

titi = (float)Convert. ToDouble (s);

double x = Math. Pow (f, -1);

if (x < ti)

{

MessageBox. Show («Время импульса не может быть больше периода»);

return;

}

}

catch

{

MessageBox. Show («Введенное значение не является числом!»);

return;

}

this. Visible = false;

}

}

private void button2_Click (object sender, EventArgs e)

{

this. Visible = false;

}

}

}

5.5 Класс Form2

Данный класс является контейнером для объектов Ostsilograf

using System;

using System. Collections. Generic;

using System. ComponentModel;

using System. Data;

using System. Drawing;

using System. Linq;

using System. Text;

using System. Windows. Forms;

namespace WindowsFormsApplication1

{

public partial class Form2: Form

{

public Form2()

{

InitializeComponent ();

}

private void создатьToolStripMenuItem_Click (object sender, EventArgs e)

{

Form1 f = new Form1();

f. MdiParent = this;

f. Show ();

}

private void закрытьToolStripMenuItem_Click (object sender, EventArgs e)

{

Application. Exit ();

}

private void каскадомToolStripMenuItem_Click (object sender, EventArgs e)

{

LayoutMdi (MdiLayout. Cascade);

}

private void вертикальноToolStripMenuItem_Click (object sender, EventArgs e)

{

LayoutMdi (MdiLayout. TileVertical);

}

private void горизонтальноToolStripMenuItem_Click (object sender, EventArgs e)

{

LayoutMdi (MdiLayout. TileHorizontal);

}

}

}

6. Внешний вид компонент и приложений

(Рис. 1)

осциллограф сигнал электрический амплитудный

(Рис. 2)

(Рис. 3)

(Рис. 4)

(Рис. 5)

(Рис. 6)

(Рис. 7)

7. Заключение

7.1 Выводы

В данном проекте реализован двухканальный виртуальный осциллограф с использованием компонент. Для удобства разработки были использованы три разработанные мной компоненты (Setka, Signal, Ostsilograf). Setka и Signal размещены на Ostsilograf, который и является выходным проектируемым компонентом. Так же на данной компоненте находятся стандартные компоненты, представляющие собой кнопки, статические тексты, текстовые окна и др. В связи с этим можно задавать с помощью генератора сигналы и измерять их. Для удобства измерения реализованы такие элементы управления, позволяющие изменить амплитуды и фазу сигналов. Имеется интерфейс для настройки экрана (четкость, яркость, подсветка).

7.2 Рекомендации

В дальнейшем можно реализовать следующие возможности:

1) Ввести дополнительные каналы для измерения сигналов.

2) Создать кнопку для зеркального отображения сигналов относительно их центра.

3) Добавить функции для сложения и вычитания сигналов.

4) Добавить синхронизацию

5) Реализовать базу данных сигналов

6) Добавить возможность анализировать сигналы

7) Добавить возможность отображения значений параметров сигналов на дисплее.

8) Реализовать возможность взаимодействия с другими приборами.

8. Список литературы

1) Методические указания к лабораторным работам по курсу «Технология программирования «Веселов А. А.

2) Павловская Т. «C# Программирование на языке высокого уровня»

3) Марченко А. «C# Введение в программирование»

4) Simon Robinsin и др. «C# для профессионалов том 1»

5) Simon Robinsin и др. «C# для профессионалов том 2»

6) Карли Ватсон «C#»

ПоказатьСвернуть
Заполнить форму текущей работой