汇编语言实现PID运算Word下载.docx
《汇编语言实现PID运算Word下载.docx》由会员分享,可在线阅读,更多相关《汇编语言实现PID运算Word下载.docx(8页珍藏版)》请在冰豆网上搜索。
SHIFTTIME2DB?
//存放商和余数需要向右移位的次数(此值大小为除数小数位数)
QUOTIENTDW?
//存放商(包含后四位的小数)
REMAINDERDW?
//存放余数
DIV1DOTDW?
//小数部分移位后的值作为被除数,暂存值QUOTIENTDOTDW?
//存放小数部分相除的商,暂存值
REMAINDERDOTDW?
//存放小数部分相除的余数,暂存值
ERROR2DB'
DIV2=0,ERROR!
'
0AH,'
$'
//除0错误SQUARE_TIMEDW?
//开平方迭代次数
SQUARE1DW?
//需要进行开方运算的变量
SHIFTTIME3DB0//开方运算右移次数,为被开方数小数位数值的一半
SQUARE2DW?
//开方运算的值
DISPLAYWORDDW?
//用于显示的字,做测试用
//取绝对值存储区
ABSNUMDW?
//被转换的数
ABSVALDW?
//数转换完成后的数
//2.PID参数数据区
PVDW?
//被控量,可以提前给定一个量
SVDW0010H//设定值,需要给定
UNDW?
//控制量
UNOVDW?
//若UN值溢出,高字部分放在UN2中
EN1DW?
//前一控制周期(n-1)时刻偏差量
EN2DW?
//后一控制周期n时刻偏差量
ENPRODD?
//存放比例项
ENINT1DW?
//累积偏差量
ENINTDD?
//存放积分项
ENDIFFDD?
//用于微分项
ENSUMDD?
//存放三项的和
//
(1)PID1理想微分PID控制开环阶跃响应
KP1DW00A0H//比例系数
TI1DW0020H//积分时间常数
TD1DW0020H//微分时间常数
KD1DW0H//微分系数
TC1DW0008H//控制周期
//
(2)PID2实际微分PID控制开环阶跃响应
KP2DW0010H//比例系数
TI2DW0020H//积分时间常数
TD2DW0020H//微分时间常数
KD2DW0020H//微分系数KP和KD的乘积不超过8000H
TC2DW0008H//控制周期
UD0DD?
//微分项前一状态值Ud(n-1)
UD1DD?
//存放微分项后一状态值Ud(n)
UDDD?
//存放暂时的值
//(3)PID3闭环系统PID控制开环阶跃
SV1DW0100H//闭环串级系统的设定值
KPDW?
//比例系数
TIDW?
//积分时间常数
TDDW?
//微分时间常数
KDDW?
//微分系数KP和KD的乘积不超过8000H
TC3DW0008H//控制周期
INTSEPDB?
//积分分离是否开启,为1则开,为0则关,默认为0
INTSEPVALDW?
//积分分离值
//主调节器的PID参数
//一阶系统PID的参数
KP3DW0070H//比例系数
TI3DW0050H//积分时间常数
TD3DW0001H//微分时间常数
KD3DW0001H//微分系数KP和KD的乘积不超过8000H
UN1DW?
//主控制器的输出
EN11DW?
//主调节器存储上一时刻误差
UD11DW?
//存放上一时刻微分输出
//副调节器的PID参数
KP4DW0050H//比例系数
TI4DW0050H//积分时间常数
TD4DW0000H//微分时间常数
KD4DW0050H//微分系数KP和KD的乘积不超过8000H
UN2DW?
//副控制器的输出
EN21DW?
////副调节器存储上一时刻误差
UD21DW?
//3.被控对象数据存储区
KGDW?
//控制对象的增益
TGDW?
//控制对象的时间常数
//
(1)一阶惯性环节
K1DW0010H//增益,按照KP的小数格式,最后四位为小数位
T1DW0020H//惯性时间常数,最后四位为小数
PV2DW?
//一阶系统的输出
TCDW0008H//控制周期
//
(2)二阶惯性环节,与一阶一起构成二阶系统,K1,T1,K2,T2四个系数
K2DW0010H//增益,按照KP的小数格式,最后四位为小数位
T2DW0020H//惯性时间常数,最后四位为小数
PV1DW?
//二阶系统的输出
PV3DW?
//二阶系统中两个一阶系统之间的输出值
DATASENDS
//----------------------------------代码段---------------------------------
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
START:
MOVAX,DATAS//初始化
MOVDS,AX
//PID1理想微分开环阶跃响应
MOVCX,200//PID计算次数
MOVPV,0000H//开环阶跃效应,第一周期输入为0,故PV设置为SV的值
CALLPIDINT
LOOP1:
//MOVBX,WORDPTRENPRO+2
//MOVDISPLAYWORD,BX
//CALLDISPLAYS
//MOVBX,WORDPTRENPRO
//MOVAX,WORDPTRENINT+2
//MOVDISPLAYWORD,AX
//MOVAX,WORDPTRENINT
//MOVBX,WORDPTRENDIFF+2
//MOVBX,WORDPTRENDIFF
//MOVINTSEP,0//开启积分分离
//MOVINTSEPVAL,0008H
CALLPIDG1
MOVAX,PV2
MOVDISPLAYWORD,AX
CALLDISPLAYS//显示被控量PV的值
//CALLPIDG1
//MOVAX,PV2
MOVDL,0AH
MOVAH,02H
INT21H
//CALLPID2
//MOVPV,0H//从第二个周期开始PV值设为0,用于阶跃响应
DECCX
JNZLOOP1
//用于测试乘法部分
//MOVMUL1,1000H
//MOVMUL2,0030H
//MOVSHIFTTIME1,4
//CALLMULTIPLICATION
//MOVAX,WORDPTRPRODUCT
//MOVBX,WORDPTRPRODUCT+2
//用于测试除法部分
//MOVDIV1,0078H//为被除数和除数赋值
//MOVDIV2,0050H
//MOVSHIFTTIME2,4
//CALLDIVISION
//MOVAX,TC1//调用乘法,获得Td除以Tc乘以Kp
//MOVDIV1,AX
//MOVAX,TI1
//MOVDIV2,AX
//MOVSHIFTTIME2,4//左移4位,按照Td的小数格式形成结果
//MOVAX,QUOTIENT
//MOVDISPLAYWORD,AX//查看商的值
//MOVAX,REMAINDER
//MOVDISPLAYWORD,AX//用于测试,查看余数的值
//MOVAX,TC1//调用除法和乘法,获得Tc除以Ti乘以Kp
//MOVAX,QUOTIENT//左移4位,按照Tc的小数格式形成结果
//MOVMUL2,AX
//MOVMUL1,AX
//MOVAX,KP1
//测试开平方部分
//MOVSQUARE_TIME,10//迭代次数为100次
//MOVSQUARE1,14H//被开放数为19
//CALLSQUARE
//MOVAX,SQUARE2
//MOVDISPLAYWORD,AX
//测试数值转换部分:
//MOVAX,8011H
//MOVABSNUM,AX
//CALLABSOLUTE
//MOVAX,ABSVAL