лр / ТСАиУ Лабораторная работа №4 Задание 2024
.pdfЛабораторная работа № 4
ИССЛЕДОВАНИЕ ПЕРЕХОДНЫХ ХАРАКТЕРИСТИК ОБЪЕКТА ПЕРВОГО ПОРЯДКА
Задание
1. Для начала необходимо получить переходную характеристику объекта. Методика получения переходной заключается в следующем:
вход объекта необходимо подключить к выходу ЦАП
выход объекта подключить к любому каналу АЦП (в примерах 1 канал)
поскольку при включении ЭВМ на выходе ЦАП устанавливается напряжение -5.12В (в регистре ЦАП на старте системы находится 0), перед проведением эксперимента необходимо установить на выходе ЦАП напряжение 0В. Делается это простой программой:
Turbo Pascal
begin
Port [$300]:= 2048;
end.
Borland C++
{
outpw(0x300,2048);
}
Далее необходимо подать ступенчатое воздействие на объект и сразу начать в цикле измерять отклик от него. Будем делать это методом рассмотренным в лабораторной работе №3, используя прерывание текущей программы. Данный метод используется, поскольку в нем можно задать напрямую период квантования измерений в микросекундах. Для начала установим минимально возможный период квантования 20 микросекунд. Примеры программ приведены далее.
2.По зарегистрированному переходному процессу в любом программном пакете построить график переходного процесса, определить тип звана и его параметры.
Примеры программ
Turbo Pascal
Uses Dos, crt;
const count:integer=1; M = 1000; T=40;
var
U: array [1..M] of integer; Ureal:real;
OldIntB: pointer;
i:integer; f:text; s:string;
Procedure wait(i:word); var j:word; begin for j:=1 to i do asm nop end;end;
Procedure IntDAC; interrupt; {Оперативная программа} begin {Старт оперативной программы}
asm STI end;{Установка IF=1 в регистре флагов ЦП} port[$304]:=$FF; {Запуск АЦП на измерение}
asm NOP end;
while (Port[$302]>=$F8) do ; {Проверка окончания измерения.}
Uvx[count]:=PortW[$300] {Считываем очередное значение} inc(count); {Инкремент программного счетчика}
if count>M then Port [$21]:=Port [$21] or $8; port[$20]:=$20;{IS3=0 Сброс бита регистра ISR – OCW2}
end; {Конец оперативной программы}
Procedure SetTime(T:word); var N1, N2: word;
begin
if (T >= 10) |
then |
begin |
|
port[$30B]:=$36; port[$30B]:=$56; |
|
N2:=10; |
N1:= T div N2; |
port[$308]:=Lo(N1);Port[$308]:=Hi(N1); port[$309]:=Lo(N2);
end
else writeln ('The parameter NOT in range!'); end;
begin { Основная программа.} port [$30F]:= 0;
port[$21]:=Port[$21] OR $8;
port[$302]:=$E0;
{Устанавливаем канал и режим измерения АЦП}
wait(?); { Задержка на переключение мультиплексора из ЛР2}
GetIntVec($B,OldIntB);
SetIntVec($B,@IntDAC);
SetTime(T);
portw[$300]:=4048; {отправляем на выход ЦАП 5 В}
port[$30F]:=1;
port[$21]:=Port[$21] AND (NOT ($8));
while count<=M do; {пустой цикл, пока не будут проведены все измерения}
{Вывод результатов в файл}
assign(f, 'c:\LR4.txt'); rewrite(f);
for i:=1 to M do begin
Ureal:= 2.5*(Uvx[i]-2048)/1000 str(Ureal:4:2,s); writeln(f,s);
end;
close(f); SetIntVec($B,OldIntB);
portw[$300]:=2048; {отправляем на выход ЦАП 0 В}
end.
Как видно из программы, происходит регистрация 1000 точек с периодом 20 микросекунд. После регистрации необходимо открыть файл и убедится, что переходной процесс дошел до установившегося значения. Если этого не произошло, нужно будет увеличить период квантования, например, взять 30 или 40 микросекунд.
Borland C++
#include <dos.h> #include <stdio.h>
const int M=1000, T=20;
int U[M];
int count=0;
void interrupt IntDAC(...)
{
asm sti; //Установка IF=1 в регистре флагов ЦП.
outp(0x304,0xFF); asm nop;
while (inp(0x302)>=0xF8); U[count]=inpw(0x300); count++;
outp(0x20,0x20); //IS3=0 Сброс бита регистра ISR OCW2.
}
int SetTime(int Time)
{
if (T>=10)
{
outp(0x30B,0x36);
outp(0x30B,0x56);
Time=Time/10;
outp(0x308,Time%256);outp(0x308,Time/256);
outp(0x309,10);
}
return 0;
}
int wait(long count)
{
for(int i=0;i<count;i++) asm nop;
return 0;
}
int main()
{
float Uvx;
void (interrupt far *oldvect)(...);
outp(0x302,0xE0);
wait(?);//Задержка на переключение мультиплексора из ЛР2
outp(0x30F,0);
outp(0x21,inp(0x21) | 0x8);
oldvect=getvect(0xB);
setvect(0xB,IntDAC);
SetTime(T);
outpw(0x300,4048); //отправляем на выход ЦАП 5 В
outp(0x30F,1);
outp(0x21,inp(0x21) & (!0x8));
while (count<M); //пустой цикл, пока не будут проведены все измерения
outp(0x30F,0);
setvect(0xB, oldvect);
// Вывод результатов в файл
FILE *f; f=fopen("c:\\LR4.txt","w"); char str[5];
for(int i=0;i<M;i++)
{
Uvx=(U[i]-2048)*0.0025; sprintf(str,"%f",Uvx); fputs(str,f); fputc('\n',f);
}
fclose(f);
outpw(0x300,2048); //отправляем на выход ЦАП 0 В return 0;
}
Как видно из программы, происходит регистрация 1000 точек с периодом 20 микросекунд. После регистрации необходимо открыть файл и убедится, что переходной процесс дошел до установившегося значения. Если этого не произошло, нужно будет увеличить период квантования, например, взять 30 или 40 микросекунд.
