增量式PID控制算法程序汇编文档格式.docx
《增量式PID控制算法程序汇编文档格式.docx》由会员分享,可在线阅读,更多相关《增量式PID控制算法程序汇编文档格式.docx(29页珍藏版)》请在冰豆网上搜索。
常数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
MOVR0,#39H
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
MOVR1,#30H;
30H里存的是T/Ti+1LCALLFADD
MOVR1,#39H
LCALLFMUL
MOVR1,#BLOCK1;
将结果保存在BLOCK1中LCALLFMOVR0
MOVR1,#BUFF1;
30H恢复原值
MOVR0,#30H
LCALLFMOV
MOVR1,#BUFF;
33H恢复原值
MOVR0,#33H
MOVR0,#40H;
计算B的值Kp.(1+2.Td/T)
MOVR1,#33H
MOVR1,#30H
MOVR1,#3CH
MOVR1,#BLOCK2;
保存B值到BLOCK2中LCALLFMOVR0
MOVR0,#39H;
计算C的值Kp.Td/TMOVR1,#33H
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
保存R(k)中的值
MOVR1,#CK
LCALLFSUB;
计算R(k)-C(k)的值送给E(k)MOVR1,#EK
恢复RK的值释放BUFFMOVR0,#RK
MOVR0,#BLOCK2;
将B.e(k-1)的值暂存在BUFF1中
保存B
MOVR1,#EK1
恢复B释放BUFFLCALLFMOV
MOVR0,#BLOCK3;
将C.e(K-2)的值暂存在BUFF2中
保存C
MOVR1,#EK2
MOVR1,#BUFF2
恢复C释放BUFFLCALLFMOV
MOVR0,#BLOCK1;
A.E(k)MOVR1,#BUFF
MOVR1,#EK
计算Uk值A.E(k)-B.E(k-1)+C.E(k-2)
LCALLFSUB
MOVR1,#UK;
保存结果到UK中
恢复A释放BUFFLCALLFMOV
MOVR0,#UK;
UK转换成BCD码浮点数输出LCALLFTOB
MOVR1,#EK1;
将E(k-1)-->
E(k-2),E(k)-->
E(k-1)
MOVR0,#EK1
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时,溢出。
字节
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;
传回尾数的高字节
MOVA,R2;
取结果的阶码
MOVC,1FH;
取结果的数符
MOVACC.7,C;
拼入阶码中
CLRACC.7;
不考虑数符
CLROV;
清除溢出标志
CJNEA,#3FH,MV01;
阶码是否上溢,********应为#40H
SETBOV;
设立溢出标志
MV01:
MOVA,@R0;
取出带数符的阶码RET
MVR0:
将[R0]传送到第一工作区中的子程序
MOVC,ACC.7;
将数符保存在位1FH中MOV1FH,C
MOVC,ACC.6;
将阶码扩充为,,,,补码MOVACC.7,C
MOVR2,A;
存放在R2中
INCR0
MOVA,@R0;
将尾数高字节存放在R3中MOVR3,A;
将尾数低字节存放在R4中MOVR4,A
DECR0;
恢复数据指针
MVR1:
MOVA,@R1;
将[R1]传送到第二工作区中的子程序
将数符保存在位1EH中MOV1EH,C
MOVR5,A;
存放在R5中
INCR1
MOVA,@R1;
将尾数高字节存放在R6中MOVR6,A
将尾数低字节存放在R7中MOVR7,A
DECR1;
DECR1
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;
对阶,比较两个操作