增量式PID控制算法程序汇编.docx
《增量式PID控制算法程序汇编.docx》由会员分享,可在线阅读,更多相关《增量式PID控制算法程序汇编.docx(29页珍藏版)》请在冰豆网上搜索。
增量式PID控制算法程序汇编
增量式PID控制算法程序(汇编)
;********增量式PID控制算法程序***********
;T、TD、TI、KP依次从30H,33H,36H,39H开始。
;A,B,C的值依次存在BLOCK1,BLOCK2,BLOCK3的地址里
;这里R(k)给的是定值
;ORG0000H
BLOCK1EQU43H;A,B,CBLOCK2EQU46H
BLOCK3EQU49H
UKEQU4CH;存结果UK
RKEQU50H
EKEQU53H;存放偏差值E(k)的始址EK1EQU56H;存放E(k-1)的始址EK2EQU59H;存放E(k-2)的始址CKEQU5CH;采样数据始址
BUFFEQU60H;暂存区
BUFF1EQU63H
BUFF2EQU66H
RECEQU69H
TEST:
MOVRK,#01H;常数Rk的BCD码浮点数MOVRK+1,#12H;1.25MOVRK+2,#50H
MOV3CH,#01H;常数1的BCD码浮点数MOV3DH,#10H
MOV3EH,#00H
MOV40H,#01H;常数2的BCD码浮点数MOV41H,#20H
MOV42H,#00H
MOV30H,#01H;T的BCD码浮点数MOV31H,#23H;2.34MOV32H,#40H
MOV33H,#01H;Td的BCD码浮点数MOV34H,#35H;3.54MOV35H,#40H
MOV36H,#01H;Ti的BCD码浮点数MOV37H,#11H;1.12MOV38H,#20H
MOV39H,#01H;Kp的BCD码浮点数MOV3AH,#12H;1.25MOV3BH,#50H
MOVR0,#RK;指向,,,码浮点操作数
LCALLBTOF;将其转换成二进制浮点操作数MOVR0,#3CH
LCALLBTOF
MOVR0,#40H
LCALLBTOF
MOVR0,#39H
LCALLBTOF
MOVR0,#36H;指向,,,码浮点操作数TiLCALLBTOF;将其转换成二进制浮点操作数MOVR0,#33H;指向,,,码浮点操作数TdLCALLBTOF;将其转换成二进制浮点操作数MOVR0,#30H;指向,,,码浮点操作数TLCALLBTOF;将其转换成二进制浮点操作数
MOVR1,#BUFF1;保存30H中的值即T值LCALLFMOVR0
MOVR1,#36H;计算A值(1+T/Ti+Td/T).Kp
LCALLFDIV
MOVR1,#3CH;常数1
LCALLFADD
MOVR0,#33H;保存33H中的值
MOVR1,#BUFF
LCALLFMOVR0
MOVR1,#BUFF1
LCALLFDIV
MOVR1,#30H;30H里存的是T/Ti+1LCALLFADD
MOVR1,#39H
LCALLFMUL
MOVR1,#BLOCK1;将结果保存在BLOCK1中LCALLFMOVR0
MOVR1,#BUFF1;30H恢复原值
MOVR0,#30H
LCALLFMOV
MOVR1,#BUFF;33H恢复原值
MOVR0,#33H
LCALLFMOV
MOVR0,#40H;计算B的值Kp.(1+2.Td/T)
MOVR1,#33H
LCALLFMUL
MOVR1,#30H
LCALLFDIV
MOVR1,#3CH
LCALLFADD
MOVR1,#39H
LCALLFMUL
MOVR1,#BLOCK2;保存B值到BLOCK2中LCALLFMOVR0
MOVR0,#39H;计算C的值Kp.Td/TMOVR1,#33H
LCALLFMUL
MOVR1,#30H
LCALLFDIV
MOVR1,#BLOCK3;保存C值到BLOCK3中LCALLFMOVR0
MOVR0,#EK1;将EK1,EK2设初值0LCALLFCLR
MOVR0,#EK2
LCALLFCLR
MOVREC,#03H;设置采样次数
LOOP:
MOVCK,#7eH;采样数据暂时给了一个定值MOVCK+1,#21H;0.002112MOVCK+2,#12H
MOVR0,#CK
LCALLBTOF
MOVR0,#RK;保存R(k)中的值
MOVR1,#BUFF
LCALLFMOVR0
MOVR1,#CK
LCALLFSUB;计算R(k)-C(k)的值送给E(k)MOVR1,#EK
LCALLFMOVR0
MOVR1,#BUFF;恢复RK的值释放BUFFMOVR0,#RK
LCALLFMOV
MOVR0,#BLOCK2;将B.e(k-1)的值暂存在BUFF1中
MOVR1,#BUFF;保存B
LCALLFMOVR0
MOVR1,#EK1
LCALLFMUL
MOVR1,#BUFF1
LCALLFMOVR0
MOVR1,#BUFF;恢复B释放BUFFLCALLFMOV
MOVR0,#BLOCK3;将C.e(K-2)的值暂存在BUFF2中
MOVR1,#BUFF;保存C
LCALLFMOVR0
MOVR1,#EK2
LCALLFMUL
MOVR1,#BUFF2
LCALLFMOVR0
MOVR1,#BUFF;恢复C释放BUFFLCALLFMOV
MOVR0,#BLOCK1;A.E(k)MOVR1,#BUFF
LCALLFMOVR0
MOVR1,#EK
LCALLFMUL
MOVR1,#BUFF1;计算Uk值A.E(k)-B.E(k-1)+C.E(k-2)
LCALLFSUB
MOVR1,#BUFF2
LCALLFADD
MOVR1,#UK;保存结果到UK中
LCALLFMOVR0
MOVR1,#BUFF;恢复A释放BUFFLCALLFMOV
MOVR0,#UK;UK转换成BCD码浮点数输出LCALLFTOB
MOVR1,#EK1;将E(k-1)-->E(k-2),E(k)-->E(k-1)
MOVR0,#EK2
LCALLFMOV
MOVR1,#EK
MOVR0,#EK1
LCALLFMOV
LCALLDELAY;等待采样时刻
DJNZREC,NEXT1
SJMP$
NEXT1:
LJMPLOOP
DELAY:
MOVR7,#02HDELAY1:
MOVR6,#0FFHDELAY2:
DJNZR6,DELAY2DJNZR7,DELAY1
RET
;(,)标号:
,,,功能:
浮点数格式化
;入口条件:
待格式化浮点操作数在[R0]中。
;出口信息:
已格式化浮点操作数仍在[R0]中。
;影响资源:
PSW、A、R2、R3、R4、位1FH堆栈需求:
字节
FSDT:
LCALLMVR0;将待格式化操作数传送到第一工作区中LCALLRLN;通过左规完成格式化
LJMPMOV0;将已格式化浮点操作数传回到[R0]中
;(,)标号:
,,,功能:
浮点数加法
;入口条件:
被加数在[R0]中,加数在[R1]中。
;出口信息:
OV=0时,和仍在[R0]中,OV=1时,溢出。
;;影响资源:
PSW、A、B、R2,R7、位1EH、1FH堆栈需求:
字节
FADD:
CLRF0;设立加法标志
SJMPAS;计算代数和
;(,)标号:
,,,功能:
浮点数减法
;入口条件:
被减数在[R0]中,减数在[R1]中。
;出口信息:
OV=0时,差仍在[R0]中,OV=1时,溢出。
;影响资源:
PSW、A、B、R2,R7、位1EH、1FH堆栈需求:
字节
FSUB:
SETBF0;设立减法标志
AS:
LCALLMVR1;计算代数和。
先将[R1]传送到第二工作区MOVC,F0;用加减标志来校正第二操作数的有效符号CLRA;********,,,应加的一条语句
RRCA
XRLA,@R1
MOVC,ACC.7
ASN:
MOV1EH,C;将第二操作数的有效符号存入位1EH中XRLA,@R0;与第一操作数的符号比较
RLCA
MOVF0,C;保存比较结果
LCALLMVR0;将[R0]传送到第一工作区中
LCALLAS1;在工作寄存器中完成代数运算
MOV0:
INCR0;将结果传回到[R0]中的子程序入口INCR0
MOVA,R4;传回尾数的低字节
MOV@R0,A
DECR0
MOVA,R3;传回尾数的高字节
MOV@R0,A
DECR0
MOVA,R2;取结果的阶码
MOVC,1FH;取结果的数符
MOVACC.7,C;拼入阶码中
MOV@R0,A
CLRACC.7;不考虑数符
CLROV;清除溢出标志
CJNEA,#3FH,MV01;阶码是否上溢,********应为#40H
SETBOV;设立溢出标志
MV01:
MOVA,@R0;取出带数符的阶码RET
MVR0:
MOVA,@R0;将[R0]传送到第一工作区中的子程序
MOVC,ACC.7;将数符保存在位1FH中MOV1FH,C
MOVC,ACC.6;将阶码扩充为,,,,补码MOVACC.7,C
MOVR2,A;存放在R2中
INCR0
MOVA,@R0;将尾数高字节存放在R3中MOVR3,A;
INCR0
MOVA,@R0;将尾数低字节存放在R4中MOVR4,A
DECR0;恢复数据指针
DECR0
RET
MVR1:
MOVA,@R1;将[R1]传送到第二工作区中的子程序
MOVC,ACC.7;将数符保存在位1EH中MOV1EH,C
MOVC,ACC.6;将阶码扩充为,,,,补码MOVACC.7,C
MOVR5,A;存放在R5中
INCR1
MOVA,@R1;将尾数高字节存放在R6中MOVR6,A
INCR1
MOVA,@R1;将尾数低字节存放在R7中MOVR7,A
DECR1;恢复数据指针
DECR1
RET
AS1:
MOVA,R6;读取第二操作数尾数高字节ORLA,R7
JZAS2;第二操作数为零,不必运算MOVA,R3;读取第一操作数尾数高字节
ORLA,R4
JNZEQ
MOVA,R6;第一操作数为零,结果以第二操作数为准
MOVR3,A
MOVA,R7
MOVR4,A
MOVA,R5
MOVR2,A
MOVC,1EH
MOV1FH,C
AS2:
RET
EQ:
MOVA,R2;对阶,比较两个操作