积分分离PID控制算法程序
- 格式:doc
- 大小:46.00 KB
- 文档页数:28
希望对大家有所帮助,多谢您的浏览!
1 / 28 积分分离PID控制算法程序
2007-01-05 15:23
希望对大家有所帮助,多谢您的浏览!
2 / 28 ;**********P10,积分分离PID控制算法程序 ********
;T、TD、TI、KP依次从30H,33H,36H,39H开始。
;A,B,C,A',的值依次存在BLOCK1,BLOCK2,BLOCK3 BLOCK4 的地址里
;这里B'与C值相同
; 这里R(k)给的是定值
ORG 0000H
E EQU 20H ; 一阈值
GK EQU 23H ;G(k)
GK1 EQU 26H ;G(k-1)
FK EQU 29H ;F(k)
FK1 EQU 2CH ;F(k-1)
BLOCK1 EQU 50H ;A
BLOCK2 EQU 53H ;B
BLOCK3 EQU 56H ;C
BLOCK4 EQU 5AH ;A'
UK EQU 5DH ;存放结果
BUFF EQU 43H ;暂存区
BUFF1 EQU 46H
BUFF2 EQU 49H
BUFFR0 EQU 4CH
REC EQU 63H ;采样次数
RK EQU 66H ;R(k)
CK EQU 69H ;采样数据始址
EK EQU 6CH ;存放偏差值E(k)的始址
EK1 EQU 70H ;存放E(k-1)的始址
TEST: MOV RK,#01H ;常数Rk 1.25的BCD码浮点数
MOV RK+1,#12H
MOV RK+2,#50H
; MOV E,#7EH ;设定一阈值0.001的BCD码浮点数
; MOV E+1,#10H
; MOV E+2,#00H
MOV E,#00H ;阈值为0.3
MOV E+1,#30H
MOV E+2,#00H
MOV 3CH,#01H ;常数1的BCD码浮点数
MOV 3DH,#10H
MOV 3EH,#00H
MOV 40H,#01H ;常数2的BCD码浮点数
MOV 41H,#20H
MOV 42H,#00H
MOV 30H,#01H ;T 2.34的BCD 码浮点数 希望对大家有所帮助,多谢您的浏览!
3 / 28 MOV 31H,#23H
MOV 32H,#40H
MOV 33H,#01H ;Td 3.54的BCD码浮点数
MOV 34H,#35H
MOV 35H,#40H
MOV 36H,#01H ;Ti 1.12的BCD码浮点数
MOV 37H,#11H
MOV 38H,#20H
MOV 39H,#01H ;Kp 1.25的BCD码浮点数
MOV 3AH,#12H
MOV 3BH,#50H
MOV R0,#E ; 将其转换成二进制浮点操作数
LCALL BTOF
MOV R0,#RK
LCALL BTOF
MOV R0,#3CH
LCALL BTOF
MOV R0,#40H
LCALL BTOF
MOV R0,#39H
LCALL BTOF
MOV R0,#36H
LCALL BTOF ;将其转换成二进制浮点操作数
MOV R0,#33H ;指向BCD码浮点操作数Td
LCALL BTOF ;将其转换成二进制浮点操作数
MOV R0,#30H ;指向BCD码浮点操作数T
LCALL BTOF ;将其转换成二进制浮点操作数
MOV R1, #BUFFR0 ;保存30H中的值 即T值
LCALL FMOVR0
MOV R1, #36H ;计算A值(1+T/Ti+Td/T).Kp
LCALL FDIV
MOV R1,#3CH ;常数1
LCALL FADD
MOV R0,#33H ;保存33H中的值
MOV R1,#BUFF
LCALL FMOVR0
MOV R1,#BUFFR0
LCALL FDIV
MOV R1,#30H ;30H里存的是T/Ti+1
LCALL FADD
MOV R1,#39H
LCALL FMUL
MOV R1 ,#BLOCK1 ;将结果保存在BLOCK1中
LCALL FMOVR0 希望对大家有所帮助,多谢您的浏览!
4 / 28 MOV R1,#BUFFR0 ;30H恢复原值
MOV R0,#30H
LCALL FMOV
MOV R1,#BUFF ;33H恢复原值
MOV R0,#33H
LCALL FMOV
MOV R0,#40H ;计算B的值Kp.(1+2.Td/T)
MOV R1,#33H
LCALL FMUL
MOV R1,#30H
LCALL FDIV
MOV R1,#3CH
LCALL FADD
MOV R1,#39H
LCALL FMUL
MOV R1,#BLOCK2 ;保存B值到BLOCK2中
LCALL FMOVR0
MOV R0,#39H ;计算C的值Kp.Td/T
MOV R1,#33H
LCALL FMUL
MOV R1,#30H
LCALL FDIV
MOV R1,#BLOCK3 ;保存C值到BLOCK3中
LCALL FMOVR0
MOV R0,#33H ;计算A',保存33H中的值
MOV R1,#BUFFR0
LCALL FMOVR0
MOV R1,#30H
LCALL FDIV
MOV R1,#3CH
LCALL FADD
MOV R1,#39H
LCALL FMUL
MOV R1,#BLOCK4 ;保存A'值到BLOCK4中
LCALL FMOVR0
MOV R1,#BUFFR0 ;恢复33H中的值
LCALL FMOV
MOV R0,#EK1 ;将EK1,FK1,GK1设初值0
LCALL FCLR
MOV R0,#FK1
LCALL FCLR
MOV R0,#GK1
LCALL FCLR
MOV REC,#04H ;设置采样次数 希望对大家有所帮助,多谢您的浏览!
5 / 28 LOOP: MOV CK,#01H ;采样数据暂时给了一个定值
MOV CK+1,#10H
MOV CK+2,#00H
MOV R0,#CK
LCALL BTOF
MOV R0,#RK ;保存R(k)中的值
MOV R1,#BUFFR0
LCALL FMOVR0
MOV R1,#CK
LCALL FSUB ;计算R(k)-C(k)的值送给E(k)
MOV R1,#EK
LCALL FMOVR0
MOV R1,#BUFFR0
LCALL FMOV ;恢复R(K)的值,释放、BUFFR0
MOV R0,#BUFFR0 ;EK存到BUFFR0
MOV R1,#EK
LCALL FMOV
LCALL FABS ;求EK的绝对值
MOV R1,#E ;判断EK的绝对值与E的大小
LCALL FCMP
JC PID ;EK<=E时转PID控制程序否则PD程序
CJNE A,#00H,PD
LJMP PID
PD: MOV R0,#BLOCK4
MOV R1,#BUFFR0 ;保存A'的值
LCALL FMOVR0
MOV R1,#EK
LCALL FMUL
MOV R1,#FK1
LCALL FSUB
MOV R1,#UK ;结果存在UK中
LCALL FMOVR0
MOV R1,#BUFFR0 ;恢复A'
LCALL FMOV
MOV R0,#BLOCK3 ;计算B'.E(k)这里B'值与C值同
MOV R1,#BUFFR0 ;保存B'
LCALL FMOVR0
MOV R1,#EK
LCALL FMUL
MOV R1,#FK ;B'.EK存到FK中
LCALL FMOVR0
MOV R1,#BUFFR0 ;恢复B'
LCALL FMOV 希望对大家有所帮助,多谢您的浏览!
6 / 28 LJMP OUT
PID: MOV R0,#BLOCK1 ;计算A.E(k)+G(K-1)
MOV R1,#BUFFR0 ;保存A
LCALL FMOVR0
MOV R1,#EK
LCALL FMUL
MOV R1,#GK1
LCALL FADD
MOV R1,#UK ;计算结果存入UK中
LCALL FMOVR0
MOV R1,#BUFFR0 ;恢复A值
LCALL FMOV
MOV R0,#BLOCK2 ;计算U(k)-B.E(k)+C.E(k-1)
MOV R1,#BUFFR0 ;保存B到BUFFR0
LCALL FMOVR0
MOV R1,#EK
LCALL FMUL
MOV R1,#BUFF ;B.E(k)保存到BUFF
LCALL FMOVR0
MOV R0,#UK
MOV R1,#BUFF1 ;UK保存到BUFF1
LCALL FMOVR0
MOV R1,#BUFF
LCALL FSUB
MOV R1,#BUFF ;U(k)-BE(k)保存到BUFF
LCALL FMOVR0
MOV R0,#BLOCK3 ;计算C.E(k-1)
MOV R1,#BUFF2 ;保存C到BUFF2
LCALL FMOVR0
MOV R1,#EK1
LCALL FMUL
MOV R1,#BUFF
LCALL FADD
MOV R1,#GK ;U(k)-BE(k)+CE(k-1)保存到GK
LCALL FMOVR0
MOV R1,#BUFF2 ;恢复C值释放BUFF2
LCALL FMOV
MOV R0,#UK ;恢复UK值释放BUFF1
MOV R1,#BUFF1
LCALL FMOV
MOV R0,#BLOCK2 ;恢复B
MOV R1,#BUFFR0
LCALL FMOV