В статье представлена компьютерная программа для цифрового вольтметра на базе микросхемы TLC1549. Рассмотренный в статье виртуальный прибор может быть использован для проведения учебных измерений электрического напряжения на уроках физики.
Ключевые слова:аналого-цифровой преобразователь, цифровые измерения, цифровой вольтметр, виртуальный прибор, программирование, COM-порт, Lazarus.
В книге Патрика Гёлля [1, с. 17-22] приводится описание 10-разряднго аналого-цифрового преобразователя (АЦП), принципиальная схема которого с несущественными изменениями может выглядеть так, как это показано на рис. 1 [2; 6]. Предполагается, что АЦП подключается к COM-порту. Он фактически представляет собой цифровой вольтметр, способный измерять постоянные электрические напряжения в интервале от 0 до 5 В [2; 4]. Также в книге приводится описание программного обеспечения этого прибора на языке Паскаль, функционирование которого возможно лишь в операционной системе MS-DOS.
Для считывания данных с выхода этого АЦП, мы предлагаем простую компьютерную программу, написанную в среде программирования Lazarus и позволяющую использовать этот прибор, подключая его к современным компьютерам с операционными системами семейства Windows (Windows XP, Windows Vista, Windows 7) [7]. Если на компьютере отсутствует физический COM-порт, то этот АЦП также можно использовать с этим компьютером, подключая его через специальный адаптер USB-COM [2; 6]. Для этого на компьютере предварительно должен быть установлен драйвер виртуального COM-порта. Никаких изменений в предлагаемом программном обеспечении в этом случае производить не требуется. Программа представляет собой минимальный набор операторов, необходимых для проведения цифровых измерений напряжения [5], который может быть легко трансформирован опытным пользователем компьютерной техники в код, реализующий виртуальный цифровой осциллограф, с возможностью вывода визуальной информации в виде осциллограмм на экран в режиме реального времени [3].
Рис. 1. Принципиальная схема АЦП
Кратко опишем состав программы. В проект типа «Приложение», создаваемый с помощью Lazarus, должны быть включены следующие стандартные модули: Windows, Messages, Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, ExtCtrls. В тексте программы размещены описания констант Bit = 10 (разрядность АЦП) и Denominator = 1024 (разрешение АЦП или максимальное количество значений измеряемой величины) в блоке const, а также описания переменных hCom типа THandle, InitCOM типа PAnsiChar и Value типа Real (измеряемая величина) – в блоке public.
Приложение содержит элемент ComboBox1. В инспекторе событий ему сопоставлено событие OnChange, вызывающее процедуру TForm1.ComboBox1Change, текст которой приведен ниже:
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
InitCom := PChar(ComboBox1.Text);
OpenCOMPort;
end;
Кроме того, программа содержит процедуру TForm1.Beginning:
procedure TForm1.Beginning;
var i: Integer;
begin
for i := 1 to 9 do
begin
hCOM := CreateFile(PChar('COM' + IntToStr(i)),
GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING,
0, 0);
if hCOM = INVALID_HANDLE_VALUE then Continue;
ComboBox1.Items.Add('COM' + IntToStr(i));
CloseHandle(hCOM);
end;
end;
Также в программу добавлена процедура TForm1.OpenCOMPort:
procedure TForm1.OpenCOMPort;
begin
if hCOM <> INVALID_HANDLE_VALUE then CloseHandle(hCOM);
hCOM := INVALID_HANDLE_VALUE;
hCOM := CreateFile(InitCOM, GENERIC_READ or
GENERIC_WRITE, 0, nil, OPEN_EXISTING, 0, 0);
if ComboBox1.Text = '' then
Application.MessageBox(PChar('Порт не
подключен!'), 'Информация', MB_ICONWARNING)
else
Application.MessageBox(PChar('Порт ' + ComboBox1.Text +
' подключен.'), 'Информация', MB_ICONINFORMATION);
EscapeCommFunction(hCOM, SETBREAK);
end;
Ниже приводится текст процедуры TForm1.FormCreate, которой в инспекторе событий сопоставлено событие OnCreate.
procedure TForm1.FormCreate(Sender: TObject);
begin
Beginning;
ComboBox1.ItemIndex := 0;
InitCom := PChar(ComboBox1.Text);
OpenCOMPort;
end;
Процедуре TForm1.FormClose, текст которой идет ниже, сопоставлено событие OnClose.
procedure TForm1.FormClose(Sender: TObject; var CloseAction: TCloseAction);
begin
CloseHandle(hCom);
end;
Форма Form1 приложения содержит метку Label1, в которой будут выводиться значения измеряемой величины – электрического напряжения. Также на ней размещен элемент Timer1, свойство Interval которого равно 100. Программа содержит процедуру TForm1.Timer1Timer, которой сопоставлено событие OnTimer объекта Timer1 (текст размещен ниже).
procedure TForm1.Timer1Timer(Sender: TObject);
var ValueStr : string;
begin
Value := 5 * ADC / Denominator;
ValueStr := Format(' %1.2f В ', [Value]);
Label1.Caption := ValueStr;
end;
Наиболее важной подпрограммой является функция, осуществляющая считывание сигнала на выходе АЦП. Это функция ADC типа Word. Вид этой функции приведен ниже:
function TForm1.ADC: Word;
var i : Byte;
CommStatus: DWord;
begin
EscapeCommFunction(hCom, CLRDTR);
Result := 0;
for i := Bit - 1 downto 0 do
begin
EscapeCommFunction(hCom, SETRTS);
GetCommModemStatus(hCom, CommStatus);
if (CommStatus and MS_CTS_ON) <> 0 then Result :=
Result + (1 shl i);
EscapeCommFunction(hCom, CLRRTS);
end;
end;
Проверка работоспособности программы заключается в следующем. После компиляции запускают программу на выполнение. Если при наборе текста программы не допущено ошибок, то получится следующий результат. Программа найдет все существующие (физические и виртуальные) на компьютере COM-порты и активирует самый первый из них (с наименьшим номером). На экране появится окно с сообщением о том, что соответствующий порт подключен, а затем главное окно программы с элементом ComboBox1, с помощью которого можно будет переключать существующие на данном компьютере порты. В этом же окне выводится значение напряжения на входе АЦП. Меняя напряжение на входе с помощью обычной батарейки и потенциометра, можно убедиться в том, что значения напряжения на входе АЦП изменяются, и их можно наблюдать на экране (рис. 2).
Рис. 2. Главное окно приложения
Если использовать при написании программы среду программирования Lazarus версии 1.0, то в результате получится текст компьютерной программы следующего содержания.
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Windows, Messages, Classes, SysUtils, FileUtil, Forms,
Controls, Graphics, Dialogs, StdCtrls, ExtCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
ComboBox1: TComboBox;
Label1: TLabel;
Timer1: TTimer;
procedure ComboBox1Change(Sender: TObject);
procedure FormClose(Sender: TObject; var CloseAction:
TCloseAction);
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ private declarations }
procedure Beginning;
procedure OpenCOMPort;
public
{ public declarations }
hCom : THandle;
InitCOM : PAnsiChar;
Value : Real;
function ADC: Word;
end;
var
Form1: TForm1;
implementation
{$R *.lfm}
const
Bit = 10;
Denominator = 1024;
{ TForm1 }
procedure TForm1.FormCreate(Sender: TObject);
begin
Begining;
ComboBox1.ItemIndex := 0;
InitCom := PChar(ComboBox1.Text);
OpenCOMPort;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var ValueStr : string;
begin
Value := 5 * ADC / Denominator;
ValueStr := Format(' %1.2f В ', [Value]);
Label1.Caption := ValueStr;
end;
function TForm1.ADC: Word;
var i : Byte;
CommStatus: DWord;
begin
EscapeCommFunction(hCom, CLRDTR);
Result := 0;
for i := Bit - 1 downto 0 do
begin
EscapeCommFunction(hCom, SETRTS);
GetCommModemStatus(hCom, CommStatus);
if (CommStatus and MS_CTS_ON) <> 0 then Result :=
Result + (1 shl i);
EscapeCommFunction(hCom, CLRRTS);
end;
end;
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
InitCom := PChar(ComboBox1.Text);
OpenCOMPort;
end;
procedure TForm1.FormClose(Sender: TObject; var CloseAction:
TCloseAction);
begin
CloseHandle(hCom);
end;
procedure TForm1.Beginning;
var i: Integer;
begin
for i := 1 to 9 do
begin
hCOM := CreateFile(PChar('COM' + IntToStr(i)),
GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING,
0, 0);
if hCOM = INVALID_HANDLE_VALUE then Continue;
ComboBox1.Items.Add('COM' + IntToStr(i));
CloseHandle(hCOM);
end;
end;
procedure TForm1.OpenCOMPort;
begin
if hCOM <> INVALID_HANDLE_VALUE then CloseHandle(hCOM);
hCOM := INVALID_HANDLE_VALUE;
hCOM := CreateFile(InitCOM, GENERIC_READ or GENERIC_WRITE,
0, nil, OPEN_EXISTING, 0, 0);
if ComboBox1.Text = '' then
Application.MessageBox(PChar('Порт не подключен!'),
'Информация', MB_ICONWARNING)
else
Application.MessageBox(PChar('Порт ' + ComboBox1.Text +
' подключен.'), 'Информация', MB_ICONINFORMATION);
EscapeCommFunction(hCOM, SETBREAK);
end;
end.
Литература:
1. Гёлль П. Как превратить персональный компьютер в измерительный комплекс: Пер. с фр. – М.: ДМК Пресс, 2005. – 144 с.
2. Данилов О. Е. Аналого-цифровой преобразователь как базовый элемент учебного компьютерного измерительного комплекса с аналоговыми датчиками физических величин / О. Е. Данилов // Молодой ученый. – 2013. – № 4. – С. 114-119.
3. Данилов О. Е. Виртуальный прибор "Цифровой вольтметр" / О. Е. Данилов // Свидетельство о государственной регистрации программы для ЭВМ № 2011617600. – Заявка № 2011613163; зарегистр. в Реестре программ для ЭВМ 29.09.2011.
4. Данилов О. Е. Компьютерный вольтметр на базе микросхемы TLC1549 / О. Е. Данилов // Учебный физический эксперимент: Актуальные проблемы. Современные решения: Программа и материалы шестнадцатой Всероссийской научно-практической конференции. – Глазов: ГГПИ, 2011. – С. 49.
5. Данилов О. Е. Применение компьютерных технологий в учебном физическом эксперименте / О. Е. Данилов // Молодой ученый. – 2013. – № 1. – С. 330-333.
6. Данилов О. Е. Создание компьютерного измерительного комплекса с аналоговыми датчиками для школьного кабинета физики / О. Е. Данилов // Дистанционное и виртуальное обучение. – 2013. - № 3. – С. 93-102.
7. Данилов О. Е. Цифровой вольтметр для учебных измерений / О. Е. Данилов // Потенциал. – 2013. – № 12. – С. 37-44.