汇编语言实现PID运算(3)

2019-03-10 14:38

//各存储单元清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作为分母


汇编语言实现PID运算(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:中国梦(900字)作文

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: