Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

лр / ТСАиУ Лабораторная работа №4 Задание 2024

.pdf
Скачиваний:
0
Добавлен:
21.12.2025
Размер:
470.28 Кб
Скачать

Лабораторная работа № 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 микросекунд.