- •Система сбора данных от низкоуровневых датчиков напряжения md155
- •1. Введение.
- •3.Основные технические характеристики устройства
- •4. Подключение к устройству датчиков сигналов, управляющих сигналов и питания.
- •5.Управление работой устройства
- •6.Пример программы для работы с устройством на языке pascal
5.Управление работой устройства
Обмен управляющей информацией и данными между устройством и РС осуществляется по шинам интерфейса RS-232. Посылка по этому интерфейсу имеет следующий формат:
-
115200 бит/сек;
-
8 бит данных;
-
1 стоп-бит;
-
без контрольного бита.
Управление работой устройства осуществляется путем прямой записи данных во внутренние регистры АЦП AD7731. Для првильного программирования работы этого АЦП необходимо ознакомиться с подробными правилами его программирования, изложенными в файле AD7731.pdf. При этом программист должен иметь в виду, что в разряды CH2..CH0 регистра режима работы (mode register) всегда должен записываться код 100. Это связано с тем, что в устройстве используется внешний по отношению к микросхеме АЦП коммутатор каналов, выход которого постоянно подключен к 0 внутреннему дифференциальному каналу этой микросхемы. В разряды MR11..MR9 и MR7 этого же регистра всегда должен записываться код 0, так как функции, определяемые этими разрядами, не могут быть использованы устройством.
Команда, передаваемая устройству, может состоять из одного или двух байтов. Первый байт содержит код команды, второй байт (если от необходим)- код аргумента.
Ниже приведены все команды, на которые реагирует устройство.
Команда «СБРОС». Эта команда состоит из одного байта с кодом 0. По этой команде микроконтроллер устройства переходит в режим ожидания новой команды независимо от предыдущего состояния. Команда «Сброс» позволяет вывести устройство из состояния ожидания готовности данных от АЦП в случае неправильного задания режима его работы.
Команда «УСТАНОВИТЬ КАНАЛ». Команда состоит из двух байтов. Первый байт содержит код 1, второй – код канала, подключающего измеряемый сигнал. Допустимыми значениями для второго байта являются 0..7. Все остальные коды передаются по модулю 8.
Команда «ЗАПИСАТЬ БАЙТ». Команда состоит из двух байтов. Первый байт содержит код 2, второй – байт, который необходимо передать во внутренние регистры АЦП AD7731.
Команда «ПРОЧИТАТЬ БАЙТ». Команда состоит из одного байта с кодом 3. В ответ на эту команду устройство передает 1 байт из внутренних регистров АЦП AD7731.
Команда «ПРОЧИТАТЬ БАЙТ С ОЖИДАНИЕМ ГОТОВНОСТИ ДАННЫХ». Команда состоит из одного байта с кодом 4. В ответ на эту команду устройство ожидает низкого уровня сигнала готовности данных в АЦП AD7731 и затем передает 1 байт из внутренних регистров АЦП AD7731.
Все команды с другими кодами устройство игнорирует.
6.Пример программы для работы с устройством на языке pascal
program MD155T1;
{полный тест системы сбора данных MD155 в режиме обмена через COMport}
USES Crt, dos, GRAPH;
const
base=$2F8; {адрес COM порта 2}
{base=$3F8; {адрес COM порта 1}
label 1,2,3,4,5,6;
var
ch,rn,t,t1,t2,tmp: byte;
f,sf,ttt,tt: word;
r: integer;
q: real;
{---------------------------------------------------------} Procedure COMPUT(i:byte);{запись байта через COMport}
begin
Port[base]:=i;
while(Port[base+5] and $20)=0 do ;
end;
{---------------------------------------------------------} Function COMGET:byte;{чтение байта через COMport}
var
i: word;
begin
i:=0;
while (Port[base+5] and $1)=0 do
begin
i:=i+1;
if i=000 then
begin
GotoXY(60,23);
{Writeln(' Time_Out ComGet ');}
exit;
end;
end;
COMGET:=Port[base];
end;
{---------------------------------------------------------} Procedure Init_COM;
{инициализация COMport}
var
i,j: byte;
Begin
Port[base+3]:=$83;{8bit, 1stop, no check}
{Port[base]:=6; {19200 bit/s}
{Port[base]:=2; {57600 bit/s} Port[base]:=1; {115200 bit/s} Port[base+1]:=0; Port[base+3]:=$1B; Port[base+1]:=$0; {no interrupt} for j:=1 to 16 do
begin
i:=port[base];
delay(1);
end;
end;
{---------------------------------------------------------} Procedure MD155wr_ch(i:byte);
{запись номера подключаемого канала устройства MD155}
begin
COMPUT(1);
COMPUT(i);
end;
{---------------------------------------------------------} Procedure MD155wr_byte(i:byte);
{запись байта i в АЦП AD7731 устройства MD155}
begin
COMPUT(2);
COMPUT(i);
end;
{---------------------------------------------------------} Function MD155rd_byte: byte;
{чтение байта из АЦП AD7731 устройства MD155 без ожидания
признака готовности}
begin
COMPUT(3);
MD155rd_byte:=COMGET;
end;
{---------------------------------------------------------} Function MD155rd_byte_rdy: byte;
{чтение байта из АЦП AD7731 устройства MD155 с ожиданием
признака готовности данных}
begin
COMPUT(4);
MD155rd_byte_rdy:=COMGET;
end;
{---------------------------------------------------------} Procedure MD155rst;
{принудительный перевод устройства MD155 в режим ожидания новой команды через COMport без завершения ожидания окончания предыдущей команды} begin
COMPUT(0);
end;
{---------------------------------------------------------} Procedure MD155rst_adc;
{принудительный сброс интерфейсного блока АЦП AD7731 устройства MD155} var
i: byte;
begin
for i:=1 to 4 do MD155wr_byte($FF);
end;
{---------------------------------------------------------}
begin
clrscr;{очистка экрана}
Init_COM;{инициализация COM порта}
MD155rst;{принудительный перевод устройства MD155 в режим ожидания новой команды}
MD155rst_adc;{принудительный сброс интерфейсного блока АЦП AD7731 устройства MD155}
Write('номер канала для ввода данных (0..7): ');
read(ch);
ch:=ch and $7;
Writeln('код диапазона входных сигналов (1..7)');
Writeln('1 - +-20мВ');
Writeln('2 - +-40мВ'); Writeln('3 - +-80мВ'); Writeln('4 - +-160мВ'); Writeln('5 - +-320мВ'); Writeln('6 - +-640мВ'); Writeln('7 - +-1280мВ');
Write('код диапазона входных сигналов (1..7): ');
read(rn);
rn:=rn and $7;
{вычисление кванта результата измерения q в мВ для 16-разр. АЦП}
tmp:=$1;
tmp:=tmp shl (7-rn); q:=1280/32768/(tmp);
Write('частота вывода данных (SKIP=0, CHP=1)(47..1280)[Гц]: '); read(f);
{вычисление константы sf для записи в АЦП MD7731} sf:=round(96000/f);
sf:=sf and $1FFF;
GoToXY(28,14);
Write('результат измерения');
GoToXY(20,24);
Write('для выхода из программы нажмите любую клавишу');
{---------------------------------------------------------}
{установка номера измерительного канала}
MD155wr_ch(ch);
{---------------------------------------------------------}
{запись информации в filter register AD7731}
MD155wr_byte($3);{запись в communication register}
tt:=(sf shl 4)+$4;{SKIP=0, CHP=1}
MD155wr_byte(Hi(tt));{запись старшего байта в filter
register AD7731}
MD155wr_byte(Lo(tt));{запись младшего байта в filter
register AD7731}
{---------------------------------------------------------}
{запуск внутренней автокалибровки нуля}
{---------------------------------------------------------}
{запись информации в mode register AD7731} MD155wr_byte($2);{запись в communication register}
tt:=(rn shl 4)+$8004;
MD155wr_byte(Hi(tt));{запись старшего байта в mode
register AD7731} MD155wr_byte(Lo(tt));{запись младшего байта в mode
register AD7731} delay(8000);{ожидание окончания автокалибровки}
{---------------------------------------------------------} {запуск внутренней автокалибровки масштаба}
{---------------------------------------------------------}
{запись информации в mode register AD7731} MD155wr_byte($2);{запись в communication register}
tt:=(rn shl 4)+$A004;
MD155wr_byte(Hi(tt));{запись старшего байта в mode
register AD7731} MD155wr_byte(Lo(tt));{запись младшего байта в mode
register AD7731} delay(8000);{ожидание окончания автокалибровки}
{---------------------------------------------------------} {запуск системной автокалибровки нуля}
{---------------------------------------------------------} (*
{запись информации в mode register AD7731} MD155wr_byte($2);{запись в communication register}
tt:=(rn shl 4)+$C004;
MD155wr_byte(Hi(tt));{запись старшего байта в mode
register AD7731} MD155wr_byte(Lo(tt));{запись младшего байта в mode
register AD7731} delay(4000);{ожидание окончания автокалибровки}
*)
{---------------------------------------------------------} {запуск основного режима работы АЦП}
{---------------------------------------------------------} {запись информации в mode register AD7731} MD155wr_byte($2);{запись в communication register}
tt:=(rn shl 4)+$2004;
MD155wr_byte(Hi(tt));{запись старшего байта в mode Register
AD7731}
MD155wr_byte(Lo(tt));{запись младшего байта в mode
register AD7731}
{---------------------------------------------------------}
{ожидание флага готовности и чтение результата преобразования}
{---------------------------------------------------------}
{запись информации в mode register AD7731} 2:MD155wr_byte($11);{запись в communication register} t1:=MD155rd_byte_rdy;{чтение старшего байта из data register AD7731 по низкому уровню сигнала RDY в АЦП AD7731} t2:=MD155rd_byte;{чтение младшего байта из data register AD7731} r:=(t1 shl 8)+t2-32767;
GoToXY(33,15);
Write(' мВ');
GoToXY(33,15);
Write(r*q:8:4);
if not KeyPressed then goto 2;
end.