《积分分离PID控制算法程序.docx》由会员分享,可在线阅读,更多相关《积分分离PID控制算法程序.docx(25页珍藏版)》请在优知文库上搜索。
1、积分分离PlD控制算法程序2022-01-0515:23;*P10,积分分离PID控制算法程序*;T、TD、TIKP挨次从30H,33H,36H,39H开始。;A,B,C,A,的值挨次存在BLOCKl,BL0CK2,BL0CK3BL0CK4的地址里;这里B与C值相同;这里R(k)给的是定值ORG0000HEEQU20H;一阈值GKEQU23H;G(k)GKlEQU26H;G(k-l)FKEQU29H;F(k)FKlEQU2CH;F(k-l)BLOCKlEQU50H;ABL0CK2EQU53H;BBL0CK3EQU56H;CBL0CK4EQU5AH;AUKEQU5DH;存放结果BUFFEQU43
2、H;暂存区BUFFlEQU46HBUFF2EQU49HBUFFROEQU4CHRECEQU63H;采样次数RKEQU66H;R(k)CKEQU69H;采样数据始址EKEQU6CH;存放偏差值E(k)的始址EKlEQU70H;存放E(kT)的始址TEST:MOVRK,#01H;常数Rk1.25的BCD码浮点数MOVRK+1,#12HMOVRK+2,#50H;MOVE,#7EH;设定一阈值0.001的BCD码浮点数;MOVE+l,ttlOH;MOVE+2,#00HMOVE,#00H;阈值为0.3MOVE+l,#30HMOVE+2,#00HMOV3CH,#0111;常数1的BCD码浮点数MOV3DH
3、,#10HMOV3EH,#00HMOV40H,#01H;常数2的BCD码浮点数MOV41H,#20HMOV42H,#00HMOV30H,#01H;T2.34的BCD码浮点数MOV31H,#23HMOV32H,#40HMOV33H,#01H;Td3.54的BCD码浮点数MOV34H,#35HMOV35H,#40HMOV36H,#01H;Ti1.12的BCD码浮点数MOV37H,#11HMOV38H,#20HMOV39H,#01H;Kp1.25的BCD码浮点数MOV3AH,#12HMOV3BH,#50HMOVRO,#E;将其转换成二进制浮点操作数LCALLBTOFMOVRO,#RKLCALLBTO
4、FMOVRO,#3CHLCALLBTOFMOVRO,#40HLCALLBTOFMOVRO,#39HLCALLBTOFMOVRO,#36HLCALLBTOF;将其转换成二进制浮点操作数MOVR0,tt33H;指向BCD码浮点操作数TdLCALLBTOF;将其转换成二进制浮点操作数MOVRO,#30H;指向BCD码浮点操作数TLCALLBTOF;将其转换成二进制浮点操作数MOVRl,#BUFFRO;保存30H中的值即T值LCALLFMOVROMOVRl,#36H;计算A值(1+T/Ti+Td/T).KpLCALLFDIVMOVRl,#3CH;常数1LCALLFADDMOVR0,#33H;保存33H
5、中的值MOVRl,#BUFFLCALLFMOVROMOVRl,#BUFFROLCALLFDIVMOVRl,#30H;30H里存的是T/Ti+1LCALLFADDMOVR1,#39HLCALLFMULMOVRl,#BLOCK1;将结果保存在BI,OCK1中LCALLFMOVROMOVRl,#BUFFRO;30H恢复原值MOVR0,#30HLCALLFMOVMOVRl,#BuFF;33H恢复原值MOVR0,#33HLCALLFMOVMOVR0,#40H;计算B的值Kp.(1+2.Td/T)MOVR1,#33HLCALLFMULMOVRl,#30HLCALLFDIVMOVRl,tt3CHLCALLF
6、ADDMOVR1,#39HLCALLFMULMOVRI,#BLoCK2;保存B值到BLOCK2中LCALLFMOVROMOVRO,#39H;计算C的值Kp.Td/TMOVR1,#33HLCALLFMULMOVRl,#30HLCALLFDIVMOVRl,#BLoCK3;保存C值到BL0CK3中LCALLFMOVROMOVR0,#33H;计算A,保存33H中的值MOVRl,#BUFFROLCALLFMOVROMOVRl,#30HLCALLFDIVMOVR1,#3CHLCALLFADDMOVRl,#39HLCALLFMULMOVRI,#BLoCK4;保存A值到BL0CK4中LCALLFMOVROMO
7、VRl,#BUFFRO;恢复33H中的值LCALLFMOVMOVR0,#EKl;将EKI,FKl,GKl设初值0LCALLFCLRMOVR0,卵KlLCALLFCLRMOVR0,#GKlLCLLFCLRMOVREC,#04H;设置采样次数LOOP:MOVCK,#O1H;采样数据暂时给了一个定值MOVCK+1,1OHMOVCK+2,#00HMOVRO,#CKLCALLBTOFMOVRO,#RK;保存R(k)中的值MOVRl,SBUFFROLCALLFMOVROMOVRI,#CKLCALLFSUB;计算R(k)-C(k)的值送给E(k)MOVR1,#EKLCALLFMOVROMOVRI,#BUFF
8、ROLCALLFMOV;恢复R(K)的值,释放、BUFFROMOVR0,#BUFFRO;EK存到BUFFROMOVRI,#EKLCALLFMOVLCALLFABS;求EK的绝对值MOVRI,#E;判断EK的绝对值与E的大小LCALLFCMPJCPID;EKG(k-l)MOVRI,#GKLCALLFMOVMOVRO,#FKl;F(k)F(K-1)MOVRI,#FKLCALLFMOVMOVRO,#EKl;E(K)E(K-1)MOVRl,#EKLCALLFMOVMOVRO,#UK;UK转换成BCD码浮点数输出LCALLFTOBLCALLDELAY;等待采样时刻DJNZREC,NEXTlSJMP$NE
9、XTl:LJMPLOOPDELAY:MOVR7,#02HDELAYl:MOVR6,#OFFHDELY2:DJNZR6,DELY2DJNZR7,DELAYlRET;(1)标号:FSDT功能:浮点数格式化;入口条件:待格式化浮点操作数在R0中。;出口信息:己格式化浮点操作数仍在R0中。;影响资源:PSW、A、R2、R3、R4、位IFH堆栈需求:6字节FSDT:LCALLMVRO;将待格式化操作数传送到第一工作区中LCALLRLN;通过左规完成格式化LJMPMOVO;将已格式化浮点操作数传回到R0中;(2)标号:FADD功能:浮点数加法;入口条件:被加数在R0中,加数在R1中。;出口信息、:OV=O
10、时,和仍在R0中,OV=I时,溢出。;影响资源:PSW、A、B、R2R7、位1EH、IFH堆栈需求:6字节FADD:CLRFO;设立加法标志SJMPAS;计算代数和(3)标号:FSUB功能:浮点数减法;入口条件:被减数在R0中,减数在R1中。;出口信息:OV=O时,差仍在R0中,OV=I时,溢出。;影响资源:PSW、A、B、R2R7、位1EH、IFH堆栈需求:6字节FSUB:SETBFO;设立减法标志AS:LCALLMVR1;计算代数和。先将R1传送到第二工作区MOVC,FO;用加减标志来校正第二操作数的有效符号CLRA;*?应加的一条语句RRCAXRLA,RlMOVC,ACC.7ASN:MO
11、V1EH,C;将第二操作数的有效符号存入位IEH中XRLA,R0;与第一操作数的符号比较RLCAMOVF0,C;保存比较结果LCALLMVRO;将以0传送到第一工作区中LCALLASl;在工作寄存器中完成代数运算MOVO:INCRO;将结果传回到R0中的子程序入口INCROMOVA,R4;传回尾数的低字节MOVR0,ADECROMOVA,R3;传回尾数的高字节MOVR0,ADECROMOVA,R2;取结果的阶码MOVC,IFH;取结果的数符MOVACC.7,C;拼入阶码中MOVR0,ACLRACC.7;不考虑数符CLROV;清除溢出标志CJNEA,#3FH,MVOl;阶码是否上溢?*应为#40HSETBOV;设立溢出标志MVOl:MOVA,Ro;取出带数符的阶码RETMVRO:MOVA,R0;将出0传送到第一工作区中的子程序MOVC,ACC.7;将数符保存在位IFH中MOV1FH,CMOVC,ACC.6;将阶码扩充为8bit补码MOVACC.7,CMOVR2,A;存放在R2中INCROMOVA,R0;将尾数高字节存放在R3中MOVR3,A