微机原理与汇编语言程序设计直流电机转速控制模板Word文档格式.docx
《微机原理与汇编语言程序设计直流电机转速控制模板Word文档格式.docx》由会员分享,可在线阅读,更多相关《微机原理与汇编语言程序设计直流电机转速控制模板Word文档格式.docx(25页珍藏版)》请在冰豆网上搜索。
即拆分法。
如两位十进制AB转换为A*10+B的形式,再通过A+30H与B+30H来转换为ASCII码,若溢出,加7运算。
DECSHOWPROCNEAR;
完成两位十进制数显示子程序
MOVDX,0
MOVBX,10;
计算AX/10
DIVBX
ADDAL,30H;
商+30H,即为十位数ASCII码
MOVAH,0EH
INT10H
ADDDL,30H;
余+30H,即为个位数ASCII码
MOVAH,2
INT21H
RET
DECSHOWENDP
实验接线图:
转速调节程序设计框图:
(a)转速调节主程序
主程序流程图:
程序清单:
;
***************根据CHECK配置信息修改下列符号值*******************
INTR_IVADDEQU0038H;
INTR对应的中断矢量地址
INTR_OCW1EQU21H;
INTR对应PC机内部8259的OCW1地址
INTR_OCW2EQU20H;
INTR对应PC机内部8259的OCW2地址
INTR_IMEQU0BFH;
INTR对应的中断屏蔽字
PCI_INTCSREQU0CC38H;
PCI卡中断控制寄存器地址
IOY0EQU0C400H;
片选IOY0对应的端口始地址
IOY1EQU0C440H;
*****************************************************************
MY8255_AEQUIOY0+00H*4;
8255的A口地址
MY8255_BEQUIOY0+01H*4;
8255的B口地址
MY8255_CEQUIOY0+02H*4;
8255的C口地址
MY8255_MODEEQUIOY0+03H*4;
8255的控制寄存器地址
AD0809EQUIOY1+00H;
AD0809的端口地址
STACK1SEGMENTSTACK
DW64DUP(?
)
TOPLABELWORD
STACK1ENDS
DATASEGMENT
TABLE1DB'
AssumedFanSpeed:
(/s)'
0AH,0DH,'
$'
;
字符串变量
TABLE2DB'
CurrentFanSpeed:
ENTDB0AH,0DH,'
换行,回车
CS_BAKDW?
保存INTR原中断处理程序入口段地址的变量
IP_BAKDW?
保存INTR原中断处理程序入口偏移地址的变量
IM_BAKDB?
保存INTR原中断屏蔽字的变量
CS_BAK1DW?
保存定时器0中断处理程序入口段地址的变量
IP_BAK1DW?
保存定时器0中断处理程序入口偏移地址的变量
IM_BAK1DB?
保存定时器0中断屏蔽字的变量
TSDB14H;
采样周期
SPECDW55;
转速给定值
IBANDDW0060H;
积分分离值
KPPDW1060H;
比例系数
KIIDW0010H;
积分系数
KDDDW0020H;
微分系数
YKDW?
CKDB?
VADDDW?
ZVDB?
ZVVDB?
TCDB?
FPWMDB?
CK_1DB?
EK_1DW?
AEK_1DW?
BEKDW?
AAAADB?
VAADB?
BBBDB?
VBBDB?
MARKDB?
R0DW?
R1DW?
R2DW?
R3DW?
R4DW?
R5DW?
R6DW?
R7DB?
R8DW?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETTABLE1;
显示字符串1
MOVAH,09H
MOVAX,SPEC;
显示给定值
CALLDECSHOW
MOVDX,OFFSETENT;
回车,换行
MOVDX,OFFSETTABLE2;
显示字符串2
CLI
MOVAX,0000H
MOVES,AX
MOVDI,0020H
MOVAX,ES:
[DI]
MOVIP_BAK1,AX;
保存定时器0中断处理程序入口偏移地址
MOVAX,OFFSETTIMERISR
MOVES:
[DI],AX;
设置实验定时中断处理程序入口偏移地址
ADDDI,2
MOVCS_BAK1,AX;
保存定时器0中断处理程序入口段地址
MOVAX,SEGTIMERISR
设置实验定时中断处理程序入口段地址
INAL,21H
MOVIM_BAK1,AL;
保存INTR原中断屏蔽字
ANDAL,0F7H
OUT21H,AL;
打开定时器0中断屏蔽位
MOVDX,PCI_INTCSR;
初始化PCI卡中断控制寄存器
MOVAX,1F00H;
向PCI_INTCSR中写入003F1F00H
OUTDX,AX
ADDDX,2
MOVAX,003FH
MOVDI,INTR_IVADD
MOVIP_BAK,AX;
保存INTR原中断处理程序入口偏移地址
MOVAX,OFFSETMYISR
设置当前中断处理程序入口偏移地址
MOVCS_BAK,AX;
保存INTR原中断处理程序入口段地址
MOVAX,SEGMYISR
设置当前中断处理程序入口段地址
MOVDX,INTR_OCW1
INAL,DX
MOVIM_BAK,AL;
ANDAL,INTR_IM
OUTDX,AL;
打开INTR的中断屏蔽位
MOVVADD,0000H;
变量的初始化
MOVZV,00H
MOVZVV,00H
MOVCK,00H
MOVYK,0000H
MOVCK_1,00H
MOVEK_1,0000H
MOVAEK_1,0000H
MOVBEK,0000H
MOVBBB,00H
MOVVBB,00H
MOVR0,0000H
MOVR1,0000H
MOVR2,0000H
MOVR3,0000H
MOVR4,0000H
MOVR5,0000H
MOVR6,0000H
MOVR7,00H
MOVR8,0000H
MOVMARK,00H
MOVFPWM,01H
MOVAAAA,7FH
MOVVAA,7FH
MOVTC,00H
MOVAL,80H;
初始化8255
MOVDX,MY8255_MODE
OUTDX,AL
MOVAL,00H
MOVDX,MY8255_B
MOVDX,MY8255_A
MOVDX,PC8254_MODE;
初始化PC机定时器0,定时1ms
MOVAL,36H
MOVDX,PC8254_COUNT0
MOVAL,8FH
MOVAL,04H
STI
M1:
MOVAL,TS;
判断采样周期到否?
SUBAL,TC
JNCM1;
没到则继续等待
MOVTC,00H;
采样周期到,将采样周期变量清0
MOVAL,ZVV
MOVAH,00H
MOVYK,AX;
得到反馈量YK
LOOP1:
MOVDX,AD0809;
启动A/D转换
CALLDALLY
读出转换结果
MOVDX,MY8255_A;
将结果显示于LED
MOVBL,AL
MOVBH,0
CALLPID;
调用PID子程序,得到控制量CK
MOVAL,CK;
把控制量转化成PWM输出
SUBAL,80H
JCIS0
MOVAAAA,AL
JMPCOU
IS0:
MOVAL,10H;
电机的启动值不能低于10H
COU:
MOVAL,7FH
SUBAL,AAAA
MOVBBB,AL
MOVAX,YK;
将反馈值YK送到屏幕显示
MOVDL,0DH;
回车
MOVAH,02H
MOVAH,1;
判断是否有按键按下
INT16H
JZM1;
无按键则跳回继续等待,有则退出
EXIT:
MOVAL,00H;
退出时停止电机运转
恢复PC机定时器0状态
恢复PCI卡中断控制寄存器
MOVAX,0000H;
恢复INTR原中断矢量
MOVAX,IP_BAK;
恢复INTR原中断处理程序入口偏移地址
[DI],AX
MOVAX,CS_BAK;
恢复INTR原中断处理程序入口段地址
MOVDX,INTR_OCW1;
恢复INTR原中断屏蔽寄存器的屏蔽字
MOVAL,IM_BAK
MOVAX,IP_BAK1;
恢复定时器0中断处理程序入口偏移地址
MOVAX,CS_BAK1;
恢复定时器0中断处理程序入口段地址
MOVAL,IM_BAK1
恢复屏蔽字
MOVAX,4C00H
MYISRPROCNEAR;
系统总线INTR中断处理程序
PUSHAX
PUSHCX
PUSHDX
MOVAL,MARK
CMPAL,01H
JZIN1
MOVMARK,01H
JMPIN2
IN1:
MOVMARK,00H;
计算转速
VV:
MOVDX,0000H
MOVAX,03E8H
MOVCX,VADD
CMPCX,0000H
JZMM1
DIVCX
MM:
MOVZV,AL
MOVVADD,0000H
MM1:
MOVAL,ZV
MOVZVV,AL
IN2:
清PCI卡控制寄存器标志位
SUBDX,19H
MOVDX,PCI_INTCSR
MOVDX,INTR_OCW2;
向PC机内部8259发送中断结束命令
MOVAL,20H
OUT20H,AL
POPDX
POPCX
POPAX
IRET
MYISRENDP
TIMERISRPROCNEAR;
PC机定时器0中断处理程序
INCTC;
采样周期变量加1
CALLKJ
CLC
CMPMARK,01H
JCTT1
INCVADD
CMPVADD,0700H;
转速值溢出,赋极值
MOVVADD,0700H
TT1:
MOVAL,20H;
中断结束,发EOI命令
TIMERISRENDP
KJPROCNEAR;
PWM子程序
CMPFPWM,01H;
PWM为1,产生PWM的高电平
JNZTEST2
CMPVAA,00H
JNZANOT0
MOVFPWM,02H
MOVAL,BBB
RCRAL,01H
MOVVBB,AL
JMPTEST2
ANOT0:
DECVAA
MOVAL,01H;
PB0=1电机转动
MOVDX,MY8255_B
TEST2:
CMPFPWM,02H;
PWM为2,产生PWM的低电平
JNZOUTT
CMPVBB,00H
JNZBNOT0
MOVAL,AAAA
MOVVAA,AL
JMPOUTT
BNOT0:
DECVBB
PB0=0电机停止
OUTT:
KJENDP
PID:
MOVAX,BX;
PID子程序
SUBAX,YK;
求偏差EK
MOVR0,AX
MOVR1,AX
SUBAX,EK_1
MOVR2,AX
SUBAX,AEK_1;
求BEK
MOVBEK,AX
MOVR8,AX
MOVAX,R1;
求偏差变化量AEK
MOVEK_1,AX
MOVAX,R2
MOVAEK_1,AX
TESTR1,8000H
JZEK1;
若偏差EK为正数,则不需要求补码
NEGR1;
若偏差EK为负数,则求偏差EK的补码
EK1:
判断偏差EK是否在积分分离值的范围内
SUBAX,IBAND
JCII;
在积分分离值范围内,则跳转到II,计算积分项
MOVR3,00H;
若不在积分分离值范围内,则将积分项清0
JMPDDD;
计算微分项
II:
计算积分项,结果放在R3变量中(R3=EK*TS/KII)
MOVAH,00H;
其中TS和KII均为正数,所以R3的正负由EK决定
MOVCX,R1
MULCX
MOVCX,KII
MOVR3,AX
TESTR0,8000H;
判断积分项的正负
JZDDD;
为正数,则跳转去计算微分项
NEGR3;
为负数,则将积分项的结果求补码
DDD:
TESTBEK,8000H;
判断BEK的正负
JZDDD1;
为正数,则BEK不变
NEGBEK;
为负数,则求BEK的补码
DDD1:
MOVAX,BEK;
计算微分项(R4=KDD*BEK/8TS)
MOVCX,KDD
MOVAL,TS
将微分项缩小8倍,防止溢出
MOVCX,0008H
MOVCX,AX
MOVR4,AX
TESTR8,8000H;
判断微分项的正负
JZDD1;
为正数,则结果不需要求补码
NEGR4;
为负数,则微分项结果R4求补码
DD1:
MOVAX,R3;
积分项和微分项相加,结果放在R5变量中
ADDAX,R4
MOVR5,AX
JOL9;
判断溢出
L2:
MOVAX,R5
ADDAX,R2
MOVR6,AX;
R6=R5+R2=积分项+微分项+AEK
JOL3
L5:
MOVAX,R6;
计算KPP*R6
MOVCX,KPP
IMULCX
MOVCX,1000H
IDIVCX
RCLAH,01H;
判断溢出,溢出赋极值
PUSHF
POPF
JCLLL1
CMPCH,00H
JZLLL2
JMPLLL2
LLL1:
CMPCH,0FFH
MOVAL,80H
LLL2:
MOVR7,AL;
CK=CK_1+CK
ADDAL,CK_1
JOL8
L18:
MOVCK_1,AL
ADDAL,80H
MOVCK,AL
L8:
TESTR7,80H;
CK溢出处理程序
JNZL17
MOVAL,7FH;
若为正溢出,则赋给正极值7FH
JMPL18
L17:
若为负溢出,则赋给赋极值80H
L9:
TESTR3,8000H
JNZL1
MOVR5,7FFFH;
若为正溢出,则赋给正极值7FFFH
JMPL2
L1:
MOVR5,8000H;
若为负溢出,则赋给负极值8000H
L3:
TESTR2,8000H
JNZL4
MOVR6,7FFFH
JMPL5
L4:
MOVR6,8000H
DALLYPROCNEAR;
软件延时子程序
MOVCX,4000H
D1:
MOVAX,0600H
D2:
DEC