📄 zhiliu.asm
字号:
MOV DX,INTR_OCW1 ;恢复INTR原中断屏蔽寄存器的屏蔽字
MOV AL,IM_BAK
OUT DX,AL
MOV DI,0020H
MOV AX,IP_BAK1 ;恢复定时器0中断处理程序入口偏移地址
MOV ES:[DI],AX
ADD DI,2
MOV AX,CS_BAK1 ;恢复定时器0中断处理程序入口段地址
MOV ES:[DI],AX
MOV AL,IM_BAK1
OUT 21H,AL ;恢复屏蔽字
STI
MOV AX,4C00H
INT 21H
MYISR PROC NEAR ;系统总线INTR中断处理程序
PUSH AX
PUSH CX
PUSH DX
MOV AX,DATA
MOV DS,AX
MOV AL,MARK
CMP AL,01H
JZ IN1
MOV MARK,01H
JMP IN2
IN1: MOV MARK,00H ;计算转速
VV: MOV DX,0000H
MOV AX,03E8H
MOV CX,VADD
CMP CX,0000H
JZ MM1
DIV CX
MM: MOV ZV,AL
MOV VADD,0000H
MM1: MOV AL,ZV
MOV ZVV,AL
IN2: MOV DX,PCI_INTCSR ;清PCI卡控制寄存器标志位
SUB DX,19H
IN AL,DX
MOV DX,PCI_INTCSR
ADD DX,2
MOV AX,003FH
OUT DX,AX
MOV DX,INTR_OCW2 ;向PC机内部8259发送中断结束命令
MOV AL,20H
OUT DX,AL
MOV AL,20H
OUT 20H,AL
POP DX
POP CX
POP AX
IRET
MYISR ENDP
TIMERISR PROC NEAR ;PC机定时器0中断处理程序
PUSH AX
PUSH CX
PUSH DX
MOV AX,DATA
MOV DS,AX
INC TC ;采样周期变量加1
CALL KJ
CLC
CMP MARK,01H
JC TT1
INC VADD
CMP VADD,0700H ;转速值溢出,赋极值
JC TT1
MOV VADD,0700H
MOV MARK,00H
TT1: MOV AL,20H ;中断结束,发EOI命令
OUT 20H,AL
POP DX
POP CX
POP AX
IRET
TIMERISR ENDP
KJ PROC NEAR ;PWM子程序
PUSH AX
CMP FPWM,01H ;PWM为1,产生PWM的高电平
JNZ TEST2
CMP VAA,00H
JNZ ANOT0
MOV FPWM,02H
MOV AL,BBB
CLC
RCR AL,01H
MOV VBB,AL
JMP TEST2
ANOT0: DEC VAA
MOV AL, 01H ;PB0=1 电机转动
MOV DX, MY8255_B
OUT DX,AL
TEST2: CMP FPWM,02H ;PWM为2,产生PWM的低电平
JNZ OUTT
CMP VBB,00H
JNZ BNOT0
MOV FPWM,01H
MOV AL,AAAA
CLC
RCR AL,01H
MOV VAA,AL
JMP OUTT
BNOT0: DEC VBB
MOV AL,00H ;PB0=0 电机停止
MOV DX,MY8255_B
OUT DX,AL
OUTT: POP AX
RET
KJ ENDP
PID: MOV AX,SPEC ;PID子程序
SUB AX,YK ;求偏差EK
MOV R0,AX
MOV R1,AX
SUB AX,EK_1
MOV R2,AX
SUB AX,AEK_1 ;求BEK
MOV BEK,AX
MOV R8,AX
MOV AX,R1 ;求偏差变化量AEK
MOV EK_1,AX
MOV AX,R2
MOV AEK_1,AX
TEST R1,8000H
JZ EK1 ;若偏差EK为正数,则不需要求补码
NEG R1 ;若偏差EK为负数,则求偏差EK的补码
EK1: MOV AX,R1 ;判断偏差EK是否在积分分离值的范围内
SUB AX,IBAND
JC II ;在积分分离值范围内,则跳转到II,计算积分项
MOV R3,00H ;若不在积分分离值范围内,则将积分项清0
JMP DDD ;计算微分项
II: MOV AL,TS ;计算积分项,结果放在R3变量中(R3=EK*TS/KII)
MOV AH,00H ;其中TS和KII均为正数,所以R3的正负由EK决定
MOV CX,R1
MUL CX
MOV CX,KII
DIV CX
MOV R3,AX
TEST R0,8000H ;判断积分项的正负
JZ DDD ;为正数,则跳转去计算微分项
NEG R3 ;为负数,则将积分项的结果求补码
DDD: TEST BEK,8000H ;判断BEK的正负
JZ DDD1 ;为正数,则BEK不变
NEG BEK ;为负数,则求BEK的补码
DDD1: MOV AX,BEK ;计算微分项(R4=KDD*BEK/8TS)
MOV CX,KDD
MUL CX
PUSH AX
PUSH DX
MOV AL,TS
MOV AH,00H ;将微分项缩小8倍,防止溢出
MOV CX,0008H
MUL CX
MOV CX,AX
POP DX
POP AX
DIV CX
MOV R4,AX
TEST R8,8000H ;判断微分项的正负
JZ DD1 ;为正数,则结果不需要求补码
NEG R4 ;为负数,则微分项结果R4求补码
DD1: MOV AX,R3 ;积分项和微分项相加,结果放在R5变量中
ADD AX,R4
MOV R5,AX
JO L9 ;判断溢出
L2: MOV AX,R5
ADD AX,R2
MOV R6,AX ;R6=R5+R2=积分项+微分项+AEK
JO L3
L5: MOV AX,R6 ;计算KPP*R6
MOV CX,KPP
IMUL CX
MOV CX,1000H
IDIV CX
MOV CX,AX
RCL AH,01H ;判断溢出,溢出赋极值
PUSHF
RCR AL,01H
POPF
JC LLL1
CMP CH,00H
JZ LLL2
MOV AL,7FH
JMP LLL2
LLL1: CMP CH,0FFH
JZ LLL2
MOV AL,80H
LLL2: MOV R7,AL ;CK=CK_1+CK
ADD AL,CK_1
JO L8
L18: MOV CK_1,AL
ADD AL,80H
MOV CK,AL
RET
L8: TEST R7,80H ;CK溢出处理程序
JNZ L17
MOV AL,7FH ;若为正溢出,则赋给正极值7FH
JMP L18
L17: MOV AL,80H ;若为负溢出,则赋给赋极值80H
JMP L18
L9: TEST R3,8000H
JNZ L1
MOV R5,7FFFH ;若为正溢出,则赋给正极值7FFFH
JMP L2
L1: MOV R5,8000H ;若为负溢出,则赋给负极值8000H
JMP L2
L3: TEST R2,8000H
JNZ L4
MOV R6,7FFFH
JMP L5
L4: MOV R6,8000H
JMP L5
DECSHOW PROC NEAR ;完成两位十进制数显示子程序
MOV DX,0
MOV BX,10 ;计算AX/10
DIV BX
ADD AL,30H ;商+30H,即为十位数ASCII码
MOV AH,0EH
INT 10H
ADD DL,30H ;余+30H,即为个位数ASCII码
MOV AH,2
INT 21H
RET
DECSHOW ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -