Используемые в программе процедуры и макрокоманды
Proc _Reg
Цифровой регулируемый привод, таймерное исполнение!
Zad5: ;задача 5 в меню каркасной программы
mov [I],0 ;инициализация переменных, I(k)
mov [I1],0 ;I(k-1)
mov [Nupr],0 ;управление на ЦАП
mov [Y],0 ;Y(k)
mov [Y1],0 ;Y(k-1)
mov [X],4000 ;задание скорости на входе фильтра
mov ax,[X] ;
sar ax,3 ; ;ах=4000/8=500
mov [C],ax ;С=500
TaimIni 2735, Privod;f0=438Гц = 1/Т 0 ; Т 0 = 0,00228с,
;вектор прерывания - Privod
; цикл фоновой (прерываемой) программы
ckl:
DisplBin 320,Y ;индикация переменных, задание
DisplBin 350,Nos ;обратная связь
DisplBin 380,Nras ;рассогласование
DisplBin 410,Nu ;управление
KeyTest ;клавиатура нажималась? jz ckl ;переход по нулю
ExitInt ;выход из прерываний
WriteReg 0D000h, Nul ;обнулить ЦАП, останов привода jmp menu ;выход в меню
;=========================================
;обработчик таймерных прерываний
Privod:push ax ;сохранение регистров фоновой программы
push cx
push dx
Call _Fz ;фильтр, расчет задания, результат в Y
Call _Fos ;формирование обратной связи Nos
Call _Reg ;ПИ-регулятор, выход в Nu
mov al,20h ;код 20h – в регистр al
out 20h,al ;al – в порт с адресом 20h
pop dx ;восстановить регистры
pop cx
pop ax
sti ;разрешить прерывания процессору
iret ;возврат в фоновую программу
;===========================
;Используемые процедуры
PROC _Fz ;формирование задания, выход фильтра
mov ax,0
add ax,[C] ;ax=500
add ax,[Y] ;ax=500+y(k-1)
mov bx,[Y1]
sar bx,3 ;bx=1/8[y(k-1)]
sub ax,bx ;ax=500 + y(k-1) -1/8[y(k-1)]
mov [Y],ax ;Y(k) – новое значение задания скорости
mov [Y1],ax ;Y(k-1) ← Y(k) для нового цикла
ret ;возврат из процедуры
;================================================
;процедура формирования обратной связи с АЦП
PROC _Fos ;формирование обратной связи
ReadReg 0F400h, Nos ;чтение АЦП в переменную Nos ret
ENDP
;==========================================
;процедура регулятора скорости
mov dx,0 ;делимое в dx,ax
mov ax,[Nras] ;
mov bx,[a] ;делитель a=7 в регистре bx
div bx ;деление dx:ax на bx; в ах –частное, в dx–остаток
add ax,[I1] ;ax=Nras/a+I(k-1)
mov [I],ax ;I(k) – интегральная часть
mov [I1],ax ;I(k-1)=I(k)
add ax,[Nras] ;добавить пропорциональную часть
mov [Nu],ax ;Nu=ax – управление для ЦАП
WriteReg 0D100h ;переслать в ЦАП
ret ;возврат из процедуры
ENDP
;================================================
;Сегмент данных
DATASEG ;начало сегмента данных
INCLUDE "pr_menu.dat" ;файл с данными для меню
;Область для сохранения параметров системы.
oldip8 dw 0 ;старое смещение вектора прер.
oldcs8 dw 0 ;старый сегмент вектора прер.
;область сегмента данных – управление приводом
X dw 0 ;задание на входе фильтра
Y dw 0 ;выход фильтра y(k)
Y1 dw 0 ;выход фильтра y(k-1)
C dw 0 ;константа
I dw 0 ;компонент интеграла I(k)
I1 dw 0 ;компонент интегралаI(k-1)
Nos dw 0 ;значение обр.связи в k интервале
Ras dw 0 ;рассогласование
Nu dw 0 ;управление (на ЦАП)
a dw 7 ;коэффициент а=7 алгоритма
Nul dw 0 ;нулевая константа для ЦАП
;конец сегмента данных
ENDS
;===============================================
STACK 200h ;начало сегмента стека размером 200h
;===============================================
END Start ;конец программы, стартовый адрес
;===============================================
Процедуры
_DisplBin –вывод на экран однословного двоичного числа со знаком путем прямой записи в видеопамять. Требует установки: в di –адреса знакоместа на мониторе, в переменной Atr – атрибута символов.
_PrintBin –вывод двоичного числа в десятичной форме.
_TestKey – вывод на монитор кодов и сканкодов клавиатуры в десятичной форме.