Библиографическое описание:

Данилов О. Е. Программное обеспечение цифрового вольтметра на базе микросхемы TLC1549 // Молодой ученый. — 2014. — №4. — С. 97-103.

В статье представлена компьютерная программа для цифрового вольтметра на базе микросхемы 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.

Обсуждение

Социальные комментарии Cackle