📄 zhiliu.asm
字号:
;Zhiliu.asm
;直流电机闭环调速实验
;***************根据CHECK配置信息修改下列符号值*******************
INTR_IVADD EQU 01CCH ;INTR对应的中断矢量地址
INTR_OCW1 EQU 0A1H ;INTR对应PC机内部8259的OCW1地址
INTR_OCW2 EQU 0A0H ;INTR对应PC机内部8259的OCW2地址
INTR_IM EQU 0F7H ;INTR对应的中断屏蔽字
PCI_INTCSR EQU 9438H ;PCI卡中断控制寄存器地址
IOY0 EQU 9C00H ;片选IOY0对应的端口始地址
;*****************************************************************
MY8255_A EQU IOY0+00H*4 ;8255的A口地址
MY8255_B EQU IOY0+01H*4 ;8255的B口地址
MY8255_C EQU IOY0+02H*4 ;8255的C口地址
MY8255_MODE EQU IOY0+03H*4 ;8255的控制寄存器地址
PC8254_COUNT0 EQU 40H ;PC机内8254定时器0端口地址
PC8254_MODE EQU 43H ;PC机内8254控制寄存器端口地址
STACK1 SEGMENT STACK
DW 64 DUP(?)
TOP LABEL WORD
STACK1 ENDS
DATA SEGMENT
TABLE1 DB 'Assumed Fan Speed:(/s)',0AH,0DH,'$' ;字符串变量
TABLE2 DB 'Current Fan Speed:(/s)',0AH,0DH,'$' ;字符串变量
ENT DB 0AH,0DH,'$' ;换行,回车
CS_BAK DW ? ;保存INTR原中断处理程序入口段地址的变量
IP_BAK DW ? ;保存INTR原中断处理程序入口偏移地址的变量
IM_BAK DB ? ;保存INTR原中断屏蔽字的变量
CS_BAK1 DW ? ;保存定时器0中断处理程序入口段地址的变量
IP_BAK1 DW ? ;保存定时器0中断处理程序入口偏移地址的变量
IM_BAK1 DB ? ;保存定时器0中断屏蔽字的变量
TS DB 14H ;采样周期
SPEC DW ? ;转速给定值
IBAND DW 0060H ;积分分离值
KPP DW 1060H ;比例系数
KII DW 0010H ;积分系数
KDD DW 0020H ;微分系数
YK DW ?
CK DB ?
VADD DW ?
ZV DB ?
ZVV DB ?
TC DB ?
FPWM DB ?
CK_1 DB ?
EK_1 DW ?
AEK_1 DW ?
BEK DW ?
AAAA DB ?
VAA DB ?
BBB DB ?
VBB DB ?
MARK DB ?
R0 DW ?
R1 DW ?
R2 DW ?
R3 DW ?
R4 DW ?
R5 DW ?
R6 DW ?
R7 DB ?
R8 DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET TABLE1 ;显示字符串1
MOV AH,09H
INT 21H
MOV AH,01H
INT 21H
MOV BL,10H
MUL BL
MOV BX,AX
MOV AH,01
INT 21
AND AH,00H
ADD AX,BX
MOV SPEC,AX
; MOV AX,SPEC ;显示给定值
CALL DECSHOW
MOV DX,OFFSET ENT ;回车,换行
MOV AH,09H
INT 21H
MOV DX,OFFSET TABLE2 ;显示字符串2
MOV AH,09H
INT 21H
CLI
MOV AX,0000H
MOV ES,AX
MOV DI,0020H
MOV AX,ES:[DI]
MOV IP_BAK1,AX ;保存定时器0中断处理程序入口偏移地址
MOV AX,OFFSET TIMERISR
MOV ES:[DI],AX ;设置实验定时中断处理程序入口偏移地址
ADD DI,2
MOV AX,ES:[DI]
MOV CS_BAK1,AX ;保存定时器0中断处理程序入口段地址
MOV AX,SEG TIMERISR
MOV ES:[DI],AX ;设置实验定时中断处理程序入口段地址 ..........................................
IN AL,21H ;??????????????????????????????????????????????????????????????????????????????? 系统中断的地址?
MOV IM_BAK1,AL ;保存INTR原中断屏蔽字
AND AL,0F7H
OUT 21H,AL ;打开定时器0中断屏蔽位
MOV DX,PCI_INTCSR ;初始化PCI卡中断控制寄存器
MOV AX,1F00H ;向PCI_INTCSR中写入003F1F00H
OUT DX,AX
ADD DX,2
MOV AX,003FH
OUT DX,AX
MOV DI,INTR_IVADD
MOV AX,ES:[DI]
MOV IP_BAK,AX ;保存INTR原中断处理程序入口偏移地址
MOV AX,OFFSET MYISR
MOV ES:[DI],AX ;设置当前中断处理程序入口偏移地址
ADD DI,2
MOV AX,ES:[DI]
MOV CS_BAK,AX ;保存INTR原中断处理程序入口段地址
MOV AX,SEG MYISR
MOV ES:[DI],AX ;设置当前中断处理程序入口段地址
MOV DX,INTR_OCW1
IN AL,DX
MOV IM_BAK,AL ;保存INTR原中断屏蔽字
AND AL,INTR_IM
OUT DX,AL ;打开INTR的中断屏蔽位
MOV VADD,0000H ;变量的初始化
MOV ZV,00H
MOV ZVV,00H
MOV CK,00H
MOV YK,0000H
MOV CK_1,00H
MOV EK_1,0000H
MOV AEK_1,0000H
MOV BEK,0000H
MOV BBB,00H
MOV VBB,00H
MOV R0,0000H
MOV R1,0000H
MOV R2,0000H
MOV R3,0000H
MOV R4,0000H
MOV R5,0000H
MOV R6,0000H
MOV R7,00H
MOV R8,0000H
MOV MARK,00H
MOV FPWM,01H
MOV AAAA,7FH
MOV VAA,7FH
MOV TC,00H
MOV AL,80H ;初始化8255
MOV DX,MY8255_MODE
OUT DX,AL
MOV AL,00H
MOV DX,MY8255_B
OUT DX,AL
MOV DX,PC8254_MODE ;初始化PC机定时器0,定时1ms
MOV AL,36H
OUT DX,AL
MOV DX,PC8254_COUNT0
MOV AL,8FH
OUT DX,AL
MOV AL,04H
OUT DX,AL
STI
M1: MOV AL,TS ;判断采样周期到否?
SUB AL,TC
JNC M1 ;没到则继续等待
MOV TC,00H ;采样周期到,将采样周期变量清0
MOV AL,ZVV
MOV AH,00H
MOV YK,AX ;得到反馈量YK
CALL PID ;调用PID子程序,得到控制量CK
MOV AL,CK ;把控制量转化成PWM输出
SUB AL,80H
JC IS0
MOV AAAA,AL
JMP COU
IS0: MOV AL,10H ;电机的启动值不能低于10H
MOV AAAA,AL
COU: MOV AL,7FH
SUB AL,AAAA
MOV BBB,AL
MOV AX,YK ;将反馈值YK送到屏幕显示
CALL DECSHOW
MOV DL,0DH ;回车
MOV AH,02H
INT 21H
MOV AH,1 ;判断是否有按键按下
INT 16H
JZ M1 ;无按键则跳回继续等待,有则退出
EXIT: CLI
MOV AL,00H ;退出时停止电机运转
MOV DX,MY8255_B
OUT DX,AL
MOV DX,PC8254_MODE ;恢复PC机定时器0状态
MOV AL,36H
OUT DX,AL
MOV DX,PC8254_COUNT0
MOV AL,00H
OUT DX,AL
MOV AL,00H
OUT DX,AL
MOV DX,PCI_INTCSR ;恢复PCI卡中断控制寄存器
MOV AX,0000H
OUT DX,AX
MOV AX,0000H ;恢复INTR原中断矢量
MOV ES,AX
MOV DI,INTR_IVADD
MOV AX,IP_BAK ;恢复INTR原中断处理程序入口偏移地址
MOV ES:[DI],AX
ADD DI,2
MOV AX,CS_BAK ;恢复INTR原中断处理程序入口段地址
MOV ES:[DI],AX
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -