资源描述:
《pid控制算法程序》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、;********增量式PID控制算法程序***********;T、TD、TI、KP依次从30H,33H,36H,39H开始。;A,B,C的值依次存在BLOCK1,BLOCK2,BLOCK3的地址里;这里R(k)给的是定值;ORG0000HBLOCK1EQU43H;A,B,CBLOCK2EQU46HBLOCK3EQU49HUKEQU4CH;存结果UKRKEQU50HEKEQU53H;存放偏差值E(k)的始址EK1EQU56H;存放E(k-1)的始址EK2EQU59H;存放E(k-2)的始址CKEQU5CH;采样数据始址BUFFEQU60H;暂存区BUFF1EQU63HBUFF2EQ
2、U66HRECEQU69HTEST:MOVRK,#01H;常数Rk的BCD码浮点数MOVRK+1,#12H;1.25MOVRK+2,#50HMOV3CH,#01H;常数1的BCD码浮点数MOV3DH,#10HMOV3EH,#00HMOV40H,#01H;常数2的BCD码浮点数MOV41H,#20HMOV42H,#00HMOV30H,#01H;T的BCD码浮点数MOV31H,#23H;2.34MOV32H,#40HMOV33H,#01H;Td的BCD码浮点数MOV34H,#35H;3.54MOV35H,#40HMOV36H,#01H;Ti的BCD码浮点数MOV37H,#11H;1.12
3、MOV38H,#20HMOV39H,#01H;Kp的BCD码浮点数MOV3AH,#12H;1.25MOV3BH,#50HMOVR0,#RK;指向BCD码浮点操作数LCALLBTOF;将其转换成二进制浮点操作数MOVR0,#3CHLCALLBTOFMOVR0,#40HLCALLBTOFMOVR0,#39HLCALLBTOFMOVR0,#36H;指向BCD码浮点操作数TiLCALLBTOF;将其转换成二进制浮点操作数MOVR0,#33H;指向BCD码浮点操作数TdLCALLBTOF;将其转换成二进制浮点操作数MOVR0,#30H;指向BCD码浮点操作数TLCALLBTOF;将其转换成二进
4、制浮点操作数MOVR1,#BUFF1;保存30H中的值即T值LCALLFMOVR0MOVR1,#36H;计算A值(1+T/Ti+Td/T).KpLCALLFDIVMOVR1,#3CH;常数1LCALLFADDMOVR0,#33H;保存33H中的值MOVR1,#BUFFLCALLFMOVR0MOVR1,#BUFF1LCALLFDIVMOVR1,#30H;30H里存的是T/Ti+1LCALLFADDMOVR1,#39HLCALLFMULMOVR1,#BLOCK1;将结果保存在BLOCK1中LCALLFMOVR0MOVR1,#BUFF1;30H恢复原值MOVR0,#30HLCALLFMOV
5、MOVR1,#BUFF;33H恢复原值MOVR0,#33HLCALLFMOVMOVR0,#40H;计算B的值Kp.(1+2.Td/T)MOVR1,#33HLCALLFMULMOVR1,#30HLCALLFDIVMOVR1,#3CHLCALLFADDMOVR1,#39HLCALLFMULMOVR1,#BLOCK2;保存B值到BLOCK2中LCALLFMOVR0MOVR0,#39H;计算C的值Kp.Td/TMOVR1,#33HLCALLFMULMOVR1,#30HLCALLFDIVMOVR1,#BLOCK3;保存C值到BLOCK3中LCALLFMOVR0MOVR0,#EK1;将EK1,E
6、K2设初值0LCALLFCLRMOVR0,#EK2LCALLFCLRMOVREC,#03H;设置采样次数LOOP:MOVCK,#7eH;采样数据暂时给了一个定值MOVCK+1,#21H;0.002112MOVCK+2,#12HMOVR0,#CKLCALLBTOFMOVR0,#RK;保存R(k)中的值MOVR1,#BUFFLCALLFMOVR0MOVR1,#CKLCALLFSUB;计算R(k)-C(k)的值送给E(k)MOVR1,#EKLCALLFMOVR0MOVR1,#BUFF;恢复RK的值释放BUFFMOVR0,#RKLCALLFMOVMOVR0,#BLOCK2;将B.e(k-1)
7、的值暂存在BUFF1中MOVR1,#BUFF;保存BLCALLFMOVR0MOVR1,#EK1LCALLFMULMOVR1,#BUFF1LCALLFMOVR0MOVR1,#BUFF;恢复B释放BUFFLCALLFMOVMOVR0,#BLOCK3;将C.e(K-2)的值暂存在BUFF2中MOVR1,#BUFF;保存CLCALLFMOVR0MOVR1,#EK2LCALLFMULMOVR1,#BUFF2LCALLFMOVR0MOVR1,#BUFF;恢复C释放BU