//汇编语言实现PID运算,一阶二阶系统控制(含注释) //---------------------------------堆栈段--------------------------------- STACKS SEGMENT STACK
DW 128 DUP(?) //注意这里只有128个字节 STACKS ENDS
//---------------------------------数据段--------------------------------- DATAS SEGMENT //1.乘数运算数据存储区
MUL1 DW ? //存放被乘数 MUL2 DW ? //存放乘数
SHIFTTIME1 DB ? //存放 乘积需要向左移位的次数(若结果按照被乘数的小数位,此值大小为乘数小数位数)
PRODUCT DD ? //存放最终乘积 DIV1 DW ? //存放被除数 DIV2 DW ? //存放除数
SHIFTTIME2 DB ? //存放 商和余数需要向右移位的次数(此值大小为除数小数位数)
QUOTIENT DW ? //存放商(包含后四位的小数) REMAINDER DW ? //存放余数
DIV1DOT DW ? //小数部分移位后的值作为被除数,暂存值 QUOTIENTDOT DW ? //存放小数部分相除的商,暂存值
REMAINDERDOT DW ? //存放小数部分相除的余数,暂存值
ERROR2 DB 'DIV2=0,ERROR!',0AH,'$' //除0错误 SQUARE_TIME DW ? //开平方迭代次数
SQUARE1 DW ? //需要进行开方运算的变量
SHIFTTIME3 DB 0 //开方运算右移次数,为被开方数小数位数值的一半
SQUARE2 DW ? //开方运算的值
DISPLAYWORD DW ? //用于显示的字,做测试用 //取绝对值存储区
ABSNUM DW ? //被转换的数
ABSVAL DW ? //数转换完成后的数 //2.PID参数数据区
PV DW ? //被控量,可以提前给定一个量 SV DW 0010H //设定值,需要给定 UN DW ? //控制量
UNOV DW ? //若UN值溢出,高字部分放在UN2中 EN1 DW ? //前一控制周期(n-1)时刻偏差量 EN2 DW ? //后一控制周期n时刻偏差量 ENPRO DD ? //存放比例项 ENINT1 DW ? //累积偏差量 ENINT DD ? //存放积分项 ENDIFF DD ? //用于微分项
ENSUM DD ? //存放三项的和 //(1)PID 1 理想微分PID控制开环阶跃响应
KP1 DW 00A0H //比例系数 TI1 DW 0020H //积分时间常数 TD1 DW 0020H //微分时间常数 KD1 DW 0H //微分系数 TC1 DW 0008H //控制周期 //(2)PID 2 实际微分PID控制开环阶跃响应
KP2 DW 0010H //比例系数 TI2 DW 0020H TD2 DW 0020H KD2 DW 0020H 8000H
TC2 DW 0008H UD0 DD ? UD1 DD ? UD DD ? //(3)PID 3 闭环系统PID控制开环阶跃
SV1 DW 0100H KP DW ? TI DW ? TD DW ? KD DW ? 8000H
TC3 DW 0008H INTSEP DB ? 认为0
INTSEPVAL DW ? //主调节器的PID参数
//一阶系统PID的参数
KP3 DW 0070H TI3 DW 0050H TD3 DW 0001H KD3 DW 0001H 8000H
UN1 DW ? EN11 DW ? UD11 DW ? //副调节器的PID参数
KP4 DW 0050H TI4 DW 0050H TD4 DW 0000H KD4 DW 0050H 8000H
//积分时间常数 //微分时间常数
//微分系数 KP和KD的乘积不超过 //控制周期
//微分项前一状态值Ud(n-1) //存放微分项后一状态值Ud(n) //存放暂时的值 //闭环串级系统的设定值 //比例系数 //积分时间常数 //微分时间常数
//微分系数 KP和KD的乘积不超过 //控制周期
//积分分离是否开启,为1则开,为0则关,默 //积分分离值 //比例系数 //积分时间常数 //微分时间常数
//微分系数 KP和KD的乘积不超过 //主控制器的输出
//主调节器存储上一时刻误差 //存放上一时刻微分输出 //比例系数 //积分时间常数 //微分时间常数
//微分系数 KP和KD的乘积不超过 UN2 DW ? //副控制器的输出
EN21 DW ? // //副调节器存储上一时刻误差 UD21 DW ? //存放上一时刻微分输出 //3.被控对象数据存储区
KG DW ? //控制对象的增益 TG DW ? //控制对象的时间常数 //(1)一阶惯性环节
K1 DW 0010H //增益,按照KP的小数格式,最后四位为小数位
T1 DW 0020H //惯性时间常数,最后四位为小数 PV2 DW ? //一阶系统的输出 TC DW 0008H //控制周期
//(2)二阶惯性环节,与一阶一起构成二阶系统,K1,T1,K2,T2四个系数
K2 DW 0010H //增益,按照KP的小数格式,最后四位为小数位
T2 DW 0020H //惯性时间常数,最后四位为小数 PV1 DW ? //二阶系统的输出
PV3 DW ? //二阶系统中两个一阶系统之间的输出值 DATAS ENDS
//----------------------------------代码段--------------------------------- CODES SEGMENT
ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS //初始化 MOV DS,AX
//PID1 理想微分开环阶跃响应
MOV CX,200 //PID计算次数 MOV PV,0000H //开环阶跃效应,第一周期输入为0,故PV设置为SV的值
CALL PIDINT LOOP1:
//MOV BX,WORD PTR ENPRO+2 //MOV DISPLAYWORD,BX //CALL DISPLAYS
//MOV BX,WORD PTR ENPRO //MOV DISPLAYWORD,BX //CALL DISPLAYS
//MOV AX,WORD PTR ENINT+2 //MOV DISPLAYWORD,AX //CALL DISPLAYS
//MOV AX,WORD PTR ENINT //MOV DISPLAYWORD,AX //CALL DISPLAYS
//MOV BX,WORD PTR ENDIFF+2
//MOV DISPLAYWORD,BX //CALL DISPLAYS
//MOV BX,WORD PTR ENDIFF //MOV DISPLAYWORD,BX //CALL DISPLAYS
//MOV INTSEP,0 //开启积分分离 //MOV INTSEPVAL,0008H CALL PIDG1 MOV AX,PV2
MOV DISPLAYWORD,AX
CALL DISPLAYS //显示被控量PV的值 //CALL PIDG1 //MOV AX,PV2
//MOV DISPLAYWORD,AX //CALL DISPLAYS MOV DL,0AH MOV AH,02H INT 21H //CALL PID2
//MOV PV,0H //从第二个周期开始PV值设为0,用于阶跃响应
DEC CX JNZ LOOP1
//用于测试乘法部分
//MOV MUL1,1000H //MOV MUL2,0030H //MOV SHIFTTIME1,4 //CALL MULTIPLICATION
//MOV AX,WORD PTR PRODUCT //MOV BX,WORD PTR PRODUCT+2 //MOV DISPLAYWORD,BX //CALL DISPLAYS
//MOV DISPLAYWORD,AX //CALL DISPLAYS //用于测试除法部分
//MOV DIV1,0078H //为被除数和除数赋值 //MOV DIV2,0050H //MOV SHIFTTIME2,4 //CALL DIVISION
//MOV AX,TC1 //调用乘法,获得Td除以Tc乘以Kp //MOV DIV1,AX //MOV AX,TI1
//MOV DIV2,AX
//MOV SHIFTTIME2,4 //左移4位,按照Td的小数格式形成结果
//CALL DIVISION
//MOV AX,QUOTIENT
//MOV DISPLAYWORD,AX //查看商的值 //CALL DISPLAYS
//MOV AX,REMAINDER
//MOV DISPLAYWORD,AX //用于测试,查看余数的值 //CALL // MOV //MOV //MOV //MOV //MOV //CALL //MOV //MOV //MOV //MOV //CALL //MOV //MOV //MOV //MOV //MOV //CALL //MOV //MOV //CALL //测试开平方部分
//MOV //MOV //CALL //MOV //MOV //CALL //测试数值转换部分:
//MOV //MOV //CALL //MOV //MOV DISPLAYS
AX,TC1 //调用除法和乘法,获得Tc除以Ti乘以Kp DIV1,AX AX,TI1 DIV2,AX
SHIFTTIME2,4 DIVISION
AX,QUOTIENT //左移4位,按照Tc的小数格式形成结果 MUL2,AX MUL1,1000H SHIFTTIME1,4 MULTIPLICATION
AX,WORD PTR PRODUCT MUL1,AX AX,KP1 MUL2,AX
SHIFTTIME1,4 MULTIPLICATION
AX,WORD PTR PRODUCT DISPLAYWORD,AX DISPLAYS SQUARE_TIME,10 //迭代次数为100次 SQUARE1,14H //被开放数为19 SQUARE
AX,SQUARE2
DISPLAYWORD, AX DISPLAYS AX,8011H ABSNUM,AX ABSOLUTE AX,ABSVAL
DISPLAYWORD,AX