//各存储单元清0,为PID运算做准备 PIDINT PROC
MOV EN1,0 //初始误差置0 MOV EN2,0
MOV EN11,0 //串级控制误差清0 MOV EN21,0
MOV UN,0 //控制量清0
MOV UNOV,0 //控制量溢出位清0
MOV WORD PTR ENPRO,0 //比例项低字清0 MOV WORD PTR ENPRO+2,0 //比例项高字清0 MOV ENINT1,0 //误差累积清0
MOV WORD PTR ENINT,0 //积分项低字清0 MOV WORD PTR ENINT+2,0 //积分项高字清0 MOV WORD PTR ENDIFF,0 //微分项低字清0 MOV WORD PTR ENDIFF+2,0 //微分项高字清0 MOV WORD PTR ENSUM,0 //三项和低字清0 MOV WORD PTR ENSUM+2,0 //三项和高字清0
MOV WORD PTR UD0,0 //微分项前一状态清0,用于实际微分中
MOV WORD PTR UD0+2,0
MOV WORD PTR UD1,0 //微分项前一状态清0,用于实际微分中
MOV WORD PTR UD1+2,0
MOV PV1,0 //一阶系统控制量清0 MOV PV2,0 //二阶系统控制量清0 MOV PV3,0 MOV UN1,0
MOV UN2,0 //串级系统中的被控量清0 MOV INTSEP,0 //积分分离初始化为关闭状态 RET PIDINT ENDP
//-----------------------PID1计算子程序---------------------
//调用前请为设定值SV赋值,PID的计算结果存储在控制量PV当中,验证作业(1) PID1 PROC
PUSH AX PUSH BX PUSH CX //PID计算过程
MOV AX,TD1 //调用乘除法,获得Td除以Tc乘以Kp MOV DIV1,AX MOV AX,TC1 MOV DIV2,AX
MOV SHIFTTIME2,4 //左移4位,按照Td的小数格式形成结果
CALL DIVISION
MOV AX,QUOTIENT
MOV MUL1,AX //商作为被乘数 MOV AX,KP1 MOV MUL2,AX
MOV SHIFTTIME1,4 CALL MULTIPLICATION
MOV AX,WORD PTR PRODUCT //假定乘积不超过16位△ PUSH AX //Td除以Tc乘以Kp的结果压入堆栈
MOV MOV MOV MOV MOV CALL MOV MOV MOV MOV MOV CALL MOV PUSH //
MOV MOV SUB MOV MOV MOV 的小数格式显示
MOV MOV CALL MOV MOV MOV MOV ENPRO双字中
//-------------//MOV MOV 项过早溢出△
ADD AX,TC1 //调用除法和乘法,获得Tc除以Ti乘以Kp DIV1,AX AX,TI1 DIV2,AX
SHIFTTIME2,4 DIVISION
AX,QUOTIENT //TC除以TI的结果作为被乘数 MUL1,AX AX,KP1 MUL2,AX
SHIFTTIME1,4 MULTIPLICATION
AX,WORD PTR PRODUCT
AX //Tc除以Ti乘以Kp的结果压入堆栈 AX,SV //取设定值和控制量的值 BX,PV
AX,BX //获得设定值与控制量之间的偏差 EN2,AX //偏差赋给当前误差值EN2
MUL1,AX //利用当前误差EN2计算比例项
BX,KP1 //比例项计算开始,Kp作为乘数,结果按照En MUL2,BX
SHIFTTIME1,4
MULTIPLICATION //调用乘法,获得比例项 AX,WORD PTR PRODUCT+2 WORD PTR ENPRO+2,AX AX,WORD PTR PRODUCT
WORD PTR ENPRO,AX //比例项计算完成,结果存在AX,EN2 //积分项计算开始
AX,0030H //此处积分的误差项用一个小值代替,防止积分 ENINT1,AX //误差累积
MOV AX,ENINT1 // 误差累积作为第一个乘数 MOV MUL1,AX
POP AX //弹出Tc除以Ti的商作为乘数 MOV MUL2,AX
MOV SHIFTTIME1,4 CALL MULTIPLICATION
MOV AX,WORD PTR PRODUCT+2 MOV WORD PTR ENINT+2,AX MOV AX,WORD PTR PRODUCT
MOV ENINT双字中
MOV SUB MOV POP MOV MOV CALL MOV MOV MOV MOV ENDIFF双字中 //结尾工作 CLC
MOV 和积分
ADD MOV MOV ADC MOV CLC
MOV ADD MOV MOV ADC MOV 加
MOV MOV MOV WORD PTR ENINT,AX //积分项计算完成,结果存在 AX,EN2 //微分项计算开始 AX,EN1 //计算前后误差的差值 MUL1,AX
AX //弹出Td除以Tc的商作为乘数 MUL2,AX
SHIFTTIME1,4 MULTIPLICATION
AX,WORD PTR PRODUCT+2 WORD PTR ENDIFF+2,AX AX,WORD PTR PRODUCT
WORD PTR ENDIFF,AX //微分项计算完成,结果存在 AX,WORD PTR ENPRO //计算三项的和,首先是比例AX,WORD PTR ENINT
WORD PTR ENSUM,AX //低字的和放入低字 AX,WORD PTR ENPRO+2 AX,WORD PTR ENINT+2
WORD PTR ENSUM+2,AX //高字的和放入高字 AX,WORD PTR ENSUM //加入微分项 AX,WORD PTR ENDIFF
WORD PTR ENSUM,AX //低字的和放入低字 AX,WORD PTR ENSUM+2 AX,WORD PTR ENDIFF+2
WORD PTR ENSUM+2,AX //高字的和放入高字,三项相 AX,WORD PTR ENSUM+2 //UN溢出量赋值为UNOV UNOV,AX
DISPLAYWORD,AX
CALL DISPLAYS
MOV AX,WORD PTR ENSUM
MOV UN,AX //此处UN和PV相同,不含控制对象 MOV AX,EN2
MOV EN1,AX //当前误差覆盖上一次误差 MOV AX,UN
MOV DISPLAYWORD,AX CALL DISPLAYS //每两个数形成一个换行
MOV DL,0AH // 每次调用显示时生成换行 MOV AH,02H INT 21H
//MOV DISPLAYWORD,CX //有这两句就不死循环,没有就死循环
//CALL DISPLAYS //DEC CX
//JNZ LOOP_PID5 POP CX POP BX POP AX RET PID1 ENDP
//-----------------------PID2计算子程序--------------------- //调用前请为设定值SV赋值,PID2的计算结果存储在控制量PV当中,用来验证内容(2) PID2 PROC
PUSH AX //初始状态保存,压入堆栈 PUSH BX PUSH CX MOV AX,0
MOV WORD PTR UD,AX //每次调用PID2,暂存值UD清0
MOV WORD PTR UD+2,AX MOV AX,SV //设定值 SUB AX,PV //被控量 MOV EN2,AX
MOV BX,EN2 //获取n时刻的误差
SUB BX,EN1 //与(n-1)时刻的误差做差,误差增量存在BX中
MOV MUL1,BX //--------------此处为了演示,把误差值调小 //MOV MUL1,0100H
MOV AX,KP2 //与KP2相乘 MOV MUL2,AX
MOV SHIFTTIME1,4
CALL MULTIPLICATION
MOV AX,WORD PTR PRODUCT+2 MOV WORD PTR ENPRO+2,AX MOV AX,WORD PTR PRODUCT
MOV WORD PTR ENPRO,AX //比例项计算完成,结果存在ENPRO双字中
MOV AX,KP2 //计算微分项,首先计算KP乘以KD MOV MUL1,AX MOV AX,KD2 MOV MUL2,AX
MOV SHIFTTIME1,4 CALL MULTIPLICATION
MOV AX,WORD PTR PRODUCT //假定KP2和KD2的乘积不超过16位 △
MOV MUL1,BX //乘积再和误差增量做乘积 MOV MUL2,AX
MOV SHIFTTIME1,4 CALL MULTIPLICATION
MOV AX,WORD PTR PRODUCT+2 MOV WORD PTR UD+2,AX
MOV AX,WORD PTR PRODUCT
MOV WORD PTR UD,AX //微分第二项计算完成,结果暂时保存在UD双字中
// 此时的UD只在第二个周期时有数值,其余周期为0 CLC //与第一项UD0相加 MOV AX,WORD PTR UD
ADD AX,WORD PTR UD0 //低字部分相加
MOV WORD PTR UD,AX //存放在暂存值WORD PTR UD中
MOV AX,WORD PTR UD+2 //高字部分相加 ADC AX,WORD PTR UD0+2
MOV WORD PTR UD+2,AX //暂存在双字UD中,至此,微分的乘数计算完成
//此时UD已经和UD0相加结合起来,从第二个周期开始的前若干个周期有数值
MOV AX,KD2 //计算括号外的乘数值 MOV MUL1,AX MOV AX,TC2 MOV MUL2,AX
MOV SHIFTTIME1,4 CALL MULTIPLICATION
MOV AX,WORD PTR PRODUCT //KD2和TC2的乘积存放在AX中
ADD AX,TD2 //乘积加上TD2作为分母